From 56d112e96d1b1beb63014de5c3fe19c38a96d4f4 Mon Sep 17 00:00:00 2001 From: Random Number <159942794+loftlifter31@users.noreply.github.com> Date: Thu, 29 Aug 2024 11:03:36 -0500 Subject: [PATCH 01/17] galp5: initial effort by @loftlifter31 squashed and signed off doing - git log - copy commit ID from where to squash and sign (xxxx) - git rebase --signoff -i xxxx^ - follow GUI, here 'e' to edit oldest commit log message, all others to be squashed were tagged 's' for squash - edited commit message by git commit --signoff --amend - continued rebase by doing git rebase --continue - after rebase, all commits to be squashed commit messages on screen, delete all irrelevant. Signed-off-by: Thierry Laurion --- .../galp5/TigerLakeFspBinPkg/Client/.ignore | 1 + boards/galp5/TigerLakeFspBinPkg/Client/Fsp.fd | Bin 0 -> 1048576 bytes boards/galp5/cmos.default | 5 + boards/galp5/cmos.layout | 40 + boards/galp5/fd.rom | Bin 0 -> 4096 bytes boards/galp5/galp5.config | 59 + boards/galp5/me.rom | Bin 0 -> 5238784 bytes boards/galp5/memlayout.ld | 48 + boards/galp5/tigerlake/chipset.cb | 157 + boards/galp5/tlg-u/board.fmd | 12 + boards/galp5/tlg-u/devicetree.cb | 139 + boards/galp5/tlg-u/variants/galp5/data.vbt | Bin 0 -> 8704 bytes .../tlg-u/variants/galp5/overridetree.cb | 195 ++ config/coreboot-galp5.config | 855 +++++ config/linux-galp5.config | 3104 +++++++++++++++++ 15 files changed, 4615 insertions(+) create mode 100644 boards/galp5/TigerLakeFspBinPkg/Client/.ignore create mode 100644 boards/galp5/TigerLakeFspBinPkg/Client/Fsp.fd create mode 100644 boards/galp5/cmos.default create mode 100644 boards/galp5/cmos.layout create mode 100644 boards/galp5/fd.rom create mode 100644 boards/galp5/galp5.config create mode 100644 boards/galp5/me.rom create mode 100644 boards/galp5/memlayout.ld create mode 100644 boards/galp5/tigerlake/chipset.cb create mode 100644 boards/galp5/tlg-u/board.fmd create mode 100644 boards/galp5/tlg-u/devicetree.cb create mode 100644 boards/galp5/tlg-u/variants/galp5/data.vbt create mode 100644 boards/galp5/tlg-u/variants/galp5/overridetree.cb create mode 100644 config/coreboot-galp5.config create mode 100644 config/linux-galp5.config diff --git a/boards/galp5/TigerLakeFspBinPkg/Client/.ignore b/boards/galp5/TigerLakeFspBinPkg/Client/.ignore new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/boards/galp5/TigerLakeFspBinPkg/Client/.ignore @@ -0,0 +1 @@ + diff --git a/boards/galp5/TigerLakeFspBinPkg/Client/Fsp.fd b/boards/galp5/TigerLakeFspBinPkg/Client/Fsp.fd new file mode 100644 index 0000000000000000000000000000000000000000..ea46ea00f01fcc7ef154eef87181a48025dd1da8 GIT binary patch literal 1048576 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

+BnI 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

  • KJ4&cERXfZrPrdf=d4s_N=OC_xiQ! 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 s7ZfbuaOsP_vGD;T7=Jb&qXMTEIi$=E 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

    {DlL&bf^nY4PM33 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%0AxGp`3bvov9I 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

    2ZbD@2Jt!-AyU`#7;)f~UyXh%-xwhLp&;;%y>m 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 !IIxKL2ms>zP6!~dwV4U@UeJWlOJM9O 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

    gD%G6kIdz6_x1(Z!DZ*)evnNOCu*HvN2 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 z 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

    69ARAI-apvxzCq3F*3V;Ce_%tLF!@D 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≻ajQ$VFdq#jOBi8Rx zOnstGAvs%g2FOx}tlj}|2o}D60??!{1@-yQ9NTpTqb#jJ_sJ962qw_Vw!%SgHSdFV zY5Vyn{-F8;Lzfxb3XiPG`g!H5O6+y;?$+Ph?EI%1VTl#ZKMo|bY3Pmo_aN%_z>iaIS@&SoA_|-R868Xpef`|Xb>?Enz#6Cz-rLIy`-!P}*y;Qp~DSs@; zL?~a*KPJDp@Ep}qqI+fw(o=L9B9PUtYwyX08gc9OtG@J5K2|sK+RPh{xsF@ z((=PdcNr-|32h91X7K^B$F8hTS3MCK{q}q0Qm=*HXqE@upN|;TYKW23$6e#4Cw>z5 z{w=Z<67jKStYt00pdZ$*KE zrrO@H8SwIEknjKmououBZQNCwB0{$MyZ(G^`D3wK6@)<=H!PY+5N?1?(m!^B$|1B;9@hiOG_-iqE z(2haGy6?q)XU6HRv?13SPTV!pqHfTqz(PkF+cJxh#V)37pQhR%yv_z zuf+Qj6S~~(X!};>A4wf(8#%x&2viqhpz+!P57^-{ zxD^d^PmWRvbNAp%F6(JT=rKiI8qxGv2gdUuoda}oUA9!-nIV>j^k;e^E& z7@|ElA6T0U3MeNm3yQ%`&@qTVu3I8RK?1R}%h19J?khDAl%hn}aaFHZA%*38wVv#$5#iBmaijZ+C z=dVh&ze=6R-__nbn2{#0z@B#-V|U{@6S7hz42{PW@?p!gpC3-goIUs_aO1MP zExLez9x8yN6_LDwmyB-PA%K~lP!@UeA4mB5Ck%!LH>{G4s9#P@G7@(g@Ni-Q67$ zhwe^MTDltn=}zhH7Nn65>5}g5?t1s}-uwK2AKou=b~@MEYtOyboMVoGvxyy|Z&oMG z^*bK^DpbcyiF&TYwb2|emF-=A$l{W`&4bQn=2!K3V7thV`t;+{U&|1#WU5(V8oylB zQcZ77`xa@5mg78nhE}Y~>N&m^toVI~LQ1~q9L+sY2xIHRYCz{ ztD?)o@Te#?OMvxA+K@Z&)%+4xaHJ`e{0mWDp$*IWfPbe@n0dD( zARYHYZqdp$X!s+p+$+1_nx7lzw;TkDK5+PqWH!G^15P087i?H(!kmI8;u!mZGZtQ zg7hajZcE<4^jDg|_tzDGz)8c_<~>c&#Jorw?Cu`35LC~(mFtxVMx5(pHXxy^i(Dhl zGxkww#U2PUVNxEJdkf&;8*-eE&|v)(%UVYhYY&yd^4JO{VGlFYrg7nH8E2vXYaFgW z;Pio%&lir~`0$UjWbs*L9?Ar$0$~a#6^HR|6QSk_Tno#0d$^dfyg+a6p+pZH1oLtO zA1GemtRiH!F2D{5FI$iLmNi0O8u$R+b%JXvFLECgoBN7u*D+OizEGjWTyR%kQEZ}9 z@%{*CDEs_Ts7C~$0aN$axVA_O(P)AJ{dg=!H>(`<%qvs3#9_+3)Fh;78(tA3Tl(15H1ri>Y(Xyxk)n463QDH$=gm94eA0 zLrG~~+a{PXh(FlJyb?I*QOX`9yFS8yDFaIoQxpPOV;SU~Mn{iz827Pr6f>&6U-&M; z%(kv5mzWiD22nZfxaRvRY*7xIL21MZa5WZlFvsa=T#+KPwW({*#$5eCe#S}5WXPQT zmWt&wAT+dj^)D&VdUX&0;&hYndLm}$N?1xnlr`{yJc^=cx%IauU;IsOm%?*L`Sd&7 z@j-*i9L?s5&`}hlDRV>~rw^|i6)VD(a;0X@>UczsOm{KB*xx7CpSRzcGrpj$g<<7y zLN5%)I0ZxRZ#+G|wV-OSH=>D&Kgbme)?%8ZNjf1CQvO#3R~`DHjM3#16m z3fxtLnr8dfJuYg6QUos! zPoQ$vo;KUIv-7R==?{FE7eUU92MC>%$Dm0|3vZOa7sK@d7n4RZtyJ1&T~6mEFYkb? zT4ns$alSc$FTVZF?m8a{g|Q1i`2#H)MYx0=Iq}w=02krv;`}Yda7>H%Vq?N-LbSUN zV}ur~p{SugL?2<)k9}IQ?-o}HTa`f)F{e3I&OuX(+aEshRa>)tL=GCFSzR@*J`0Xn z^$xwK?!J!4Qc%nMvCuI=LqHov><5h(eXQ{t?fKy$4$o-NYj=FBMy#5{`fm zwvB?G0&JUB<>$qH*Zj5^Xw^hos_T0XBJFyVPsfFqeue%Im!PE*1rw1dAgd59AVAgJ zjBAF1L--D#OI)8S7U)bFy+$QoNLJndzrLYP^A(w__okRHkc$t$e*`=wGasdob< zP0lTvsQNtxHYls{6$fK~yCMv#Fgo_fFXdcv4e)b~lV#KKrlg23Jh`0LZ5XS4*I{xE z(CWeD0((gppgK_V(j$wW%_db)d-FUDlYf7go%}L~g~3N22EwSj#0YXFu>&FfOrw$&k{L zV)I4+Ct<6pybIGJ5oDh`LYZ6L&Z4&gZ#9^L2#X0STI&d~)$MF-#092E9Nmw<33~kGU(nbfC(aZ?VEg;179f+)L%aOcUxQPm_EhCzx zuZeo0w0C#lJShNF4K%_TD;wCyj1FHWAVelhX0f!}#b@!43cuWUfJv0L2ilIPe>i9o z#ea4mJmp**2iQC(J#c;{YuCO+VFYy;dMGO#yBrTR5jlN3rqW4AN|tqsr+bBjOF)q{ z-?yScK>Bf58H?Jg%l$)yH=HJc?FEc%H@#e^T|KcN=E$Nv-3s}U;S}s5sOn)|quL@< zXxIUX?L4Gf)|iSYp)bEuRdx{X;Yc7Z^wl!`rWjXM5b>c29D0K36|6T&wEX#0I<*Iy{$Al+H9Gan#(Wz9>|#noI9gpB zl#(`@i99m@LYLNYvJ%p3_%7q`;ZaJhyHZ=|aCKbR;3PbT3t7K{3z60o$u&<~?2-NK zJ5siTPfdZcUMZc&c+q5z2|#5cje+4>ZV!Nq79jgUtbyQ~QvlFaz{0y)^8PS1!4_Qf zg6C;F3!9LgyB)|sl;J;-kD14x(ol+aHGUgH6EdC&ldTyfow0>Ue3=o;X))}1LvEm; z@Ge0lv>aZg^A8P{j#}3r)&@M%$A-Q^lc#glFjMYBH{LdxKqOG%Nj{{6TkzxU6iS zpD>bBw*Ec0r+c4MUN~5JjP&6nX;G#j&I{g48t~tbdtbFVvs=jMGLPVE*hg>PzkfgQ zIpr#!IIX|PW9>5lGKQjc%fGFJl2(K#m+LQJ2&-(4kl+Algvu3@4ZvVL$;5P%$txX`@W5H`4Rt*qf~df|WVDC?TDEjp9M){b?x@>S9^)=Jt&#Kes4oCACO$+C zh1qN2-R-Fq)g-de`G6BKM}a@^Ptg*8p&%_;3go7YxHI5~WNxvhSoh^Wk`CzAThQP3 zi9m%Lyp;C^+A|mN@w`a(lER+Auh{iH>*)$1K(=4-nEXtwa>QPv4=p`pl{K5aP}FkG z93uY6#y>7^5wf^3D5x0;LGdZG^x(}voJW~3Bt@LZWM3-i0K_au8G!bS*1nzUHuXx* zM|-(VUl2QhImOYo(H+6ja*lJ;{xEg?c-C-o>#B0SLYM1YLwK%WyTLv2Tk5$l+=E7XpJ#jj6pV`N<;T;a+rrpx!OxC zZEyi?ObHW$)^F1YZ2%K~9~@NH>hXWUDv>w^gmOKGvTB6Me2Fz+o((kzQm2}16*#;+ z&>RjgXHv%BQ@UGx_ZXsF5~;f2!@=3R@?+OC%%<&8S*Ok+JPVJ@0U4Zw)))_xf5V>y zWY;HY)DIk(x~b^!eK=P#fEZE>x@o|@_L69s_CUP3fjuPij9z|wh#aW%;IDax|BO=5DyVPQC50U= z2CdGc7*XG$!)@>EI$}a#vS^F2h8>B`^!?q2uGZ=#=oAt*<%j;@mR-89{DH5FQtmk z4s_ui>Cx~*@k!1&GQWPSRMSS?4mLR6lc#`kSa2$#q_88iBP}uK$?rl2ZT-FuYj^C< zi{{5qk~8#3%6h?Ie;kDudiP@k#6`xw*csTeha^!-1{)>E%?7G@n>k4ycxJteBxx(8 zB>FB+Q99zsTRg@ybnWmsP$L2{_?m?ecA3bua6zrq0dK0!;f%+?>6rOsGX=9i4we@^ zh>Q*|Ao7!fmNq}$_{&;TN%KJM-KJNhmoya4a1}s*`POjm{?nNAZHBv@5d(`rsA9N6 zr@hbCLJ(5AO|B2%?6-xk+ zHL~z?()4Y0F=1Y&Hp?MGc_ES=gvf$g?j6L7RDEG{y$s{)uB~vDF!=962e9Iee1DQ= zUcG-%n8Paf{pnDQ?vbbXIa1M9$p_NGR!IX7TxA)w{es&Z2~G{VYD>b*WC0Og>9PEL z8!eXQd*a?G5z<;ysG|oNOY_H2D0!)5$SBJ(z;!9b0yF+%%n{?_z+1YWu{VN#`dJ{^ z!9aNnHq!>6I{j$*|56)JVW7Efv8D~YQ#ikg_05p)Q0 z%S(!Za=$~KG->8HvBow4}4f7M! zI{x1TJTsAzBDc^OF)3NwbEsxCa##XC5uV+QD_Y{ZKvMnQklqE z*pORa{>#hZ+u&O*>t&}XO?@&vT4uZ7a=9%#DhBr!^cAkd`EBF-)P*fOs!QZ(S4k4~ z0;w3dy1u_Hgz8t>;&87o4_l*{R~#*1`-cmyBJBV%Z|bdo;}+c!6+qkqpao7;24Erm zB$-NbVMFv`1oLc!9n9<5&9K{Bc7^k4j*NS@$ouPSeq-og>-@&v z)f+=*vM9zZW>fA>WV81a59h$ih76aO%HX9_SP&Y2#hm{xli*BXagg{$^wToG@;5}1 zdI6O#{(1p1gf_XzoOB~ZOoLgf6#(Ehj1DHY*7s4Ywc}axrN$q0hN!$pZbGze7i)Zz z^u0`!w1Gm2i-L?=qLEIthI9-gma-qSR z>>H~99Z^tuT77S#k3uvgV`crDOi5}SdC_E)f8Z&IjFLCIQE^jzM0Hc&s9v@~0Iw*M zeoSSnr1l+GyhfUCdm6=5{40-f@w~bM#QF@GtH7sHc*%y}{z_9n7MnKn^UcH?kk?}h z$(gor!azmNm`POM|IKwm^DzR6=XLlr_}Wiq(sk=D$dr0Ysw4?O;qLkH22kTDf)>4# zo*qd??3PZsk(-wqJoYgv5T8|8NFfZG$ty7shAVFWQvY%zuY^_$ef(EII|Z&`C(}}S zr;j@SPU-#rePJ{MNi;+Mq#73Y_J!`8AjZ3_ppi z`IGo_=ltIXs~l63c#jEb`OVS?-B85!f8sXEyrw|oPwCSnJ$pU~JSHTRMhd$rPw9TH z0{y$$5Ni$jaUaPAThZcksa<35d5aZRq;|96{cSV^lfL07aL_D)MT5r3we}mbvF@=SVzKmPwF1 z+^J{Vj2Vp%(E!z^Q#4J1w+|>vALjS~e)sdTX-X>lFSaA+jposd!`fn_hj!5k z=gP`v{KJ5?Lw$WG&OcsF(qS-)gY6esS1=IMLA0x~ISF_~L-;*-QW&|<#;#gIN$L_N zW`9c)1xJ#nADP^L!5zwqRoBh_3?Za4Ci*A73L`<=8$Qw_zwkPI9^|oZFNn4 zuF^HiYQ>nrO7Z#xBR}LS==7gvUb_OINr}(vYdQTvGuJd?YJBptIyWjzl|r?*{j~Wd z9Zq9fbJsZ58J)6Cq&6Cnaeim{! zX3y2`Txu@R8K)Enmx3aCH=Ed8&A8iy?!gS<(6;?3f z&^H6wq;s;*-hM}@$01M3h)J-dWbI_0RKkQW{<|25NtmI}pHRbOP6(5fU|4ZwAU5!| z&iDLQ$vpU|N1nQX62m`(1Bt}AOUd6Y7LmC!?ylTmWA*HLVgkJ;I3==`W(-jXt&d&z z%=t*+!F`V`#h?cgZ3cM+eoHmzNCf>^>5@fQP&G)ia?5S-m*cRr$dcvFl#3V0G-saT ztWa{Wx)^&O6Sa~JzYPp1Q)D1PNH+Zwjaw(9Q3ym^82oOd-V8s*6TosGA8@J3flc)U zxNg8zKD&Ptb+?q_l>~E|62&BK$aWB*GH!AB5G_j@I36_je|-mL-0@%Ekvdkr!Afp) z7ffusfFWw=VY&4EUF8>;@dFR;F_x+}P8+!}4MLLOJg*EYQS=a_b2Xm2XWu_$cybd* zJ4af*RcJDulj8?KB5F*JyX*73L-awp3#6#CYk&0|+c~!ya*iJsOPlO!g=*OLJ{m+4 zDPdKrRr%|KUaxYVrrXm0hcaVEA74lQj%b^~joIVBU z>q86$hm!GRu2>x?-z8`{J3yVDQoZ2L36U{p-&{*aCcX_0#LWI{Zsefsp-h+5*_Cak z@juNe$Epg>5k8dZfaGdw%%@e^7<8RF(TrHi}##UJOVfCX(C>|&^3XFP*T1OF_A zFzAcoppqI7S5C`gOLSR);6A0WNK~sffT0q?pRJU33?{0f$}iB|MATr}@c9759jL#v zR!p6&o_M zY-G;l-CM4Ye>Jq2je29XDq%9Jg0S<;k~fI(Rf)ied6m7MNFTWRJ9Zzpu93uD{Ey4Y zI1fOfVRrahO4FXYfl314UY>jFLvi(VmH#;KxL-7vRp~Yvun6pQvw6m>BUf!tEk}6R zU8WIi10H{<_@rh20S?=ocJx?&nOZz*88GH$M4TNBHXC&@EETS#wg($9FErke+Nt=m znaG=ax9R;?wv8IP5B}O@#S&^bB5laKCAvQO{lD2S1VpES^bN($OBU+TVy#$0zyys} z)gEE??A7M+2cOALCsr#Z)6%Pv=6X*z8le&|D2Pdr@ldcp!SLBB%{)X7Ev`CG~#G* zt$+n(s|=usClYvj`j=c=Jih${P(r^*aD4(G0w!N2B9F|iJ#Ws=EEC&q~H)>uSTd%-}g&xn%H~?)1 zXzU!5(KCbQ6@+v#f%IQTBlE$$r;Tdk3-Ud8Z|h)m+*Csuz-$ZsWeXKNYEeW#5afOs zNG-b#2VOMpVgbd$U*l!>Ta-p28q6MLd<_jh3Ch67VHy)buvqR^-4?0&HzK;uy$*)o((On$rcF_9Mca9z;6iLbaTQoV zLd0aj8RwpDh?r#lm=FY)h^#L_#Mb?I<7)l|)aD$SlO@LMx{z&g?|w8J#;1e$Vts!Q zQ`WMBN{1MAA7BWHvC86|YFhrm2|Cd54JuFq6Q%`s`R~s}t@#AOA|#KTUdPXSHQy(u zV_6Q?Y<-*-47b4H+1anH8CUm^nQGB>aJ++pUg43Dr4KzYH>Q>{{FoM|`wN+BKQm)4 zY{MmiJco_`O)2i;6-fDVMthkF3>3xSU|szuxpSBsYbr#)qA9yLm;sv z)MR~2O?D00pJek>lgLq@S>kj;ZwSE46RcqHGMIxQbz^@zfrYvB=vUFkxjnqIx!1+u66;iTZIWA z?~r>2kfw};{`927Tv8wm`}&veh#Z!((Y*eWJ7908?LcT8Z!_cK#h#SYKssRC&7PF) zR99K>doo{C&w_{eO;MD0Ay)}^4L}Go&VItLh61n`XArxNg+ zoE9zk7`Qto8u6r^em}lz%CMSC5QJH<+4ZcKSc3@fsZuAICC7cECrpa5Lp>B9NYxEg zLUJgc!PE`?WvtTH=}*Nsldx7ugzuw%dsHl3!*xLi4r4we;L0jM9|CwX$)@)rjZC?qqi+sL)lMC%7%K^_;@cfJI%w36E)faAe5;ACivhOe> zsJ#0U$r$nv4sCKEcc_r6L%=V%Im-#;L=wt0A$5pU+)cFK5Whn{3EBqX|fM#7B}t6^av~-2H4QOB}O6*Ga9?4J+eH|616|u#chN) z<%?u7EouoT{c(47WSd(xm7Riq*LMJm1m^FCF$F^8zU@YTT5Ai9Hl)|3~&vzC$D3l!>OVpt!q5XOk#Ef+di#iP17k zH3#AY9Iyo~Mdh`~4@)DWi&Tbd9kohkhZbNyul~jz@d3)ZIBnmFEr7hq40;Z$!BY8@);ip%n*$dzMb=1DtT4e+7-&(ASuc}4ip=)>l8RkoVsU1a z$-Ok&5~X6`EjVfMw`3j>XY~+JM`>KS1Jg?=(I{7eH=8WZ>Oa$0W-GOV*H)#QtLtE1 z0FfL=)u<}&V8nQb&I%J?^pdE@WH zavi&4|5{aqHGqOL zsG-t)AWfIy2jQ3HUSRaO*H#HUvk4Lq1Wo2(_7HX){ksNDpxY9X+Od^JZoftWz%rYK z*$-*>-Z4m;>`U?jLi;Ut-h79M&MDh8VWj&%>MgircRhG+;$K^JIeO>pluQkulGT2V z3sXpVM{}0bK@gWBSLbnonU(W~hE-&U#O0vET0GT0PjJM>C;qTE6QUpy4S_p#ra=_T z{A5qyS+ooAHYpYnZw+jG7#mY)&O0b6L^L709xO1-Umsu!v;6MKDWxk|Hx&-dzTw)$ zi!B1R_1g#{Nf!xoX3_**AJveF{wHv?5tIl-xm>Uu2^zj$5PA6N>Vf6Bwhe>y5^88n zuV?fP&Q>~tQBY6yC%yQYKfnEOf_?_?=2I-0S2&IN;}0uNUDktTm@9=(=EfuXO|i|b z1B>ZAOwm4C$>M{}2B_Y~elayWXhe(zcmj5lO3yD-;khJL%q&*ZoKe=8TN_t4905xX z!D`5%S(g3*T>s;BA%PY9ho(sL9j7~LBfR%Npp|7d$pF6#5mW9ZH`|q5j7>2ExPnJ2|gy%qbgi?)azF zLU5?|osa2`3&d|4eAGSo@VI0U*ZA9F7^Zz8qU73;+_%`AVy;n?Xd*#6_O6>73bzIr zM#~R2OIHn?9@^9*R+jNbw0RAc3fQPhQdu~tIrHLb66hf{ zrI4t>{&H=%8&LJZj)!rX*it`0FuG`C3cH!7TJTZvLHxlZy3E3<*8B33Epfu4A#z0? zjd9iims8}##GfE#Qj2PIXQ@LkLEB|F>H6r;?(SnHVfg)AZx(Vqqd!c-TmgN>;r?6- zhdigZf0lVpG1|7p@ZYC|kGtwGmcO;n&b`}Pkz1^4$B)~IjT^j{N!LnzK!daj=F;?Z zI1195co-WV$Mb%uSe)@jg*9@~rXveodcOsEn}e46^Un`U8MHQ}Lba!u3FR)BQnsKiL&MtS?@Cg|A* z3OgCvDPP=L`U>iF(*5Yo7O#fJPn{zo;tY&2PVQ&jJ2dZ$XqAIT^SjK0SWKGGJ=(*2 z`;THFw1;P&rTXe=34=!8rqmC7e`}i4g-KhJhyX&t5Mb@>^i}w-&-;bfcxRFx)y{_$ zbNSbNWq)u^-A_v1uFaw&Abf}`>&NIs3G59=4(W&No$341lC4bDa*Q!aulcNp>jcsM zroUMADSw{mfQlKfW0)m^8aEh`|FrZ?Pmphu75f-+10JtyY*EiSikfgwcH2(D?M%BK zq(7m;@e1oid01G%j5fIG1$6u~&7wH^y47NkFlHqfC+8|P4+%xSN)9?K7TC%IO)QC@ zwY~fM;vb%17@1Hk0b?NBLV?r8N7$zDRc1;hdx5krY$_>y@u!qzLs2 z4;5bDmB;zSav5F|A0%rKW>x#iYUwzy=l5>PD^5HltF4*hN@7N^V{Ylk&SXi>9XV%75^cbb52P#z$u}tfDu5QP0yjdvcBApVhKk{{U zE5i@ZAcL5whF-GI+jCm;Js?{41#Tcm%SwMwl>9nCkJ!vFZFz`)c7#^MqSG{o=A^)B z7Xd`OA*@^q^pVErX3NR+>Wa(Yoj^4VuB&)-aXv{v^J?x!;fw=~d3tyn0&K{c4ii@p z6+RNS!7ZsiFJ_bEs@%9njWeypSYR!{J8rV5M;i!nSk0~>2R7NZVk~PA{Fchbdx;-2 zVw7nvuP|77tD`D)q8uF|x8KFAml0;N zGur7=_3Y^sy!|`Ay0c-=+QWR4xRL%huuK_jWUuuy8fTb}eD31+0+%CEJ9|!Qip36D zB7Cnyx*LPA~fjak*8Ec68eq^o22Q{yVj2qV0V3c$mr)qt*gMMZEb^qD%dgXAM! zZ5^$+4YM^t&uev2?0Y~jx^_~Oz!EIy4y{`s0b@JvVfFW2K=JD$E*SoyVWauGoa0@5 zCNyaaJvSYv1_4G+3kL#s&%RaB1(uS2s63(i5&0X9>~4rPs^8}>%yw0G6NPUBQ}_3D z>@`)}oJ}hjq4*^RrPHXoAzIa`S9)B_vgPAh{odZvaw&d;@GM&|2>HqqG~etA+ybbb ztK+EoP;4`ThDB$}@+PL%OReOr11cC6a1P`AiA-c==#uCysFFe~Dld=$vR~CEzFoxb zp$mg{tFPwqlyH#s0r3}% z`lw3(ljZ{q`0N&hA6@uC)Xf`5aKEXK=oo8UXjP5<;3r(Dg?M>7NP}Bq^aE}@+rw+O zjmkRnwe-9k?EQ#O{9Q!hk3XE0b*oiDy3p!=Jc33TwesT>|D^L|k|(ip*J$;}tz+F^ zQ~-RONO|(j7QRH4Ss0??!|z0PTnGetT#FO^pgCZBWGFNbF4n5*a|TRkTy?GL1CiI8 zML-x@(PRnY#>1=aY7T*5x@f9bCUF5`1O(mX1{R%0vH8RDCJVFVA}n|KAF1vs&sV_# zsf^EBdrbl;T9!qd@;~-`?O$^rii;|)D;6n#hoJINHipUlSxA`4vOsSYw`F1o;_v561NEln5=xp&SEi0S!SI&ob zw=bSC(R_na->>yrQmYp%O1@v4)?Tq@#6Qmk=oxg6od}nIt>*$3@TKsY5FfSA77~{~ z$yM8wVMM!6%O@!0@UXAvmop^1d<&0wdw8x*-h7Akn{Vt}P+lqu8ELhGM;6m^2S+>k z`>lTU$h61VO)kZ=Tz=BPdpK{ECYnp3Y^%2SKPfzmG#?ZNzn=7~ zCzdau0g}%Wmm~g9A7%UYq8_u=Q%1u4?6Ep923n)8ov^wiDpiAzWwM+Nlz6izX}aJY znq}2Z{<$YcFfGt1hy7t6I(`4Re)UZ4l2a8`P8YAwz3h!UpWM=i9}+Ax39<&#sFy{l z`7#HHQnfs@mqiG9b8=mvU5km3opp3P`ss>h{+gItEW8#(Y&KJ*a5rKwvh|>&8xt`m6O_ zxXUaQ@PjaicyL_b{epf;5Ll#bJ+GqZL{PfjGKG>r7)HnWG=QOvPG9IO-RF6AwFRl` zC{pvEPt^TM2{r@$PWG$%?=sUCN#cYkpNoRSva~LiODLK+I$T0YGZ40+2v`Q5&g*s8 z^oosIs%tZqqH;sfiyjRd$5MUI3oC%oP_rbNLRS5@ef_LapOx*29u57EJ0Nv4Wjnh; zS^D^aiq?*OseJpDyG0br<08)fkgWbx_+gYMqg$!X-E!|kGRjpUx6mKa?1y6%xA-N6 z?lz@a1mvDUf0HHaQ}eVlyZuG6UrSD>ot>#@)k)lIx8c3@@S8rUNI|uqpMRPTKclTh z7Yw;g#oqXaUBQanGV3{JYEg=L4=H`03nA9|Gzhb$m!(%)3-5t|&CWl&VcB;l>(5x$ z4a`=GJ;S%l&M}Hy8E=!B2G4m*RraXy3$kE}t){7$>Jd^NLM)#K{k9yKTzJ(jEa4@t z@7h{ZyIu=A_4mHb#h#={1YIn@{&P8LH{foVzS@^+pUL>sAh{;xu#+h1zVDNRCy#Y# z=lMSP_20{DU#pZUm*=yS4QK?>7l|s9#He0GstG=o5}YbRyel2vo_iwl>~=o z33rnal(J}G>VdX=J0xyX?Bc~?>&GbfU->E#F?xOXMn~VR)Crh)-6|-Z3G>5c@|Dqx zeNi5+_3geEUf1K<3iirIv8B7sBpuY4?{!SaWbh)lYf$&-dOi)6UG+QxGBgE!NmPbG z#+w01l$KXd?L8&Sv#fa9sZh(p>~m+m8d#M+p*CzwTD`FZjftk1^oyHiaP z64%l!)$P>K)oJZQm?Lx&d$I1Yvtydq&_H&9y@YlP2x_PKrJjQZK|KCJtjr z_-CvGuO?_^NG0`esw8;#hi7oLc5J>9Ngy7PLIU!Yf2ya%lENcC(mdkI=-N( zrvKki^Z)N}HoXCh@fQ-S|G*@~)&N~AYS$lI)*J(u<6}Wo;kz&lCO`H%gb9exdmmAa z%<5RVW8P#2a@+om_1_N6_65v4DlW{OxBFz{d%$E5jei<^?Ms^wd=u~V5h9K43KdC4 z58(&D$XZ=#Hn2%3jdCqn8Xkg8Q4t}6X`bodX`wF4mrAIGaK zC(TdAc3WXp`Ng&g+Q(rQsIwtNGhUtI@c;z@IUiRLYeqI?l*xq*@-fO3kYdk|CrRo( z+bbd%2$y7ZpGv3>V%9${+pLaTvG-5hwtx5$GJ1PmJc+*roTs?j zQ+l{G`vUxKkv7eTD_~hxD>pR`YfyEuH7P=(^Dai{Q6}$Dw0mh%&W8iMG(-;+&SqNW zk$O$7!O<1yUi)KG=&&FS^miI)_%-s}9yuSrL3TwE z_ z%OwWIWbN4`W`E3{BMwFX9O=7y0@6M*MDeN5bPATbl7~iJ<8>~@sCZJz>GvO(;WekB zk0nP$YckCFmcuI#jTpOUd8;P#Q;JatDgvPP&5xA`!Tqhj4BY^L^{x!O+hiCcvH|8f zv5Qw|?thBYlR$y5Xzl{A>hR~C8`z~8PbA0L(3)ct2hFy-=GO6EZ}EePuY@LzTpn_bC3^#EL;B>9RdW9pDhorobRKG z>6Hu?%o(`6v^G?}J`J}JxyY7PMb2*Lktu7r;J6SRP8!f;@@C?Yw$`&A?!)x=!X6)l z`VF!!aJ+DjO>*vJ7l4)|5rwBhk4N~4tv)N?_cL2nP?;#-Gdsr8cwlXvx(WlCCo&p{ z99+e<2Mw9MQ*jC6WVanRB((|OCX+AtzX)~@^!qVbU#|hQGOyS-vd%JGF1(Lpxw}dn?T^5|ZrO#$b(fgom0@VZ2>!HNS!BB( z+7<;ii8~rFNrC)wsyqV?NR}A=IeBX0j82tX!CDLk#^-k}L|H<2Y4$*8F|P)&5%0D$ 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

    M>ejY+eI@&-BmC^g1=YcJPnVl?#74Rw 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

    {f<#Yx`9%M{vnYSRigbaka)iAW=fOc}a9 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�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

    D}c4tywvIig^b!RZ0h_w2|{ZB<+TnS{!m1 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

    {lqBV64^7^fD{W( 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 Ke)5Hh(?}0CJU&z$Xew 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

    |EsDaVyy8ynCx&O$c-ce_0UG+5*n{9JhA2$V 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

    b3=R*f2)HYvn6+>856@Zr zLv{a#-`>zNq4HRGlAd12Yto2o*+8NuyC?7h?Q~pLCTS87+Ohfz^p($Vy0XWV>y|rg zI-e=27!3gzE5@%ryiEyyuv!<$keXSKuvC!Q;~`j4t&K_v3K|laXmDh zvP|`WT7RT1Ayi}l`l3$%$(Dq5R53vx9BW;C^+69;k$^8<52ky%2eD){-kcTv=CVoF z!vv6**387Il8{n+2PnjdIoAUp4ZgGaebIGzovU#f1Y5hljn9bv1}#YZTA2k)Wa#F& zT1S%@gJ$ic&DCWoDyu_F90_B6`W-N|Jh=<+p&M_X4OCd6_K$$(JnvHh2**f}V>u5; z##uy1<+vn>3uYEZ0L?fDhg(+z1aWF(87)K;31EL$Tt<$QIc29640I0a?jSneCLwK* zmkJ+naiT*RwP#VzjHs19urrboHb%EORt>C{5fn5CsVju+grHchx&|yxd^pwpWN+23 zE+&OKpDzzlJ4+@!f@rGiXlBZUdQa)BD>4Fw2pwtC&io#k<2fbfFUqI;l1`2sQ-d}l z$Qhet0Zp#Oo_rPTNHzkBgut3!r>4Ptfbzr}uD(ie!BOoKfv^K>4emkGrtFh1Y9lkG zD)uB9ce)7+S0Qf#r+Cg06R~^T`2)`b7OzU(Ng(qP;=@#-6))tmZPlRFS^c0&2xMZ% z=Tz(KY9(rydg+#ZHkC60oVI@CD0WPi;h4}1>#I{F#70^;15ki%(l?c3= zS@++ru(zvg5WcI##;9TwcLe?*UhKC+iXE4bw*+MbPM?w*Ln(DJ4 zBENVhJ-qYhVfTKElHFDic4Q_*WN7Ok^+7L}&`v;IhA8Xc&8Qmc`6vgt{@{v+0m}C5 zfL2lau3LI1A!fo)M{m$enBf}a?v2J)14j}_;e$svZhhdd%qa@3!DZNH8Epn>AO~ya z(b^CsM1Q5(r&T??nhC$lM|ZU1?ei2`0c3mRp%~Hmg*_ez7_RRs?;-Jtm-xE4lJJ)z zCF=P+o?=V)WOP2ltJgT+lxhZp;J-?)_PTVJ=M-eETR#;S#lvhH^D36*_EXHzHOr(^qrLjD1$EKD7&GGD6`nPQ(ppZD&?-XOGLFGX7&W zWq@DsCp5i3lB&ZA#HzIqw}@ICgRgvH?nj}x%n9{FhXPpn@8h6*B)-_m^4?=&%1kCG zJjOtyx1%l?DNPlpz|{DS)L}1~1z8ZVZ`lLoco`hSi~8q^ir=l**gyo5+_)D(=?)kvj8Vm=v;{Iljf*YlOoOW@QG5Q_?;`}sgouZjrB2{BL-oOBL^ z#ryaIuBzaIvky^S-vs8!C0FUKTX+wm1c*YDiVQuHtL4igkJA?VckP~+Xu+p4qoH)ufDeAc?=qjiLnA(GI`<4- z&b~TS1^PLSM`k8a>aH3v=v)8Hy=xMxseyr)j{ia zJE}|@mPh!xr--#9#PC)d^zJ`~YDt$u^0=oWCUoAtUbA*xpm;R$oKA$W^o`BFXA@pX zyBZex%O|hjf3AGL!di=CYJ+{+jlwz zc7;)+Fl{E4Nf3+A%F}s=%ZemM5JHaM z6$fh{KzqskmqmRprkZzrXATl%^e?thH!u(Ff!Dm|ap?fy@0WFtK)+k~X+Fw&!lcs-SJHuPz< zC<(Tzd7Im)fm^Bf4L;^sKA;-9H17nku9U8474(co(lZ&yklB|YnTr$6u`Dl=ak4Ie-D~b+k2b%FWG6AjPAY@tFQk-%_>f=N)G7^%@&wORTFZYEMWXv2AVAGO{QdBf<|?kA%tKEZ7{^F!4wWqgUJhp*%nnBZ zv?&VTjFEsupPR6tGU^W+cJeXv(nlZzJnA`v0l?4>vjK&Xoy!hzv5%~0?VDicmAzMN ziEldZ4k%Uh(}4BcUngP*1zc&zchqh{+d`;Yt*D1T+n(@c0oZ@Iv~AVE><(=EF#0FK zy)i1U4S43`m8~%6Ovp8Wn&(JH8d%?=vnblna&gK25%)ol+WTbuo*Bp{JyHZ4!@c`C zo|b^g z3-x>A_L1J~??VLgOn)T<(UrDKf^|cs^%UxS0;B(bX`2NqE$7tvRjvc#Fzv2~AHG0w zZUH}0-jdP&@g#bl>ot{nOcu9W<^?KIc_!U>WvxQY7 z3!_TK0tTmN{IJTMrQj-RA_R2XwC1;Ytv0!`A&t5aX$tjaKG<5k*gT}IaXb$lB}zch z2`-EKc^v(VI-hcQtPAmB#RFe^c160kd3p)cJYFvv58>Rp4Lfi$T*ff`&y~xAOjM9e zRJzYmnao^DIJkRc+8<}=E!iLUqG`cdu6s=wg{<|^pHnA#&3MbGk=%K z$GqC-H33vS}|%^4hH+h(Dk%`_#;rAVP5y6=Y74i(=Hv zHN#_-;Cl!be9SyA{M=kXWeaY(_)qP#|H9QD1$=^5_LHdJ_wuU;G2`(|l#%>_VINUJ zQlhd%XlYx7FE1-E6}!kXnFjS8u6%-25{-P!^bF5+&A>CP9_rKnR8wwB&~D8Kq=69A zM?Bqv1FoWTxUQB)RZ&5=U_~f^y*Q+Sl>d-QS-bUD=-t#8YhwYK4iDy+@9!sT4f&@5 zOU(>h1~O8?+iBJlG(^^aH&IY?d+u9|#%k<}?7!WbkVg#!Cl-1!g@yt%_Jev$b*@dA z0c;sX3+c*1Q5NJZL;S4Q*Nj}+kGyK+u`WK}@rg7}$hah&q(X*Kw)24QV%Ba^sU?g! zvZy~_dUh8X%S-Vy)0n4Oi>Dck?aS}pUaxRg4nlW$Da{_SA!zcRHiA|SfE*1x;|EJ= z;KbqTwp$5sH|lcv6^Fh06C1}AZQjPT>dvY=-jl}2lga{`hj(F$OlaDPY|imooianD zrH|H6{hB~=seqQT3wW!*LJ~}n>Ru(#b?c3^`0xZvhSlfbtro9qN|>XQ6r4G*ApSx_ zOnJ{Y(S*4>&YgUD+F(qyL!uNEWU!A3z$o+p$v4+6+>zQnZrcI^5LRao;5KV0HgPPcJTXg8ch#{_y>1)v(zb@ zjPJUE9eLv08oQ3^K=%?zKvzwkBEPa8{W^- zF3gnvrf;&7W?o8k!TzBUv<~{eZEo|p-kN-zV!^@fCCooUyY5pA7`%1{Vr^})e0l+Z z1BLi(K|zn#j`MPs#Ap$KRG*>whg<1hP zU2m6D!p$9j?ub>9=~f9{LFd1FN51E3^KH8IlMny*JqC$bCNlrHg99eHkS~sulymY8 zhrHPS`E()lR$n_;C0|2C+iSvSXZmS*qv&vMe9=s)XX$Z0dKw9K>ud9TnZsH0;=$IC z=>jYeRzoPA7{)qVMvHn>tIK^)IRi#kS@*eGpDda(X_L(66z?$~IyL1K>K_RphvP-= zb9+k_c86aGD=%E$?oyeb7dJMxectKlcJ3fkXYJMe_<1*oA}<9y{pClA=hVAa*++0w zS0G-*pvbcVMoVC(QYz<$DdxNkS$C`m@=F6FMAxLWZ3t?!oL{MI9?2>#JAPG5?xns z%QVLWT?yRr&8{;RZ+fwxFV7}Havs4|goJ-bqhLenh@?LeQsj?u2gB%~VQg|F?pb%s z#qO=d13PBIq&2zWRhl-Rm|MmXz0k=h+!8#@mJO|RUgM?$sf}hG^;<)o(_0>|Mq*?* zK(PmUF@1{#>Fkeb znATlu(?K&2U?gR+DmTgEP$>xl318JCmfM6XCIOL(Hk}vdi^e`q*61-a2&cy907DiK zeQcay*I`QP{>5+$D51m^1+H2RW^{6-+p;kZWeH>wT$I--rw|D^m2p;$j0Y9)otTR# z`ffVHOdInbwK_9c7+;@`Y~z^U$Az7Q;KnCagJX3?v(628Zkbqi$$3O?N1FI|BUSjc zJ1_sHlM#~1xTMF#mg}Y00KT#51m^^U1OR&Dn`HOlGz>EnvI^D76Gi`YY{`5ggUJdMGzs`gs*B?Nz}eOx3I*(6Y~r-!!|#D5Sr`B>5l zeNwmB1CVlDK#wG(mC05L+Q(%3_lQ6{gi^da$PG(u<`!&6<@f8cJu_n%VpA#011jRS zh!|Y+gwOvMqi1;B=oB9a8s8SqULj9H%T!Y?@Lu;1MRwngBTUP}Osd9+D(uo?iPkvb zg!VQ;56RQ8q`ZQn<_>2d-zf zi4MfX>ww?El*vVlt-qPdj<`&vzN= z6jeOc-9?=v-)b9eLJ;w>tvZ1FT7uUW2cM*>)+bS^NtKA{s(mDUsf+gzdsYXV=M8)B zbd+FfF)iojP}>8qiB0@B^zd?({9+qSaP(Iaa0Y_nlAk`DC5Qa?ox=S~(=$Nr(m&{N z;fZrP73wt%G#{rghkoXJ(BLn}hxiJl!6-Ru7Wu~qxtZFe+v?W`uu$O_fPV_mHDaFZ z_F7{S7u-qeT=IX2UjZ6)g{crl^D8unH5~?u#>6o*B9-WVUpgZk2LS=Pue57-dVSr0 zv}m+T@cyy$E>KWg^9Wltscz($G$?S}m7DmFJwGqF()qR*=T`H_k`#_iAKa%PA00i4 z0I=_;^N8fE)N8{w9XJP!KP6*H5Wh*KctSvC6r|KTJ@qB0ftCI#VdW;gd2t|;J=~V} zu?!XjvFsSzo)JltgVYpfrG0^uU&b)XOvjeuAp&IGf`M4sgL>acKsNB9jD{Oq!w<*_ z$qi1IKYHezhKGVRvkc>Rc@Oaj2yxFX@+KA!EVt!14+RrZ;+92~& z7M|i&ojErP;5a@Bh(g7hJRE)pcfpubcWScm_B*gVNtz!)il1g3h>&Q$TGe+2EHs7@ z6ItYt!+kfRNiD7+vG!9~HY*30Q>MAm7_ZI) zG1FngZ(0F9kSg7Si*Q#3zw<8vagefLju zGZ{=JGq`eW(SHa@QiDD7T~N`16gk8J?X^ccZ7%%>Vw%<~^+5UFSPVi*i%w6*lN;zZ zuwXcU_Rtbv=cNNpVK_F<(^IALmJ5C$A{p&tOw~J%eZ`_UE7YBA`u+N{A&7KIM<>4TePhY%M;Nk$NFhg&b{IY&AoOdc#Ep3?*j3J~hh%XucL6)*eBlm2Y!U%a^l9EdUX+QPd9S;s=Jf}gkV4Y5;-x1p=v%JAjWQ(Ia^q&g?$ej=# zkdUUP(Sxie1~F)*wPrx5>UIY7#Q)ZiL!ZX#WI0I=G=?!3HvPQdA%dt3OIBx1-c@e5 zK7R`Xp}YGKrVD&$eSD^dxA{_iJn8M`ksMVtc19Iz2HZQ9sCKtiru@_c(GS&;X%0rh z!o_7Ki`&fIw{2(nfn!Q(e}c0f4z=A4oOW3a-JxG43%ADu_n|?_<@pqA-$E|S4>K?r zB2Hd)<7e^IAYgKB-7$CU7O>D`>~}xQ7+QGEu$@`!qoTZLPHKvRvm9)Dir)Kx3QMdL z8Ae$DX3!s!`=wJ7=;uAZjW=*!R12VmD2vfMNtQqi3w*0E8n&td42WPmzWCSM)Z)JPNFw2Bx8FpXBH8E3pQ=R&qSRSehsSDR8KZn=4al9gn+{t$2 zS(CrIBxvW7h^+T_9qUL@qX&QlC*6)}Z^DDg7oi8crs;`xBv#}oS+D35=JeH5ev7bkIve%Vs7)@E z0m#;f%?M3##Qci{AT6iq@nSE~ZvGHUXyTl3n{44dhEA`qcMB9ln0kpH*ygP|n`yA{ zCttUv&5nXlLBy13&yoO6vv%gpF)`U%;|Unv3wb-cJUk4A+KciL$0k3qD`t<#J9un5 z&^GGTc>}Tt&EYl=4KeGXA#eS@ea+&>GHRp`e}h$H=Y;f4m|K3TBRyvOh^@N-`s@LH zgE<|DV{zrBfmXxMB$PIm#?43Enk7(QpiOY)AB&J&$si>nhN4!@-zrT6oPN!eK_o(g-M0xLtPR5B*jjca}917L`Dv~!=8e^L{MF3CVoxf3O z9qUG6r^!v<%C+^8MCv&F1s3cyg5F&^Ay+Y$VVr6kxHcam+v%0QPzFIGzqZ)^;25F0iqcCqVR-UP& zNTTKxm-dj&5^(MgjaDACQn}M`P?>Y((FV0=Ign8)D;Lj7H|CHrSvM`?N{?p^)}>#Q zcWN@aU`$q`biB<+H`a=T957*`3S+3NR4GZFcpp9ym(1Djs8K5`g;Yay(5cv3V^6Qk zd2Lc6NimP}1$e=>ZN$t(93o7WgkhZQZnUnQb+K-uxS@%MlQ%|ugyTcre{McC+2vGvL_j1%y+hvRLy5O!p z64Gu+y2fx$c>HqbDGWL(dx4LX-Rg@yst%j8A`Ggi%pUL47dIE+bZmwH&FKXh z^_$JK*P|B^hdDrD2Q8>^@-CsWya0)FqAQ@^SYH699EWpS!Ms4^_%~6<`~J<$Hq*i4__be98$1CExI~_(n1LGj~`kB<0oBmS;7X z;n;+^(DEXo;n6S0gGzm=Zwaf6hGv$^Jg^mD3zCUT%2?c!>+?jf^%+?#RLW*W1>}D_ zHhhxVfHh4(mvhpNiBi=*ewzYmxhEK*pjJL)F+lsKzW4D25Ym`y=)Tu)-=@DOHefnd z-UJKBn2`GOm0z6=!hUiguuG`%3hDnipPW^D1}BQ7n^0p&$#c1J`+HwE~edoh@QJltyv#bbef$|_vPTy?)C6f6y|j}T!;0a%JLuUyJB7Kk{L$+}kbPVm#2 z`kw1_-1!bCA5TjV(CFT(ySW;S?*0@$Qc8e2Is*Fvae0d+tIRc^_@e zvC)07oT-Fbp{dy2Tk-hcP51fG<7~;@I9^0SD)U}rX_W%OFBMo(n}fZ7OxBKK#N0?P zMasnF|I&D$){UeFX0BwgsF4596cx&JPN-t&+$gplh;0?3~Y&>boi{GLN$^CE2?JNBSaa%U- zd7^4!Ena?7Eh8XgJKwDOGL!VMXeOZMUBB8O=}7_$CDTyp4HCwvF|`eaS_St*{En=@ zrF#^T@qQI3*7Mb>T)*$=m-f9xa~}qVCKxf*2d|kkDpc8TonS2b!6Ii(CcbSJ>4CKFn(eI`CsLV)= zI-ry*tZI!Y=_2y4i^MN+Ce$9WD|`EFa6>b~U*?~{Zi{{F#)N8RI5J^iKci5V*)mO` z|Hu+!b7IfL%^qxvmt^tTxGZF`Htrwza$^eF0p_ojRVl6G5Ni`^W)?!Rb}Cv*_`=2F zsXH0DRp-#I$KIbfxz1EsSerE-gZ5$`9$D?jJeMKLLx48V%!Z{zo&$X`B`*+pA%Njw z4qrvi(X2P76f_65a=sUYEP9nQm7^A3GqnPU`iz7`aG)<)DyV%BbBGr$U8>;E>`U%B zq(_xs!k!m^pPFKfbJj?WpSA(YSSS(T1>PlO!C_W2X3Y3J5ho(duJJ7(IUdWQb09_Z z&;c0bE({p6;cXfa<{*t-G7UG7DZ@-pxW^M#{%0Ez(R7pWgy+^uG#y@T6I-E{7k9W# z;N%v4tzZk|oAAb;HkV#^KvH}HTdbN$pLDg>teC(#%^ID}g$`I#o7LJ+F#>QS)(nb{ z-SO?Geu98cyp$$*(-bDe1A9pju;M8sv7Y8>KFo9U{lZ_sTn4lG*7ICHoDu$)I~f+c zaX`8rhS#d8DGvC^JIKISI22r*U)5NNjwq`y?yIL52!5kE%<}520x&Nnq?HH8LpQRF zf)3!r5>t*ZW^l_xlNcWC<9FPul5rG))aI+s{Lh5{_cy2)=9DQiH;}Sw#PvOJo}`8N zs~eW*C|b5$N_mqx}y`flWUy%m+cKa3wKcTgAS#wj&_KHF4$>pdw6D zx3x<}T3dLyU_Pg5*P8iKnjxzwKw16+OVyXw_Vj^grutz zY~^@iYsq+KMc-6!IJ+nnTh=c%I?b6Wq%z=bbNV-lgOgaZ8PT`=mk;^E#pfSA@fw`0Y zTmjlO8DS!e6ux8pp#dVVc3-k=XY->OBMQb;&ASP z+gJ+gLV@lqWL&_CArR>u%ZZ|xd|KjIDIS6V3~vy@VmCOJriBuTz=Ib>LdTaaj_ddwf5*wx3Ou8nq;dB7hMqc9B z5i%Z7^<4?XXFBh|DEf+Eg9KHG@7AP4fJ?D}S#|jc+09n-hXLDG!68k^X0y%qhC*{V zhYn${mZL!~pu1gef!$<}$7*^!7!H~0iWI%4F&E5C#CYaw!m+B~4`R)SAiKH#Aoejg|^{gJMBkUk04y=&Sg!@f|5BG~X)U!RWH348)LQ*2q7o)|8o*ToCCiiu5T?t z_!SM+XK=$P%-x{4zM#SD@IOSt&-ndD)7?Q|?3laN6j+rDBd6P+L@v?g=6ru2w+V+D zOnI?_9+4xozjhe1A`{JmTU7oT+l7d2##52jld8?P!6dL*>{ zBfGc>Hmjg#7r6g#<|THZM8_ex7tZv2Itew4mb^Fib}A;1#Ecpi>34QUn4b22rmH3s zSfPFhZHxC;GO}>$&9&fUjgQwFAw%2TY2gv5J6G&hOJwMrEho~MU~}AG!1-QemVKI6 z1zIg>mbid@9ql~&Pqxpv1(<%T4uM+rv5{-}#f_I3Oo}2-9{f-{M1CxRn~ppkEpCkb z;r8glV!F9oj`}ko!eDC`!+5+Jcmq3_ee(@YNBh2RiOG^2&vqXwE~?%%U!oYz$e!9e zQn2J{ga{{BBlO#%!Q9VX;$8X(QQBUgnidCk%)`^lRhd6Z&NUc26MAZjBl*?zp64i& z3`K6J(zA~*UrdiAbe){hyjW9tcW-Lr-G_@#gqS%s`;N_gQR#mn`Ozu#DC%GS7#;HB z2arjYX6gqIfY(WWEgN#!-ZeW2lI|>gk$`?9Bq6uT{P;;P7e{qtS3xmyA{(yY&5Pw0fS)0uBEioc;=3@`Ck+p? zxRYev*5!uv*y7N=*v#ogE;mCIs|GTbvWlENP{@~pEK#zR{5yZ)-F1Kgy!$4BdLIb( zXV)Yg9{|01Uxc1MEa0FCS=sRL{Xs%28_veeCS>z!MHXH+Zw$$U$P)O;ZPgtp#>92B zwSf4Ufj8jVA6lw1rw(CLRXKQalRF<;?VzN~9~*FN#=IW3HRt{Zx0J;LKWEAV0&Jw+ z``j(#OHqDtJOiBP1MIJ5%B$iVULZ~M`?T&mQo(_IT!-9MQst%{m+aEJ@ne5tKtOEd zu-|VsL!quIe3KYKm-nRs9kpYe3e{Z&XTy|bXJ{wz&@8PCurw({3byT;mo2gxow`Tb z6|RS-|Iv9638zQLtdBn0#-%VFsA|XwX5z>0Pf$ZAJ$|t3zSK9*HlCQ*EUN`{h61=R z|NAJ1YTsLt@%J~knUkE<4{Hgi==j^bFu`)q$}kK8eA8w|^u69^N0keTgEPcjCI%Xo zUIap}OIF&VsEdK5g4S7u)fx(E2sl{x+Qm4Itp~FL%a!2AV?7;T7dS4B?Ux&{uhJ<@ z{g-&n4`X@QcXgTT+*3kQ;i?Ls2?;7R?D;0bkNGjJz4}BzX9LNc-8#i`{F4hk8DAwD%1dY{ zI_*@smdJeWXAyhrbt}q979mz^>)->&0``?@sE{DCL?wd-saMst^5ATPCW&U*oW9yB zvwT}Z+HF{r`5n0^??g~)Cv^HfX*jg12biTfZ?gnuW7cvNs0Zd3EjsKJ6DK@E;`wjO z?MZzT1v2->EZ1cw2dIhdHX;@{IJx){P8l{8`B3o)Cn}Sf0p8OD4Xfa%zvz%fACTu zs=)5?J>N(rE5bsf*ZiumrB9%+whhaL5fF51130jt%3qwWG+a8Aj!`~DG}folRRc09 ziu|!U?iwr`sRZ|;GE6>KQaiP0C)?o#v+=a=f(5+aP*Y0D8$+?Osd z*`T_;So9{SBD#|u{4#X5jioA^R326vY@_T9#(qSp|3Bf;*1OcJtu7WQf#jPnAi8Df zYyZfBvoNb&jMw-V0$NDDk`OF@Wn{XY#5?Ztr{e)0NT1)fd|C_T1-%OiG2?IS=OKz~%$I5wVeF zEbu*1BY|(ZNB9Syg;|tJd*d4tCyo%5U3%+m?qqS-g)xbw1jFN=a9f&zv%%s({#G){ zxwx-(K%8!UH+BqT>k&oY{2~9^x+4WgodQ{+1cBbcG02dUZp4cxj#%9+4x5x#=Ix2T zw+%%0t@r)KKBUrs>Pn4W&V@$AS>lqO1JY2sJkNMCZ)x z(%<=hblPXf%rW-Ig)6-5|on?l;7F-V5lxQwqOkJeI-icA1ut!s=)fOMoXXbeK|+# zAW%VtG=&&?99-M1=@DPFR&aC{!%9$?#`H}khWwWBd^o+xTi%C5nt~Hp&3I632p`Z{ zWnpXE`j$-3S8+rK3|4A1&#Y#Lhqslwn5{~<@nqCx5$;H4y9n^V@G;&xQ3?JZi3qI+ zX7QZ^@X`P32KdnaQ>?-RQziq$({v_tQ=n|TnBeJRVtX9G1T_ISxJgLUEwTZyn1#2~IG#*<_Nn<9Pz$K&B(T_{gX@WU6iLGRB+1oH| zwo2VFb2TRuAjBs64`>x}ggJ&iKn#pov}fR}SS?GwKQoeK@tx;CE^kh4oT79U(BdAR zn7ZE{M?*zKW*v+!44_kAU311>9>z*=01kZAlhQL4lKa(l>!J62qf>H_*ugIBHQw$x z0< z7+W9%2YSDerx`YX-Bsb?`Ha;Vz90%@Tol+k_|6$+Qxa^snOos&BzcM|5xJI(UKo@& zK#_~_bS|4`qm|U5jBZy1qZ=WVUE*8b))&Kk=K`YSl0EHWL0glYvrqO5k8zb{daXM28J3z$0L|4G$jg@6ynakZ4FYu9HM^lH;ZHV^Q7^07k`l{$+8;C+t z5$4VWF7RMeIf{=?H!~Y&G)tQlZBIGL#m5|#ZK+7TPvVE3jB8bp{``Pugrz3@4konnh82ZCm*y=Cku-V8 zj-M8g_P<(ejz#R^mvMGEHF{m2#+=OO_1=-G&p53RmN8bCc3t;CEjC-oCl~*hiyA*g zGzuWJVeM#^#$#3#j`)M3L87Pxd*{J8g6`j5=o5lWWhT_?Ze+B%+hma0*x0Nm-B|qx zcP0|fBDw9guEo5}@>2woGxO`*3~2AiHGnXD#~1V0eE2@uu8-9ajA*4XHp3hVvAz14 zyo``1v+IBMr{%N$d%{v!NmCHv;jM&PVMTSY`4KZD;GmkcTJNq)P-^9Y`lr&2VQ>G& z$0k2w3l2o+(4jT*#k($L%LUVDU_t>j^{LUbpQ`s#m}>Cf3wn%JgpFv6wkqqdQhZs} z^w_Y`ZDXi}uQZPZ6>MQ$B8xAv(;`qr^MXc3$~6%a-tKi1wnUj1@XO6TP~s~RMSU9o z-o9-{4a7tDpC16l5))P}O8m>5S6g>7U5`L~+)Jr}i1;_tegJ{!B0VKUgHJs^RO0%< zE?hw|`Iq`6dZkDO4q*E<3gw)#yVsU+z~q=1FAaFYbppQ;kS+P+r_yI!{7iK6-t$?r zM5t3?pD4Jsu7`Ebrw}L7mCw8eJ^NLR?ysg*%eca_8?i~mlG-v8pN8CfbhdE(D@%?# z6!=xIP(32w5j}G>=e&-SUZ=vI1W4MOYO^i?12h8k%p~hkp;;O4gBrJ~U4K;9(7t4t zdWf?KzFDGMRu=SWR+La}GGfi@8Fhdy~Sv6 zKtxH=jyyNqE4fCYoC^INvf})mCY+6Dx#WA>JpgKBaIwmrSnVzk{OCqXiIWD88xJ7C z)O`WHW+j2%N4Q5HC-~nC8#%ZG$-D}aCVg(*5Jo64I}pH7IaiQTD4>i;Fi#(4cUDOS zpgsu0XZ%5*N)sz6q>Q5&X#|V@@4-;5ar*RwTLY6 zaBkv&|2;>bGeK%F`+z(^>bBGbCd#Sr0(k%l7B8X0-!IH~{Q~e;=7OX2TgSbv?u;`sD1C}`yL~a369#RtL`vM&`R`Kr7zS>S( zt0=g`vL~A75NPjck^7`ONR!x(L%cz!@{sMd7gudpq?_x$TF|1bVL=lC(#jXP|LD?X zM{HALM=h*;vK2pCY57d?#-L0!%BdIyYQKJL^qQ`(6 ziEu(RUkAx|?$|DUk8m?%t|m$puEpY8&?fKZm5Us2ctFRfw-efBf*(PG96YG%X)c`7 zNaB&vXFSY3YlHOFwT(49 zR{Q@AE5m``J~qV+6u~~Q`bieM?|Z}2Kp7BL6Zipbm>S(fceMA;1T9A_pOThioS323 zu5_WQnX!HE<%>2i4uw{5vK#Y8i0Hw6;li~9X53&MiFzwNqWEKka=uXT5`qQ1iu&5V}T%I$B_FZR|<@3~-T z=nG6>xAS0UCsGVRpc#M?gpG~p8#Qxu!gM8M%+8`0(BCGSkxcUV(*A9T?U{kukmPkY z67h%~O3I4D{1FoB!YOR%u!y2l_4HQwl;O|LzbC$;h-h+{f#9*O1SqO%z2OvAc%HY< zSV>p|q;zn*opt`nb~-JP1SG!RqApysCzSJDc8dSa+>JvP2A3BL+$NSy(ErJ}#2x#d zgRi9mb%$4Ad5p@F17co}%jq106=PEcB+@!1d%mK?7G{b=_3Lzxr8iDn8?R*{VEXyAS3}0Xc-7e_(9K)ylIP@Nqgm)#HB)>-}XLSlQ z6IJ{7KSu&+rGEqQpmj54L006fym5Kl*NxL|9Bkp=|6EI}=J-b>j|o3Te6PWDy5*nX9=t2-h7w3|6~jWadB!@B*_W{zPN=;9@M^5n#KwTDi0}9u zd9*Rz9vq|YrAc8LYF!>X$W~LS2Z=#isD6sSviAXQ#Kz*~A!D*Yw8;8?j>%=iJPEQz zvR$AQTg4JW4IIX5`|%E^X?i<7Q~Rrw^hn!<*JI&(u#dxVZQl^n=rZ71ZK!E}{{HPk zZMEhUUD-zPWSC^_n(40om?!Z;4Mm>3K|`=uf3;HrTV`%3>jD5PEdW{=3SY`LL}j8|l13(CpF=1C^0WMAgN?MZ+}R zI?d{1v$f|b2K$NxHb*H7C@Wh;bj&ggF4myozgoOL5jYOrk>7I*HF>W_UPzCD)-!)C zpg10b&l}e47}1Kfd;!c5JXZzQ1@n>%$uW_IiC?J>$3QtANw($^XpJV}?EY<<^seDq zs$Bx9VF~r^1JBs2ydbO&hjX}IW(-*R)id|vj>lyfR8u<27|)&3p`ANv#R~nbxoyd+ zrti^JIi5W%qLA=o2KP~b@K_;F12dFw%2{K6zhiUlZu|>JnG+%SB5gT&!Qahl<_+7; zpf{MSO|FXvK}jYUbWAo#H3&kAm_d}WyiS6f^jn(WK?L7|&;2k_TawUTAFMvcNi;1! z*yF@Zn|njo$5(piH@`*BJN}TF9sfDzl8K2MO_96?!i0V4n<)vb__SNfK$LfzMk*#*+=!_TMaL6FJGIE`;->wHo7}=Gu zV9%`#B?78FT-h7&e3d}ZoUTvWTm5>PJWRdPQdWAgamXksmi7?M=tN8J?sIUG7vo9+ z8DpK*_wXfJ8hW=Wwt?%gS5?4V5C1WtNbnfzxp1g(P+eV>mypudepZ~t(nis^T1>bt zHFU2PnmwNJE>mtLs%HQ|sQQ*i6Y*&uSDdh{O_o9v;no2_iqDb1Td$Q?QYJfjrxEhp z(LNcOknb#xZ?&0feGKY`r}O|A=w_*-b>!h}f2P*O8r?S4%TX59+s@bFgb|jLqd!ITCc@t07P1n^#3mm_0Ud9 zjUk4`h?`->+;=zCiyiA_NN3;qV5QkY^hUORIaD9;QwW&__Ii>MsrGkNVj^t zvqW!rlV4mN>`(P{NapIs6>G%`w?=zoqu-JbtdG$NRi1(==LQO7CEM1->d5u02&o9L z%uonQOZsdiaOmGMWYb|kFCHBz0jN?(o7Mt!#<=ziSe9*YcB&$dOt?YY3O>4obgsm< z5&sx3ORmSOB+PVF+4eSWHWc@N?NYvPy*~Uo!WAUe0SJ%}rj(G4qKD0b?!oF*MTD!0 zLXPVhqInVVySXoU+Y9~|#G%#z9Lsi11Or@pvyB@xVSDbH=m=-~&uAWY+-bD-6kknx zJ%iybp&8y}6?8ar9Yhtc z9xdGe7Bf( zdV-IA;@;sBIXPm=vyO=c{Ej>qh?%`RqO-`O;eZ-DpMEHLmmUa!AAjKceX<|a%4c|-!D3Gs0 zzdmhF@V-$w_AY8pak^%L=#bhy)v5*8v8Egax2!xg+^)~-4MT#64Ajo@D0|kiGAMMe zXo8F^=0D(?;TS|K|2gW&228G`CH{#kT&jcwBIAMo&}B>J4FrXQW-t0cK3jOw^I;s6v}EPkz7n8_&(sp*nN&NY zz`~|Oj{ce!j}g5*q|_bWdCTS#+;02Ts$It2)Ky2lGSt|XLDWtc+Ki`-O1TjOH_TQ` zo6xLebh_Q+3`KyeeqGnhlARWpF317Z+XB8-HpEm;RVDS+Pr+ABbjpE8yqT?b-~>)e zZfn?|D*lIXhnnTBr$7gZa|{-%kJ;b`g(xJUxrh(IYn%j7;wFP9gRo)i+-Bst{(dUS z1+?lw^E{;s+W%NF8mWcJBx5u~>}*(?Ca<7!B%q+FtRew>L%NpvDm`yj@f{w_ zqm#BReUp`+br3HUP>C2o21th>c+@?r-9y}jix9a$Iz(OLGM>-K64Jz*+0+-6l9^zQ z$N7^eoga5dy%6|Z7y0OKJiC^2$o{y-_D7^%(AddT?^o8DJ2-${YGM@g7sW{A*PhW( zqUsa8r4^8E_d9|b*r{9n2(v0LgT=5q;p?@aqS^7z`wQ&xWGW&G7;{E#azSg23*BWx z+CviBGC;j|ZA0Ui{NW9NNW?L4TxZZb0qB6nJGx1juIPb67!)8GJj23;W<(KY-b9Gg z%F^?xj0NulQ`X06Ulw%TDmrd?+>|({1ZQ@N&a=ZRJ2>-0q$`Vh=To;2?E9BI*_o=NDDg(!#8^*I-xQ*~lu&ZfW8!Why0aiY|U@!yLbio$4oY_N5H_Ye989|_uepc*&jfjE$y-$ zVbi`wFs#m33F;ly@;rgq?&|Z-Sf8j?-ranG(r0LbTfAA>c3H6QH1u-x%BdGO)F=DwW3V= zJ&<`U#4=4fci`if4#LOLuc;ajD`+#bs~IdZ$?1;{vRidPfIl}IiRqQ6pjYN7YUv!y zXnLhZ!QdkjP2)r8BL!UG9jZ+iB;+X%QWE&(ID-E$x>|Z9FYdt;z#9WK9~)q!q&M6Q zNkDLOKn>i++2*zWu>Dol-UqB-X+YY|fK)V;@M{8y+A$ZA2YnE!O4hZIee;`S)MCg@ zlYR^)5K&g;zFDL=%1Su^>!#Y(9ffP3k%1-z%k8#E2l<}9J0i}yMndo%nm9hl0z*spCZz0@ z@4YRI5d25nC@&t|RW+9;CvU1pJ)wj$)MNfGc$$QE*rgArx2ap;=^Zq>XW@oYFsS?9_+1O%_8R8#zEbKoAdzx3(eMNsz)Sq6{Ku%2$#>w@G>B+v)fPE=Ot; z>j;jV3cmi3F11TF@nKnF@kr#0`$_%e_0qwt7w6nabr-iVsyWeDO0;t`lySTJi`Q~cM&b!=dH0T+l|Kd;y$?qhZe2DVp4QhN0p`;Kueb2(h1dJ0 z_*`MBTZG!fZVkUW3Li?g!ro&|5z4(()u z*s1ldJRHq@+1&nc0m9xSD_ee<%U0r3|8*qZ{m;6WGWMo!nscNJ!T0W5<@KfQdYc?? zQ$OM?{I$K^DBgGtpI9PwfD1Av_~A)%b(D+C5G|31fBL1|{RSLfvbpg967vySVmcZ` z7Dcb3N;usBBi>at9~h;0mBCWoPkw^?bFM zZdlVw0>Y8z&W3rjde$sK3XC3@!kuw{<3P43qG-Zi78n%5m38NT4f*_yDH^P*hj{Dt z7EsjRN{5whE#C-<6meP=Z50`hdvX;%OFd+--nIZKox{u^77OIkAW^}^t+5GXE8Nj z^YKcF(#PkfI*~&tca}pFJXQErK`9Lkb}U6g4RyG^j#wFNIqGj~Fm!?xLH<`TsepeL zn&M=$$WVWrS!di0B+c-wv)boU_+IstPZb5WJz@RNW96sMuAxm|>PM0XHj$D0P==Sa zHv@rdCQ{3qM_Qz_KB7)F;#?)09ucy)}(Kr}Xa+i+**#0k(S${CWyO8yRJH%g`E@#PWAXw7s({bbXno^q1a9_4eD zbqWI`fAq&nM&!f;E0HIYkNjf+uWhix#GdMN(E2AUo`)zopdVE`ej-l}DhN3>!PPU_ zy3$6!E^<`du_mnMU6MN0ZoHbH^T10JN#F=sC=n@^*gF(IltEl5wSa;gRv9@IuQJYI zzb>hNjwa+NMpJtX)N$VSA%;{Ko9}P&w_r)4D4aK+x;#N)<%+edaqpMrQb5g}0@P%? z&i=pcEVrNv3gM_R;S1t<_AtYgALtF3E?+7C-Hk$5H({jmigENzV;Ykro$y3hYusv) zB3Cmfn%1=>dWmN|U?Jc?G=xaJ&f{+fs#S-(lnu>a?0*C26e-g8{pEJHADiQn}xVJMvf$&!_ z80a8A_D3|Hq}N*xa(PDR!D^A{&|2mutJj4;APkC$!RSO>OvOz`goK3b_oTuDq)WAs z3kX>`xmL#SXgkaH9M{WjuIWcr3De3cV>d!#&I9E0=8)H6#0biRS+^b zdrg2Q9aR8})E!%0>oG2K>IC8yRU+j2E$kiZi_NIZuz%+#RW=%LYdg}Ig+sK^iPY=mx|2H6 z&tLrIzDEBMI0dVv#>d#oEM*tJ{ye0ExHo$>;=5PL{r-+(A`G>R_Nq9Sm;u;9M9wG3 zf*5f^FUR%RPiQoH^o1g)o}DUEsP&9a0J3Vt<+Qsj=Wd>0<06p+wWIR?3O>~ZAL0F! zTHO)}H>V@V$j`LR=1L)CuK#?up960r0UenM6!nnHz;zuW7DAu+Eij^jPmxRop~|tO zXbcwtSGxo_QG#%iS*K{mqDo8N#6kBR!g!|`?0{riGhr=c+&6v*SW)?xJS01)i>`{U zj~g<{$_qu`#e;8`Q9$isnpzM80Le=j7+1|!@F62k9rcJIJc)ena)h$UT4WepzJtJs zAM`%tw7uATAJ~EDnWf}sgniTBv6IaLw(vmXuXRV0Sv}uyLJL0hQ;eK&?~MCuoZQ(M~4~FzI7^%F4xJ zte#{1%sEiGE&J?0? z3QE$W@rW?$N}a+o>Q};?bXk!>hf4D5*y(b)WLb_kXiUy<+97hageogl7Gx(`feF*+ z)e6YeQAtv{{h~C*Z7@I~&FNeYekb*Yk7_89c-|IMtBTN-=+BML)iy%^d5D0b_TK7% zNGpACz(b5q*t9Q4V@n@F7DSDVrCOrQwN3A*uR`sDJO|Ymfm==>SD)kb)zctC6jq)6 zztq2@0EPmraHt)}5x`?*1t?sQ@W}j`f0vX*m!#hY@M)NZf!B_uVRU;J)sO|w1hGJK zg|48fVhCVi?9vK%VAw`cxV1z^C$}Vbk8yAqo-ndcqpp>4dVn!#hZ~^ltsSZ~BuDk% z17$gb5af_KIjwf=M1nwuHeaC`nSBHX2{^H_ype!@t!(&==Sd?{Z^*0QS*Txte|JIm z8Mv`)pbZ8H7k1W?$^pN?GgrlM07QsyylY{A4}4#~IezmR=5ESAIG;8Ry@-pP7m#

    RCBIwi;+@_h@lksD-j+#eM&_9K2XugL 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 fse}^+#+MNvG|`kYrijaSQj;*mqK^fNmEP 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°>QZxe_+1flVN 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%0Dy;_Ixrh1`I_)zVAw3#^F1P{6_)>sVv*Kg#s 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 z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ S009C72oNAZfWZGHf&T~4aaQF3 literal 0 HcmV?d00001 diff --git a/boards/galp5/memlayout.ld b/boards/galp5/memlayout.ld new file mode 100644 index 000000000..c199118d2 --- /dev/null +++ b/boards/galp5/memlayout.ld @@ -0,0 +1,48 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include + +/* + * The bootblock linker script should be included before the Cache-As-RAM linker + * script. Indeed, if it is included after and Cache-As-RAM .data section + * support is enabled, the definition order of the sections makes the linker + * create an image with an almost 4 GB hole. + */ +#if ENV_BOOTBLOCK +INCLUDE "bootblock/arch/x86/bootblock.ld" +#endif /* ENV_BOOTBLOCK */ + +SECTIONS +{ + /* + * It would be good to lay down RAMSTAGE, ROMSTAGE, etc consecutively + * like other architectures/chipsets it's not possible because of + * the linking games played during romstage creation by trying + * to find the final landing place in CBFS for XIP. Therefore, + * conditionalize with macros. + */ +#if ENV_RAMSTAGE + /* Relocated at runtime in cbmem so the address does not matter. */ + RAMSTAGE(64M, 8M) + +#elif ENV_SEPARATE_ROMSTAGE + /* The 1M size is not allocated. It's just for basic size checking. + * Link at 32MiB address and rely on cbfstool to relocate to XIP. */ + ROMSTAGE(CONFIG_ROMSTAGE_ADDR, 1M) + + INCLUDE "romstage/arch/x86/car.ld" +#elif ENV_SEPARATE_VERSTAGE + /* The 1M size is not allocated. It's just for basic size checking. + * Link at 32MiB address and rely on cbfstool to relocate to XIP. */ + VERSTAGE(CONFIG_VERSTAGE_ADDR, 1M) + + INCLUDE "verstage/arch/x86/car.ld" +#elif ENV_BOOTBLOCK + + INCLUDE "bootblock/arch/x86/car.ld" + +#elif ENV_POSTCAR + POSTCAR(32M, 1M) +#endif +} diff --git a/boards/galp5/tigerlake/chipset.cb b/boards/galp5/tigerlake/chipset.cb new file mode 100644 index 000000000..f0576ad5e --- /dev/null +++ b/boards/galp5/tigerlake/chipset.cb @@ -0,0 +1,157 @@ +chip soc/intel/tigerlake + + device cpu_cluster 0 on end + device domain 0 on + device gpio 0 alias pch_gpio on end + device pci 00.0 alias system_agent on end + device pci 02.0 alias igpu off end + device pci 04.0 alias dptf off end + device pci 05.0 alias ipu off end + device pci 06.0 alias peg off end + device pci 07.0 alias tbt_pcie_rp0 off + chip soc/intel/common/block/usb4 + use tbt_dma0 as usb4_port + device generic 0 on end + end + end + device pci 07.1 alias tbt_pcie_rp1 off + chip soc/intel/common/block/usb4 + use tbt_dma0 as usb4_port + device generic 1 on end + end + end + device pci 07.2 alias tbt_pcie_rp2 off + chip soc/intel/common/block/usb4 + use tbt_dma1 as usb4_port + device generic 0 on end + end + end + device pci 07.3 alias tbt_pcie_rp3 off + chip soc/intel/common/block/usb4 + use tbt_dma1 as usb4_port + device generic 1 on end + end + end + device pci 08.0 alias gna off end + device pci 09.0 alias npk off end + device pci 0a.0 alias crashlog off end + device pci 0d.0 alias north_xhci off + chip drivers/usb/acpi + register "type" = "UPC_TYPE_HUB" + device usb 0.0 alias tcss_root_hub off + chip drivers/usb/acpi + device usb 3.0 alias tcss_usb3_port1 off end + end + chip drivers/usb/acpi + device usb 3.1 alias tcss_usb3_port2 off end + end + chip drivers/usb/acpi + device usb 3.2 alias tcss_usb3_port3 off end + end + chip drivers/usb/acpi + device usb 3.3 alias tcss_usb3_port4 off end + end + end + end + end + device pci 0d.1 alias north_xdci off end + device pci 0d.2 alias tbt_dma0 off end + device pci 0d.3 alias tbt_dma1 off end + device pci 0e.0 alias vmd off end + device pci 10.6 alias thc0 off end + device pci 10.7 alias thc1 off end + device pci 12.0 alias ish off end + device pci 12.6 alias gspi2 off end + device pci 13.0 alias gspi3 off end + device pci 14.0 alias south_xhci off + chip drivers/usb/acpi + register "type" = "UPC_TYPE_HUB" + device usb 0.0 alias xhci_root_hub off + chip drivers/usb/acpi + device usb 2.0 alias usb2_port1 off end + end + chip drivers/usb/acpi + device usb 2.1 alias usb2_port2 off end + end + chip drivers/usb/acpi + device usb 2.2 alias usb2_port3 off end + end + chip drivers/usb/acpi + device usb 2.3 alias usb2_port4 off end + end + chip drivers/usb/acpi + device usb 2.4 alias usb2_port5 off end + end + chip drivers/usb/acpi + device usb 2.5 alias usb2_port6 off end + end + chip drivers/usb/acpi + device usb 2.6 alias usb2_port7 off end + end + chip drivers/usb/acpi + device usb 2.7 alias usb2_port8 off end + end + chip drivers/usb/acpi + device usb 2.8 alias usb2_port9 off end + end + chip drivers/usb/acpi + device usb 2.9 alias usb2_port10 off end + end + chip drivers/usb/acpi + device usb 3.0 alias usb3_port1 off end + end + chip drivers/usb/acpi + device usb 3.1 alias usb3_port2 off end + end + chip drivers/usb/acpi + device usb 3.2 alias usb3_port3 off end + end + chip drivers/usb/acpi + device usb 3.3 alias usb3_port4 off end + end + end + end + end + device pci 14.1 alias south_xdci off end + device pci 14.2 alias shared_ram off end + device pci 14.3 alias cnvi_wifi off end + device pci 15.0 alias i2c0 off end + device pci 15.1 alias i2c1 off end + device pci 15.2 alias i2c2 off end + device pci 15.3 alias i2c3 off end + device pci 16.0 alias heci1 off end + device pci 16.1 alias heci2 off end + device pci 16.2 alias csme1 off end + device pci 16.3 alias csme2 off end + device pci 16.4 alias heci3 off end + device pci 16.5 alias heci4 off end + device pci 17.0 alias sata off end + device pci 19.0 alias i2c4 off end + device pci 19.1 alias i2c5 off end + device pci 19.2 alias uart2 off end + device pci 1c.0 alias pcie_rp1 off end + device pci 1c.1 alias pcie_rp2 off end + device pci 1c.2 alias pcie_rp3 off end + device pci 1c.3 alias pcie_rp4 off end + device pci 1c.4 alias pcie_rp5 off end + device pci 1c.5 alias pcie_rp6 off end + device pci 1c.6 alias pcie_rp7 off end + device pci 1c.7 alias pcie_rp8 off end + device pci 1d.0 alias pcie_rp9 off end + device pci 1d.1 alias pcie_rp10 off end + device pci 1d.2 alias pcie_rp11 off end + device pci 1d.3 alias pcie_rp12 off end + device pci 1e.0 alias uart0 off end + device pci 1e.1 alias uart1 off end + device pci 1e.2 alias gspi0 off end + device pci 1e.3 alias gspi1 off end + device pci 1f.0 alias pch_espi on end + device pci 1f.1 alias p2sb off end + device pci 1f.2 alias pmc hidden end + device pci 1f.3 alias hda off end + device pci 1f.4 alias smbus off end + device pci 1f.5 alias fast_spi on end + device pci 1f.6 alias gbe off end + device pci 1f.7 alias tracehub off end + end +end diff --git a/boards/galp5/tlg-u/board.fmd b/boards/galp5/tlg-u/board.fmd new file mode 100644 index 000000000..6f3a0381d --- /dev/null +++ b/boards/galp5/tlg-u/board.fmd @@ -0,0 +1,12 @@ +FLASH 16M { + SI_DESC 4K + SI_ME 5116K + SI_BIOS 11M { + RW_MRC_CACHE 64K + SMMSTORE(PRESERVE) 256K + WP_RO { + FMAP 4K + COREBOOT(CBFS) + } + } +} diff --git a/boards/galp5/tlg-u/devicetree.cb b/boards/galp5/tlg-u/devicetree.cb new file mode 100644 index 000000000..f056da771 --- /dev/null +++ b/boards/galp5/tlg-u/devicetree.cb @@ -0,0 +1,139 @@ +chip soc/intel/tigerlake + register "common_soc_config" = "{ + // Touchpad I2C bus + .i2c[0] = { + .speed = I2C_SPEED_FAST, + .rise_time_ns = 80, + .fall_time_ns = 110, + }, + }" + +# ACPI (soc/intel/tigerlake/acpi.c) + # Enable Enhanced Intel SpeedStep + register "eist_enable" = "1" + + # Enable s0ix, required for TGL-U + register "s0ix_enable" = "1" + +# FSP Memory (soc/intel/tigerlake/romstage/fsp_params.c) + # Enable C6 DRAM + register "enable_c6dram" = "1" + + # System Agent dynamic frequency support + register "SaGv" = "SaGv_Enabled" + +# FSP Silicon (soc/intel/tigerlake/fsp_params.c) + # Acoustic settings + register "AcousticNoiseMitigation" = "1" + register "SlowSlewRate" = "SLEW_FAST_8" + register "FastPkgCRampDisable" = "1" + + # FIVR configuration + # Read EXT_RAIL_CONFIG to determine bitmaps + # sudo devmem2 0xfe0011b8 + # 0x0 + # Read EXT_V1P05_VR_CONFIG + # sudo devmem2 0xfe0011c0 + # 0x1a42000 + # Read EXT_VNN_VR_CONFIG0 + # sudo devmem2 0xfe0011c4 + # 0x1a42000 + # TODO: v1p05 voltage and vnn icc max? + register "ext_fivr_settings" = "{ + .configure_ext_fivr = 1, + .v1p05_enable_bitmap = 0, + .vnn_enable_bitmap = 0, + .v1p05_supported_voltage_bitmap = 0, + .vnn_supported_voltage_bitmap = 0, + .v1p05_icc_max_ma = 500, + .vnn_sx_voltage_mv = 1050, + }" + + # Read LPM_EN, make sure to invert the bits + register "LpmStateDisableMask" = " + LPM_S0i2_1 | + LPM_S0i2_2 | + LPM_S0i3_1 | + LPM_S0i3_2 | + LPM_S0i3_3 | + LPM_S0i3_4 + " + + # Thermal + register "tcc_offset" = "12" + +# Actual device tree + device cpu_cluster 0 on end + + device domain 0 on + device ref system_agent on end + device ref igpu on + # DDIA is eDP + register "DdiPortAConfig" = "DDI_PORT_CFG_EDP" + register "DdiPortAHpd" = "1" + register "DdiPortADdc" = "0" + + # DDIB is HDMI + register "DdiPortBConfig" = "DDI_PORT_CFG_NO_LFP" + register "DdiPortBHpd" = "1" + register "DdiPortBDdc" = "1" + + register "gfx" = "GMA_DEFAULT_PANEL(0)" + end + device ref dptf on end + device ref tbt_pcie_rp0 on end + device ref gna on end + device ref shared_ram on end + device ref cnvi_wifi on + register "CnviBtCore" = true + register "CnviBtAudioOffload" = true + chip drivers/wifi/generic + register "wake" = "GPE0_PME_B0" + device generic 0 on end + end + end + device ref i2c0 on + # Touchpad I2C bus + register "SerialIoI2cMode[PchSerialIoIndexI2C0]" = "PchSerialIoPci" + chip drivers/i2c/hid + register "generic.hid" = ""ELAN0412"" + register "generic.desc" = ""ELAN Touchpad"" + register "generic.irq_gpio" = "ACPI_GPIO_IRQ_LEVEL_LOW(GPP_B3)" + register "generic.detect" = "1" + register "hid_desc_reg_offset" = "0x01" + device i2c 15 on end + end + chip drivers/i2c/hid + register "generic.hid" = ""FTCS1000"" + register "generic.desc" = ""FocalTech Touchpad"" + register "generic.irq_gpio" = "ACPI_GPIO_IRQ_LEVEL_LOW(GPP_B3)" + register "generic.detect" = "1" + register "hid_desc_reg_offset" = "0x01" + device i2c 38 on end + end + end + device ref i2c1 on + # TODO: USB-PD? + register "SerialIoI2cMode[PchSerialIoIndexI2C1]" = "PchSerialIoPci" + end + device ref heci1 on end + device ref uart2 on + # Debug console + register "SerialIoUartMode[PchSerialIoIndexUART2]" = "PchSerialIoSkipInit" + end + device ref pch_espi on + register "gen1_dec" = "0x00040069" + register "gen2_dec" = "0x00fc0E01" + register "gen3_dec" = "0x00fc0F01" + chip drivers/pc80/tpm + device pnp 0c31.0 on end + end + end + device ref p2sb on end + device ref hda on + register "PchHdaAudioLinkHdaEnable" = "1" + end + device ref smbus on end + device ref fast_spi on end + end +end diff --git a/boards/galp5/tlg-u/variants/galp5/data.vbt b/boards/galp5/tlg-u/variants/galp5/data.vbt new file mode 100644 index 0000000000000000000000000000000000000000..e3b164fd1d4e7dfe9f8a529ed2a9297811704795 GIT binary patch literal 8704 zcmeHMO-vg{6n?X|*N(FkBctHZgbqnW3=Ob22_?u<);2$J0>L(fI8rMNvD=_H!39#$ z9|>3DKyNEmsz}-@R;8+yPxRD7FTS)w>cvW>s)rspMp3I=I3{)9%yM4xZWH{l-|30$JT z!y&lX{Kq4JI3b6nE?Mph-kwh+-H}#0JTo<&Omy}o=5EfUphGKHce&yUwDdx2wDN?713y zUw>d^I20W6jRi+8(~$`63y%6mNBf8UL)U01GIAm4503Ts)!55i2+XA3ot=K`#yoWg zTB!%yY3F*m$uuxCo9dvxWRgZ0W{yS@bBWn^67h~2J5!Vco0$L*3)JR-z*9dsz=rzM z$Yx{(nIb!o1!TnPHIjH z-07LkYU8+6!)BZv^41N)YCNx;@lI?H;npX)LY+=b^3YU%t-%_9wzXEZT#bMc0e2J5 zX>&$NOEc`lmCb5}wlPcE+G9@Fy~HO!+pL7+KPpH(-5?H3Ewv}1Q26;kTBYkp9k$pp zt!7jAB7W6bUK+Q6X>SdgS_)m!Bh;O)FKW=f&6R419|pw-EwXF5Thrj`UNmWQwq$tW z#mQ%PFXT2@34^T2DQD3J3tvcp1hpv}^I|Uz3pCv5P#l{y5Y@u8RjA?X&V}`GV~Y}9 zDcL|&k!w)IRo)lRw&B8gMV?yqC`zuRK?Ez;P+4ER**u;NLz6t9>V3f?sj`I?pec^_{<*OO&i%Pt3d()ZJ>T%T2#@Yoy4HlJ8r&7kURKbY4*P6+P zmyXGyyZV|8HJE@el_W*1M1$O>ti_h%vMbCMlbQ`C>_{Yu&4hc8>TP3^+rZah`0CIK zG(2jAOo%qfk{n>|@;I1Od>_#UV^p(2zWb;adeg4Ad)k#~d#Nu>z!!NEu9n5UM|G}rn2`mzvbhcxN|K?0&_rnRb|QIs z@>b%76gmy_pJV!J9T6|8M2u$lxUT`j{H=Ro3kh2&g#PWsY?)dKvoX9AvoBR8Y}-Po zdf~SLtQ*87^A)r#4yVW`xPrmSCC4u`i>HUS5WwR?hfH9(Nc$s;z9JdBf`2_dUEEp% zoax37h>Gts|Fmg_74L<@d5k;&`-n0t^L!@J_SdzGubi*P4r3j+8+pB8^Gvr4bQ3r} zecOYZxe2!y*elPse3({SF2$}I?SFoRZ4m8ZTfV=VEA>oyPUO_{fPVwaMf<&UE@HP7 z50v)1GgbSm5vWF>8i8sAsu8G0pc;W{1YS%8dcP2k!0S^0X+gz9rx>i0qxv5>_8S*K z`3!)XfVd$IQN$AM+?C57K1G08Aud?PbLbX4?h?5dX}qt0iKon#6(U0lF*4S}y)04= znaLI`lsHh;Wi4g0{DJ_AC<_W|Sv7mgWKV_(j9ao~093T431!;Z zU>e)|B~L&VGav&+olQkMb0|}<36QpGvQ_hO^j-Tk$YkaWfs7?jLU0$BOvg~Cw#Q~N z=7S=xfeXSYi!(H`=HG5{$)Ws24U0<#xAbU@sR3)1;!@woY;mFQ?a*UxFSGOBhXNiZ c;=gKkz9%}-7Sw~3Lw;8O{U2n^&lgUA0_b;IE&u=k literal 0 HcmV?d00001 diff --git a/boards/galp5/tlg-u/variants/galp5/overridetree.cb b/boards/galp5/tlg-u/variants/galp5/overridetree.cb new file mode 100644 index 000000000..22ff85126 --- /dev/null +++ b/boards/galp5/tlg-u/variants/galp5/overridetree.cb @@ -0,0 +1,195 @@ +chip soc/intel/tigerlake + # Power limits + register "power_limits_config[POWER_LIMITS_U_4_CORE]" = "{ + .tdp_pl1_override = 28, + .tdp_pl2_override = 51, + }" + register "power_limits_config[POWER_LIMITS_U_2_CORE]" = "{ + .tdp_pl1_override = 28, + .tdp_pl2_override = 51, + }" + + # GPE configuration + register "pmc_gpe0_dw0" = "PMC_GPP_A" + register "pmc_gpe0_dw1" = "PMC_GPP_R" + register "pmc_gpe0_dw2" = "PMC_GPD" + + device domain 0 on + subsystemid 0x1558 0x4018 inherit + + device ref peg on + # PCIe PEG0 x4, Clock 0 (SSD1) + register "PcieClkSrcUsage[0]" = "0x40" + register "PcieClkSrcClkReq[0]" = "0" + chip soc/intel/common/block/pcie/rtd3 + register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_D14)" # SSD1_PWR_DN# + register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_H0)" # GPP_H0_RTD3 + register "srcclk_pin" = "0" # SSD1_CLKREQ# + device generic 0 on end + end + end + device ref north_xhci on # J_TYPEC2 + register "UsbTcPortEn" = "1" + register "TcssXhciEn" = "1" + chip drivers/usb/acpi + device ref tcss_root_hub on + chip drivers/usb/acpi + register "desc" = ""USB3 J_TYPEC2"" + register "type" = "UPC_TYPE_C_USB2_SS_SWITCH" + register "group" = "ACPI_PLD_GROUP(1, 1)" + device ref tcss_usb3_port1 on end + end + end + end + end + device ref tbt_dma0 on # J_TYPEC2 + chip drivers/intel/usb4/retimer + register "dfp[0].power_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_A23)" + use tcss_usb3_port1 as dfp[0].typec_port + device generic 0 on end + end + end + + device ref south_xhci on + register "usb2_ports" = "{ + [0] = USB2_PORT_MID(OC_SKIP), /* J_USB3_2 */ + [1] = USB2_PORT_TYPE_C(OC_SKIP), /* J_TYPEC1 */ + [2] = USB2_PORT_MID(OC_SKIP), /* J_USB3_1 */ + [4] = USB2_PORT_MID(OC_SKIP), /* Fingerprint */ + [5] = USB2_PORT_TYPE_C(OC_SKIP), /* J_TYPEC2 */ + [6] = USB2_PORT_MID(OC_SKIP), /* Camera */ + [9] = USB2_PORT_MID(OC_SKIP), /* Bluetooth */ + }" + register "usb3_ports" = "{ + [0] = USB3_PORT_DEFAULT(OC_SKIP), /* J_USB3_2 */ + [1] = USB3_PORT_DEFAULT(OC_SKIP), /* J_TYPEC1 CH0 */ + [2] = USB3_PORT_DEFAULT(OC_SKIP), /* J_USB3_1 */ + [3] = USB3_PORT_DEFAULT(OC_SKIP), /* J_TYPEC1 CH1 */ + }" + # ACPI + chip drivers/usb/acpi + device ref xhci_root_hub on + chip drivers/usb/acpi + register "desc" = ""USB2 J_USB3_2"" + register "type" = "UPC_TYPE_A" + register "group" = "ACPI_PLD_GROUP(1, 2)" + device ref usb2_port1 on end + end + chip drivers/usb/acpi + register "desc" = ""USB2 J_TYPEC1"" + register "type" = "UPC_TYPE_C_USB2_SS_SWITCH" + register "group" = "ACPI_PLD_GROUP(2, 1)" + device ref usb2_port2 on end + end + chip drivers/usb/acpi + register "desc" = ""USB2 J_USB3_1"" + register "type" = "UPC_TYPE_A" + register "group" = "ACPI_PLD_GROUP(2, 2)" + device ref usb2_port3 on end + end + chip drivers/usb/acpi + register "desc" = ""USB2 Fingerprint"" + register "type" = "UPC_TYPE_INTERNAL" + device ref usb2_port5 on end + end + chip drivers/usb/acpi + register "desc" = ""USB2 J_TYPEC2"" + register "type" = "UPC_TYPE_C_USB2_SS_SWITCH" + register "group" = "ACPI_PLD_GROUP(1, 1)" + device ref usb2_port6 on end + end + chip drivers/usb/acpi + register "desc" = ""USB2 Camera"" + register "type" = "UPC_TYPE_INTERNAL" + device ref usb2_port7 on end + end + chip drivers/usb/acpi + register "desc" = ""USB2 Bluetooth"" + register "type" = "UPC_TYPE_INTERNAL" + device ref usb2_port10 on end + end + chip drivers/usb/acpi + register "desc" = ""USB3 J_USB3_2"" + register "type" = "UPC_TYPE_A" + register "group" = "ACPI_PLD_GROUP(1, 2)" + device ref usb3_port1 on end + end + chip drivers/usb/acpi + register "desc" = ""USB3 J_TYPEC1 CH0"" + register "type" = "UPC_TYPE_A" + register "group" = "ACPI_PLD_GROUP(2, 1)" + device ref usb3_port2 on end + end + chip drivers/usb/acpi + register "desc" = ""USB3 J_USB3_1"" + register "type" = "UPC_TYPE_A" + register "group" = "ACPI_PLD_GROUP(2, 2)" + device ref usb3_port3 on end + end + chip drivers/usb/acpi + register "desc" = ""USB3 J_TYPEC1 CH1"" + register "type" = "UPC_TYPE_A" + register "group" = "ACPI_PLD_GROUP(2, 1)" + device ref usb3_port4 on end + end + end + end + end + device ref i2c2 on + # TODO: Pantone ROM? + register "SerialIoI2cMode[PchSerialIoIndexI2C2]" = "PchSerialIoPci" + end + device ref pcie_rp5 on + # PCIe root port #5 x4, Clock 2 (NVIDIA GPU) + register "PcieRpLtrEnable[4]" = "1" + register "PcieClkSrcUsage[2]" = "4" + register "PcieClkSrcClkReq[2]" = "2" + chip drivers/gfx/nvidia + device pci 00.0 on end # VGA controller + device pci 00.1 on end # Audio device + device pci 00.2 on end # USB xHCI Host controller + device pci 00.3 on end # USB Type-C UCSI controller + end + end + device ref pcie_rp9 on + # PCIe root port #9 x1, Clock 3 (CARD) + register "PcieRpLtrEnable[8]" = "1" + register "PcieClkSrcUsage[3]" = "8" + register "PcieClkSrcClkReq[3]" = "3" + end + device ref pcie_rp10 on + # PCIe root port #10 x1, Clock 4 (GLAN) + register "PcieRpLtrEnable[9]" = "1" + register "PcieClkSrcUsage[4]" = "9" + register "PcieClkSrcClkReq[4]" = "4" + chip soc/intel/common/block/pcie/rtd3 + register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_F9)" # GPIO_LAN_EN + register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_F7)" # GPIO_LANRTD3 + register "srcclk_pin" = "4" # LAN_CLKREQ# + device generic 0 on end + end + end + device ref pcie_rp11 on + # PCIe root port #11 x1, Clock 1 (WLAN) + register "PcieRpLtrEnable[10]" = "1" + register "PcieClkSrcUsage[1]" = "10" + register "PcieClkSrcClkReq[1]" = "1" + register "PcieRpSlotImplemented[10]" = "1" + end + device ref pmc hidden + # The pmc_mux chip driver is a placeholder for the + # PMC.MUX device in the ACPI hierarchy. + chip drivers/intel/pmc_mux + device generic 0 on + chip drivers/intel/pmc_mux/conn + # J_TYPEC2 + use usb2_port6 as usb2_port + use tcss_usb3_port1 as usb3_port + # SBU & HSL follow CC + device generic 0 alias conn0 on end + end + end + end + end + end +end diff --git a/config/coreboot-galp5.config b/config/coreboot-galp5.config new file mode 100644 index 000000000..cd24c0ad0 --- /dev/null +++ b/config/coreboot-galp5.config @@ -0,0 +1,855 @@ +# +# Automatically generated file; DO NOT EDIT. +# coreboot configuration +# + +# +# General setup +# +CONFIG_COREBOOT_BUILD=y +CONFIG_LOCALVERSION="" +CONFIG_CBFS_PREFIX="fallback" +CONFIG_COMPILER_GCC=y +# CONFIG_COMPILER_LLVM_CLANG is not set +CONFIG_ARCH_SUPPORTS_CLANG=y +# CONFIG_ANY_TOOLCHAIN is not set +CONFIG_CCACHE=y +# CONFIG_IWYU is not set +# CONFIG_FMD_GENPARSER is not set +# CONFIG_UTIL_GENPARSER is not set +# CONFIG_OPTION_BACKEND_NONE is not set +CONFIG_USE_OPTION_TABLE=y +# CONFIG_STATIC_OPTION_TABLE is not set +CONFIG_COMPRESS_RAMSTAGE_LZMA=y +# CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set +CONFIG_SEPARATE_ROMSTAGE=y +CONFIG_INCLUDE_CONFIG_FILE=y +CONFIG_COLLECT_TIMESTAMPS=y +# CONFIG_TIMESTAMPS_ON_CONSOLE is not set +CONFIG_USE_BLOBS=y +# CONFIG_USE_AMD_BLOBS is not set +# CONFIG_USE_QC_BLOBS is not set +# CONFIG_COVERAGE is not set +# CONFIG_UBSAN is not set +CONFIG_HAVE_ASAN_IN_RAMSTAGE=y +# CONFIG_ASAN is not set +CONFIG_NO_STAGE_CACHE=y +# CONFIG_TSEG_STAGE_CACHE is not set +# CONFIG_UPDATE_IMAGE is not set +# CONFIG_BOOTSPLASH_IMAGE is not set +# CONFIG_FW_CONFIG is not set + +# +# Software Bill Of Materials (SBOM) +# +# CONFIG_SBOM is not set +# end of Software Bill Of Materials (SBOM) +# end of General setup + +# +# Mainboard +# + +# +# Important: Run 'make distclean' before switching boards +# +# CONFIG_VENDOR_51NB is not set +# CONFIG_VENDOR_ACER is not set +# CONFIG_VENDOR_ADLINK is not set +# CONFIG_VENDOR_AMD is not set +# CONFIG_VENDOR_AOPEN is not set +# CONFIG_VENDOR_APPLE is not set +# CONFIG_VENDOR_ASROCK is not set +# CONFIG_VENDOR_ASUS is not set +# CONFIG_VENDOR_BIOSTAR is not set +# CONFIG_VENDOR_BOSTENTECH is not set +# CONFIG_VENDOR_BYTEDANCE is not set +# CONFIG_VENDOR_CAVIUM is not set +# CONFIG_VENDOR_CLEVO is not set +# CONFIG_VENDOR_COMPULAB is not set +# CONFIG_VENDOR_DELL is not set +# CONFIG_VENDOR_EMULATION is not set +# CONFIG_VENDOR_EXAMPLE is not set +# CONFIG_VENDOR_FACEBOOK is not set +# CONFIG_VENDOR_FOXCONN is not set +# CONFIG_VENDOR_GETAC is not set +# CONFIG_VENDOR_GIGABYTE is not set +# CONFIG_VENDOR_GOOGLE is not set +# CONFIG_VENDOR_HP is not set +# CONFIG_VENDOR_IBASE is not set +# CONFIG_VENDOR_IBM is not set +# CONFIG_VENDOR_INTEL is not set +# CONFIG_VENDOR_INVENTEC is not set +# CONFIG_VENDOR_KONTRON is not set +# CONFIG_VENDOR_LENOVO is not set +# CONFIG_VENDOR_LIBRETREND is not set +# CONFIG_VENDOR_MSI is not set +# CONFIG_VENDOR_OCP is not set +# CONFIG_VENDOR_OPENCELLULAR is not set +# CONFIG_VENDOR_PACKARDBELL is not set +# CONFIG_VENDOR_PCENGINES is not set +# CONFIG_VENDOR_PINE64 is not set +# CONFIG_VENDOR_PORTWELL is not set +# CONFIG_VENDOR_PRODRIVE is not set +# CONFIG_VENDOR_PROTECTLI is not set +# CONFIG_VENDOR_PURISM is not set +# CONFIG_VENDOR_RAZER is not set +# CONFIG_VENDOR_RODA is not set +# CONFIG_VENDOR_SAMSUNG is not set +# CONFIG_VENDOR_SAPPHIRE is not set +# CONFIG_VENDOR_SIEMENS is not set +# CONFIG_VENDOR_SIFIVE is not set +# CONFIG_VENDOR_STARLABS is not set +# CONFIG_VENDOR_SUPERMICRO is not set +CONFIG_VENDOR_SYSTEM76=y +# CONFIG_VENDOR_TI is not set +# CONFIG_VENDOR_UP is not set +CONFIG_BOARD_SPECIFIC_OPTIONS=y +CONFIG_MAINBOARD_PART_NUMBER="galp5" +CONFIG_MAINBOARD_VERSION="galp5" +CONFIG_MAINBOARD_DIR="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/tgl-u" +CONFIG_DIMM_MAX=4 +CONFIG_DIMM_SPD_SIZE=512 +CONFIG_FMDFILE="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/tgl-u/board.fmd" +# CONFIG_NO_POST is not set +CONFIG_MAINBOARD_VENDOR="System76" +CONFIG_CBFS_SIZE=0x200000 +# CONFIG_CONSOLE_SERIAL is not set +CONFIG_MAX_CPUS=8 +CONFIG_ONBOARD_VGA_IS_PRIMARY=y +# CONFIG_POST_DEVICE is not set +# CONFIG_POST_IO is not set +CONFIG_UART_FOR_CONSOLE=2 +CONFIG_DEVICETREE="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/tgl-u/devicetree.cb" +# CONFIG_VBOOT is not set +CONFIG_VARIANT_DIR="galp5" +CONFIG_OVERRIDE_DEVICETREE="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/tgl-u/variants/galp5/overridetree.cb" +# CONFIG_VGA_BIOS is not set +CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="System76" +CONFIG_INTEL_GMA_VBT_FILE="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/tgl-u/variants/galp5/data.vbt" +# CONFIG_DISABLE_HECI1_AT_PRE_BOOT is not set +CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0x2000 +CONFIG_CMOS_DEFAULT_FILE="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/tgl-u/cmos.default" +CONFIG_CMOS_LAYOUT_FILE="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/tgl-u/cmos.layout" +CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 +CONFIG_CONSOLE_POST=y +CONFIG_TPM_PIRQ=0x0 +# CONFIG_USE_PM_ACPI_TIMER is not set +CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xc0000000 +CONFIG_ECAM_MMCONF_BUS_NUMBER=256 +CONFIG_MEMLAYOUT_LD_FILE="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/memlayout.ld" +CONFIG_DCACHE_RAM_BASE=0xfef00000 +CONFIG_DCACHE_RAM_SIZE=0x80000 +CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 +CONFIG_DCACHE_BSP_STACK_SIZE=0x40400 +CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 +CONFIG_HAVE_INTEL_FIRMWARE=y +CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 +CONFIG_DRIVERS_INTEL_WIFI=y +CONFIG_IFD_BIN_PATH="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/fd.rom" +CONFIG_ME_BIN_PATH="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/me.rom" +CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 +CONFIG_CARDBUS_PLUGIN_SUPPORT=y +CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y +# CONFIG_USE_LEGACY_8254_TIMER is not set +# CONFIG_DEBUG_SMI is not set +CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Galago Pro" +CONFIG_HAVE_IFD_BIN=y +CONFIG_PCIEXP_HOTPLUG_BUSES=8 +CONFIG_PCIEXP_HOTPLUG_MEM=0x2000000 +CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x20000000 +CONFIG_PS2K_EISAID="PNP0303" +CONFIG_PS2M_EISAID="PNP0F13" +# CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY is not set +CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y +CONFIG_D3COLD_SUPPORT=y +CONFIG_PCIEXP_ASPM=y +CONFIG_PCIEXP_L1_SUB_STATE=y +CONFIG_PCIEXP_CLK_PM=y +# CONFIG_DRIVERS_UART_8250IO is not set +CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 +CONFIG_FSP_TEMP_RAM_SIZE=0x20000 +CONFIG_HEAP_SIZE=0x10000 +CONFIG_EC_GPE_SCI=0x50 +# CONFIG_BOARD_SYSTEM76_ADDW1 is not set +# CONFIG_BOARD_SYSTEM76_ADDW2 is not set +# CONFIG_BOARD_SYSTEM76_DARP8 is not set +# CONFIG_BOARD_SYSTEM76_GALP6 is not set +# CONFIG_BOARD_SYSTEM76_GAZE17_3050 is not set +# CONFIG_BOARD_SYSTEM76_GAZE17_3060_B is not set +# CONFIG_BOARD_SYSTEM76_LEMP11 is not set +# CONFIG_BOARD_SYSTEM76_ORYP9 is not set +# CONFIG_BOARD_SYSTEM76_ORYP10 is not set +# CONFIG_BOARD_SYSTEM76_BONW14 is not set +# CONFIG_BOARD_SYSTEM76_GALP4 is not set +# CONFIG_BOARD_SYSTEM76_DARP6 is not set +# CONFIG_BOARD_SYSTEM76_LEMP9 is not set +# CONFIG_BOARD_SYSTEM76_GAZE14 is not set +# CONFIG_BOARD_SYSTEM76_GAZE15 is not set +# CONFIG_BOARD_SYSTEM76_GALP2 is not set +# CONFIG_BOARD_SYSTEM76_GALP3 is not set +# CONFIG_BOARD_SYSTEM76_GALP3_B is not set +# CONFIG_BOARD_SYSTEM76_ORYP5 is not set +# CONFIG_BOARD_SYSTEM76_ORYP6 is not set +# CONFIG_BOARD_SYSTEM76_ORYP7 is not set +# CONFIG_BOARD_SYSTEM76_ADDW3 is not set +# CONFIG_BOARD_SYSTEM76_BONW15 is not set +# CONFIG_BOARD_SYSTEM76_DARP9 is not set +# CONFIG_BOARD_SYSTEM76_GALP7 is not set +# CONFIG_BOARD_SYSTEM76_GAZE18 is not set +# CONFIG_BOARD_SYSTEM76_LEMP12 is not set +# CONFIG_BOARD_SYSTEM76_ORYP11 is not set +# CONFIG_BOARD_SYSTEM76_SERW13 is not set +# CONFIG_BOARD_SYSTEM76_GAZE16_3050 is not set +# CONFIG_BOARD_SYSTEM76_GAZE16_3060 is not set +# CONFIG_BOARD_SYSTEM76_GAZE16_3060_B is not set +# CONFIG_BOARD_SYSTEM76_ORYP8 is not set +# CONFIG_BOARD_SYSTEM76_DARP7 is not set +CONFIG_BOARD_SYSTEM76_GALP5=y +# CONFIG_BOARD_SYSTEM76_LEMP10 is not set +# CONFIG_BOARD_SYSTEM76_GALP3_C is not set +# CONFIG_BOARD_SYSTEM76_DARP5 is not set +CONFIG_TPM_MEASURED_BOOT=y +CONFIG_DRIVERS_GFX_NVIDIA_BRIDGE=0x1c +CONFIG_BOARD_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_256 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_512 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_1024 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_2048 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_4096 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_5120 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_6144 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_8192 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set +CONFIG_COREBOOT_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set +# CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set +CONFIG_COREBOOT_ROMSIZE_KB=16384 +CONFIG_ROM_SIZE=0x01000000 +CONFIG_HAVE_POWER_STATE_AFTER_FAILURE=y +CONFIG_HAVE_POWER_STATE_PREVIOUS_AFTER_FAILURE=y +# CONFIG_POWER_STATE_OFF_AFTER_FAILURE is not set +CONFIG_POWER_STATE_ON_AFTER_FAILURE=y +# CONFIG_POWER_STATE_PREVIOUS_AFTER_FAILURE is not set +CONFIG_MAINBOARD_POWER_FAILURE_STATE=1 +# end of Mainboard + +CONFIG_SYSTEM_TYPE_LAPTOP=y + +# +# Chipset +# + +# +# SoC +# +CONFIG_CHIPSET_DEVICETREE="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/tigerlake/chipset.cb" +CONFIG_FSP_M_FILE="$(obj)/Fsp_M.fd" +CONFIG_FSP_S_FILE="$(obj)/Fsp_S.fd" +CONFIG_CBFS_MCACHE_SIZE=0x4000 +CONFIG_ROMSTAGE_ADDR=0x2000000 +CONFIG_VERSTAGE_ADDR=0x2000000 +CONFIG_CONSOLE_UART_BASE_ADDRESS=0xfe03e000 +CONFIG_SMM_TSEG_SIZE=0x800000 +CONFIG_SMM_RESERVED_SIZE=0x200000 +CONFIG_SMM_MODULE_STACK_SIZE=0x800 +CONFIG_ACPI_BERT_SIZE=0x0 +CONFIG_DRIVERS_I2C_DESIGNWARE_CLOCK_MHZ=133 +CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_ACPI_CPU_STRING="CP%02X" +CONFIG_STACK_SIZE=0x2000 +CONFIG_EXT_BIOS_WIN_BASE=0xf8000000 +CONFIG_EXT_BIOS_WIN_SIZE=0x2000000 +CONFIG_IFD_CHIPSET="tgl" +CONFIG_IED_REGION_SIZE=0x400000 +CONFIG_MAX_ROOT_PORTS=12 +CONFIG_MAX_PCIE_CLOCK_SRC=7 +CONFIG_PCR_BASE_ADDRESS=0xfd000000 +CONFIG_CPU_BCLK_MHZ=100 +CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_CLOCK_MHZ=120 +CONFIG_CPU_XTAL_HZ=38400000 +CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_MAX=4 +CONFIG_SOC_INTEL_I2C_DEV_MAX=6 +CONFIG_SOC_INTEL_UART_DEV_MAX=3 +CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_M_VAL=0x25a +CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_N_VAL=0x7fff +CONFIG_FSP_HEADER_PATH="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/TigerLakeFspBinPkg/Client/Include/" +CONFIG_FSP_FD_PATH="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/TigerLakeFspBinPkg/Client/Fsp.fd" +CONFIG_DATA_BUS_WIDTH=128 +CONFIG_DIMMS_PER_CHANNEL=2 +CONFIG_MRC_CHANNEL_WIDTH=16 +CONFIG_INTEL_GMA_BCLV_OFFSET=0xc8258 +CONFIG_INTEL_GMA_BCLV_WIDTH=32 +CONFIG_INTEL_GMA_BCLM_OFFSET=0xc8254 +CONFIG_INTEL_GMA_BCLM_WIDTH=32 +CONFIG_MAX_HECI_DEVICES=6 +CONFIG_BOOTBLOCK_IN_CBFS=y +CONFIG_HAVE_PAM0_REGISTER=y +CONFIG_PCIEXP_COMMON_CLOCK=y +CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=4 +CONFIG_SOC_INTEL_GFX_FRAMEBUFFER_OFFSET=0x0 +CONFIG_PCIE_LTR_MAX_SNOOP_LATENCY=0x1003 +CONFIG_PCIE_LTR_MAX_NO_SNOOP_LATENCY=0x1003 +CONFIG_SOC_INTEL_TIGERLAKE=y +# CONFIG_INTEL_TME is not set +CONFIG_FSP_TYPE_CLIENT=y +CONFIG_SOC_INTEL_TIGERLAKE_DEBUG_CONSENT=0 +CONFIG_SOC_INTEL_COMMON_BLOCK_P2SB=y +CONFIG_FIXED_SMBUS_IO_BASE=0xefa0 +CONFIG_CBFS_CACHE_ALIGN=8 +CONFIG_SOC_INTEL_COMMON=y + +# +# Intel SoC Common Code for IP blocks +# +CONFIG_SOC_INTEL_COMMON_BLOCK=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_GPIO=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_LPIT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_PEP=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_PEP_LPM_REQ=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ACPI_CPPC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CHIP_CONFIG=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CNVI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CPU=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_MPINIT=y +CONFIG_USE_FSP_FEATURE_PROGRAM_ON_APS=y +# CONFIG_USE_COREBOOT_MP_INIT is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_CPU_SMMRELOCATE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_CAR=y +CONFIG_INTEL_CAR_NEM_ENHANCED=y +CONFIG_CAR_HAS_SF_MASKS=y +CONFIG_SF_MASK_2WAYS_PER_BIT=y +CONFIG_COS_MAPPED_TO_MSB=y +CONFIG_USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI=y +CONFIG_CPU_SUPPORTS_INTEL_TME=y +CONFIG_CPU_SUPPORTS_PM_TIMER_EMULATION=y +CONFIG_HAVE_HYPERTHREADING=y +CONFIG_FSP_HYPERTHREADING=y +# CONFIG_INTEL_KEYLOCKER is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_CSE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_HECI1_DISABLE_USING_PMC_IPC=y +CONFIG_SOC_INTEL_CSE_SEND_EOP_LATE=y +CONFIG_SOC_INTEL_CSE_FMAP_NAME="SI_ME" +CONFIG_SOC_INTEL_CSE_RW_A_FMAP_NAME="ME_RW_A" +CONFIG_SOC_INTEL_CSE_RW_B_FMAP_NAME="ME_RW_B" +CONFIG_SOC_INTEL_CSE_RW_CBFS_NAME="me_rw" +CONFIG_SOC_INTEL_CSE_RW_HASH_CBFS_NAME="me_rw.hash" +CONFIG_SOC_INTEL_CSE_RW_VERSION_CBFS_NAME="me_rw.version" +CONFIG_SOC_INTEL_CSE_RW_FILE="" +CONFIG_SOC_INTEL_CSE_RW_VERSION="" +CONFIG_SOC_INTEL_CSE_SET_EOP=y +CONFIG_SOC_INTEL_CSE_IOM_CBFS_NAME="cse_iom" +CONFIG_SOC_INTEL_CSE_IOM_CBFS_FILE="" +CONFIG_SOC_INTEL_CSE_NPHY_CBFS_NAME="cse_nphy" +CONFIG_SOC_INTEL_CSE_NPHY_CBFS_FILE="" +CONFIG_SOC_INTEL_CSE_HAVE_SPEC_SUPPORT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ME_SPEC_15=y +CONFIG_ME_SPEC=15 +CONFIG_SOC_INTEL_COMMON_BLOCK_DSP=y +CONFIG_SOC_INTEL_COMMON_BLOCK_DTT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_FAST_SPI=y +CONFIG_FAST_SPI_DISABLE_WRITE_STATUS=y +CONFIG_FAST_SPI_SUPPORTS_EXT_BIOS_WINDOW=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_ITSS_POL_CFG=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_IOSTANDBY=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO_DUAL_ROUTE_SUPPORT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GPMR=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GRAPHICS=y +# CONFIG_SOC_INTEL_DISABLE_IGD is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_VERSION_2=y +CONFIG_SOC_INTEL_COMMON_BLOCK_HDA=y +CONFIG_SOC_INTEL_COMMON_BLOCK_HDA_VERB=y +CONFIG_SOC_INTEL_COMMON_BLOCK_I2C=y +CONFIG_SOC_INTEL_COMMON_BLOCK_IRQ=y +CONFIG_SOC_INTEL_COMMON_BLOCK_ITSS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_LPC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_LPC_MIRROR_TO_GPMR=y +CONFIG_SOC_INTEL_COMMON_BLOCK_LPSS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_MEMINIT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_BASE_P2SB=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PCIE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PCIE_RTD3=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PCR=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PMC=y +CONFIG_SOC_INTEL_MEM_MAPPED_PM_CONFIGURATION=y +CONFIG_SOC_INTEL_COMMON_BLOCK_PMC_EPOC=y +CONFIG_PMC_IPC_ACPI_INTERFACE=y +CONFIG_PMC_GLOBAL_RESET_ENABLE_LOCK=y +CONFIG_SOC_INTEL_COMMON_BLOCK_POWER_LIMIT=y +CONFIG_SOC_INTEL_COMMON_BLOCK_RTC=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SATA=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SMBUS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_TCO=y +CONFIG_SOC_INTEL_COMMON_BLOCK_TCO_ENABLE_THROUGH_SMBUS=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SMM=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_IO_TRAP=y +# CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_TCO_ENABLE is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 +CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_SA=y +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 +CONFIG_SOC_INTEL_COMMON_BLOCK_TCSS=y +# CONFIG_ENABLE_TCSS_DISPLAY_DETECTION is not set +# CONFIG_ENABLE_TCSS_USB_DETECTION is not set +CONFIG_SOC_INTEL_COMMON_BLOCK_TIMER=y +CONFIG_SOC_INTEL_COMMON_BLOCK_UART=y +CONFIG_INTEL_LPSS_UART_FOR_CONSOLE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_USB4=y +CONFIG_SOC_INTEL_COMMON_BLOCK_USB4_PCIE=y +CONFIG_SOC_INTEL_COMMON_BLOCK_USB4_XHCI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_XDCI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_XHCI=y +CONFIG_SOC_INTEL_COMMON_BLOCK_XHCI_ELOG=y + +# +# Intel SoC Common PCH Code +# +CONFIG_SOC_INTEL_COMMON_PCH_CLIENT=y +CONFIG_SOC_INTEL_COMMON_PCH_BASE=y +CONFIG_SOC_INTEL_COMMON_PCH_LOCKDOWN=y +CONFIG_PCH_SPECIFIC_BASE_OPTIONS=y +CONFIG_PCH_SPECIFIC_DISCRETE_OPTIONS=y +CONFIG_PCH_SPECIFIC_CLIENT_OPTIONS=y + +# +# Intel SoC Common coreboot stages and non-IP blocks +# +CONFIG_SOC_INTEL_COMMON_BASECODE=y +CONFIG_SOC_INTEL_COMMON_BASECODE_RAMTOP=y +CONFIG_SOC_INTEL_COMMON_RESET=y +CONFIG_SOC_INTEL_COMMON_ACPI_WAKE_SOURCE=y +CONFIG_PAVP=y +# CONFIG_SOC_INTEL_DEBUG_CONSENT is not set + +# +# CPU +# +CONFIG_CPU_INTEL_FIRMWARE_INTERFACE_TABLE=y +CONFIG_CPU_INTEL_COMMON=y +CONFIG_ENABLE_VMX=y +CONFIG_SET_IA32_FC_LOCK_BIT=y +CONFIG_SET_MSR_AESNI_LOCK_BIT=y +CONFIG_CPU_INTEL_COMMON_SMM=y +CONFIG_PARALLEL_MP=y +CONFIG_PARALLEL_MP_AP_WORK=y +CONFIG_XAPIC_ONLY=y +# CONFIG_X2APIC_ONLY is not set +# CONFIG_X2APIC_RUNTIME is not set +# CONFIG_X2APIC_LATE_WORKAROUND is not set +CONFIG_UDELAY_TSC=y +CONFIG_TSC_MONOTONIC_TIMER=y +CONFIG_X86_CLFLUSH_CAR=y +CONFIG_HAVE_SMI_HANDLER=y +CONFIG_SMM_TSEG=y +CONFIG_SMM_PCI_RESOURCE_STORE_NUM_SLOTS=8 +CONFIG_AP_STACK_SIZE=0x800 +CONFIG_SMP=y +CONFIG_SSE=y +CONFIG_SSE2=y +CONFIG_SUPPORT_CPU_UCODE_IN_CBFS=y +CONFIG_USE_CPU_MICROCODE_CBFS_BINS=y +CONFIG_CPU_MICROCODE_CBFS_DEFAULT_BINS=y +# CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_BINS is not set +# CONFIG_CPU_MICROCODE_CBFS_EXTERNAL_HEADER is not set +# CONFIG_CPU_MICROCODE_CBFS_NONE is not set + +# +# Northbridge +# + +# +# Southbridge +# +CONFIG_PCIEXP_HOTPLUG=y +CONFIG_INTEL_DESCRIPTOR_MODE_REQUIRED=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_SMBUS=y +CONFIG_SOUTHBRIDGE_INTEL_COMMON_PIRQ_ACPI_GEN=y +CONFIG_INTEL_DESCRIPTOR_MODE_CAPABLE=y +CONFIG_VALIDATE_INTEL_DESCRIPTOR=y +CONFIG_FIXED_RCBA_MMIO_BASE=0xfed1c000 +CONFIG_RCBA_LENGTH=0x4000 + +# +# Super I/O +# + +# +# Embedded Controllers +# +CONFIG_EC_SYSTEM76_EC=y +CONFIG_EC_SYSTEM76_EC_BAT_THRESHOLDS=y +CONFIG_EC_SYSTEM76_EC_DGPU=y +CONFIG_EC_SYSTEM76_EC_LOCKDOWN=y + +# +# Intel Firmware +# +CONFIG_HAVE_ME_BIN=y +# CONFIG_STITCH_ME_BIN is not set +# CONFIG_ME_REGION_ALLOW_CPU_READ_ACCESS is not set +# CONFIG_DO_NOT_TOUCH_DESCRIPTOR_REGION is not set +# CONFIG_LOCK_MANAGEMENT_ENGINE is not set +CONFIG_UNLOCK_FLASH_REGIONS=y +CONFIG_UDK_BASE=y +CONFIG_UDK_2017_BINDING=y +CONFIG_UDK_2013_VERSION=2013 +CONFIG_UDK_2017_VERSION=2017 +CONFIG_UDK_202005_VERSION=202005 +CONFIG_UDK_202302_VERSION=202302 +CONFIG_UDK_VERSION=2017 +CONFIG_ARCH_X86=y +CONFIG_ARCH_BOOTBLOCK_X86_32=y +CONFIG_ARCH_VERSTAGE_X86_32=y +CONFIG_ARCH_ROMSTAGE_X86_32=y +CONFIG_ARCH_POSTCAR_X86_32=y +CONFIG_ARCH_RAMSTAGE_X86_32=y +CONFIG_ARCH_ALL_STAGES_X86_32=y +CONFIG_RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT=y +CONFIG_X86_CUSTOM_BOOTMEDIA=y +CONFIG_POSTRAM_CBFS_CACHE_IN_BSS=y +CONFIG_RAMSTAGE_CBFS_CACHE_SIZE=0x4000 +CONFIG_PC80_SYSTEM=y +CONFIG_HAVE_CMOS_DEFAULT=y +CONFIG_POSTCAR_STAGE=y +CONFIG_BOOTBLOCK_SIMPLE=y +# CONFIG_BOOTBLOCK_NORMAL is not set +CONFIG_COLLECT_TIMESTAMPS_TSC=y +CONFIG_IDT_IN_EVERY_STAGE=y +CONFIG_HAVE_CF9_RESET=y +CONFIG_DEBUG_HW_BREAKPOINTS=y +CONFIG_DEBUG_HW_BREAKPOINTS_IN_ALL_STAGES=y +CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS=y +CONFIG_DEBUG_NULL_DEREF_BREAKPOINTS_IN_ALL_STAGES=y +# CONFIG_DUMP_SMBIOS_TYPE17 is not set +# end of Chipset + +# +# Devices +# +CONFIG_HAVE_LINEAR_FRAMEBUFFER=y +CONFIG_HAVE_FSP_GOP=y +# CONFIG_VGA_ROM_RUN is not set +CONFIG_RUN_FSP_GOP=y +# CONFIG_NO_GFX_INIT is not set +CONFIG_NO_EARLY_GFX_INIT=y + +# +# Display +# +CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y +CONFIG_LINEAR_FRAMEBUFFER=y +# CONFIG_BOOTSPLASH is not set +# end of Display + +CONFIG_PCI=y +CONFIG_ECAM_MMCONF_SUPPORT=y +CONFIG_PCIX_PLUGIN_SUPPORT=y +CONFIG_AZALIA_HDA_CODEC_SUPPORT=y +CONFIG_AZALIA_LOCK_DOWN_R_WO_GCAP=y +CONFIG_PCIEXP_PLUGIN_SUPPORT=y +CONFIG_ECAM_MMCONF_LENGTH=0x10000000 +CONFIG_PCI_ALLOW_BUS_MASTER=y +CONFIG_PCI_SET_BUS_MASTER_PCI_BRIDGES=y +CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y +# CONFIG_PCIEXP_SUPPORT_RESIZABLE_BARS is not set +# CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set +CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G=y +CONFIG_PCIEXP_HOTPLUG_IO=0x800 +CONFIG_FIRMWARE_CONNECTION_MANAGER=y +# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set +# CONFIG_EARLY_PCI_BRIDGE is not set +CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 +CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 +CONFIG_INTEL_GMA_HAVE_VBT=y +CONFIG_INTEL_GMA_ADD_VBT=y +# CONFIG_SOFTWARE_I2C is not set +CONFIG_I2C_TRANSFER_TIMEOUT_US=500000 +CONFIG_RESOURCE_ALLOCATION_TOP_DOWN=y +# end of Devices + +# +# Generic Drivers +# +CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 +# CONFIG_DRIVERS_EFI_VARIABLE_STORE is not set +# CONFIG_ELOG is not set +CONFIG_CACHE_MRC_SETTINGS=y +CONFIG_MRC_SETTINGS_PROTECT=y +CONFIG_SMMSTORE=y +CONFIG_SMMSTORE_V2=y +CONFIG_SMMSTORE_SIZE=0x40000 +CONFIG_SPI_FLASH=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y +CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y +CONFIG_SPI_FLASH_SMM=y +# CONFIG_SPI_FLASH_NO_FAST_READ is not set +CONFIG_TPM_INIT_RAMSTAGE=y +# CONFIG_TPM_PPI is not set +CONFIG_DRIVERS_UART=y +CONFIG_NO_UART_ON_SUPERIO=y +CONFIG_DRIVERS_UART_8250MEM=y +CONFIG_DRIVERS_UART_8250MEM_32=y +# CONFIG_VPD is not set +CONFIG_DRIVERS_GENERIC_BAYHUB_LV2=y +CONFIG_DRIVERS_GENERIC_CBFS_SERIAL=y +CONFIG_DRIVERS_GENERIC_CBFS_UUID=y +# CONFIG_DRIVERS_GENESYSLOGIC_GL9750 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9755 is not set +# CONFIG_DRIVERS_GENESYSLOGIC_GL9763E is not set +CONFIG_DRIVERS_GFX_NVIDIA=y +CONFIG_DRIVERS_I2C_DESIGNWARE=y +CONFIG_DRIVERS_I2C_GENERIC=y +CONFIG_DRIVERS_I2C_HID=y +# CONFIG_DRIVERS_I2C_MAX98396 is not set +CONFIG_FSP_USE_REPO=y +# CONFIG_DISPLAY_HOBS is not set +# CONFIG_DISPLAY_UPD_DATA is not set +CONFIG_PLATFORM_USES_FSP2_0=y +CONFIG_PLATFORM_USES_FSP2_1=y +CONFIG_PLATFORM_USES_FSP2_2=y +CONFIG_PLATFORM_USES_FSP2_X86_32=y +CONFIG_HAVE_INTEL_FSP_REPO=y +CONFIG_ADD_FSP_BINARIES=y +CONFIG_FSP_T_LOCATION=0xfffe0000 +CONFIG_FSP_S_CBFS="fsps.bin" +CONFIG_FSP_M_CBFS="fspm.bin" +CONFIG_FSP_FULL_FD=y +CONFIG_FSP_T_RESERVED_SIZE=0x0 +CONFIG_FSP_M_XIP=y +CONFIG_FSP_USES_CB_STACK=y +CONFIG_FSP_COMPRESS_FSP_S_LZ4=y +CONFIG_FSP_STATUS_GLOBAL_RESET_REQUIRED_3=y +CONFIG_FSP_STATUS_GLOBAL_RESET=0x40000003 +CONFIG_SOC_INTEL_COMMON_FSP_RESET=y +CONFIG_FSPS_USE_MULTI_PHASE_INIT=y +CONFIG_USE_FSP_NOTIFY_PHASE_POST_PCI_ENUM=y +CONFIG_USE_FSP_NOTIFY_PHASE_READY_TO_BOOT=y +CONFIG_USE_FSP_NOTIFY_PHASE_END_OF_FIRMWARE=y +# CONFIG_DISPLAY_FSP_TIMESTAMPS is not set +CONFIG_INTEL_GMA_ACPI=y +CONFIG_VBT_CBFS_COMPRESSION_LZMA=y +# CONFIG_VBT_CBFS_COMPRESSION_LZ4 is not set +# CONFIG_VBT_CBFS_COMPRESSION_NONE is not set +CONFIG_VBT_CBFS_COMPRESSION_ALGORITHM="lzma" +CONFIG_INTEL_GMA_VERSION_2=y +CONFIG_DRIVERS_INTEL_PMC=y +# CONFIG_DRIVERS_NXP_UWB_SR1XX is not set +# CONFIG_DRIVERS_PS2_KEYBOARD is not set +CONFIG_DRIVERS_MC146818=y +# CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 +CONFIG_MEMORY_MAPPED_TPM=y +CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 +# CONFIG_DRIVERS_SIL_3114 is not set +CONFIG_DRIVERS_USB_ACPI=y +CONFIG_DRIVERS_WIFI_GENERIC=y +CONFIG_MP_SERVICES_PPI=y +CONFIG_MP_SERVICES_PPI_V1=y +CONFIG_DRIVERS_INTEL_USB4_RETIMER=y +# end of Generic Drivers + +# +# Security +# + +# +# CBFS verification +# +# CONFIG_CBFS_VERIFICATION is not set +# end of CBFS verification + +# +# Verified Boot (vboot) +# +CONFIG_VBOOT_LIB=y +# end of Verified Boot (vboot) + +# +# Trusted Platform Module +# +# CONFIG_NO_TPM is not set +CONFIG_TPM2=y +CONFIG_TPM=y +CONFIG_MAINBOARD_HAS_TPM2=y +# CONFIG_DEBUG_TPM is not set +CONFIG_TPM_RDRESP_NEED_DELAY=y +# CONFIG_TPM_LOG_CB is not set +CONFIG_TPM_LOG_TPM2=y +# CONFIG_TPM_HASH_SHA1 is not set +CONFIG_TPM_HASH_SHA256=y +# CONFIG_TPM_HASH_SHA384 is not set +# CONFIG_TPM_HASH_SHA512 is not set +CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" +CONFIG_PCR_BOOT_MODE=1 +CONFIG_PCR_HWID=1 +CONFIG_PCR_SRTM=2 +CONFIG_PCR_RUNTIME_DATA=3 +# end of Trusted Platform Module + +# +# Memory initialization +# +CONFIG_PLATFORM_HAS_DRAM_CLEAR=y +# CONFIG_SECURITY_CLEAR_DRAM_ON_REGULAR_BOOT is not set +# end of Memory initialization + +# CONFIG_INTEL_TXT is not set +# CONFIG_STM is not set +# CONFIG_INTEL_CBNT_SUPPORT is not set +CONFIG_BOOTMEDIA_LOCK_NONE=y +# CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set +# CONFIG_BOOTMEDIA_LOCK_CHIP is not set +# CONFIG_BOOTMEDIA_SMM_BWP is not set +# end of Security + +CONFIG_ACPI_HAVE_PCAT_8259=y +CONFIG_ACPI_INTEL_HARDWARE_SLEEP_VALUES=y +CONFIG_ACPI_SOC_NVS=y +CONFIG_ACPI_CUSTOM_MADT=y +CONFIG_ACPI_NO_CUSTOM_MADT=y +CONFIG_ACPI_COMMON_MADT_LAPIC=y +CONFIG_ACPI_COMMON_MADT_IOAPIC=y +CONFIG_HAVE_ACPI_TABLES=y +CONFIG_ACPI_LPIT=y +CONFIG_BOOT_DEVICE_SPI_FLASH=y +CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y +CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y +CONFIG_RTC=y + +# +# Console +# +CONFIG_BOOTBLOCK_CONSOLE=y +CONFIG_POSTCAR_CONSOLE=y +CONFIG_SQUELCH_EARLY_SMP=y +CONFIG_FIXED_UART_FOR_CONSOLE=y +# CONFIG_SPKMODEM is not set +# CONFIG_CONSOLE_NE2K is not set +CONFIG_CONSOLE_CBMEM=y +# CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set +# CONFIG_CONSOLE_SPI_FLASH is not set +# CONFIG_CONSOLE_I2C_SMBUS is not set +# CONFIG_CONSOLE_SYSTEM76_EC is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL_7=y +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_6 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_5 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_4 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_3 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_2 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_1 is not set +# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set +CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 +CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y +CONFIG_CONSOLE_USE_ANSI_ESCAPES=y +# CONFIG_CMOS_POST is not set +CONFIG_HWBASE_DEBUG_CB=y +# end of Console + +CONFIG_ACPI_S1_NOT_SUPPORTED=y +CONFIG_HAVE_MONOTONIC_TIMER=y +CONFIG_HAVE_OPTION_TABLE=y +CONFIG_IOAPIC=y + +# +# System tables +# +CONFIG_GENERATE_SMBIOS_TABLES=y +CONFIG_BIOS_VENDOR="coreboot" +CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" +# end of System tables + +# +# Payload +# +# CONFIG_PAYLOAD_NONE is not set +CONFIG_PAYLOAD_ELF=y +# CONFIG_PAYLOAD_BOOTBOOT is not set +# CONFIG_PAYLOAD_FILO is not set +# CONFIG_PAYLOAD_GRUB2 is not set +# CONFIG_PAYLOAD_SEAGRUB is not set +# CONFIG_PAYLOAD_LINUXBOOT is not set +# CONFIG_PAYLOAD_SEABIOS is not set +# CONFIG_PAYLOAD_UBOOT is not set +# CONFIG_PAYLOAD_EDK2 is not set +CONFIG_PAYLOAD_LINUX=y +CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +CONFIG_PAYLOAD_OPTIONS="" +# CONFIG_PXE is not set +# CONFIG_COMPRESSED_PAYLOAD_NONE is not set +CONFIG_COMPRESSED_PAYLOAD_LZMA=y +# CONFIG_COMPRESSED_PAYLOAD_LZ4 is not set +CONFIG_COMPRESS_SECONDARY_PAYLOAD=y + + +# +# Secondary Payloads +# +# CONFIG_COREINFO_SECONDARY_PAYLOAD is not set +# CONFIG_GRUB2_SECONDARY_PAYLOAD is not set +# CONFIG_MEMTEST_SECONDARY_PAYLOAD is not set +# CONFIG_NVRAMCUI_SECONDARY_PAYLOAD is not set +# CONFIG_SEABIOS_SECONDARY_PAYLOAD is not set +# CONFIG_TINT_SECONDARY_PAYLOAD is not set +# CONFIG_COREDOOM_SECONDARY_PAYLOAD is not set +# end of Secondary Payloads +# end of Payload + +# +# Debugging +# + +# +# CPU Debug Settings +# +# CONFIG_DISPLAY_MTRRS is not set + +# +# Vendorcode Debug Settings +# + +# +# BLOB Debug Settings +# +# CONFIG_DISPLAY_FSP_CALLS_AND_STATUS is not set +# CONFIG_DISPLAY_FSP_HEADER is not set +# CONFIG_VERIFY_HOBS is not set +CONFIG_DISPLAY_FSP_VERSION_INFO=y +# CONFIG_ENABLE_FSP_ERROR_INFO is not set +CONFIG_HAVE_GPIO_SNAPSHOT_VERIFY_SUPPORT=y +# CONFIG_CHECK_GPIO_CONFIG_CHANGES is not set + +# +# General Debug Settings +# +# CONFIG_GDB_STUB is not set +# CONFIG_FATAL_ASSERTS is not set +CONFIG_HAVE_DEBUG_GPIO=y +# CONFIG_DEBUG_GPIO is not set +# CONFIG_DEBUG_CBFS is not set +CONFIG_HAVE_DEBUG_SMBUS=y +# CONFIG_DEBUG_SMBUS is not set +# CONFIG_DEBUG_MALLOC is not set +# CONFIG_DEBUG_CONSOLE_INIT is not set +# CONFIG_DEBUG_SPI_FLASH is not set +# CONFIG_DEBUG_BOOT_STATE is not set +# CONFIG_DEBUG_ADA_CODE is not set +CONFIG_HAVE_EM100_SUPPORT=y +# CONFIG_EM100 is not set +# CONFIG_DEBUG_ACPICA_COMPATIBLE is not set +# end of Debugging + +CONFIG_SPD_READ_BY_WORD=y +CONFIG_DECOMPRESS_OFAST=y +CONFIG_WARNINGS_ARE_ERRORS=y +CONFIG_MAX_REBOOT_CNT=3 +CONFIG_RELOCATABLE_MODULES=y +CONFIG_GENERIC_GPIO_LIB=y +CONFIG_HAVE_BOOTBLOCK=y +CONFIG_HAVE_ROMSTAGE=y +CONFIG_HAVE_RAMSTAGE=y diff --git a/config/linux-galp5.config b/config/linux-galp5.config new file mode 100644 index 000000000..2ebbc1781 --- /dev/null +++ b/config/linux-galp5.config @@ -0,0 +1,3104 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/x86 5.10.5 Kernel Configuration +# +CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 8.3.0" +CONFIG_CC_IS_GCC=y +CONFIG_GCC_VERSION=80300 +CONFIG_LD_VERSION=232000000 +CONFIG_CLANG_VERSION=0 +CONFIG_LLD_VERSION=0 +CONFIG_CC_CAN_LINK=y +CONFIG_CC_CAN_LINK_STATIC=y +CONFIG_CC_HAS_ASM_GOTO=y +CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_TABLE_SORT=y +CONFIG_THREAD_INFO_IN_TASK=y + +# +# General setup +# +CONFIG_INIT_ENV_ARG_LIMIT=32 +# CONFIG_COMPILE_TEST is not set +CONFIG_LOCALVERSION="-@BRAND_NAME@" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_BUILD_SALT="" +CONFIG_HAVE_KERNEL_GZIP=y +CONFIG_HAVE_KERNEL_BZIP2=y +CONFIG_HAVE_KERNEL_LZMA=y +CONFIG_HAVE_KERNEL_XZ=y +CONFIG_HAVE_KERNEL_LZO=y +CONFIG_HAVE_KERNEL_LZ4=y +CONFIG_HAVE_KERNEL_ZSTD=y +# CONFIG_KERNEL_GZIP is not set +# CONFIG_KERNEL_BZIP2 is not set +# CONFIG_KERNEL_LZMA is not set +CONFIG_KERNEL_XZ=y +# CONFIG_KERNEL_LZO is not set +# CONFIG_KERNEL_LZ4 is not set +# CONFIG_KERNEL_ZSTD is not set +CONFIG_DEFAULT_INIT="" +CONFIG_DEFAULT_HOSTNAME="(none)" +# CONFIG_SWAP is not set +# CONFIG_SYSVIPC is not set +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_WATCH_QUEUE is not set +# CONFIG_CROSS_MEMORY_ATTACH is not set +# CONFIG_USELIB is not set +# CONFIG_AUDIT is not set +CONFIG_HAVE_ARCH_AUDITSYSCALL=y + +# +# IRQ subsystem +# +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_PENDING_IRQ=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y +CONFIG_GENERIC_IRQ_RESERVATION_MODE=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_SPARSE_IRQ=y +# end of IRQ subsystem + +CONFIG_CLOCKSOURCE_WATCHDOG=y +CONFIG_ARCH_CLOCKSOURCE_INIT=y +CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y +CONFIG_GENERIC_CMOS_UPDATE=y +CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ_COMMON=y +# CONFIG_HZ_PERIODIC is not set +CONFIG_NO_HZ_IDLE=y +# CONFIG_NO_HZ_FULL is not set +# CONFIG_NO_HZ is not set +# CONFIG_HIGH_RES_TIMERS is not set +# end of Timers subsystem + +CONFIG_PREEMPT_NONE=y +# CONFIG_PREEMPT_VOLUNTARY is not set +# CONFIG_PREEMPT is not set + +# +# CPU/Task time and stats accounting +# +CONFIG_TICK_CPU_ACCOUNTING=y +# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set +# CONFIG_IRQ_TIME_ACCOUNTING is not set +# CONFIG_PSI is not set +# end of CPU/Task time and stats accounting + +# CONFIG_CPU_ISOLATION is not set + +# +# RCU Subsystem +# +CONFIG_TREE_RCU=y +# CONFIG_RCU_EXPERT is not set +CONFIG_SRCU=y +CONFIG_TREE_SRCU=y +CONFIG_RCU_STALL_COMMON=y +CONFIG_RCU_NEED_SEGCBLIST=y +# end of RCU Subsystem + +CONFIG_BUILD_BIN2C=y +# CONFIG_IKCONFIG is not set +# CONFIG_IKHEADERS is not set +CONFIG_LOG_BUF_SHIFT=18 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 +CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 +CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y + +# +# Scheduler features +# +# CONFIG_UCLAMP_TASK is not set +# end of Scheduler features + +CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y +CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y +CONFIG_CC_HAS_INT128=y +CONFIG_ARCH_SUPPORTS_INT128=y +# CONFIG_CGROUPS is not set +# CONFIG_CHECKPOINT_RESTORE is not set +# CONFIG_SCHED_AUTOGROUP is not set +# CONFIG_SYSFS_DEPRECATED is not set +CONFIG_RELAY=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="@BLOB_DIR@/dev.cpio" +CONFIG_INITRAMFS_ROOT_UID=0 +CONFIG_INITRAMFS_ROOT_GID=0 +# CONFIG_RD_GZIP is not set +# CONFIG_RD_BZIP2 is not set +# CONFIG_RD_LZMA is not set +CONFIG_RD_XZ=y +# CONFIG_RD_LZO is not set +# CONFIG_RD_LZ4 is not set +# CONFIG_RD_ZSTD is not set +CONFIG_INITRAMFS_COMPRESSION_XZ=y +# CONFIG_INITRAMFS_COMPRESSION_NONE is not set +# CONFIG_BOOT_CONFIG is not set +# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_LD_ORPHAN_WARN=y +CONFIG_SYSCTL=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +CONFIG_HAVE_PCSPKR_PLATFORM=y +CONFIG_BPF=y +CONFIG_EXPERT=y +# CONFIG_MULTIUSER is not set +# CONFIG_SGETMASK_SYSCALL is not set +# CONFIG_SYSFS_SYSCALL is not set +# CONFIG_FHANDLE is not set +CONFIG_POSIX_TIMERS=y +CONFIG_PRINTK=y +CONFIG_PRINTK_NMI=y +CONFIG_BUG=y +CONFIG_PCSPKR_PLATFORM=y +# CONFIG_BASE_FULL is not set +CONFIG_FUTEX=y +CONFIG_FUTEX_PI=y +CONFIG_EPOLL=y +# CONFIG_SIGNALFD is not set +# CONFIG_TIMERFD is not set +# CONFIG_EVENTFD is not set +CONFIG_SHMEM=y +# CONFIG_AIO is not set +CONFIG_IO_URING=y +# CONFIG_ADVISE_SYSCALLS is not set +CONFIG_MEMBARRIER=y +# CONFIG_KALLSYMS is not set +# CONFIG_BPF_SYSCALL is not set +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y +# CONFIG_USERFAULTFD is not set +CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +# CONFIG_RSEQ is not set +CONFIG_EMBEDDED=y +CONFIG_HAVE_PERF_EVENTS=y +# CONFIG_PC104 is not set + +# +# Kernel Performance Events And Counters +# +CONFIG_PERF_EVENTS=y +# CONFIG_DEBUG_PERF_USE_VMALLOC is not set +# end of Kernel Performance Events And Counters + +# CONFIG_VM_EVENT_COUNTERS is not set +# CONFIG_SLUB_DEBUG is not set +# CONFIG_COMPAT_BRK is not set +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +CONFIG_SLUB_CPU_PARTIAL=y +# CONFIG_PROFILING is not set +# end of General setup + +CONFIG_64BIT=y +CONFIG_X86_64=y +CONFIG_X86=y +CONFIG_INSTRUCTION_DECODER=y +CONFIG_OUTPUT_FORMAT="elf64-x86-64" +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_MMU=y +CONFIG_ARCH_MMAP_RND_BITS_MIN=28 +CONFIG_ARCH_MMAP_RND_BITS_MAX=32 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 +CONFIG_GENERIC_ISA_DMA=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y +CONFIG_ARCH_MAY_HAVE_PC_FDC=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_ARCH_HAS_CPU_RELAX=y +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_FILTER_PGPROT=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y +CONFIG_ZONE_DMA32=y +CONFIG_AUDIT_ARCH=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_HAVE_INTEL_TXT=y +CONFIG_X86_64_SMP=y +CONFIG_ARCH_SUPPORTS_UPROBES=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_PGTABLE_LEVELS=4 +CONFIG_CC_HAS_SANE_STACKPROTECTOR=y + +# +# Processor type and features +# +# CONFIG_ZONE_DMA is not set +CONFIG_SMP=y +CONFIG_X86_FEATURE_NAMES=y +# CONFIG_X86_MPPARSE is not set +# CONFIG_GOLDFISH is not set +CONFIG_RETPOLINE=y +# CONFIG_X86_CPU_RESCTRL is not set +# CONFIG_X86_EXTENDED_PLATFORM is not set +# CONFIG_X86_INTEL_LPSS is not set +# CONFIG_X86_AMD_PLATFORM_DEVICE is not set +CONFIG_IOSF_MBI=y +CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y +CONFIG_SCHED_OMIT_FRAME_POINTER=y +# CONFIG_HYPERVISOR_GUEST is not set +# CONFIG_MK8 is not set +# CONFIG_MPSC is not set +CONFIG_MCORE2=y +# CONFIG_MATOM is not set +# CONFIG_GENERIC_CPU is not set +CONFIG_X86_INTERNODE_CACHE_SHIFT=6 +CONFIG_X86_L1_CACHE_SHIFT=6 +CONFIG_X86_INTEL_USERCOPY=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +CONFIG_X86_P6_NOP=y +CONFIG_X86_TSC=y +CONFIG_X86_CMPXCHG64=y +CONFIG_X86_CMOV=y +CONFIG_X86_MINIMUM_CPU_FAMILY=64 +CONFIG_X86_DEBUGCTLMSR=y +CONFIG_IA32_FEAT_CTL=y +CONFIG_X86_VMX_FEATURE_NAMES=y +CONFIG_PROCESSOR_SELECT=y +CONFIG_CPU_SUP_INTEL=y +# CONFIG_CPU_SUP_AMD is not set +# CONFIG_CPU_SUP_HYGON is not set +# CONFIG_CPU_SUP_CENTAUR is not set +# CONFIG_CPU_SUP_ZHAOXIN is not set +CONFIG_HPET_TIMER=y +CONFIG_HPET_EMULATE_RTC=y +CONFIG_DMI=y +# CONFIG_MAXSMP is not set +CONFIG_NR_CPUS_RANGE_BEGIN=2 +CONFIG_NR_CPUS_RANGE_END=512 +CONFIG_NR_CPUS_DEFAULT=64 +CONFIG_NR_CPUS=64 +CONFIG_SCHED_SMT=y +CONFIG_SCHED_MC=y +CONFIG_SCHED_MC_PRIO=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_X86_IO_APIC=y +CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y +CONFIG_X86_MCE=y +# CONFIG_X86_MCELOG_LEGACY is not set +CONFIG_X86_MCE_INTEL=y +CONFIG_X86_MCE_THRESHOLD=y +CONFIG_X86_THERMAL_VECTOR=y + +# +# Performance monitoring +# +# CONFIG_PERF_EVENTS_INTEL_UNCORE is not set +# CONFIG_PERF_EVENTS_INTEL_RAPL is not set +# CONFIG_PERF_EVENTS_INTEL_CSTATE is not set +# end of Performance monitoring + +# CONFIG_X86_VSYSCALL_EMULATION is not set +CONFIG_X86_IOPL_IOPERM=y +# CONFIG_I8K is not set +# CONFIG_MICROCODE is not set +# CONFIG_X86_MSR is not set +# CONFIG_X86_CPUID is not set +# CONFIG_X86_5LEVEL is not set +CONFIG_X86_DIRECT_GBPAGES=y +# CONFIG_NUMA is not set +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SPARSEMEM_DEFAULT=y +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 +CONFIG_X86_PMEM_LEGACY_DEVICE=y +CONFIG_X86_PMEM_LEGACY=y +# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set +CONFIG_X86_RESERVE_LOW=64 +# CONFIG_MTRR is not set +CONFIG_ARCH_RANDOM=y +# CONFIG_X86_SMAP is not set +# CONFIG_X86_UMIP is not set +# CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set +CONFIG_X86_INTEL_TSX_MODE_OFF=y +# CONFIG_X86_INTEL_TSX_MODE_ON is not set +# CONFIG_X86_INTEL_TSX_MODE_AUTO is not set +CONFIG_EFI=y +# CONFIG_EFI_STUB is not set +# CONFIG_HZ_100 is not set +CONFIG_HZ_250=y +# CONFIG_HZ_300 is not set +# CONFIG_HZ_1000 is not set +CONFIG_HZ=250 +CONFIG_KEXEC=y +CONFIG_KEXEC_FILE=y +CONFIG_ARCH_HAS_KEXEC_PURGATORY=y +# CONFIG_KEXEC_SIG is not set +# CONFIG_CRASH_DUMP is not set +CONFIG_PHYSICAL_START=0x1000000 +# CONFIG_RELOCATABLE is not set +CONFIG_PHYSICAL_ALIGN=0x1000000 +CONFIG_HOTPLUG_CPU=y +# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set +# CONFIG_DEBUG_HOTPLUG_CPU0 is not set +# CONFIG_LEGACY_VSYSCALL_EMULATE is not set +# CONFIG_LEGACY_VSYSCALL_XONLY is not set +CONFIG_LEGACY_VSYSCALL_NONE=y +# CONFIG_CMDLINE_BOOL is not set +# CONFIG_MODIFY_LDT_SYSCALL is not set +CONFIG_HAVE_LIVEPATCH=y +# end of Processor type and features + +CONFIG_ARCH_HAS_ADD_PAGES=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y + +# +# Power management and ACPI options +# +# CONFIG_SUSPEND is not set +# CONFIG_PM is not set +# CONFIG_ENERGY_MODEL is not set +CONFIG_ARCH_SUPPORTS_ACPI=y +CONFIG_ACPI=y +CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y +CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y +CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y +# CONFIG_ACPI_DEBUGGER is not set +CONFIG_ACPI_SPCR_TABLE=y +CONFIG_ACPI_LPIT=y +CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y +# CONFIG_ACPI_EC_DEBUGFS is not set +CONFIG_ACPI_AC=y +CONFIG_ACPI_BATTERY=y +CONFIG_ACPI_BUTTON=y +CONFIG_ACPI_VIDEO=y +CONFIG_ACPI_FAN=y +# CONFIG_ACPI_DOCK is not set +CONFIG_ACPI_CPU_FREQ_PSS=y +CONFIG_ACPI_PROCESSOR_CSTATE=y +CONFIG_ACPI_PROCESSOR_IDLE=y +CONFIG_ACPI_CPPC_LIB=y +CONFIG_ACPI_PROCESSOR=y +CONFIG_ACPI_HOTPLUG_CPU=y +# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set +CONFIG_ACPI_THERMAL=y +CONFIG_ACPI_CUSTOM_DSDT_FILE="" +CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y +CONFIG_ACPI_TABLE_UPGRADE=y +# CONFIG_ACPI_DEBUG is not set +# CONFIG_ACPI_PCI_SLOT is not set +CONFIG_ACPI_CONTAINER=y +CONFIG_ACPI_HOTPLUG_IOAPIC=y +# CONFIG_ACPI_SBS is not set +# CONFIG_ACPI_HED is not set +# CONFIG_ACPI_BGRT is not set +# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set +# CONFIG_ACPI_NFIT is not set +CONFIG_HAVE_ACPI_APEI=y +CONFIG_HAVE_ACPI_APEI_NMI=y +# CONFIG_ACPI_APEI is not set +# CONFIG_ACPI_DPTF is not set +# CONFIG_ACPI_CONFIGFS is not set +# CONFIG_PMIC_OPREGION is not set +CONFIG_X86_PM_TIMER=y +# CONFIG_SFI is not set + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +# CONFIG_CPU_FREQ_STAT is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y + +# +# CPU frequency scaling drivers +# +CONFIG_X86_INTEL_PSTATE=y +# CONFIG_X86_PCC_CPUFREQ is not set +# CONFIG_X86_ACPI_CPUFREQ is not set +# CONFIG_X86_SPEEDSTEP_CENTRINO is not set +# CONFIG_X86_P4_CLOCKMOD is not set + +# +# shared options +# +# end of CPU Frequency scaling + +# +# CPU Idle +# +CONFIG_CPU_IDLE=y +# CONFIG_CPU_IDLE_GOV_LADDER is not set +CONFIG_CPU_IDLE_GOV_MENU=y +# CONFIG_CPU_IDLE_GOV_TEO is not set +# end of CPU Idle + +# CONFIG_INTEL_IDLE is not set +# end of Power management and ACPI options + +# +# Bus options (PCI etc.) +# +CONFIG_PCI_DIRECT=y +# CONFIG_PCI_MMCONFIG is not set +# CONFIG_PCI_CNB20LE_QUIRK is not set +# CONFIG_ISA_BUS is not set +CONFIG_ISA_DMA_API=y +# CONFIG_X86_SYSFB is not set +# end of Bus options (PCI etc.) + +# +# Binary Emulations +# +# CONFIG_IA32_EMULATION is not set +# CONFIG_X86_X32 is not set +# end of Binary Emulations + +# +# Firmware Drivers +# +# CONFIG_EDD is not set +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_DMIID is not set +# CONFIG_DMI_SYSFS is not set +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_GOOGLE_FIRMWARE=y +# CONFIG_GOOGLE_SMI is not set +CONFIG_GOOGLE_COREBOOT_TABLE=y +CONFIG_GOOGLE_MEMCONSOLE=y +CONFIG_GOOGLE_MEMCONSOLE_X86_LEGACY=y +CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=y +# CONFIG_GOOGLE_VPD is not set + +# +# EFI (Extensible Firmware Interface) Support +# +# CONFIG_EFI_VARS is not set +CONFIG_EFI_ESRT=y +CONFIG_EFI_RUNTIME_MAP=y +# CONFIG_EFI_FAKE_MEMMAP is not set +CONFIG_EFI_RUNTIME_WRAPPERS=y +# CONFIG_EFI_BOOTLOADER_CONTROL is not set +# CONFIG_EFI_CAPSULE_LOADER is not set +# CONFIG_EFI_TEST is not set +# CONFIG_EFI_RCI2_TABLE is not set +# CONFIG_EFI_DISABLE_PCI_DMA is not set +# end of EFI (Extensible Firmware Interface) Support + +CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + +CONFIG_HAVE_KVM=y +# CONFIG_VIRTUALIZATION is not set +CONFIG_AS_AVX512=y +CONFIG_AS_SHA1_NI=y +CONFIG_AS_SHA256_NI=y +CONFIG_AS_TPAUSE=y + +# +# General architecture-dependent options +# +CONFIG_CRASH_CORE=y +CONFIG_KEXEC_CORE=y +CONFIG_HOTPLUG_SMT=y +CONFIG_GENERIC_ENTRY=y +CONFIG_HAVE_OPROFILE=y +CONFIG_OPROFILE_NMI_TIMER=y +# CONFIG_KPROBES is not set +CONFIG_JUMP_LABEL=y +# CONFIG_STATIC_KEYS_SELFTEST is not set +# CONFIG_STATIC_CALL_SELFTEST is not set +CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y +CONFIG_ARCH_USE_BUILTIN_BSWAP=y +CONFIG_HAVE_IOREMAP_PROT=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_OPTPROBES=y +CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y +CONFIG_HAVE_NMI=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_CONTIGUOUS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_ARCH_HAS_FORTIFY_SOURCE=y +CONFIG_ARCH_HAS_SET_MEMORY=y +CONFIG_ARCH_HAS_SET_DIRECT_MAP=y +CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y +CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_HAVE_ASM_MODVERSIONS=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y +CONFIG_HAVE_HW_BREAKPOINT=y +CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y +CONFIG_HAVE_USER_RETURN_NOTIFIER=y +CONFIG_HAVE_PERF_EVENTS_NMI=y +CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y +CONFIG_HAVE_PERF_REGS=y +CONFIG_HAVE_PERF_USER_STACK_DUMP=y +CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y +CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y +CONFIG_HAVE_CMPXCHG_LOCAL=y +CONFIG_HAVE_CMPXCHG_DOUBLE=y +CONFIG_HAVE_ARCH_SECCOMP=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +# CONFIG_SECCOMP is not set +CONFIG_HAVE_ARCH_STACKLEAK=y +CONFIG_HAVE_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y +CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PMD=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y +CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y +CONFIG_HAVE_ARCH_SOFT_DIRTY=y +CONFIG_HAVE_MOD_ARCH_SPECIFIC=y +CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_ARCH_HAS_ELF_RANDOMIZE=y +CONFIG_HAVE_ARCH_MMAP_RND_BITS=y +CONFIG_HAVE_EXIT_THREAD=y +CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_HAVE_STACK_VALIDATION=y +CONFIG_HAVE_RELIABLE_STACKTRACE=y +# CONFIG_COMPAT_32BIT_TIME is not set +CONFIG_HAVE_ARCH_VMAP_STACK=y +CONFIG_VMAP_STACK=y +CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y +CONFIG_STRICT_MODULE_RWX=y +CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +CONFIG_ARCH_HAS_MEM_ENCRYPT=y +CONFIG_HAVE_STATIC_CALL=y +CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y + +# +# GCOV-based kernel profiling +# +CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y +# end of GCOV-based kernel profiling + +CONFIG_HAVE_GCC_PLUGINS=y +# end of General architecture-dependent options + +CONFIG_RT_MUTEXES=y +CONFIG_BASE_SMALL=1 +CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set +# CONFIG_MODULE_UNLOAD is not set +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +# CONFIG_MODULE_SIG is not set +# CONFIG_MODULE_COMPRESS is not set +# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set +# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_TRIM_UNUSED_KSYMS=y +CONFIG_UNUSED_KSYMS_WHITELIST="" +CONFIG_MODULES_TREE_LOOKUP=y +CONFIG_BLOCK=y +CONFIG_BLK_SCSI_REQUEST=y +CONFIG_BLK_DEV_BSG=y +CONFIG_BLK_DEV_BSGLIB=y +# CONFIG_BLK_DEV_INTEGRITY is not set +# CONFIG_BLK_DEV_ZONED is not set +# CONFIG_BLK_CMDLINE_PARSER is not set +# CONFIG_BLK_WBT is not set +# CONFIG_BLK_SED_OPAL is not set +# CONFIG_BLK_INLINE_ENCRYPTION is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +CONFIG_EFI_PARTITION=y +# end of Partition Types + +CONFIG_BLK_MQ_PCI=y + +# +# IO Schedulers +# +CONFIG_MQ_IOSCHED_DEADLINE=y +# CONFIG_MQ_IOSCHED_KYBER is not set +# CONFIG_IOSCHED_BFQ is not set +# end of IO Schedulers + +CONFIG_INLINE_SPIN_UNLOCK_IRQ=y +CONFIG_INLINE_READ_UNLOCK=y +CONFIG_INLINE_READ_UNLOCK_IRQ=y +CONFIG_INLINE_WRITE_UNLOCK=y +CONFIG_INLINE_WRITE_UNLOCK_IRQ=y +CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_ARCH_USE_QUEUED_RWLOCKS=y +CONFIG_QUEUED_RWLOCKS=y +CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y +CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE=y +CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +CONFIG_ELFCORE=y +CONFIG_BINFMT_SCRIPT=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_COREDUMP is not set +# end of Executable file formats + +# +# Memory Management options +# +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_SPARSEMEM_MANUAL=y +CONFIG_SPARSEMEM=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +CONFIG_SPARSEMEM_VMEMMAP=y +CONFIG_HAVE_FAST_GUP=y +# CONFIG_MEMORY_HOTPLUG is not set +CONFIG_SPLIT_PTLOCK_CPUS=4 +# CONFIG_COMPACTION is not set +# CONFIG_PAGE_REPORTING is not set +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_VIRT_TO_BUS=y +CONFIG_MMU_NOTIFIER=y +# CONFIG_KSM is not set +CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 +CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y +# CONFIG_MEMORY_FAILURE is not set +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_ARCH_WANTS_THP_SWAP=y +# CONFIG_CLEANCACHE is not set +# CONFIG_CMA is not set +# CONFIG_ZPOOL is not set +# CONFIG_ZBUD is not set +# CONFIG_ZSMALLOC is not set +CONFIG_GENERIC_EARLY_IOREMAP=y +# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set +# CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_PTE_DEVMAP=y +# CONFIG_PERCPU_STATS is not set +# CONFIG_GUP_BENCHMARK is not set +CONFIG_ARCH_HAS_PTE_SPECIAL=y +# end of Memory Management options + +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_DIAG is not set +CONFIG_UNIX=y +CONFIG_UNIX_SCM=y +# CONFIG_UNIX_DIAG is not set +# CONFIG_TLS is not set +# CONFIG_XFRM_USER is not set +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE_DEMUX is not set +CONFIG_SYN_COOKIES=y +# CONFIG_NET_IPVTI is not set +# CONFIG_NET_FOU is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_DIAG is not set +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +# CONFIG_IPV6 is not set +# CONFIG_MPTCP is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETWORK_PHY_TIMESTAMPING is not set +# CONFIG_NETFILTER is not set +# CONFIG_BPFILTER is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_RDS is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_L2TP is not set +# CONFIG_BRIDGE is not set +CONFIG_HAVE_NET_DSA=y +# CONFIG_NET_DSA is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_PHONET is not set +# CONFIG_IEEE802154 is not set +# CONFIG_NET_SCHED is not set +# CONFIG_DCB is not set +# CONFIG_BATMAN_ADV is not set +# CONFIG_OPENVSWITCH is not set +# CONFIG_VSOCKETS is not set +# CONFIG_NETLINK_DIAG is not set +# CONFIG_MPLS is not set +# CONFIG_NET_NSH is not set +# CONFIG_HSR is not set +# CONFIG_NET_SWITCHDEV is not set +# CONFIG_NET_L3_MASTER_DEV is not set +# CONFIG_QRTR is not set +# CONFIG_NET_NCSI is not set +CONFIG_RPS=y +CONFIG_RFS_ACCEL=y +CONFIG_XPS=y +CONFIG_NET_RX_BUSY_POLL=y +CONFIG_BQL=y +# CONFIG_BPF_JIT is not set +CONFIG_NET_FLOW_LIMIT=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# end of Network testing +# end of Networking options + +# CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set +# CONFIG_BT is not set +# CONFIG_AF_RXRPC is not set +# CONFIG_AF_KCM is not set +# CONFIG_WIRELESS is not set +# CONFIG_WIMAX is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set +# CONFIG_CAIF is not set +# CONFIG_CEPH_LIB is not set +# CONFIG_NFC is not set +# CONFIG_PSAMPLE is not set +# CONFIG_NET_IFE is not set +# CONFIG_LWTUNNEL is not set +# CONFIG_FAILOVER is not set +CONFIG_ETHTOOL_NETLINK=y +CONFIG_HAVE_EBPF_JIT=y + +# +# Device Drivers +# +CONFIG_HAVE_EISA=y +# CONFIG_EISA is not set +CONFIG_HAVE_PCI=y +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +# CONFIG_PCIEPORTBUS is not set +# CONFIG_PCIEASPM is not set +# CONFIG_PCIE_PTM is not set +CONFIG_PCI_MSI=y +CONFIG_PCI_MSI_IRQ_DOMAIN=y +CONFIG_PCI_QUIRKS=y +# CONFIG_PCI_DEBUG is not set +# CONFIG_PCI_STUB is not set +CONFIG_PCI_ATS=y +CONFIG_PCI_LOCKLESS_CONFIG=y +# CONFIG_PCI_IOV is not set +CONFIG_PCI_PRI=y +CONFIG_PCI_PASID=y +CONFIG_PCI_LABEL=y +# CONFIG_PCIE_BUS_TUNE_OFF is not set +CONFIG_PCIE_BUS_DEFAULT=y +# CONFIG_PCIE_BUS_SAFE is not set +# CONFIG_PCIE_BUS_PERFORMANCE is not set +# CONFIG_PCIE_BUS_PEER2PEER is not set +# CONFIG_HOTPLUG_PCI is not set + +# +# PCI controller drivers +# +# CONFIG_VMD is not set + +# +# DesignWare PCI Core Support +# +# CONFIG_PCIE_DW_PLAT_HOST is not set +# CONFIG_PCI_MESON is not set +# end of DesignWare PCI Core Support + +# +# Mobiveil PCIe Core Support +# +# end of Mobiveil PCIe Core Support + +# +# Cadence PCIe controllers support +# +# end of Cadence PCIe controllers support +# end of PCI controller drivers + +# +# PCI Endpoint +# +# CONFIG_PCI_ENDPOINT is not set +# end of PCI Endpoint + +# +# PCI switch controller drivers +# +# CONFIG_PCI_SW_SWITCHTEC is not set +# end of PCI switch controller drivers + +# CONFIG_PCCARD is not set +# CONFIG_RAPIDIO is not set + +# +# Generic Driver Options +# +# CONFIG_UEVENT_HELPER is not set +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_STANDALONE is not set +CONFIG_PREVENT_FIRMWARE_BUILD=y + +# +# Firmware loader +# +CONFIG_FW_LOADER=y +CONFIG_EXTRA_FIRMWARE="" +# CONFIG_FW_LOADER_USER_HELPER is not set +# CONFIG_FW_LOADER_COMPRESS is not set +# end of Firmware loader + +# CONFIG_ALLOW_DEV_COREDUMP is not set +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set +# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_REGMAP=y +CONFIG_REGMAP_MMIO=y +CONFIG_DMA_SHARED_BUFFER=y +# CONFIG_DMA_FENCE_TRACE is not set +# end of Generic Driver Options + +# +# Bus devices +# +# CONFIG_MHI_BUS is not set +# end of Bus devices + +# CONFIG_CONNECTOR is not set +# CONFIG_GNSS is not set +# CONFIG_MTD is not set +# CONFIG_OF is not set +CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y +# CONFIG_PARPORT is not set +CONFIG_PNP=y +# CONFIG_PNP_DEBUG_MESSAGES is not set + +# +# Protocols +# +CONFIG_PNPACPI=y +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_NULL_BLK is not set +# CONFIG_BLK_DEV_FD is not set +CONFIG_CDROM=y +# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set +# CONFIG_BLK_DEV_UMEM is not set +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_DRBD is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_SKD is not set +# CONFIG_BLK_DEV_SX8 is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=65536 +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +# CONFIG_BLK_DEV_RBD is not set +# CONFIG_BLK_DEV_RSXX is not set + +# +# NVME Support +# +# CONFIG_BLK_DEV_NVME is not set +# CONFIG_NVME_FC is not set +# end of NVME Support + +# +# Misc devices +# +# CONFIG_AD525X_DPOT is not set +# CONFIG_DUMMY_IRQ is not set +# CONFIG_IBM_ASM is not set +# CONFIG_PHANTOM is not set +# CONFIG_TIFM_CORE is not set +# CONFIG_ICS932S401 is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_HP_ILO is not set +# CONFIG_APDS9802ALS is not set +# CONFIG_ISL29003 is not set +# CONFIG_ISL29020 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_SENSORS_BH1770 is not set +# CONFIG_SENSORS_APDS990X is not set +# CONFIG_HMC6352 is not set +# CONFIG_DS1682 is not set +# CONFIG_SRAM is not set +# CONFIG_PCI_ENDPOINT_TEST is not set +# CONFIG_XILINX_SDFEC is not set +# CONFIG_PVPANIC is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_AT24 is not set +# CONFIG_EEPROM_LEGACY is not set +# CONFIG_EEPROM_MAX6875 is not set +# CONFIG_EEPROM_93CX6 is not set +# CONFIG_EEPROM_IDT_89HPESX is not set +# CONFIG_EEPROM_EE1004 is not set +# end of EEPROM support + +# CONFIG_CB710_CORE is not set + +# +# Texas Instruments shared transport line discipline +# +# end of Texas Instruments shared transport line discipline + +# CONFIG_SENSORS_LIS3_I2C is not set +# CONFIG_ALTERA_STAPL is not set +CONFIG_INTEL_MEI=m +CONFIG_INTEL_MEI_ME=m +CONFIG_INTEL_MEI_TXE=m +# CONFIG_VMWARE_VMCI is not set +# CONFIG_GENWQE is not set +# CONFIG_ECHO is not set +# CONFIG_MISC_ALCOR_PCI is not set +# CONFIG_MISC_RTSX_PCI is not set +# CONFIG_MISC_RTSX_USB is not set +# CONFIG_HABANA_AI is not set +# CONFIG_UACCE is not set +# end of Misc devices + +CONFIG_HAVE_IDE=y +# CONFIG_IDE is not set + +# +# SCSI device support +# +CONFIG_SCSI_MOD=y +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_PROC_FS is not set + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +CONFIG_BLK_DEV_SR=y +CONFIG_CHR_DEV_SG=y +# CONFIG_CHR_DEV_SCH is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +CONFIG_SCSI_SCAN_ASYNC=y + +# +# SCSI Transports +# +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +CONFIG_SCSI_ISCSI_ATTRS=y +# CONFIG_SCSI_SAS_ATTRS is not set +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +# end of SCSI Transports + +# CONFIG_SCSI_LOWLEVEL is not set +# CONFIG_SCSI_DH is not set +# end of SCSI device support + +CONFIG_ATA=y +CONFIG_SATA_HOST=y +CONFIG_PATA_TIMINGS=y +CONFIG_ATA_VERBOSE_ERROR=y +CONFIG_ATA_FORCE=y +CONFIG_ATA_ACPI=y +CONFIG_SATA_PMP=y + +# +# Controllers with non-SFF native interface +# +CONFIG_SATA_AHCI=y +CONFIG_SATA_MOBILE_LPM_POLICY=0 +# CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_SATA_INIC162X is not set +# CONFIG_SATA_ACARD_AHCI is not set +# CONFIG_SATA_SIL24 is not set +# CONFIG_ATA_SFF is not set +CONFIG_MD=y +# CONFIG_BLK_DEV_MD is not set +# CONFIG_BCACHE is not set +CONFIG_BLK_DEV_DM_BUILTIN=y +CONFIG_BLK_DEV_DM=y +# CONFIG_DM_DEBUG is not set +CONFIG_DM_BUFIO=y +# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set +CONFIG_DM_BIO_PRISON=y +CONFIG_DM_PERSISTENT_DATA=y +# CONFIG_DM_UNSTRIPED is not set +CONFIG_DM_CRYPT=y +CONFIG_DM_SNAPSHOT=y +CONFIG_DM_THIN_PROVISIONING=y +# CONFIG_DM_CACHE is not set +# CONFIG_DM_WRITECACHE is not set +# CONFIG_DM_EBS is not set +# CONFIG_DM_ERA is not set +# CONFIG_DM_CLONE is not set +# CONFIG_DM_MIRROR is not set +# CONFIG_DM_RAID is not set +# CONFIG_DM_ZERO is not set +# CONFIG_DM_MULTIPATH is not set +# CONFIG_DM_DELAY is not set +# CONFIG_DM_DUST is not set +# CONFIG_DM_INIT is not set +# CONFIG_DM_UEVENT is not set +# CONFIG_DM_FLAKEY is not set +CONFIG_DM_VERITY=y +# CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG is not set +CONFIG_DM_VERITY_FEC=y +# CONFIG_DM_SWITCH is not set +# CONFIG_DM_LOG_WRITES is not set +# CONFIG_DM_INTEGRITY is not set +# CONFIG_TARGET_CORE is not set +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_FIREWIRE is not set +# CONFIG_FIREWIRE_NOSY is not set +# end of IEEE 1394 (FireWire) support + +# CONFIG_MACINTOSH_DRIVERS is not set +CONFIG_NETDEVICES=y +CONFIG_MII=m +CONFIG_NET_CORE=y +# CONFIG_BONDING is not set +# CONFIG_DUMMY is not set +# CONFIG_WIREGUARD is not set +# CONFIG_EQUALIZER is not set +# CONFIG_NET_FC is not set +# CONFIG_NET_TEAM is not set +# CONFIG_MACVLAN is not set +# CONFIG_IPVLAN is not set +# CONFIG_VXLAN is not set +# CONFIG_GENEVE is not set +# CONFIG_BAREUDP is not set +# CONFIG_GTP is not set +# CONFIG_MACSEC is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_TUN is not set +# CONFIG_TUN_VNET_CROSS_LE is not set +# CONFIG_VETH is not set +# CONFIG_NLMON is not set +# CONFIG_ARCNET is not set + +# +# Distributed Switch Architecture drivers +# +# end of Distributed Switch Architecture drivers + +CONFIG_ETHERNET=y +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_NET_VENDOR_ADAPTEC is not set +# CONFIG_NET_VENDOR_AGERE is not set +# CONFIG_NET_VENDOR_ALACRITECH is not set +# CONFIG_NET_VENDOR_ALTEON is not set +# CONFIG_ALTERA_TSE is not set +# CONFIG_NET_VENDOR_AMAZON is not set +# CONFIG_NET_VENDOR_AMD is not set +# CONFIG_NET_VENDOR_AQUANTIA is not set +# CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_ATHEROS is not set +# CONFIG_NET_VENDOR_AURORA is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_BROCADE is not set +# CONFIG_NET_VENDOR_CADENCE is not set +# CONFIG_NET_VENDOR_CAVIUM is not set +# CONFIG_NET_VENDOR_CHELSIO is not set +# CONFIG_NET_VENDOR_CISCO is not set +# CONFIG_NET_VENDOR_CORTINA is not set +# CONFIG_CX_ECAT is not set +# CONFIG_DNET is not set +# CONFIG_NET_VENDOR_DEC is not set +# CONFIG_NET_VENDOR_DLINK is not set +# CONFIG_NET_VENDOR_EMULEX is not set +# CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_GOOGLE is not set +# CONFIG_NET_VENDOR_HUAWEI is not set +# CONFIG_NET_VENDOR_I825XX is not set +CONFIG_NET_VENDOR_INTEL=y +# CONFIG_E100 is not set +CONFIG_E1000=m +CONFIG_E1000E=m +CONFIG_E1000E_HWTS=y +# CONFIG_IGB is not set +# CONFIG_IGBVF is not set +# CONFIG_IXGB is not set +# CONFIG_IXGBE is not set +# CONFIG_IXGBEVF is not set +# CONFIG_I40E is not set +# CONFIG_I40EVF is not set +# CONFIG_ICE is not set +# CONFIG_FM10K is not set +# CONFIG_IGC is not set +# CONFIG_JME is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MELLANOX is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_MICROCHIP is not set +# CONFIG_NET_VENDOR_MICROSEMI is not set +# CONFIG_NET_VENDOR_MYRI is not set +# CONFIG_FEALNX is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_NETERION is not set +# CONFIG_NET_VENDOR_NETRONOME is not set +# CONFIG_NET_VENDOR_NI is not set +# CONFIG_NET_VENDOR_NVIDIA is not set +# CONFIG_NET_VENDOR_OKI is not set +# CONFIG_ETHOC is not set +# CONFIG_NET_VENDOR_PACKET_ENGINES is not set +# CONFIG_NET_VENDOR_PENSANDO is not set +# CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_QUALCOMM is not set +# CONFIG_NET_VENDOR_RDC is not set +# CONFIG_NET_VENDOR_REALTEK is not set +# CONFIG_NET_VENDOR_RENESAS is not set +# CONFIG_NET_VENDOR_ROCKER is not set +# CONFIG_NET_VENDOR_SAMSUNG is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set +# CONFIG_NET_VENDOR_SILAN is not set +# CONFIG_NET_VENDOR_SIS is not set +# CONFIG_NET_VENDOR_SMSC is not set +# CONFIG_NET_VENDOR_SOCIONEXT is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_SUN is not set +# CONFIG_NET_VENDOR_SYNOPSYS is not set +# CONFIG_NET_VENDOR_TEHUTI is not set +# CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VIA is not set +# CONFIG_NET_VENDOR_WIZNET is not set +# CONFIG_NET_VENDOR_XILINX is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_NET_SB1000 is not set +# CONFIG_PHYLIB is not set +# CONFIG_MDIO_DEVICE is not set + +# +# PCS device drivers +# +# end of PCS device drivers + +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +CONFIG_USB_NET_DRIVERS=m +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_RTL8152 is not set +# CONFIG_USB_LAN78XX is not set +CONFIG_USB_USBNET=m +# CONFIG_USB_NET_AX8817X is not set +# CONFIG_USB_NET_AX88179_178A is not set +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_CDC_EEM=m +CONFIG_USB_NET_CDC_NCM=m +# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set +# CONFIG_USB_NET_CDC_MBIM is not set +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SR9700 is not set +# CONFIG_USB_NET_SR9800 is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_GL620A is not set +# CONFIG_USB_NET_NET1080 is not set +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_MCS7830 is not set +# CONFIG_USB_NET_RNDIS_HOST is not set +CONFIG_USB_NET_CDC_SUBSET=m +# CONFIG_USB_ALI_M5632 is not set +# CONFIG_USB_AN2720 is not set +# CONFIG_USB_BELKIN is not set +# CONFIG_USB_ARMLINUX is not set +# CONFIG_USB_EPSON2888 is not set +# CONFIG_USB_KC2190 is not set +# CONFIG_USB_NET_ZAURUS is not set +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_KALMIA is not set +# CONFIG_USB_NET_QMI_WWAN is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_VL600 is not set +# CONFIG_USB_NET_CH9200 is not set +# CONFIG_USB_NET_AQC111 is not set +# CONFIG_WLAN is not set + +# +# Enable WiMAX (Networking options) to see the WiMAX drivers +# +# CONFIG_WAN is not set +# CONFIG_VMXNET3 is not set +# CONFIG_FUJITSU_ES is not set +# CONFIG_NET_FAILOVER is not set +# CONFIG_ISDN is not set +# CONFIG_NVM is not set + +# +# Input device support +# +CONFIG_INPUT=y +# CONFIG_INPUT_FF_MEMLESS is not set +# CONFIG_INPUT_POLLDEV is not set +# CONFIG_INPUT_SPARSEKMAP is not set +# CONFIG_INPUT_MATRIXKMAP is not set + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +# CONFIG_KEYBOARD_ADP5588 is not set +# CONFIG_KEYBOARD_ADP5589 is not set +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_QT1050 is not set +# CONFIG_KEYBOARD_QT1070 is not set +# CONFIG_KEYBOARD_QT2160 is not set +# CONFIG_KEYBOARD_DLINK_DIR685 is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_TCA6416 is not set +# CONFIG_KEYBOARD_TCA8418 is not set +# CONFIG_KEYBOARD_LM8333 is not set +# CONFIG_KEYBOARD_MAX7359 is not set +# CONFIG_KEYBOARD_MCS is not set +# CONFIG_KEYBOARD_MPR121 is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_OPENCORES is not set +# CONFIG_KEYBOARD_SAMSUNG is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_PS2_ALPS is not set +# CONFIG_MOUSE_PS2_BYD is not set +# CONFIG_MOUSE_PS2_LOGIPS2PP is not set +CONFIG_MOUSE_PS2_SYNAPTICS=y +# CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS is not set +# CONFIG_MOUSE_PS2_CYPRESS is not set +# CONFIG_MOUSE_PS2_LIFEBOOK is not set +# CONFIG_MOUSE_PS2_TRACKPOINT is not set +# CONFIG_MOUSE_PS2_ELANTECH is not set +# CONFIG_MOUSE_PS2_SENTELIC is not set +# CONFIG_MOUSE_PS2_TOUCHKIT is not set +# CONFIG_MOUSE_PS2_FOCALTECH is not set +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_APPLETOUCH is not set +# CONFIG_MOUSE_BCM5974 is not set +# CONFIG_MOUSE_CYAPA is not set +# CONFIG_MOUSE_ELAN_I2C is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_MOUSE_SYNAPTICS_I2C is not set +# CONFIG_MOUSE_SYNAPTICS_USB is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TABLET is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set +# CONFIG_RMI4_CORE is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y +CONFIG_SERIO_I8042=y +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_SERIO_ALTERA_PS2 is not set +# CONFIG_SERIO_PS2MULT is not set +# CONFIG_SERIO_ARC_PS2 is not set +# CONFIG_USERIO is not set +# CONFIG_GAMEPORT is not set +# end of Hardware I/O ports +# end of Input device support + +# +# Character devices +# +CONFIG_TTY=y +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +# CONFIG_LDISC_AUTOLOAD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set +# CONFIG_SERIAL_8250_PNP is not set +# CONFIG_SERIAL_8250_16550A_VARIANTS is not set +# CONFIG_SERIAL_8250_FINTEK is not set +# CONFIG_SERIAL_8250_CONSOLE is not set +# CONFIG_SERIAL_8250_PCI is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_DW is not set +# CONFIG_SERIAL_8250_RT288X is not set +# CONFIG_SERIAL_8250_LPSS is not set +# CONFIG_SERIAL_8250_MID is not set + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_UARTLITE is not set +CONFIG_SERIAL_CORE=y +# CONFIG_SERIAL_JSM is not set +# CONFIG_SERIAL_LANTIQ is not set +# CONFIG_SERIAL_SCCNXP is not set +# CONFIG_SERIAL_SC16IS7XX is not set +# CONFIG_SERIAL_ALTERA_JTAGUART is not set +# CONFIG_SERIAL_ALTERA_UART is not set +# CONFIG_SERIAL_ARC is not set +# CONFIG_SERIAL_RP2 is not set +# CONFIG_SERIAL_FSL_LPUART is not set +# CONFIG_SERIAL_FSL_LINFLEXUART is not set +# CONFIG_SERIAL_SPRD is not set +# end of Serial drivers + +# CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_N_GSM is not set +# CONFIG_NOZOMI is not set +# CONFIG_NULL_TTY is not set +# CONFIG_TRACE_SINK is not set +# CONFIG_SERIAL_DEV_BUS is not set +CONFIG_TTY_PRINTK=y +CONFIG_TTY_PRINTK_LEVEL=6 +# CONFIG_VIRTIO_CONSOLE is not set +# CONFIG_IPMI_HANDLER is not set +# CONFIG_IPMB_DEVICE_INTERFACE is not set +CONFIG_HW_RANDOM=y +# CONFIG_HW_RANDOM_TIMERIOMEM is not set +CONFIG_HW_RANDOM_INTEL=y +# CONFIG_HW_RANDOM_AMD is not set +# CONFIG_HW_RANDOM_BA431 is not set +# CONFIG_HW_RANDOM_VIA is not set +# CONFIG_HW_RANDOM_XIPHERA is not set +# CONFIG_APPLICOM is not set +# CONFIG_MWAVE is not set +CONFIG_DEVMEM=y +# CONFIG_DEVKMEM is not set +# CONFIG_NVRAM is not set +# CONFIG_RAW_DRIVER is not set +CONFIG_DEVPORT=y +# CONFIG_HPET is not set +# CONFIG_HANGCHECK_TIMER is not set +CONFIG_TCG_TPM=y +# CONFIG_HW_RANDOM_TPM is not set +CONFIG_TCG_TIS_CORE=y +CONFIG_TCG_TIS=y +# CONFIG_TCG_TIS_I2C_ATMEL is not set +# CONFIG_TCG_TIS_I2C_INFINEON is not set +# CONFIG_TCG_TIS_I2C_NUVOTON is not set +# CONFIG_TCG_NSC is not set +# CONFIG_TCG_ATMEL is not set +# CONFIG_TCG_INFINEON is not set +# CONFIG_TCG_CRB is not set +# CONFIG_TCG_VTPM_PROXY is not set +# CONFIG_TCG_TIS_ST33ZP24_I2C is not set +# CONFIG_TELCLOCK is not set +# CONFIG_XILLYBUS is not set +# end of Character devices + +CONFIG_RANDOM_TRUST_CPU=y +# CONFIG_RANDOM_TRUST_BOOTLOADER is not set + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_ACPI_I2C_OPREGION=y +CONFIG_I2C_BOARDINFO=y +# CONFIG_I2C_COMPAT is not set +# CONFIG_I2C_CHARDEV is not set +# CONFIG_I2C_MUX is not set +# CONFIG_I2C_HELPER_AUTO is not set +# CONFIG_I2C_SMBUS is not set + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=y +# CONFIG_I2C_ALGOPCF is not set +# CONFIG_I2C_ALGOPCA is not set +# end of I2C Algorithms + +# +# I2C Hardware Bus support +# + +# +# PC SMBus host controller drivers +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +# CONFIG_I2C_AMD756 is not set +# CONFIG_I2C_AMD8111 is not set +# CONFIG_I2C_AMD_MP2 is not set +# CONFIG_I2C_I801 is not set +# CONFIG_I2C_ISCH is not set +# CONFIG_I2C_ISMT is not set +# CONFIG_I2C_PIIX4 is not set +# CONFIG_I2C_NFORCE2 is not set +# CONFIG_I2C_NVIDIA_GPU is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set +# CONFIG_I2C_SIS96X is not set +# CONFIG_I2C_VIA is not set +# CONFIG_I2C_VIAPRO is not set + +# +# ACPI drivers +# +# CONFIG_I2C_SCMI is not set + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +# CONFIG_I2C_DESIGNWARE_PLATFORM is not set +# CONFIG_I2C_DESIGNWARE_PCI is not set +# CONFIG_I2C_EMEV2 is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_PCA_PLATFORM is not set +# CONFIG_I2C_SIMTEC is not set +# CONFIG_I2C_XILINX is not set + +# +# External I2C/SMBus adapter drivers +# +# CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_ROBOTFUZZ_OSIF is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_TINY_USB is not set + +# +# Other I2C/SMBus bus drivers +# +# CONFIG_I2C_MLXCPLD is not set +# end of I2C Hardware Bus support + +# CONFIG_I2C_STUB is not set +CONFIG_I2C_SLAVE=y +# CONFIG_I2C_SLAVE_EEPROM is not set +# CONFIG_I2C_SLAVE_TESTUNIT is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# end of I2C support + +# CONFIG_I3C is not set +# CONFIG_SPI is not set +# CONFIG_SPMI is not set +# CONFIG_HSI is not set +# CONFIG_PPS is not set + +# +# PTP clock support +# +# CONFIG_PTP_1588_CLOCK is not set + +# +# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. +# +# end of PTP clock support + +# CONFIG_PINCTRL is not set +# CONFIG_GPIOLIB is not set +# CONFIG_W1 is not set +# CONFIG_POWER_RESET is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_POWER_SUPPLY_DEBUG is not set +# CONFIG_PDA_POWER is not set +# CONFIG_TEST_POWER is not set +# CONFIG_CHARGER_ADP5061 is not set +# CONFIG_BATTERY_CW2015 is not set +# CONFIG_BATTERY_DS2780 is not set +# CONFIG_BATTERY_DS2781 is not set +# CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_SBS is not set +# CONFIG_CHARGER_SBS is not set +# CONFIG_BATTERY_BQ27XXX is not set +# CONFIG_BATTERY_MAX17040 is not set +# CONFIG_BATTERY_MAX17042 is not set +# CONFIG_CHARGER_MAX8903 is not set +# CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_BQ2415X is not set +# CONFIG_CHARGER_SMB347 is not set +# CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_CHARGER_BD99954 is not set +# CONFIG_HWMON is not set +CONFIG_THERMAL=y +# CONFIG_THERMAL_NETLINK is not set +# CONFIG_THERMAL_STATISTICS is not set +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +# CONFIG_THERMAL_WRITABLE_TRIPS is not set +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set +# CONFIG_THERMAL_GOV_FAIR_SHARE is not set +CONFIG_THERMAL_GOV_STEP_WISE=y +# CONFIG_THERMAL_GOV_BANG_BANG is not set +# CONFIG_THERMAL_GOV_USER_SPACE is not set +# CONFIG_THERMAL_EMULATION is not set + +# +# Intel thermal drivers +# +# CONFIG_INTEL_POWERCLAMP is not set +# CONFIG_X86_PKG_TEMP_THERMAL is not set +# CONFIG_INTEL_SOC_DTS_THERMAL is not set + +# +# ACPI INT340X thermal drivers +# +# CONFIG_INT340X_THERMAL is not set +# end of ACPI INT340X thermal drivers + +# CONFIG_INTEL_PCH_THERMAL is not set +# end of Intel thermal drivers + +# CONFIG_WATCHDOG is not set +CONFIG_SSB_POSSIBLE=y +# CONFIG_SSB is not set +CONFIG_BCMA_POSSIBLE=y +# CONFIG_BCMA is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_AS3711 is not set +# CONFIG_PMIC_ADP5520 is not set +# CONFIG_MFD_BCM590XX is not set +# CONFIG_MFD_BD9571MWV is not set +# CONFIG_MFD_AXP20X_I2C is not set +# CONFIG_MFD_MADERA is not set +# CONFIG_PMIC_DA903X is not set +# CONFIG_MFD_DA9052_I2C is not set +# CONFIG_MFD_DA9055 is not set +# CONFIG_MFD_DA9062 is not set +# CONFIG_MFD_DA9063 is not set +# CONFIG_MFD_DA9150 is not set +# CONFIG_MFD_DLN2 is not set +# CONFIG_MFD_MC13XXX_I2C is not set +# CONFIG_MFD_MP2629 is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set +# CONFIG_LPC_ICH is not set +# CONFIG_LPC_SCH is not set +# CONFIG_MFD_INTEL_LPSS_ACPI is not set +# CONFIG_MFD_INTEL_LPSS_PCI is not set +# CONFIG_MFD_IQS62X is not set +# CONFIG_MFD_JANZ_CMODIO is not set +# CONFIG_MFD_KEMPLD is not set +# CONFIG_MFD_88PM800 is not set +# CONFIG_MFD_88PM805 is not set +# CONFIG_MFD_88PM860X is not set +# CONFIG_MFD_MAX14577 is not set +# CONFIG_MFD_MAX77693 is not set +# CONFIG_MFD_MAX77843 is not set +# CONFIG_MFD_MAX8907 is not set +# CONFIG_MFD_MAX8925 is not set +# CONFIG_MFD_MAX8997 is not set +# CONFIG_MFD_MAX8998 is not set +# CONFIG_MFD_MT6360 is not set +# CONFIG_MFD_MT6397 is not set +# CONFIG_MFD_MENF21BMC is not set +# CONFIG_MFD_VIPERBOARD is not set +# CONFIG_MFD_RETU is not set +# CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RC5T583 is not set +# CONFIG_MFD_SEC_CORE is not set +# CONFIG_MFD_SI476X_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_SKY81452 is not set +# CONFIG_ABX500_CORE is not set +CONFIG_MFD_SYSCON=y +# CONFIG_MFD_TI_AM335X_TSCADC is not set +# CONFIG_MFD_LP3943 is not set +# CONFIG_MFD_LP8788 is not set +# CONFIG_MFD_TI_LMU is not set +# CONFIG_MFD_PALMAS is not set +# CONFIG_TPS6105X is not set +# CONFIG_TPS6507X is not set +# CONFIG_MFD_TPS65086 is not set +# CONFIG_MFD_TPS65090 is not set +# CONFIG_MFD_TI_LP873X is not set +# CONFIG_MFD_TPS6586X is not set +# CONFIG_MFD_TPS65912_I2C is not set +# CONFIG_MFD_TPS80031 is not set +# CONFIG_TWL4030_CORE is not set +# CONFIG_TWL6040_CORE is not set +# CONFIG_MFD_WL1273_CORE is not set +# CONFIG_MFD_LM3533 is not set +# CONFIG_MFD_TQMX86 is not set +# CONFIG_MFD_VX855 is not set +# CONFIG_MFD_ARIZONA_I2C is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MFD_WM831X_I2C is not set +# CONFIG_MFD_WM8350_I2C is not set +# CONFIG_MFD_WM8994 is not set +# end of Multifunction device drivers + +# CONFIG_REGULATOR is not set +# CONFIG_RC_CORE is not set +# CONFIG_MEDIA_CEC_SUPPORT is not set +# CONFIG_MEDIA_SUPPORT is not set + +# +# Graphics support +# +# CONFIG_AGP is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 +# CONFIG_VGA_SWITCHEROO is not set +# CONFIG_DRM is not set + +# +# ARM devices +# +# end of ARM devices + +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y + +# +# Frame buffer Devices +# +CONFIG_FB_CMDLINE=y +CONFIG_FB_NOTIFY=y +CONFIG_FB=y +# CONFIG_FIRMWARE_EDID is not set +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_FOREIGN_ENDIAN is not set +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_CIRRUS is not set +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ARC is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +# CONFIG_FB_VGA16 is not set +# CONFIG_FB_VESA is not set +CONFIG_FB_EFI=y +# CONFIG_FB_N411 is not set +# CONFIG_FB_HGA is not set +# CONFIG_FB_OPENCORES is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_NVIDIA is not set +# CONFIG_FB_RIVA is not set +# CONFIG_FB_I740 is not set +# CONFIG_FB_LE80578 is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_S3 is not set +# CONFIG_FB_SAVAGE is not set +# CONFIG_FB_SIS is not set +# CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_VOODOO1 is not set +# CONFIG_FB_VT8623 is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_ARK is not set +# CONFIG_FB_PM3 is not set +# CONFIG_FB_CARMINE is not set +# CONFIG_FB_SMSCUFX is not set +# CONFIG_FB_UDL is not set +# CONFIG_FB_IBM_GXT4500 is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +# CONFIG_FB_SIMPLE is not set +# CONFIG_FB_SM712 is not set +# end of Frame buffer Devices + +# +# Backlight & LCD device support +# +# CONFIG_LCD_CLASS_DEVICE is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_BACKLIGHT_APPLE is not set +# CONFIG_BACKLIGHT_QCOM_WLED is not set +# CONFIG_BACKLIGHT_SAHARA is not set +# CONFIG_BACKLIGHT_ADP8860 is not set +# CONFIG_BACKLIGHT_ADP8870 is not set +# CONFIG_BACKLIGHT_LM3639 is not set +# CONFIG_BACKLIGHT_LV5207LP is not set +# CONFIG_BACKLIGHT_BD6107 is not set +# CONFIG_BACKLIGHT_ARCXCNN is not set +# end of Backlight & LCD device support + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_DUMMY_CONSOLE_COLUMNS=80 +CONFIG_DUMMY_CONSOLE_ROWS=25 +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set +# end of Console display driver support + +# CONFIG_LOGO is not set +# end of Graphics support + +# CONFIG_SOUND is not set + +# +# HID support +# +CONFIG_HID=y +# CONFIG_HID_BATTERY_STRENGTH is not set +# CONFIG_HIDRAW is not set +# CONFIG_UHID is not set +CONFIG_HID_GENERIC=y + +# +# Special HID drivers +# +# CONFIG_HID_A4TECH is not set +# CONFIG_HID_ACCUTOUCH is not set +# CONFIG_HID_ACRUX is not set +# CONFIG_HID_APPLE is not set +# CONFIG_HID_APPLEIR is not set +# CONFIG_HID_AUREAL is not set +# CONFIG_HID_BELKIN is not set +# CONFIG_HID_BETOP_FF is not set +# CONFIG_HID_CHERRY is not set +# CONFIG_HID_CHICONY is not set +# CONFIG_HID_COUGAR is not set +# CONFIG_HID_MACALLY is not set +# CONFIG_HID_CMEDIA is not set +# CONFIG_HID_CREATIVE_SB0540 is not set +# CONFIG_HID_CYPRESS is not set +# CONFIG_HID_DRAGONRISE is not set +# CONFIG_HID_EMS_FF is not set +# CONFIG_HID_ELECOM is not set +# CONFIG_HID_ELO is not set +# CONFIG_HID_EZKEY is not set +# CONFIG_HID_GEMBIRD is not set +# CONFIG_HID_GFRM is not set +# CONFIG_HID_GLORIOUS is not set +# CONFIG_HID_HOLTEK is not set +# CONFIG_HID_VIVALDI is not set +# CONFIG_HID_KEYTOUCH is not set +# CONFIG_HID_KYE is not set +# CONFIG_HID_UCLOGIC is not set +# CONFIG_HID_WALTOP is not set +# CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_GYRATION is not set +# CONFIG_HID_ICADE is not set +# CONFIG_HID_ITE is not set +# CONFIG_HID_JABRA is not set +# CONFIG_HID_TWINHAN is not set +# CONFIG_HID_KENSINGTON is not set +# CONFIG_HID_LCPOWER is not set +# CONFIG_HID_LENOVO is not set +# CONFIG_HID_MAGICMOUSE is not set +# CONFIG_HID_MALTRON is not set +# CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_REDRAGON is not set +# CONFIG_HID_MICROSOFT is not set +# CONFIG_HID_MONTEREY is not set +# CONFIG_HID_MULTITOUCH is not set +# CONFIG_HID_NTI is not set +# CONFIG_HID_NTRIG is not set +# CONFIG_HID_ORTEK is not set +# CONFIG_HID_PANTHERLORD is not set +# CONFIG_HID_PENMOUNT is not set +# CONFIG_HID_PETALYNX is not set +# CONFIG_HID_PICOLCD is not set +# CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PRIMAX is not set +# CONFIG_HID_RETRODE is not set +# CONFIG_HID_ROCCAT is not set +# CONFIG_HID_SAITEK is not set +# CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SPEEDLINK is not set +# CONFIG_HID_STEAM is not set +# CONFIG_HID_STEELSERIES is not set +# CONFIG_HID_SUNPLUS is not set +# CONFIG_HID_RMI is not set +# CONFIG_HID_GREENASIA is not set +# CONFIG_HID_SMARTJOYPLUS is not set +# CONFIG_HID_TIVO is not set +# CONFIG_HID_TOPSEED is not set +# CONFIG_HID_THRUSTMASTER is not set +# CONFIG_HID_UDRAW_PS3 is not set +# CONFIG_HID_WACOM is not set +# CONFIG_HID_XINMO is not set +# CONFIG_HID_ZEROPLUS is not set +# CONFIG_HID_ZYDACRON is not set +# CONFIG_HID_SENSOR_HUB is not set +# CONFIG_HID_ALPS is not set +# end of Special HID drivers + +# +# USB HID support +# +CONFIG_USB_HID=m +# CONFIG_HID_PID is not set +# CONFIG_USB_HIDDEV is not set + +# +# USB HID Boot Protocol drivers +# +# CONFIG_USB_KBD is not set +# CONFIG_USB_MOUSE is not set +# end of USB HID Boot Protocol drivers +# end of USB HID support + +# +# I2C HID support +# +# CONFIG_I2C_HID is not set +# end of I2C HID support + +# +# Intel ISH HID support +# +# CONFIG_INTEL_ISH_HID is not set +# end of Intel ISH HID support +# end of HID support + +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_COMMON=y +# CONFIG_USB_ULPI_BUS is not set +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB=y +CONFIG_USB_PCI=y +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEFAULT_PERSIST=y +# CONFIG_USB_FEW_INIT_RETRIES is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_OTG_PRODUCTLIST is not set +# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set +CONFIG_USB_AUTOSUSPEND_DELAY=2 +# CONFIG_USB_MON is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +CONFIG_USB_XHCI_HCD=m +# CONFIG_USB_XHCI_DBGCAP is not set +CONFIG_USB_XHCI_PCI=m +# CONFIG_USB_XHCI_PCI_RENESAS is not set +CONFIG_USB_XHCI_PLATFORM=m +CONFIG_USB_EHCI_HCD=m +# CONFIG_USB_EHCI_ROOT_HUB_TT is not set +CONFIG_USB_EHCI_TT_NEWSCHED=y +CONFIG_USB_EHCI_PCI=m +# CONFIG_USB_EHCI_FSL is not set +CONFIG_USB_EHCI_HCD_PLATFORM=m +# CONFIG_USB_OXU210HP_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_FOTG210_HCD is not set +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_OHCI_HCD_PCI=m +# CONFIG_USB_OHCI_HCD_PLATFORM is not set +# CONFIG_USB_UHCI_HCD is not set +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_HCD_TEST_MODE is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set +# CONFIG_USB_WDM is not set +# CONFIG_USB_TMC is not set + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may +# + +# +# also be needed; see USB_STORAGE Help for more info +# +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_REALTEK is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_ONETOUCH is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set +# CONFIG_USB_STORAGE_ENE_UB6250 is not set +# CONFIG_USB_UAS is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USBIP_CORE is not set +# CONFIG_USB_CDNS3 is not set +# CONFIG_USB_MUSB_HDRC is not set +# CONFIG_USB_DWC3 is not set +# CONFIG_USB_DWC2 is not set +# CONFIG_USB_CHIPIDEA is not set +# CONFIG_USB_ISP1760 is not set + +# +# USB port drivers +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_FTDI_ELAN is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_APPLE_MFI_FASTCHARGE is not set +# CONFIG_USB_SISUSBVGA is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_EHSET_TEST_FIXTURE is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_YUREX is not set +# CONFIG_USB_EZUSB_FX2 is not set +# CONFIG_USB_HUB_USB251XB is not set +# CONFIG_USB_HSIC_USB3503 is not set +# CONFIG_USB_HSIC_USB4604 is not set +# CONFIG_USB_LINK_LAYER_TEST is not set +# CONFIG_USB_CHAOSKEY is not set + +# +# USB Physical Layer drivers +# +# CONFIG_NOP_USB_XCEIV is not set +# CONFIG_USB_ISP1301 is not set +# end of USB Physical Layer drivers + +# CONFIG_USB_GADGET is not set +# CONFIG_TYPEC is not set +# CONFIG_USB_ROLE_SWITCH is not set +CONFIG_MMC=m +CONFIG_MMC_BLOCK=m +CONFIG_MMC_BLOCK_MINORS=8 +# CONFIG_SDIO_UART is not set +# CONFIG_MMC_TEST is not set + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_SDHCI=m +# CONFIG_MMC_SDHCI_PCI is not set +# CONFIG_MMC_SDHCI_ACPI is not set +# CONFIG_MMC_SDHCI_PLTFM is not set +# CONFIG_MMC_WBSD is not set +# CONFIG_MMC_TIFM_SD is not set +# CONFIG_MMC_CB710 is not set +# CONFIG_MMC_VIA_SDMMC is not set +# CONFIG_MMC_VUB300 is not set +# CONFIG_MMC_USHC is not set +# CONFIG_MMC_USDHI6ROL0 is not set +CONFIG_MMC_CQHCI=m +# CONFIG_MMC_HSQ is not set +# CONFIG_MMC_TOSHIBA_PCI is not set +# CONFIG_MMC_MTK is not set +# CONFIG_MEMSTICK is not set +# CONFIG_NEW_LEDS is not set +# CONFIG_ACCESSIBILITY is not set +# CONFIG_INFINIBAND is not set +CONFIG_EDAC_ATOMIC_SCRUB=y +CONFIG_EDAC_SUPPORT=y +CONFIG_RTC_LIB=y +CONFIG_RTC_MC146818_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +CONFIG_RTC_SYSTOHC=y +CONFIG_RTC_SYSTOHC_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set +CONFIG_RTC_NVMEM=y + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_ABB5ZES3 is not set +# CONFIG_RTC_DRV_ABEOZ9 is not set +# CONFIG_RTC_DRV_ABX80X is not set +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1374 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_ISL12022 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_PCF8523 is not set +# CONFIG_RTC_DRV_PCF85063 is not set +# CONFIG_RTC_DRV_PCF85363 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_M41T80 is not set +# CONFIG_RTC_DRV_BQ32K is not set +# CONFIG_RTC_DRV_S35390A is not set +# CONFIG_RTC_DRV_FM3130 is not set +# CONFIG_RTC_DRV_RX8010 is not set +# CONFIG_RTC_DRV_RX8581 is not set +# CONFIG_RTC_DRV_RX8025 is not set +# CONFIG_RTC_DRV_EM3027 is not set +# CONFIG_RTC_DRV_RV3028 is not set +# CONFIG_RTC_DRV_RV3032 is not set +# CONFIG_RTC_DRV_RV8803 is not set +# CONFIG_RTC_DRV_SD3078 is not set + +# +# SPI RTC drivers +# +CONFIG_RTC_I2C_AND_SPI=y + +# +# SPI and I2C RTC drivers +# +# CONFIG_RTC_DRV_DS3232 is not set +# CONFIG_RTC_DRV_PCF2127 is not set +# CONFIG_RTC_DRV_RV3029C2 is not set + +# +# Platform RTC drivers +# +CONFIG_RTC_DRV_CMOS=y +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1685_FAMILY is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_DS2404 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_MSM6242 is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_RP5C01 is not set +# CONFIG_RTC_DRV_V3020 is not set + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_FTRTC010 is not set + +# +# HID Sensor RTC drivers +# +# CONFIG_DMADEVICES is not set + +# +# DMABUF options +# +CONFIG_SYNC_FILE=y +# CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_SELFTESTS is not set +# CONFIG_DMABUF_HEAPS is not set +# end of DMABUF options + +# CONFIG_AUXDISPLAY is not set +# CONFIG_UIO is not set +# CONFIG_VFIO is not set +# CONFIG_VIRT_DRIVERS is not set +# CONFIG_VIRTIO_MENU is not set +# CONFIG_VDPA is not set +# CONFIG_VHOST_MENU is not set + +# +# Microsoft Hyper-V guest support +# +# end of Microsoft Hyper-V guest support + +# CONFIG_GREYBUS is not set +# CONFIG_STAGING is not set +# CONFIG_X86_PLATFORM_DEVICES is not set +CONFIG_PMC_ATOM=y +# CONFIG_CHROME_PLATFORMS is not set +# CONFIG_MELLANOX_PLATFORM is not set +CONFIG_HAVE_CLK=y +CONFIG_CLKDEV_LOOKUP=y +CONFIG_HAVE_CLK_PREPARE=y +CONFIG_COMMON_CLK=y +# CONFIG_COMMON_CLK_MAX9485 is not set +# CONFIG_COMMON_CLK_SI5341 is not set +# CONFIG_COMMON_CLK_SI5351 is not set +# CONFIG_COMMON_CLK_SI544 is not set +# CONFIG_COMMON_CLK_CDCE706 is not set +# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_HWSPINLOCK is not set + +# +# Clock Source drivers +# +CONFIG_CLKEVT_I8253=y +CONFIG_I8253_LOCK=y +CONFIG_CLKBLD_I8253=y +# end of Clock Source drivers + +CONFIG_MAILBOX=y +CONFIG_PCC=y +# CONFIG_ALTERA_MBOX is not set +CONFIG_IOMMU_IOVA=y +CONFIG_IOASID=y +CONFIG_IOMMU_API=y +CONFIG_IOMMU_SUPPORT=y + +# +# Generic IOMMU Pagetable Support +# +# end of Generic IOMMU Pagetable Support + +# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +# CONFIG_AMD_IOMMU is not set +CONFIG_DMAR_TABLE=y +CONFIG_INTEL_IOMMU=y +CONFIG_INTEL_IOMMU_SVM=y +CONFIG_INTEL_IOMMU_DEFAULT_ON=y +CONFIG_INTEL_IOMMU_FLOPPY_WA=y +# CONFIG_INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON is not set +# CONFIG_IRQ_REMAP is not set + +# +# Remoteproc drivers +# +# CONFIG_REMOTEPROC is not set +# end of Remoteproc drivers + +# +# Rpmsg drivers +# +# CONFIG_RPMSG_QCOM_GLINK_RPM is not set +# CONFIG_RPMSG_VIRTIO is not set +# end of Rpmsg drivers + +# CONFIG_SOUNDWIRE is not set + +# +# SOC (System On Chip) specific Drivers +# + +# +# Amlogic SoC drivers +# +# end of Amlogic SoC drivers + +# +# Aspeed SoC drivers +# +# end of Aspeed SoC drivers + +# +# Broadcom SoC drivers +# +# end of Broadcom SoC drivers + +# +# NXP/Freescale QorIQ SoC drivers +# +# end of NXP/Freescale QorIQ SoC drivers + +# +# i.MX SoC drivers +# +# end of i.MX SoC drivers + +# +# Qualcomm SoC drivers +# +# end of Qualcomm SoC drivers + +# CONFIG_SOC_TI is not set + +# +# Xilinx SoC drivers +# +# CONFIG_XILINX_VCU is not set +# end of Xilinx SoC drivers +# end of SOC (System On Chip) specific Drivers + +# CONFIG_PM_DEVFREQ is not set +# CONFIG_EXTCON is not set +# CONFIG_MEMORY is not set +# CONFIG_IIO is not set +# CONFIG_NTB is not set +# CONFIG_VME_BUS is not set +# CONFIG_PWM is not set + +# +# IRQ chip support +# +# end of IRQ chip support + +# CONFIG_IPACK_BUS is not set +# CONFIG_RESET_CONTROLLER is not set + +# +# PHY Subsystem +# +CONFIG_GENERIC_PHY=y +# CONFIG_USB_LGM_PHY is not set +# CONFIG_BCM_KONA_USB2_PHY is not set +# CONFIG_PHY_PXA_28NM_HSIC is not set +# CONFIG_PHY_PXA_28NM_USB2 is not set +# CONFIG_PHY_INTEL_LGM_EMMC is not set +# end of PHY Subsystem + +# CONFIG_POWERCAP is not set +# CONFIG_MCB is not set + +# +# Performance monitor support +# +# end of Performance monitor support + +# CONFIG_RAS is not set +# CONFIG_USB4 is not set + +# +# Android +# +# CONFIG_ANDROID is not set +# end of Android + +CONFIG_LIBNVDIMM=y +# CONFIG_BLK_DEV_PMEM is not set +# CONFIG_ND_BLK is not set +# CONFIG_BTT is not set +# CONFIG_DAX is not set +CONFIG_NVMEM=y +# CONFIG_NVMEM_SYSFS is not set + +# +# HW tracing support +# +# CONFIG_STM is not set +# CONFIG_INTEL_TH is not set +# end of HW tracing support + +# CONFIG_FPGA is not set +# CONFIG_UNISYS_VISORBUS is not set +# CONFIG_SIOX is not set +# CONFIG_SLIMBUS is not set +# CONFIG_INTERCONNECT is not set +# CONFIG_COUNTER is not set +# end of Device Drivers + +# +# File systems +# +CONFIG_DCACHE_WORD_ACCESS=y +# CONFIG_VALIDATE_FS_PARSER is not set +CONFIG_FS_IOMAP=y +# CONFIG_EXT2_FS is not set +# CONFIG_EXT3_FS is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_USE_FOR_EXT2=y +# CONFIG_EXT4_FS_POSIX_ACL is not set +# CONFIG_EXT4_FS_SECURITY is not set +# CONFIG_EXT4_DEBUG is not set +CONFIG_JBD2=y +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_BTRFS_FS is not set +# CONFIG_NILFS2_FS is not set +# CONFIG_F2FS_FS is not set +# CONFIG_FS_DAX is not set +# CONFIG_EXPORTFS_BLOCK_OPS is not set +CONFIG_FILE_LOCKING=y +CONFIG_MANDATORY_FILE_LOCKING=y +# CONFIG_FS_ENCRYPTION is not set +# CONFIG_FS_VERITY is not set +# CONFIG_DNOTIFY is not set +# CONFIG_INOTIFY_USER is not set +# CONFIG_FANOTIFY is not set +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_FUSE_FS is not set +# CONFIG_OVERLAY_FS is not set + +# +# Caches +# +# CONFIG_FSCACHE is not set +# end of Caches + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +# CONFIG_ZISOFS is not set +# CONFIG_UDF_FS is not set +# end of CD-ROM/DVD Filesystems + +# +# DOS/FAT/EXFAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +# CONFIG_FAT_DEFAULT_UTF8 is not set +CONFIG_EXFAT_FS=y +CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" +# CONFIG_NTFS_FS is not set +# end of DOS/FAT/EXFAT/NT Filesystems + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +# CONFIG_PROC_KCORE is not set +CONFIG_PROC_SYSCTL=y +# CONFIG_PROC_PAGE_MONITOR is not set +# CONFIG_PROC_CHILDREN is not set +CONFIG_PROC_PID_ARCH_STATUS=y +CONFIG_KERNFS=y +CONFIG_SYSFS=y +# CONFIG_TMPFS is not set +# CONFIG_HUGETLBFS is not set +CONFIG_ARCH_HAS_GIGANTIC_PAGE=y +# CONFIG_CONFIGFS_FS is not set +CONFIG_EFIVAR_FS=m +# end of Pseudo filesystems + +# CONFIG_MISC_FILESYSTEMS is not set +CONFIG_NETWORK_FILESYSTEMS=y +# CONFIG_CEPH_FS is not set +# CONFIG_CIFS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="utf8" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ASCII is not set +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_MAC_ROMAN is not set +# CONFIG_NLS_MAC_CELTIC is not set +# CONFIG_NLS_MAC_CENTEURO is not set +# CONFIG_NLS_MAC_CROATIAN is not set +# CONFIG_NLS_MAC_CYRILLIC is not set +# CONFIG_NLS_MAC_GAELIC is not set +# CONFIG_NLS_MAC_GREEK is not set +# CONFIG_NLS_MAC_ICELAND is not set +# CONFIG_NLS_MAC_INUIT is not set +# CONFIG_NLS_MAC_ROMANIAN is not set +# CONFIG_NLS_MAC_TURKISH is not set +CONFIG_NLS_UTF8=y +# CONFIG_UNICODE is not set +CONFIG_IO_WQ=y +# end of File systems + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY_DMESG_RESTRICT is not set +# CONFIG_SECURITYFS is not set +# CONFIG_PAGE_TABLE_ISOLATION is not set +CONFIG_INTEL_TXT=y +CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y +CONFIG_HARDENED_USERCOPY=y +CONFIG_HARDENED_USERCOPY_FALLBACK=y +# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set +# CONFIG_FORTIFY_SOURCE is not set +# CONFIG_STATIC_USERMODEHELPER is not set +# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" + +# +# Kernel hardening options +# + +# +# Memory initialization +# +CONFIG_INIT_STACK_NONE=y +# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set +# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set +# end of Memory initialization +# end of Kernel hardening options +# end of Security options + +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_SKCIPHER=y +CONFIG_CRYPTO_SKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_AKCIPHER2=y +CONFIG_CRYPTO_KPP2=y +CONFIG_CRYPTO_ACOMP2=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +CONFIG_CRYPTO_USER=y +CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_NULL2=y +# CONFIG_CRYPTO_PCRYPT is not set +CONFIG_CRYPTO_CRYPTD=y +CONFIG_CRYPTO_AUTHENC=y +# CONFIG_CRYPTO_TEST is not set +CONFIG_CRYPTO_SIMD=y +CONFIG_CRYPTO_GLUE_HELPER_X86=y + +# +# Public-key cryptography +# +# CONFIG_CRYPTO_RSA is not set +# CONFIG_CRYPTO_DH is not set +# CONFIG_CRYPTO_ECDH is not set +# CONFIG_CRYPTO_ECRDSA is not set +# CONFIG_CRYPTO_SM2 is not set +# CONFIG_CRYPTO_CURVE25519 is not set +# CONFIG_CRYPTO_CURVE25519_X86 is not set + +# +# Authenticated Encryption with Associated Data +# +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_ECHAINIV is not set + +# +# Block modes +# +CONFIG_CRYPTO_CBC=y +# CONFIG_CRYPTO_CFB is not set +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set +CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_OFB is not set +# CONFIG_CRYPTO_PCBC is not set +CONFIG_CRYPTO_XTS=y +# CONFIG_CRYPTO_KEYWRAP is not set +# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set +# CONFIG_CRYPTO_ADIANTUM is not set +CONFIG_CRYPTO_ESSIV=y + +# +# Hash modes +# +# CONFIG_CRYPTO_CMAC is not set +CONFIG_CRYPTO_HMAC=y +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_VMAC is not set + +# +# Digest +# +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CRC32C_INTEL=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_CRC32_PCLMUL is not set +# CONFIG_CRYPTO_XXHASH is not set +# CONFIG_CRYPTO_BLAKE2B is not set +# CONFIG_CRYPTO_BLAKE2S is not set +# CONFIG_CRYPTO_BLAKE2S_X86 is not set +# CONFIG_CRYPTO_CRCT10DIF is not set +# CONFIG_CRYPTO_GHASH is not set +# CONFIG_CRYPTO_POLY1305 is not set +# CONFIG_CRYPTO_POLY1305_X86_64 is not set +# CONFIG_CRYPTO_MD4 is not set +CONFIG_CRYPTO_MD5=y +# CONFIG_CRYPTO_MICHAEL_MIC is not set +# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_RMD160 is not set +# CONFIG_CRYPTO_RMD256 is not set +# CONFIG_CRYPTO_RMD320 is not set +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA1_SSSE3=y +CONFIG_CRYPTO_SHA256_SSSE3=y +CONFIG_CRYPTO_SHA512_SSSE3=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_SHA512=y +# CONFIG_CRYPTO_SHA3 is not set +# CONFIG_CRYPTO_SM3 is not set +# CONFIG_CRYPTO_STREEBOG is not set +# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_WP512 is not set +# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set + +# +# Ciphers +# +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +CONFIG_CRYPTO_AES_NI_INTEL=y +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_SALSA20 is not set +# CONFIG_CRYPTO_CHACHA20 is not set +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set +# CONFIG_CRYPTO_SM4 is not set +# CONFIG_CRYPTO_TWOFISH is not set +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set +# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set + +# +# Compression +# +# CONFIG_CRYPTO_DEFLATE is not set +# CONFIG_CRYPTO_LZO is not set +# CONFIG_CRYPTO_842 is not set +# CONFIG_CRYPTO_LZ4 is not set +# CONFIG_CRYPTO_LZ4HC is not set +# CONFIG_CRYPTO_ZSTD is not set + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set +# CONFIG_CRYPTO_DRBG_MENU is not set +# CONFIG_CRYPTO_JITTERENTROPY is not set +CONFIG_CRYPTO_USER_API=y +CONFIG_CRYPTO_USER_API_HASH=y +CONFIG_CRYPTO_USER_API_SKCIPHER=y +CONFIG_CRYPTO_USER_API_RNG=y +CONFIG_CRYPTO_USER_API_AEAD=y +# CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set +# CONFIG_CRYPTO_STATS is not set +CONFIG_CRYPTO_HASH_INFO=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_AES=y +# CONFIG_CRYPTO_LIB_BLAKE2S is not set +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA256=y +# CONFIG_CRYPTO_HW is not set + +# +# Certificates for signature checking +# +# end of Certificates for signature checking + +# +# Library routines +# +# CONFIG_PACKING is not set +CONFIG_BITREVERSE=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_NET_UTILS=y +CONFIG_GENERIC_FIND_FIRST_BIT=y +# CONFIG_CORDIC is not set +# CONFIG_PRIME_NUMBERS is not set +CONFIG_RATIONAL=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_IOMAP=y +CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y +CONFIG_ARCH_HAS_FAST_MULTIPLIER=y +CONFIG_ARCH_USE_SYM_ANNOTATIONS=y +# CONFIG_CRC_CCITT is not set +CONFIG_CRC16=y +# CONFIG_CRC_T10DIF is not set +# CONFIG_CRC_ITU_T is not set +CONFIG_CRC32=y +# CONFIG_CRC32_SELFTEST is not set +CONFIG_CRC32_SLICEBY8=y +# CONFIG_CRC32_SLICEBY4 is not set +# CONFIG_CRC32_SARWATE is not set +# CONFIG_CRC32_BIT is not set +# CONFIG_CRC64 is not set +# CONFIG_CRC4 is not set +# CONFIG_CRC7 is not set +CONFIG_LIBCRC32C=y +# CONFIG_CRC8 is not set +# CONFIG_RANDOM32_SELFTEST is not set +CONFIG_XZ_DEC=y +CONFIG_XZ_DEC_X86=y +# CONFIG_XZ_DEC_POWERPC is not set +# CONFIG_XZ_DEC_IA64 is not set +# CONFIG_XZ_DEC_ARM is not set +# CONFIG_XZ_DEC_ARMTHUMB is not set +# CONFIG_XZ_DEC_SPARC is not set +CONFIG_XZ_DEC_BCJ=y +# CONFIG_XZ_DEC_TEST is not set +CONFIG_DECOMPRESS_XZ=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_REED_SOLOMON=y +CONFIG_REED_SOLOMON_DEC8=y +CONFIG_INTERVAL_TREE=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAS_DMA=y +CONFIG_DMA_OPS=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_SWIOTLB=y +# CONFIG_DMA_API_DEBUG is not set +CONFIG_SGL_ALLOC=y +CONFIG_CPU_RMAP=y +CONFIG_DQL=y +CONFIG_GLOB=y +# CONFIG_GLOB_SELFTEST is not set +CONFIG_NLATTR=y +# CONFIG_IRQ_POLL is not set +CONFIG_UCS2_STRING=y +CONFIG_HAVE_GENERIC_VDSO=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_VDSO_TIME_NS=y +CONFIG_FONT_SUPPORT=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +CONFIG_SG_POOL=y +CONFIG_ARCH_HAS_PMEM_API=y +CONFIG_MEMREGION=y +CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y +CONFIG_ARCH_HAS_COPY_MC=y +CONFIG_ARCH_STACKWALK=y +CONFIG_SBITMAP=y +# CONFIG_STRING_SELFTEST is not set +# end of Library routines + +# +# Kernel hacking +# + +# +# printk and dmesg options +# +CONFIG_PRINTK_TIME=y +# CONFIG_PRINTK_CALLER is not set +CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 +CONFIG_CONSOLE_LOGLEVEL_QUIET=4 +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 +CONFIG_BOOT_PRINTK_DELAY=y +# CONFIG_DYNAMIC_DEBUG is not set +# CONFIG_DYNAMIC_DEBUG_CORE is not set +CONFIG_SYMBOLIC_ERRNAME=y +# CONFIG_DEBUG_BUGVERBOSE is not set +# end of printk and dmesg options + +# +# Compile-time checks and compiler options +# +# CONFIG_DEBUG_INFO is not set +# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_FRAME_WARN=1024 +# CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_READABLE_ASM is not set +# CONFIG_HEADERS_INSTALL is not set +# CONFIG_DEBUG_SECTION_MISMATCH is not set +CONFIG_SECTION_MISMATCH_WARN_ONLY=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set +CONFIG_STACK_VALIDATION=y +# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set +# end of Compile-time checks and compiler options + +# +# Generic Kernel Debugging Instruments +# +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 +CONFIG_MAGIC_SYSRQ_SERIAL=y +CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" +# CONFIG_DEBUG_FS is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y +# CONFIG_UBSAN is not set +CONFIG_HAVE_ARCH_KCSAN=y +# end of Generic Kernel Debugging Instruments + +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_MISC is not set + +# +# Memory Debugging +# +# CONFIG_PAGE_EXTENSION is not set +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_POISONING is not set +# CONFIG_DEBUG_RODATA_TEST is not set +CONFIG_ARCH_HAS_DEBUG_WX=y +# CONFIG_DEBUG_WX is not set +CONFIG_GENERIC_PTDUMP=y +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_SLUB_STATS is not set +CONFIG_HAVE_DEBUG_KMEMLEAK=y +# CONFIG_DEBUG_KMEMLEAK is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_SCHED_STACK_END_CHECK is not set +CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_VM_PGTABLE is not set +CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y +# CONFIG_DEBUG_VIRTUAL is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_HAVE_ARCH_KASAN=y +CONFIG_HAVE_ARCH_KASAN_VMALLOC=y +CONFIG_CC_HAS_KASAN_GENERIC=y +CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y +# CONFIG_KASAN is not set +# end of Memory Debugging + +# CONFIG_DEBUG_SHIRQ is not set + +# +# Debug Oops, Lockups and Hangs +# +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_ON_OOPS_VALUE=0 +CONFIG_PANIC_TIMEOUT=0 +CONFIG_LOCKUP_DETECTOR=y +CONFIG_SOFTLOCKUP_DETECTOR=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 +CONFIG_HARDLOCKUP_DETECTOR_PERF=y +CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y +CONFIG_HARDLOCKUP_DETECTOR=y +# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 +CONFIG_DETECT_HUNG_TASK=y +CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 +# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set +CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 +CONFIG_WQ_WATCHDOG=y +# CONFIG_TEST_LOCKUP is not set +# end of Debug Oops, Lockups and Hangs + +# +# Scheduler Debugging +# +# CONFIG_SCHED_DEBUG is not set +# CONFIG_SCHEDSTATS is not set +# end of Scheduler Debugging + +# CONFIG_DEBUG_TIMEKEEPING is not set + +# +# Lock Debugging (spinlocks, mutexes, etc...) +# +CONFIG_LOCK_DEBUGGING_SUPPORT=y +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_DEBUG_ATOMIC_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_LOCK_TORTURE_TEST is not set +# CONFIG_WW_MUTEX_SELFTEST is not set +# CONFIG_SCF_TORTURE_TEST is not set +# CONFIG_CSD_LOCK_WAIT_DEBUG is not set +# end of Lock Debugging (spinlocks, mutexes, etc...) + +# CONFIG_STACKTRACE is not set +# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set +# CONFIG_DEBUG_KOBJECT is not set + +# +# Debug kernel data structures +# +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_PLIST is not set +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_BUG_ON_DATA_CORRUPTION is not set +# end of Debug kernel data structures + +# CONFIG_DEBUG_CREDENTIALS is not set + +# +# RCU Debugging +# +# CONFIG_RCU_SCALE_TEST is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_REF_SCALE_TEST is not set +CONFIG_RCU_CPU_STALL_TIMEOUT=21 +# CONFIG_RCU_TRACE is not set +# CONFIG_RCU_EQS_DEBUG is not set +# end of RCU Debugging + +# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set +# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set +# CONFIG_LATENCYTOP is not set +CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_TRACING_SUPPORT=y +# CONFIG_FTRACE is not set +# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set +# CONFIG_SAMPLES is not set +CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y +# CONFIG_STRICT_DEVMEM is not set + +# +# x86 Debugging +# +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y +# CONFIG_X86_VERBOSE_BOOTUP is not set +CONFIG_EARLY_PRINTK=y +# CONFIG_EARLY_PRINTK_DBGP is not set +# CONFIG_EARLY_PRINTK_USB_XDBC is not set +# CONFIG_EFI_PGT_DUMP is not set +# CONFIG_DEBUG_TLBFLUSH is not set +CONFIG_HAVE_MMIOTRACE_SUPPORT=y +# CONFIG_X86_DECODER_SELFTEST is not set +CONFIG_IO_DELAY_0X80=y +# CONFIG_IO_DELAY_0XED is not set +# CONFIG_IO_DELAY_UDELAY is not set +# CONFIG_IO_DELAY_NONE is not set +# CONFIG_CPA_DEBUG is not set +# CONFIG_DEBUG_ENTRY is not set +# CONFIG_DEBUG_NMI_SELFTEST is not set +# CONFIG_X86_DEBUG_FPU is not set +# CONFIG_PUNIT_ATOM_DEBUG is not set +CONFIG_UNWINDER_ORC=y +# CONFIG_UNWINDER_FRAME_POINTER is not set +# CONFIG_UNWINDER_GUESS is not set +# end of x86 Debugging + +# +# Kernel Testing and Coverage +# +# CONFIG_KUNIT is not set +# CONFIG_NOTIFIER_ERROR_INJECTION is not set +# CONFIG_FAULT_INJECTION is not set +CONFIG_ARCH_HAS_KCOV=y +CONFIG_CC_HAS_SANCOV_TRACE_PC=y +# CONFIG_KCOV is not set +# CONFIG_RUNTIME_TESTING_MENU is not set +# CONFIG_MEMTEST is not set +# end of Kernel Testing and Coverage +# end of Kernel hacking From 24bcfee3d1e093c8d759cc62e32b0c373351751a Mon Sep 17 00:00:00 2001 From: Random Number <159942794+loftlifter31@users.noreply.github.com> Date: Thu, 29 Aug 2024 11:21:28 -0500 Subject: [PATCH 02/17] Delete boards/galp5/TigerLakeFspBinPkg/Client/.ignore Signed-off-by: Thierry Laurion --- boards/galp5/TigerLakeFspBinPkg/Client/.ignore | 1 - 1 file changed, 1 deletion(-) delete mode 100644 boards/galp5/TigerLakeFspBinPkg/Client/.ignore diff --git a/boards/galp5/TigerLakeFspBinPkg/Client/.ignore b/boards/galp5/TigerLakeFspBinPkg/Client/.ignore deleted file mode 100644 index 8b1378917..000000000 --- a/boards/galp5/TigerLakeFspBinPkg/Client/.ignore +++ /dev/null @@ -1 +0,0 @@ - From bb33a5b58e9615ceafa8926e6d2d3e00162b447b Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 3 Sep 2024 10:28:06 -0400 Subject: [PATCH 03/17] modules/coreboot: add system76 coreboot fork, using latest head commit Signed-off-by: Thierry Laurion --- modules/coreboot | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/coreboot b/modules/coreboot index 13fc943f4..d249a0a79 100644 --- a/modules/coreboot +++ b/modules/coreboot @@ -97,6 +97,13 @@ coreboot-dasharo_commit_hash := 3a9aa3a4692f3dd49732f5b4e3ec54be385f0969 coreboot-dasharo_patch_version := unreleased $(eval $(call coreboot_module,dasharo,)) +# System76 maintain their own fork +coreboot-system76_repo := https://github.com/system76/coreboot +coreboot-system76_commit_hash := 6da534f92044c684139675a599eef92d077b2b36 +coreboot-system76_patch_version := unreleased +$(eval $(call coreboot_module,system76,)) + + # Check that the board configured the coreboot version correctly ifeq "$(CONFIG_COREBOOT_VERSION)" "" $(error "$(BOARD): does not specify coreboot version under CONFIG_COREBOOT_VERSION") From 63b6e7a04196c233397d7f7d44472dbd6a0b33b7 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 3 Sep 2024 10:30:17 -0400 Subject: [PATCH 04/17] boards/galp5: base on librem_11, use system76 coreboot fork, reorganize Signed-off-by: Thierry Laurion --- boards/galp5/galp5.config | 52 +++++++++++++-------------------------- 1 file changed, 17 insertions(+), 35 deletions(-) diff --git a/boards/galp5/galp5.config b/boards/galp5/galp5.config index f3f11b86b..54f49de68 100644 --- a/boards/galp5/galp5.config +++ b/boards/galp5/galp5.config @@ -1,7 +1,11 @@ +# Configuration System76 Galago Pro 5 CONFIG_LINUX_CONFIG=config/linux-galp5.config CONFIG_COREBOOT_CONFIG=config/coreboot-galp5.config -export CONFIG_BOOT_DEV="/dev/nvme0n1p1" -export CONFIG_ROOT_DEV="/dev/nvme0n1p3" + +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=system76 +export CONFIG_LINUX_VERSION=6.1.8 + CONFIG_CRYPTSETUP2=y CONFIG_FLASHROM=y CONFIG_FLASHTOOLS=y @@ -14,46 +18,24 @@ CONFIG_PCIUTILS=y CONFIG_POPT=y CONFIG_QRENCODE=y CONFIG_TPMTOTP=y + CONFIG_CAIRO=y CONFIG_FBWHIPTAIL=y CONFIG_HOTPKEY=y + CONFIG_LINUX_USB=y -#export CONFIG_TPM=y -export CONFIG_TPM2_TOOLS=y -export CONFIG_PRIMARY_KEY_TYPE=ecc -CONFIG_TPM2_TSS=y -CONFIG_OPENSSL=y +CONFIG_MOBILE_TETHERING=y + +export CONFIG_TPM=y +export CONFIG_SUPPORT_USB_KEYBOARD=y + export CONFIG_BOOTSCRIPT=/bin/gui-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" export CONFIG_BOOT_KERNEL_REMOVE="" -export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" -export CONFIG_ROOT_CHECK_AT_BOOT="n" -export CONFIG_AUTO_BOOT_TIMEOUT=5 -export CONFIG_COREBOOT=y -export CONFIG_COREBOOT_VERSION=4.22.01 -export CONFIG_LINUX_VERSION=5.10.5 -#export CONFIG_LINUX_VERSION=5.16.19 -export CONFIG_BOARD_NAME="galp5" -CONFIG_IO386=y +export CONFIG_BOOT_DEV="/dev/nvme0n1p1" +export CONFIG_BOARD_NAME="Galago Pro 5" +export CONFIG_FLASHROM_OPTIONS="-p internal" -CONFIG_VENDOR_SYSTEM76=y -CONFIG_BOARD_SYSTEM76_GALP5=y -CONFIG_CCACHE=y -CONFIG_CONSOLE_SERIAL=n -CONFIG_CPU_MICROCODE_CBFS_DEFAULT_BINS=y -CONFIG_HAVE_IFD_BIN=y -CONFIG_HAVE_ME_BIN=y -CONFIG_IFD_BIN_PATH="boards/galp5/fd.rom" -CONFIG_ME_BIN_PATH="boards/galp5/me.rom" -CONFIG_PAYLOAD_ELF=y -CONFIG_PAYLOAD_FILE=coreboot.rom -CONFIG_PCIEXP_HOTPLUG_MEM=0x2000000 -CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x20000000 -CONFIG_POST_IO=n -CONFIG_SMMSTORE=y -CONFIG_SMMSTORE_V2=y -CONFIG_USE_OPTION_TABLE=y -CONFIG_VALIDATE_INTEL_DESCRIPTOR=y -#CONFIG_CONSOLE_SYSTEM76_EC=y +export CONFIG_AUTO_BOOT_TIMEOUT=5 From e0972669e1b8aa24cbd1e751c72033bb1dfc01a1 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 3 Sep 2024 10:31:20 -0400 Subject: [PATCH 05/17] galp5 coreboot config: WiP: start from clean menuconfig, save, borrow librem_11 GOP based changes Signed-off-by: Thierry Laurion --- config/coreboot-galp5.config | 113 +++++++++++++++++++++-------------- 1 file changed, 69 insertions(+), 44 deletions(-) diff --git a/config/coreboot-galp5.config b/config/coreboot-galp5.config index cd24c0ad0..37d210e78 100644 --- a/config/coreboot-galp5.config +++ b/config/coreboot-galp5.config @@ -13,13 +13,12 @@ CONFIG_COMPILER_GCC=y # CONFIG_COMPILER_LLVM_CLANG is not set CONFIG_ARCH_SUPPORTS_CLANG=y # CONFIG_ANY_TOOLCHAIN is not set -CONFIG_CCACHE=y +# CONFIG_CCACHE is not set # CONFIG_IWYU is not set # CONFIG_FMD_GENPARSER is not set # CONFIG_UTIL_GENPARSER is not set -# CONFIG_OPTION_BACKEND_NONE is not set -CONFIG_USE_OPTION_TABLE=y -# CONFIG_STATIC_OPTION_TABLE is not set +CONFIG_OPTION_BACKEND_NONE=y +# CONFIG_USE_OPTION_TABLE is not set CONFIG_COMPRESS_RAMSTAGE_LZMA=y # CONFIG_COMPRESS_RAMSTAGE_LZ4 is not set CONFIG_SEPARATE_ROMSTAGE=y @@ -33,10 +32,15 @@ CONFIG_USE_BLOBS=y # CONFIG_UBSAN is not set CONFIG_HAVE_ASAN_IN_RAMSTAGE=y # CONFIG_ASAN is not set -CONFIG_NO_STAGE_CACHE=y -# CONFIG_TSEG_STAGE_CACHE is not set +# CONFIG_NO_STAGE_CACHE is not set +CONFIG_TSEG_STAGE_CACHE=y # CONFIG_UPDATE_IMAGE is not set -# CONFIG_BOOTSPLASH_IMAGE is not set +CONFIG_BOOTSPLASH_IMAGE=y +CONFIG_BOOTSPLASH_FILE="@BRAND_DIR@/bootsplash.jpg" +CONFIG_BOOTSPLASH_CONVERT=y +CONFIG_BOOTSPLASH_CONVERT_QUALITY=70 +# CONFIG_BOOTSPLASH_CONVERT_RESIZE is not set +# CONFIG_BOOTSPLASH_CONVERT_COLORSWAP is not set # CONFIG_FW_CONFIG is not set # @@ -107,37 +111,37 @@ CONFIG_VENDOR_SYSTEM76=y CONFIG_BOARD_SPECIFIC_OPTIONS=y CONFIG_MAINBOARD_PART_NUMBER="galp5" CONFIG_MAINBOARD_VERSION="galp5" -CONFIG_MAINBOARD_DIR="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/tgl-u" +CONFIG_MAINBOARD_DIR="system76/tgl-u" CONFIG_DIMM_MAX=4 CONFIG_DIMM_SPD_SIZE=512 -CONFIG_FMDFILE="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/tgl-u/board.fmd" +CONFIG_FMDFILE="src/mainboard/$(CONFIG_MAINBOARD_DIR)/board.fmd" # CONFIG_NO_POST is not set CONFIG_MAINBOARD_VENDOR="System76" CONFIG_CBFS_SIZE=0x200000 -# CONFIG_CONSOLE_SERIAL is not set +CONFIG_CONSOLE_SERIAL=y CONFIG_MAX_CPUS=8 CONFIG_ONBOARD_VGA_IS_PRIMARY=y # CONFIG_POST_DEVICE is not set -# CONFIG_POST_IO is not set +CONFIG_POST_IO=y CONFIG_UART_FOR_CONSOLE=2 -CONFIG_DEVICETREE="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/tgl-u/devicetree.cb" +CONFIG_DEVICETREE="devicetree.cb" # CONFIG_VBOOT is not set CONFIG_VARIANT_DIR="galp5" -CONFIG_OVERRIDE_DEVICETREE="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/tgl-u/variants/galp5/overridetree.cb" +CONFIG_OVERRIDE_DEVICETREE="variants/$(CONFIG_VARIANT_DIR)/overridetree.cb" # CONFIG_VGA_BIOS is not set CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="System76" -CONFIG_INTEL_GMA_VBT_FILE="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/tgl-u/variants/galp5/data.vbt" +CONFIG_INTEL_GMA_VBT_FILE="src/mainboard/$(MAINBOARDDIR)/variants/$(VARIANT_DIR)/data.vbt" # CONFIG_DISABLE_HECI1_AT_PRE_BOOT is not set CONFIG_PRERAM_CBMEM_CONSOLE_SIZE=0x2000 -CONFIG_CMOS_DEFAULT_FILE="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/tgl-u/cmos.default" -CONFIG_CMOS_LAYOUT_FILE="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/tgl-u/cmos.layout" +CONFIG_CMOS_DEFAULT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.default" +CONFIG_CMOS_LAYOUT_FILE="src/mainboard/$(MAINBOARDDIR)/cmos.layout" CONFIG_BOOT_DEVICE_SPI_FLASH_BUS=0 CONFIG_CONSOLE_POST=y CONFIG_TPM_PIRQ=0x0 # CONFIG_USE_PM_ACPI_TIMER is not set CONFIG_ECAM_MMCONF_BASE_ADDRESS=0xc0000000 CONFIG_ECAM_MMCONF_BUS_NUMBER=256 -CONFIG_MEMLAYOUT_LD_FILE="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/memlayout.ld" +CONFIG_MEMLAYOUT_LD_FILE="src/arch/x86/memlayout.ld" CONFIG_DCACHE_RAM_BASE=0xfef00000 CONFIG_DCACHE_RAM_SIZE=0x80000 CONFIG_C_ENV_BOOTBLOCK_SIZE=0x40000 @@ -146,21 +150,22 @@ CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_DRIVERS_INTEL_WIFI=y -CONFIG_IFD_BIN_PATH="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/fd.rom" -CONFIG_ME_BIN_PATH="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/me.rom" +CONFIG_IFD_BIN_PATH="3rdparty/blobs/mainboard/$(MAINBOARDDIR)/descriptor.bin" +CONFIG_ME_BIN_PATH="3rdparty/blobs/mainboard/$(MAINBOARDDIR)/me.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y -# CONFIG_USE_LEGACY_8254_TIMER is not set +CONFIG_USE_LEGACY_8254_TIMER=y # CONFIG_DEBUG_SMI is not set CONFIG_MAINBOARD_SMBIOS_PRODUCT_NAME="Galago Pro" CONFIG_HAVE_IFD_BIN=y CONFIG_PCIEXP_HOTPLUG_BUSES=8 -CONFIG_PCIEXP_HOTPLUG_MEM=0x2000000 -CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x20000000 +CONFIG_PCIEXP_HOTPLUG_MEM=0x800000 +CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x10000000 CONFIG_PS2K_EISAID="PNP0303" CONFIG_PS2M_EISAID="PNP0F13" # CONFIG_SOC_INTEL_CSE_SEND_EOP_EARLY is not set +CONFIG_TTYS0_BAUD=115200 CONFIG_POWER_STATE_DEFAULT_ON_AFTER_FAILURE=y CONFIG_D3COLD_SUPPORT=y CONFIG_PCIEXP_ASPM=y @@ -169,7 +174,6 @@ CONFIG_PCIEXP_CLK_PM=y # CONFIG_DRIVERS_UART_8250IO is not set CONFIG_PC_CMOS_BASE_PORT_BANK1=0x72 CONFIG_FSP_TEMP_RAM_SIZE=0x20000 -CONFIG_HEAP_SIZE=0x10000 CONFIG_EC_GPE_SCI=0x50 # CONFIG_BOARD_SYSTEM76_ADDW1 is not set # CONFIG_BOARD_SYSTEM76_ADDW2 is not set @@ -189,16 +193,23 @@ CONFIG_EC_GPE_SCI=0x50 # CONFIG_BOARD_SYSTEM76_GALP2 is not set # CONFIG_BOARD_SYSTEM76_GALP3 is not set # CONFIG_BOARD_SYSTEM76_GALP3_B is not set +# CONFIG_BOARD_SYSTEM76_DARP10 is not set +# CONFIG_BOARD_SYSTEM76_DARP10_B is not set +# CONFIG_BOARD_SYSTEM76_LEMP13 is not set +# CONFIG_BOARD_SYSTEM76_LEMP13_B is not set # CONFIG_BOARD_SYSTEM76_ORYP5 is not set # CONFIG_BOARD_SYSTEM76_ORYP6 is not set # CONFIG_BOARD_SYSTEM76_ORYP7 is not set # CONFIG_BOARD_SYSTEM76_ADDW3 is not set +# CONFIG_BOARD_SYSTEM76_ADDW4 is not set # CONFIG_BOARD_SYSTEM76_BONW15 is not set +# CONFIG_BOARD_SYSTEM76_BONW15_B is not set # CONFIG_BOARD_SYSTEM76_DARP9 is not set # CONFIG_BOARD_SYSTEM76_GALP7 is not set # CONFIG_BOARD_SYSTEM76_GAZE18 is not set # CONFIG_BOARD_SYSTEM76_LEMP12 is not set # CONFIG_BOARD_SYSTEM76_ORYP11 is not set +# CONFIG_BOARD_SYSTEM76_ORYP12 is not set # CONFIG_BOARD_SYSTEM76_SERW13 is not set # CONFIG_BOARD_SYSTEM76_GAZE16_3050 is not set # CONFIG_BOARD_SYSTEM76_GAZE16_3060 is not set @@ -211,6 +222,7 @@ CONFIG_BOARD_SYSTEM76_GALP5=y # CONFIG_BOARD_SYSTEM76_DARP5 is not set CONFIG_TPM_MEASURED_BOOT=y CONFIG_DRIVERS_GFX_NVIDIA_BRIDGE=0x1c +CONFIG_LINUX_COMMAND_LINE="" CONFIG_BOARD_ROMSIZE_KB_16384=y # CONFIG_COREBOOT_ROMSIZE_KB_256 is not set # CONFIG_COREBOOT_ROMSIZE_KB_512 is not set @@ -223,6 +235,7 @@ CONFIG_BOARD_ROMSIZE_KB_16384=y # CONFIG_COREBOOT_ROMSIZE_KB_10240 is not set # CONFIG_COREBOOT_ROMSIZE_KB_12288 is not set CONFIG_COREBOOT_ROMSIZE_KB_16384=y +# CONFIG_COREBOOT_ROMSIZE_KB_24576 is not set # CONFIG_COREBOOT_ROMSIZE_KB_32768 is not set # CONFIG_COREBOOT_ROMSIZE_KB_65536 is not set CONFIG_COREBOOT_ROMSIZE_KB=16384 @@ -244,7 +257,7 @@ CONFIG_SYSTEM_TYPE_LAPTOP=y # # SoC # -CONFIG_CHIPSET_DEVICETREE="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/tigerlake/chipset.cb" +CONFIG_CHIPSET_DEVICETREE="soc/intel/tigerlake/chipset.cb" CONFIG_FSP_M_FILE="$(obj)/Fsp_M.fd" CONFIG_FSP_S_FILE="$(obj)/Fsp_S.fd" CONFIG_CBFS_MCACHE_SIZE=0x4000 @@ -257,6 +270,7 @@ CONFIG_SMM_MODULE_STACK_SIZE=0x800 CONFIG_ACPI_BERT_SIZE=0x0 CONFIG_DRIVERS_I2C_DESIGNWARE_CLOCK_MHZ=133 CONFIG_PRERAM_CBFS_CACHE_SIZE=0x4000 +CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_ACPI_CPU_STRING="CP%02X" CONFIG_STACK_SIZE=0x2000 CONFIG_EXT_BIOS_WIN_BASE=0xf8000000 @@ -274,8 +288,8 @@ CONFIG_SOC_INTEL_I2C_DEV_MAX=6 CONFIG_SOC_INTEL_UART_DEV_MAX=3 CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_M_VAL=0x25a CONFIG_SOC_INTEL_COMMON_LPSS_UART_CLK_N_VAL=0x7fff -CONFIG_FSP_HEADER_PATH="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/TigerLakeFspBinPkg/Client/Include/" -CONFIG_FSP_FD_PATH="/home/dev/build/heads-165f90a8cf881aabf7e7481f699833ec9f497437/boards/galp5/TigerLakeFspBinPkg/Client/Fsp.fd" +CONFIG_FSP_HEADER_PATH="3rdparty/fsp/TigerLakeFspBinPkg/Client/Include/" +CONFIG_FSP_FD_PATH="3rdparty/fsp/TigerLakeFspBinPkg/Client/Fsp.fd" CONFIG_DATA_BUS_WIDTH=128 CONFIG_DIMMS_PER_CHANNEL=2 CONFIG_MRC_CHANNEL_WIDTH=16 @@ -291,6 +305,7 @@ CONFIG_CPU_INTEL_NUM_FIT_ENTRIES=4 CONFIG_SOC_INTEL_GFX_FRAMEBUFFER_OFFSET=0x0 CONFIG_PCIE_LTR_MAX_SNOOP_LATENCY=0x1003 CONFIG_PCIE_LTR_MAX_NO_SNOOP_LATENCY=0x1003 +CONFIG_SOC_PHYSICAL_ADDRESS_WIDTH=0 CONFIG_SOC_INTEL_TIGERLAKE=y # CONFIG_INTEL_TME is not set CONFIG_FSP_TYPE_CLIENT=y @@ -391,16 +406,16 @@ CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_IO_TRAP=y CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS=0 CONFIG_SOC_INTEL_COMMON_BLOCK_SPI=y CONFIG_SOC_INTEL_COMMON_BLOCK_SA=y -CONFIG_DOMAIN_RESOURCE_32BIT_LIMIT=0xe0000000 CONFIG_SOC_INTEL_COMMON_BLOCK_TCSS=y -# CONFIG_ENABLE_TCSS_DISPLAY_DETECTION is not set -# CONFIG_ENABLE_TCSS_USB_DETECTION is not set +# CONFIG_TCSS_HAS_USBC_OPS is not set CONFIG_SOC_INTEL_COMMON_BLOCK_TIMER=y CONFIG_SOC_INTEL_COMMON_BLOCK_UART=y CONFIG_INTEL_LPSS_UART_FOR_CONSOLE=y CONFIG_SOC_INTEL_COMMON_BLOCK_USB4=y CONFIG_SOC_INTEL_COMMON_BLOCK_USB4_PCIE=y CONFIG_SOC_INTEL_COMMON_BLOCK_USB4_XHCI=y +CONFIG_FIRMWARE_CONNECTION_MANAGER=y +# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set CONFIG_SOC_INTEL_COMMON_BLOCK_XDCI=y CONFIG_SOC_INTEL_COMMON_BLOCK_XHCI=y CONFIG_SOC_INTEL_COMMON_BLOCK_XHCI_ELOG=y @@ -482,6 +497,7 @@ CONFIG_RCBA_LENGTH=0x4000 # CONFIG_EC_SYSTEM76_EC=y CONFIG_EC_SYSTEM76_EC_BAT_THRESHOLDS=y +CONFIG_EC_SYSTEM76_EC_FAN2=y CONFIG_EC_SYSTEM76_EC_DGPU=y CONFIG_EC_SYSTEM76_EC_LOCKDOWN=y @@ -542,7 +558,7 @@ CONFIG_NO_EARLY_GFX_INIT=y # CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y -# CONFIG_BOOTSPLASH is not set +CONFIG_BOOTSPLASH=y # end of Display CONFIG_PCI=y @@ -559,8 +575,6 @@ CONFIG_PCI_ALLOW_BUS_MASTER_ANY_DEVICE=y # CONFIG_PCIEXP_LANE_ERR_STAT_CLEAR is not set CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM_BELOW_4G=y CONFIG_PCIEXP_HOTPLUG_IO=0x800 -CONFIG_FIRMWARE_CONNECTION_MANAGER=y -# CONFIG_SOFTWARE_CONNECTION_MANAGER is not set # CONFIG_EARLY_PCI_BRIDGE is not set CONFIG_SUBSYSTEM_VENDOR_ID=0x0000 CONFIG_SUBSYSTEM_DEVICE_ID=0x0000 @@ -579,13 +593,10 @@ CONFIG_CRB_TPM_BASE_ADDRESS=0xfed40000 # CONFIG_ELOG is not set CONFIG_CACHE_MRC_SETTINGS=y CONFIG_MRC_SETTINGS_PROTECT=y -CONFIG_SMMSTORE=y -CONFIG_SMMSTORE_V2=y -CONFIG_SMMSTORE_SIZE=0x40000 +# CONFIG_SMMSTORE is not set CONFIG_SPI_FLASH=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP=y CONFIG_BOOT_DEVICE_SPI_FLASH_RW_NOMMAP_EARLY=y -CONFIG_SPI_FLASH_SMM=y # CONFIG_SPI_FLASH_NO_FAST_READ is not set CONFIG_TPM_INIT_RAMSTAGE=y # CONFIG_TPM_PPI is not set @@ -640,13 +651,14 @@ CONFIG_DRIVERS_INTEL_PMC=y # CONFIG_DRIVERS_NXP_UWB_SR1XX is not set # CONFIG_DRIVERS_PS2_KEYBOARD is not set CONFIG_DRIVERS_MC146818=y -# CONFIG_USE_PC_CMOS_ALTCENTURY is not set +CONFIG_USE_PC_CMOS_ALTCENTURY=y CONFIG_PC_CMOS_BASE_PORT_BANK0=0x70 CONFIG_MEMORY_MAPPED_TPM=y CONFIG_TPM_TIS_BASE_ADDRESS=0xfed40000 # CONFIG_DRIVERS_SIL_3114 is not set CONFIG_DRIVERS_USB_ACPI=y CONFIG_DRIVERS_WIFI_GENERIC=y +# CONFIG_DRIVERS_MTK_WIFI is not set CONFIG_MP_SERVICES_PPI=y CONFIG_MP_SERVICES_PPI_V1=y CONFIG_DRIVERS_INTEL_USB4_RETIMER=y @@ -687,6 +699,7 @@ CONFIG_TPM_MEASURED_BOOT_RUNTIME_DATA="" CONFIG_PCR_BOOT_MODE=1 CONFIG_PCR_HWID=1 CONFIG_PCR_SRTM=2 +CONFIG_PCR_FW_VER=10 CONFIG_PCR_RUNTIME_DATA=3 # end of Trusted Platform Module @@ -719,6 +732,7 @@ CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y CONFIG_RTC=y +CONFIG_HEAP_SIZE=0x100000 # # Console @@ -727,10 +741,23 @@ CONFIG_BOOTBLOCK_CONSOLE=y CONFIG_POSTCAR_CONSOLE=y CONFIG_SQUELCH_EARLY_SMP=y CONFIG_FIXED_UART_FOR_CONSOLE=y + +# +# memory mapped, 8250-compatible +# +CONFIG_TTYS0_BASE=0x3e8 +# CONFIG_CONSOLE_SERIAL_921600 is not set +# CONFIG_CONSOLE_SERIAL_460800 is not set +# CONFIG_CONSOLE_SERIAL_230400 is not set +CONFIG_CONSOLE_SERIAL_115200=y +# CONFIG_CONSOLE_SERIAL_57600 is not set +# CONFIG_CONSOLE_SERIAL_38400 is not set +# CONFIG_CONSOLE_SERIAL_19200 is not set +# CONFIG_CONSOLE_SERIAL_9600 is not set +CONFIG_TTYS0_LCS=3 # CONFIG_SPKMODEM is not set # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y -# CONFIG_CONSOLE_CBMEM_DUMP_TO_UART is not set # CONFIG_CONSOLE_SPI_FLASH is not set # CONFIG_CONSOLE_I2C_SMBUS is not set # CONFIG_CONSOLE_SYSTEM76_EC is not set @@ -747,6 +774,7 @@ CONFIG_DEFAULT_CONSOLE_LOGLEVEL=7 CONFIG_CONSOLE_USE_LOGLEVEL_PREFIX=y CONFIG_CONSOLE_USE_ANSI_ESCAPES=y # CONFIG_CMOS_POST is not set +CONFIG_POST_IO_PORT=0x80 CONFIG_HWBASE_DEBUG_CB=y # end of Console @@ -767,7 +795,7 @@ CONFIG_MAINBOARD_SERIAL_NUMBER="123456789" # Payload # # CONFIG_PAYLOAD_NONE is not set -CONFIG_PAYLOAD_ELF=y +# CONFIG_PAYLOAD_ELF is not set # CONFIG_PAYLOAD_BOOTBOOT is not set # CONFIG_PAYLOAD_FILO is not set # CONFIG_PAYLOAD_GRUB2 is not set @@ -778,15 +806,12 @@ CONFIG_PAYLOAD_ELF=y # CONFIG_PAYLOAD_EDK2 is not set CONFIG_PAYLOAD_LINUX=y CONFIG_PAYLOAD_FILE="@BOARD_BUILD_DIR@/bzImage" -CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" CONFIG_PAYLOAD_OPTIONS="" # CONFIG_PXE is not set -# CONFIG_COMPRESSED_PAYLOAD_NONE is not set -CONFIG_COMPRESSED_PAYLOAD_LZMA=y -# CONFIG_COMPRESSED_PAYLOAD_LZ4 is not set +CONFIG_LINUX_INITRD="@BOARD_BUILD_DIR@/initrd.cpio.xz" +# CONFIG_PAYLOAD_IS_FLAT_BINARY is not set CONFIG_COMPRESS_SECONDARY_PAYLOAD=y - # # Secondary Payloads # From 7c210f05024b9c61ec069089fc8e457b3df5540a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 3 Sep 2024 10:32:30 -0400 Subject: [PATCH 06/17] glap5 linux config: WiP start from librem_11 share 6.x kernel config Signed-off-by: Thierry Laurion --- config/linux-galp5.config | 1161 +++++++++++++++++++------------------ 1 file changed, 599 insertions(+), 562 deletions(-) diff --git a/config/linux-galp5.config b/config/linux-galp5.config index 2ebbc1781..70590d5b1 100644 --- a/config/linux-galp5.config +++ b/config/linux-galp5.config @@ -1,17 +1,21 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 5.10.5 Kernel Configuration +# Linux/x86 6.1.8 Kernel Configuration # CONFIG_CC_VERSION_TEXT="x86_64-linux-musl-gcc (GCC) 8.3.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=80300 -CONFIG_LD_VERSION=232000000 CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=23200 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=23200 CONFIG_LLD_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y -CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -21,6 +25,7 @@ CONFIG_THREAD_INFO_IN_TASK=y # CONFIG_INIT_ENV_ARG_LIMIT=32 # CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set CONFIG_LOCALVERSION="-@BRAND_NAME@" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_BUILD_SALT="" @@ -40,7 +45,6 @@ CONFIG_KERNEL_XZ=y # CONFIG_KERNEL_ZSTD is not set CONFIG_DEFAULT_INIT="" CONFIG_DEFAULT_HOSTNAME="(none)" -# CONFIG_SWAP is not set # CONFIG_SYSVIPC is not set # CONFIG_POSIX_MQUEUE is not set # CONFIG_WATCH_QUEUE is not set @@ -62,6 +66,7 @@ CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_IRQ_MSI_IOMMU=y CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y CONFIG_GENERIC_IRQ_RESERVATION_MODE=y CONFIG_IRQ_FORCED_THREADING=y @@ -78,6 +83,8 @@ CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y # # Timers subsystem @@ -89,11 +96,26 @@ CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set # CONFIG_HIGH_RES_TIMERS is not set +CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 # end of Timers subsystem +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +# CONFIG_BPF_SYSCALL is not set +# CONFIG_BPF_JIT is not set +# end of BPF subsystem + +CONFIG_PREEMPT_NONE_BUILD=y CONFIG_PREEMPT_NONE=y # CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT is not set +# CONFIG_PREEMPT_DYNAMIC is not set +# CONFIG_SCHED_CORE is not set # # CPU/Task time and stats accounting @@ -117,7 +139,6 @@ CONFIG_RCU_STALL_COMMON=y CONFIG_RCU_NEED_SEGCBLIST=y # end of RCU Subsystem -CONFIG_BUILD_BIN2C=y # CONFIG_IKCONFIG is not set # CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 @@ -134,12 +155,15 @@ CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC11_NO_ARRAY_BOUNDS=y +CONFIG_GCC12_NO_ARRAY_BOUNDS=y CONFIG_ARCH_SUPPORTS_INT128=y # CONFIG_CGROUPS is not set # CONFIG_CHECKPOINT_RESTORE is not set # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set -CONFIG_RELAY=y +# CONFIG_RELAY is not set CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="@BLOB_DIR@/dev.cpio" CONFIG_INITRAMFS_ROOT_UID=0 @@ -154,13 +178,13 @@ CONFIG_RD_XZ=y CONFIG_INITRAMFS_COMPRESSION_XZ=y # CONFIG_INITRAMFS_COMPRESSION_NONE is not set # CONFIG_BOOT_CONFIG is not set +# CONFIG_INITRAMFS_PRESERVE_MTIME is not set # CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_LD_ORPHAN_WARN=y CONFIG_SYSCTL=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y -CONFIG_BPF=y CONFIG_EXPERT=y # CONFIG_MULTIUSER is not set # CONFIG_SGETMASK_SYSCALL is not set @@ -168,7 +192,6 @@ CONFIG_EXPERT=y # CONFIG_FHANDLE is not set CONFIG_POSIX_TIMERS=y CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_PCSPKR_PLATFORM=y # CONFIG_BASE_FULL is not set @@ -184,10 +207,8 @@ CONFIG_IO_URING=y # CONFIG_ADVISE_SYSCALLS is not set CONFIG_MEMBARRIER=y # CONFIG_KALLSYMS is not set -# CONFIG_BPF_SYSCALL is not set -CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y -# CONFIG_USERFAULTFD is not set CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_KCMP=y # CONFIG_RSEQ is not set CONFIG_EMBEDDED=y CONFIG_HAVE_PERF_EVENTS=y @@ -200,17 +221,6 @@ CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set # end of Kernel Performance Events And Counters -# CONFIG_VM_EVENT_COUNTERS is not set -# CONFIG_SLUB_DEBUG is not set -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLAB_FREELIST_RANDOM is not set -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -CONFIG_SLUB_CPU_PARTIAL=y # CONFIG_PROFILING is not set # end of General setup @@ -232,17 +242,10 @@ CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -CONFIG_ARCH_HAS_FILTER_PGPROT=y -CONFIG_HAVE_SETUP_PER_CPU_AREA=y -CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y -CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_NR_GPIO=1024 CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARCH_WANT_GENERAL_HUGETLB=y -CONFIG_ZONE_DMA32=y CONFIG_AUDIT_ARCH=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y @@ -253,12 +256,10 @@ CONFIG_CC_HAS_SANE_STACKPROTECTOR=y # # Processor type and features # -# CONFIG_ZONE_DMA is not set CONFIG_SMP=y CONFIG_X86_FEATURE_NAMES=y # CONFIG_X86_MPPARSE is not set # CONFIG_GOLDFISH is not set -CONFIG_RETPOLINE=y # CONFIG_X86_CPU_RESCTRL is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set @@ -293,22 +294,23 @@ CONFIG_CPU_SUP_INTEL=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y +CONFIG_BOOT_VESA_SUPPORT=y # CONFIG_MAXSMP is not set CONFIG_NR_CPUS_RANGE_BEGIN=2 CONFIG_NR_CPUS_RANGE_END=512 CONFIG_NR_CPUS_DEFAULT=64 -CONFIG_NR_CPUS=64 +CONFIG_NR_CPUS=32 +CONFIG_SCHED_CLUSTER=y CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_SCHED_MC_PRIO=y CONFIG_X86_LOCAL_APIC=y CONFIG_X86_IO_APIC=y -CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y +# CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set CONFIG_X86_MCE=y # CONFIG_X86_MCELOG_LEGACY is not set CONFIG_X86_MCE_INTEL=y CONFIG_X86_MCE_THRESHOLD=y -CONFIG_X86_THERMAL_VECTOR=y # # Performance monitoring @@ -320,7 +322,6 @@ CONFIG_X86_THERMAL_VECTOR=y # CONFIG_X86_VSYSCALL_EMULATION is not set CONFIG_X86_IOPL_IOPERM=y -# CONFIG_I8K is not set # CONFIG_MICROCODE is not set # CONFIG_X86_MSR is not set # CONFIG_X86_CPUID is not set @@ -329,16 +330,14 @@ CONFIG_X86_DIRECT_GBPAGES=y # CONFIG_NUMA is not set CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_X86_PMEM_LEGACY_DEVICE=y CONFIG_X86_PMEM_LEGACY=y # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set -CONFIG_X86_RESERVE_LOW=64 # CONFIG_MTRR is not set -CONFIG_ARCH_RANDOM=y -# CONFIG_X86_SMAP is not set -# CONFIG_X86_UMIP is not set +CONFIG_X86_UMIP=y +CONFIG_CC_HAS_IBT=y +# CONFIG_X86_KERNEL_IBT is not set # CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set CONFIG_X86_INTEL_TSX_MODE_OFF=y # CONFIG_X86_INTEL_TSX_MODE_ON is not set @@ -356,22 +355,31 @@ CONFIG_ARCH_HAS_KEXEC_PURGATORY=y # CONFIG_KEXEC_SIG is not set # CONFIG_CRASH_DUMP is not set CONFIG_PHYSICAL_START=0x1000000 -# CONFIG_RELOCATABLE is not set +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_X86_NEED_RELOCS=y CONFIG_PHYSICAL_ALIGN=0x1000000 +CONFIG_DYNAMIC_MEMORY_LAYOUT=y +CONFIG_RANDOMIZE_MEMORY=y +CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0x0 CONFIG_HOTPLUG_CPU=y # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set # CONFIG_DEBUG_HOTPLUG_CPU0 is not set -# CONFIG_LEGACY_VSYSCALL_EMULATE is not set # CONFIG_LEGACY_VSYSCALL_XONLY is not set CONFIG_LEGACY_VSYSCALL_NONE=y # CONFIG_CMDLINE_BOOL is not set # CONFIG_MODIFY_LDT_SYSCALL is not set +# CONFIG_STRICT_SIGALTSTACK_SIZE is not set CONFIG_HAVE_LIVEPATCH=y # end of Processor type and features +CONFIG_CC_HAS_RETURN_THUNK=y +CONFIG_SPECULATION_MITIGATIONS=y +CONFIG_PAGE_TABLE_ISOLATION=y +# CONFIG_RETPOLINE is not set +CONFIG_CPU_IBRS_ENTRY=y CONFIG_ARCH_HAS_ADD_PAGES=y -CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y -CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y # # Power management and ACPI options @@ -386,13 +394,13 @@ CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y # CONFIG_ACPI_DEBUGGER is not set CONFIG_ACPI_SPCR_TABLE=y +# CONFIG_ACPI_FPDT is not set CONFIG_ACPI_LPIT=y CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y # CONFIG_ACPI_EC_DEBUGFS is not set CONFIG_ACPI_AC=y CONFIG_ACPI_BATTERY=y CONFIG_ACPI_BUTTON=y -CONFIG_ACPI_VIDEO=y CONFIG_ACPI_FAN=y # CONFIG_ACPI_DOCK is not set CONFIG_ACPI_CPU_FREQ_PSS=y @@ -420,9 +428,11 @@ CONFIG_HAVE_ACPI_APEI_NMI=y # CONFIG_ACPI_APEI is not set # CONFIG_ACPI_DPTF is not set # CONFIG_ACPI_CONFIGFS is not set +# CONFIG_ACPI_PFRUT is not set +CONFIG_ACPI_PCC=y # CONFIG_PMIC_OPREGION is not set +CONFIG_ACPI_PRMT=y CONFIG_X86_PM_TIMER=y -# CONFIG_SFI is not set # # CPU Frequency scaling @@ -446,6 +456,8 @@ CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # CONFIG_X86_INTEL_PSTATE=y # CONFIG_X86_PCC_CPUFREQ is not set +# CONFIG_X86_AMD_PSTATE is not set +# CONFIG_X86_AMD_PSTATE_UT is not set # CONFIG_X86_ACPI_CPUFREQ is not set # CONFIG_X86_SPEEDSTEP_CENTRINO is not set # CONFIG_X86_P4_CLOCKMOD is not set @@ -475,56 +487,15 @@ CONFIG_PCI_DIRECT=y # CONFIG_PCI_CNB20LE_QUIRK is not set # CONFIG_ISA_BUS is not set CONFIG_ISA_DMA_API=y -# CONFIG_X86_SYSFB is not set # end of Bus options (PCI etc.) # # Binary Emulations # # CONFIG_IA32_EMULATION is not set -# CONFIG_X86_X32 is not set +# CONFIG_X86_X32_ABI is not set # end of Binary Emulations -# -# Firmware Drivers -# -# CONFIG_EDD is not set -# CONFIG_FIRMWARE_MEMMAP is not set -# CONFIG_DMIID is not set -# CONFIG_DMI_SYSFS is not set -CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y -# CONFIG_FW_CFG_SYSFS is not set -CONFIG_GOOGLE_FIRMWARE=y -# CONFIG_GOOGLE_SMI is not set -CONFIG_GOOGLE_COREBOOT_TABLE=y -CONFIG_GOOGLE_MEMCONSOLE=y -CONFIG_GOOGLE_MEMCONSOLE_X86_LEGACY=y -CONFIG_GOOGLE_MEMCONSOLE_COREBOOT=y -# CONFIG_GOOGLE_VPD is not set - -# -# EFI (Extensible Firmware Interface) Support -# -# CONFIG_EFI_VARS is not set -CONFIG_EFI_ESRT=y -CONFIG_EFI_RUNTIME_MAP=y -# CONFIG_EFI_FAKE_MEMMAP is not set -CONFIG_EFI_RUNTIME_WRAPPERS=y -# CONFIG_EFI_BOOTLOADER_CONTROL is not set -# CONFIG_EFI_CAPSULE_LOADER is not set -# CONFIG_EFI_TEST is not set -# CONFIG_EFI_RCI2_TABLE is not set -# CONFIG_EFI_DISABLE_PCI_DMA is not set -# end of EFI (Extensible Firmware Interface) Support - -CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y - -# -# Tegra firmware driver -# -# end of Tegra firmware driver -# end of Firmware Drivers - CONFIG_HAVE_KVM=y # CONFIG_VIRTUALIZATION is not set CONFIG_AS_AVX512=y @@ -539,8 +510,6 @@ CONFIG_CRASH_CORE=y CONFIG_KEXEC_CORE=y CONFIG_HOTPLUG_SMT=y CONFIG_GENERIC_ENTRY=y -CONFIG_HAVE_OPROFILE=y -CONFIG_OPROFILE_NMI_TIMER=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set @@ -552,8 +521,11 @@ CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y @@ -562,9 +534,11 @@ CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_ARCH_HAS_SET_DIRECT_MAP=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y +CONFIG_ARCH_WANTS_NO_INSTR=y CONFIG_HAVE_ASM_MODVERSIONS=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_RUST=y CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y @@ -575,6 +549,7 @@ CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_MERGE_VMAS=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y @@ -586,36 +561,65 @@ CONFIG_HAVE_ARCH_STACKLEAK=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI_CLANG=y CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y -CONFIG_HAVE_CONTEXT_TRACKING=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y CONFIG_HAVE_MOVE_PMD=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=28 +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_HAVE_OBJTOOL=y +CONFIG_HAVE_JUMP_LABEL_HACK=y +CONFIG_HAVE_NOINSTR_HACK=y +CONFIG_HAVE_NOINSTR_VALIDATION=y +CONFIG_HAVE_UACCESS_VALIDATION=y CONFIG_HAVE_STACK_VALIDATION=y CONFIG_HAVE_RELIABLE_STACKTRACE=y # CONFIG_COMPAT_32BIT_TIME is not set CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y CONFIG_STRICT_KERNEL_RWX=y CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +CONFIG_ARCH_USE_MEMREMAP_PROT=y CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_HAVE_STATIC_CALL=y CONFIG_HAVE_STATIC_CALL_INLINE=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAS_ELFCORE_COMPAT=y +CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y +CONFIG_DYNAMIC_SIGFRAME=y +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y # # GCOV-based kernel profiling @@ -624,6 +628,8 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -634,19 +640,21 @@ CONFIG_MODULES=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" CONFIG_TRIM_UNUSED_KSYMS=y CONFIG_UNUSED_KSYMS_WHITELIST="" CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_DEV_BSG=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_DEV_BSG_COMMON=y CONFIG_BLK_DEV_BSGLIB=y # CONFIG_BLK_DEV_INTEGRITY is not set # CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_CMDLINE_PARSER is not set # CONFIG_BLK_WBT is not set # CONFIG_BLK_SED_OPAL is not set # CONFIG_BLK_INLINE_ENCRYPTION is not set @@ -660,6 +668,8 @@ CONFIG_EFI_PARTITION=y # end of Partition Types CONFIG_BLK_MQ_PCI=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y # # IO Schedulers @@ -699,38 +709,71 @@ CONFIG_BINFMT_SCRIPT=y # # Memory Management options # -CONFIG_SELECT_MEMORY_MODEL=y -CONFIG_SPARSEMEM_MANUAL=y +# CONFIG_SWAP is not set + +# +# SLAB allocator options +# +# CONFIG_SLAB is not set +CONFIG_SLUB=y +# CONFIG_SLOB is not set +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLUB_STATS is not set +CONFIG_SLUB_CPU_PARTIAL=y +# end of SLAB allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_FAST_GUP=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y # CONFIG_COMPACTION is not set # CONFIG_PAGE_REPORTING is not set CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_VIRT_TO_BUS=y CONFIG_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set -# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_CLEANCACHE is not set +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y +CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y +CONFIG_HAVE_SETUP_PER_CPU_AREA=y # CONFIG_CMA is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -# CONFIG_ZSMALLOC is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +# CONFIG_ZONE_DMA is not set +CONFIG_ZONE_DMA32=y +# CONFIG_VM_EVENT_COUNTERS is not set # CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_BENCHMARK is not set + +# +# GUP_TEST needs to have DEBUG_FS enabled +# CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring # end of Memory Management options CONFIG_NET=y @@ -742,6 +785,7 @@ CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y CONFIG_UNIX_SCM=y +CONFIG_AF_UNIX_OOB=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set # CONFIG_XFRM_USER is not set @@ -752,12 +796,13 @@ CONFIG_INET=y # CONFIG_IP_PNP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set -CONFIG_SYN_COOKIES=y +# CONFIG_SYN_COOKIES is not set # CONFIG_NET_IPVTI is not set # CONFIG_NET_FOU is not set # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 # CONFIG_INET_DIAG is not set # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y @@ -776,10 +821,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_ATM is not set # CONFIG_L2TP is not set # CONFIG_BRIDGE is not set -CONFIG_HAVE_NET_DSA=y # CONFIG_NET_DSA is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set # CONFIG_LLC2 is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set @@ -799,12 +842,13 @@ CONFIG_HAVE_NET_DSA=y # CONFIG_NET_L3_MASTER_DEV is not set # CONFIG_QRTR is not set # CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y CONFIG_RPS=y CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y CONFIG_XPS=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y -# CONFIG_BPF_JIT is not set CONFIG_NET_FLOW_LIMIT=y # @@ -819,8 +863,8 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set +# CONFIG_MCTP is not set # CONFIG_WIRELESS is not set -# CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set @@ -831,7 +875,6 @@ CONFIG_NET_FLOW_LIMIT=y # CONFIG_LWTUNNEL is not set # CONFIG_FAILOVER is not set CONFIG_ETHTOOL_NETLINK=y -CONFIG_HAVE_EBPF_JIT=y # # Device Drivers @@ -842,7 +885,11 @@ CONFIG_HAVE_PCI=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y # CONFIG_PCIEPORTBUS is not set -# CONFIG_PCIEASPM is not set +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +# CONFIG_PCIEASPM_PERFORMANCE is not set # CONFIG_PCIE_PTM is not set CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y @@ -860,6 +907,8 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCIE_BUS_SAFE is not set # CONFIG_PCIE_BUS_PERFORMANCE is not set # CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_HOTPLUG_PCI is not set # @@ -897,6 +946,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_PCI_SW_SWITCHTEC is not set # end of PCI switch controller drivers +# CONFIG_CXL_BUS is not set # CONFIG_PCCARD is not set # CONFIG_RAPIDIO is not set @@ -906,6 +956,7 @@ CONFIG_PCIE_BUS_DEFAULT=y # CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set # CONFIG_STANDALONE is not set CONFIG_PREVENT_FIRMWARE_BUILD=y @@ -916,6 +967,7 @@ CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER is not set # CONFIG_FW_LOADER_COMPRESS is not set +# CONFIG_FW_UPLOAD is not set # end of Firmware loader # CONFIG_ALLOW_DEV_COREDUMP is not set @@ -935,9 +987,54 @@ CONFIG_DMA_SHARED_BUFFER=y # Bus devices # # CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set # end of Bus devices # CONFIG_CONNECTOR is not set + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# end of ARM System Control and Management Interface Protocol + +# CONFIG_EDD is not set +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_DMIID is not set +# CONFIG_DMI_SYSFS is not set +CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y +# CONFIG_ISCSI_IBFT is not set +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_SYSFB=y +CONFIG_SYSFB_SIMPLEFB=y +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# EFI (Extensible Firmware Interface) Support +# +CONFIG_EFI_ESRT=y +CONFIG_EFI_RUNTIME_MAP=y +# CONFIG_EFI_FAKE_MEMMAP is not set +CONFIG_EFI_RUNTIME_WRAPPERS=y +# CONFIG_EFI_BOOTLOADER_CONTROL is not set +# CONFIG_EFI_CAPSULE_LOADER is not set +# CONFIG_EFI_TEST is not set +# CONFIG_EFI_RCI2_TABLE is not set +# CONFIG_EFI_DISABLE_PCI_DMA is not set +CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y +# CONFIG_EFI_DISABLE_RUNTIME is not set +# CONFIG_EFI_COCO_SECRET is not set +# end of EFI (Extensible Firmware Interface) Support + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + # CONFIG_GNSS is not set # CONFIG_MTD is not set # CONFIG_OF is not set @@ -955,63 +1052,49 @@ CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_FD is not set CONFIG_CDROM=y # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=65536 # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_RSXX is not set +# CONFIG_BLK_DEV_UBLK is not set # # NVME Support # -# CONFIG_BLK_DEV_NVME is not set +CONFIG_NVME_CORE=y +CONFIG_BLK_DEV_NVME=y +# CONFIG_NVME_MULTIPATH is not set +# CONFIG_NVME_VERBOSE_ERRORS is not set # CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set +# CONFIG_NVME_AUTH is not set # end of NVME Support # # Misc devices # -# CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_IBM_ASM is not set # CONFIG_PHANTOM is not set # CONFIG_TIFM_CORE is not set -# CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_HP_ILO is not set -# CONFIG_APDS9802ALS is not set -# CONFIG_ISL29003 is not set -# CONFIG_ISL29020 is not set -# CONFIG_SENSORS_TSL2550 is not set -# CONFIG_SENSORS_BH1770 is not set -# CONFIG_SENSORS_APDS990X is not set -# CONFIG_HMC6352 is not set -# CONFIG_DS1682 is not set # CONFIG_SRAM is not set +# CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set -# CONFIG_PVPANIC is not set # CONFIG_C2PORT is not set # # EEPROM support # -# CONFIG_EEPROM_AT24 is not set -# CONFIG_EEPROM_LEGACY is not set -# CONFIG_EEPROM_MAX6875 is not set # CONFIG_EEPROM_93CX6 is not set -# CONFIG_EEPROM_IDT_89HPESX is not set -# CONFIG_EEPROM_EE1004 is not set # end of EEPROM support # CONFIG_CB710_CORE is not set @@ -1021,29 +1104,30 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 # # end of Texas Instruments shared transport line discipline -# CONFIG_SENSORS_LIS3_I2C is not set -# CONFIG_ALTERA_STAPL is not set -CONFIG_INTEL_MEI=m -CONFIG_INTEL_MEI_ME=m -CONFIG_INTEL_MEI_TXE=m +# +# Altera FPGA firmware download module (requires I2C) +# +# CONFIG_INTEL_MEI is not set +# CONFIG_INTEL_MEI_ME is not set +# CONFIG_INTEL_MEI_TXE is not set # CONFIG_VMWARE_VMCI is not set # CONFIG_GENWQE is not set # CONFIG_ECHO is not set +# CONFIG_BCM_VK is not set # CONFIG_MISC_ALCOR_PCI is not set # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set # CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set # end of Misc devices -CONFIG_HAVE_IDE=y -# CONFIG_IDE is not set - # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set +CONFIG_SCSI_COMMON=y CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_PROC_FS is not set @@ -1055,6 +1139,7 @@ CONFIG_BLK_DEV_SD=y # CONFIG_CHR_DEV_ST is not set CONFIG_BLK_DEV_SR=y CONFIG_CHR_DEV_SG=y +CONFIG_BLK_DEV_BSG=y # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_LOGGING is not set @@ -1071,14 +1156,64 @@ CONFIG_SCSI_ISCSI_ATTRS=y # CONFIG_SCSI_SRP_ATTRS is not set # end of SCSI Transports -# CONFIG_SCSI_LOWLEVEL is not set +CONFIG_SCSI_LOWLEVEL=y +CONFIG_ISCSI_TCP=y +# CONFIG_ISCSI_BOOT_SYSFS is not set +# CONFIG_SCSI_CXGB3_ISCSI is not set +# CONFIG_SCSI_CXGB4_ISCSI is not set +# CONFIG_SCSI_BNX2_ISCSI is not set +# CONFIG_BE2ISCSI is not set +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_HPSA is not set +# CONFIG_SCSI_3W_9XXX is not set +# CONFIG_SCSI_3W_SAS is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_AIC94XX is not set +# CONFIG_SCSI_MVSAS is not set +# CONFIG_SCSI_MVUMI is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_ARCMSR is not set +# CONFIG_SCSI_ESAS2R is not set +# CONFIG_MEGARAID_NEWGEN is not set +# CONFIG_MEGARAID_LEGACY is not set +# CONFIG_MEGARAID_SAS is not set +# CONFIG_SCSI_MPT3SAS is not set +# CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_MPI3MR is not set +# CONFIG_SCSI_SMARTPQI is not set +# CONFIG_SCSI_HPTIOP is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_MYRB is not set +# CONFIG_SCSI_MYRS is not set +# CONFIG_VMWARE_PVSCSI is not set +# CONFIG_SCSI_SNIC is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_FDOMAIN_PCI is not set +# CONFIG_SCSI_ISCI is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_STEX is not set +# CONFIG_SCSI_SYM53C8XX_2 is not set +# CONFIG_SCSI_IPR is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_QLA_ISCSI is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_AM53C974 is not set +# CONFIG_SCSI_WD719X is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_PMCRAID is not set +# CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_DH is not set # end of SCSI device support CONFIG_ATA=y CONFIG_SATA_HOST=y CONFIG_PATA_TIMINGS=y -CONFIG_ATA_VERBOSE_ERROR=y +# CONFIG_ATA_VERBOSE_ERROR is not set CONFIG_ATA_FORCE=y CONFIG_ATA_ACPI=y CONFIG_SATA_PMP=y @@ -1089,6 +1224,7 @@ CONFIG_SATA_PMP=y CONFIG_SATA_AHCI=y CONFIG_SATA_MOBILE_LPM_POLICY=0 # CONFIG_SATA_AHCI_PLATFORM is not set +# CONFIG_AHCI_DWC is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set @@ -1160,12 +1296,6 @@ CONFIG_NET_CORE=y # CONFIG_VETH is not set # CONFIG_NLMON is not set # CONFIG_ARCNET is not set - -# -# Distributed Switch Architecture drivers -# -# end of Distributed Switch Architecture drivers - CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set @@ -1177,21 +1307,25 @@ CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set +CONFIG_NET_VENDOR_ASIX=y # CONFIG_NET_VENDOR_ATHEROS is not set -# CONFIG_NET_VENDOR_AURORA is not set +# CONFIG_CX_ECAT is not set # CONFIG_NET_VENDOR_BROADCOM is not set -# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set # CONFIG_NET_VENDOR_CORTINA is not set -# CONFIG_CX_ECAT is not set +CONFIG_NET_VENDOR_DAVICOM=y # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set +CONFIG_NET_VENDOR_ENGLEDER=y +# CONFIG_TSNEP is not set # CONFIG_NET_VENDOR_EZCHIP is not set +CONFIG_NET_VENDOR_FUNGIBLE=y +# CONFIG_FUN_ETH is not set # CONFIG_NET_VENDOR_GOOGLE is not set # CONFIG_NET_VENDOR_HUAWEI is not set # CONFIG_NET_VENDOR_I825XX is not set @@ -1210,24 +1344,30 @@ CONFIG_E1000E_HWTS=y # CONFIG_ICE is not set # CONFIG_FM10K is not set # CONFIG_IGC is not set +CONFIG_NET_VENDOR_WANGXUN=y +# CONFIG_NGBE is not set +# CONFIG_TXGBE is not set # CONFIG_JME is not set +CONFIG_NET_VENDOR_LITEX=y # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set +CONFIG_NET_VENDOR_MICROSOFT=y # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set +# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NETERION is not set # CONFIG_NET_VENDOR_NETRONOME is not set -# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set # CONFIG_NET_VENDOR_PACKET_ENGINES is not set # CONFIG_NET_VENDOR_PENSANDO is not set # CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_REALTEK is not set @@ -1235,9 +1375,9 @@ CONFIG_E1000E_HWTS=y # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set -# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set # CONFIG_NET_VENDOR_STMICRO is not set @@ -1245,6 +1385,7 @@ CONFIG_E1000E_HWTS=y # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set +CONFIG_NET_VENDOR_VERTEXCOM=y # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_NET_VENDOR_XILINX is not set @@ -1252,6 +1393,7 @@ CONFIG_E1000E_HWTS=y # CONFIG_HIPPI is not set # CONFIG_NET_SB1000 is not set # CONFIG_PHYLIB is not set +# CONFIG_PSE_CONTROLLER is not set # CONFIG_MDIO_DEVICE is not set # @@ -1303,34 +1445,34 @@ CONFIG_USB_NET_CDC_SUBSET=m # CONFIG_USB_VL600 is not set # CONFIG_USB_NET_CH9200 is not set # CONFIG_USB_NET_AQC111 is not set +CONFIG_USB_RTL8153_ECM=m # CONFIG_WLAN is not set +# CONFIG_WAN is not set # -# Enable WiMAX (Networking options) to see the WiMAX drivers +# Wireless WAN # -# CONFIG_WAN is not set +# CONFIG_WWAN is not set +# end of Wireless WAN + # CONFIG_VMXNET3 is not set # CONFIG_FUJITSU_ES is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set -# CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y # CONFIG_INPUT_FF_MEMLESS is not set -# CONFIG_INPUT_POLLDEV is not set # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set +CONFIG_INPUT_VIVALDIFMAP=y # # Userland interfaces # -CONFIG_INPUT_MOUSEDEV=y -# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_MOUSEDEV is not set # CONFIG_INPUT_JOYDEV is not set # CONFIG_INPUT_EVDEV is not set # CONFIG_INPUT_EVBUG is not set @@ -1339,48 +1481,15 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y -# CONFIG_KEYBOARD_ADP5588 is not set -# CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=y -# CONFIG_KEYBOARD_QT1050 is not set -# CONFIG_KEYBOARD_QT1070 is not set -# CONFIG_KEYBOARD_QT2160 is not set -# CONFIG_KEYBOARD_DLINK_DIR685 is not set # CONFIG_KEYBOARD_LKKBD is not set -# CONFIG_KEYBOARD_TCA6416 is not set -# CONFIG_KEYBOARD_TCA8418 is not set -# CONFIG_KEYBOARD_LM8333 is not set -# CONFIG_KEYBOARD_MAX7359 is not set -# CONFIG_KEYBOARD_MCS is not set -# CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_XTKBD is not set -CONFIG_INPUT_MOUSE=y -CONFIG_MOUSE_PS2=y -# CONFIG_MOUSE_PS2_ALPS is not set -# CONFIG_MOUSE_PS2_BYD is not set -# CONFIG_MOUSE_PS2_LOGIPS2PP is not set -CONFIG_MOUSE_PS2_SYNAPTICS=y -# CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS is not set -# CONFIG_MOUSE_PS2_CYPRESS is not set -# CONFIG_MOUSE_PS2_LIFEBOOK is not set -# CONFIG_MOUSE_PS2_TRACKPOINT is not set -# CONFIG_MOUSE_PS2_ELANTECH is not set -# CONFIG_MOUSE_PS2_SENTELIC is not set -# CONFIG_MOUSE_PS2_TOUCHKIT is not set -# CONFIG_MOUSE_PS2_FOCALTECH is not set -# CONFIG_MOUSE_SERIAL is not set -# CONFIG_MOUSE_APPLETOUCH is not set -# CONFIG_MOUSE_BCM5974 is not set -# CONFIG_MOUSE_CYAPA is not set -# CONFIG_MOUSE_ELAN_I2C is not set -# CONFIG_MOUSE_VSXXXAA is not set -# CONFIG_MOUSE_SYNAPTICS_I2C is not set -# CONFIG_MOUSE_SYNAPTICS_USB is not set +# CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TABLET is not set # CONFIG_INPUT_TOUCHSCREEN is not set @@ -1417,7 +1526,7 @@ CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set -# CONFIG_LDISC_AUTOLOAD is not set +CONFIG_LDISC_AUTOLOAD=y # # Serial drivers @@ -1436,6 +1545,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_8250_RT288X is not set # CONFIG_SERIAL_8250_LPSS is not set # CONFIG_SERIAL_8250_MID is not set +CONFIG_SERIAL_8250_PERICOM=y # # Non-8250 serial port support @@ -1445,7 +1555,6 @@ CONFIG_SERIAL_CORE=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_LANTIQ is not set # CONFIG_SERIAL_SCCNXP is not set -# CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_ARC is not set @@ -1459,13 +1568,11 @@ CONFIG_SERIAL_CORE=y # CONFIG_N_GSM is not set # CONFIG_NOZOMI is not set # CONFIG_NULL_TTY is not set -# CONFIG_TRACE_SINK is not set # CONFIG_SERIAL_DEV_BUS is not set CONFIG_TTY_PRINTK=y CONFIG_TTY_PRINTK_LEVEL=6 # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set -# CONFIG_IPMB_DEVICE_INTERFACE is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set CONFIG_HW_RANDOM_INTEL=y @@ -1476,9 +1583,7 @@ CONFIG_HW_RANDOM_INTEL=y # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set CONFIG_DEVMEM=y -# CONFIG_DEVKMEM is not set # CONFIG_NVRAM is not set -# CONFIG_RAW_DRIVER is not set CONFIG_DEVPORT=y # CONFIG_HPET is not set # CONFIG_HANGCHECK_TIMER is not set @@ -1486,104 +1591,22 @@ CONFIG_TCG_TPM=y # CONFIG_HW_RANDOM_TPM is not set CONFIG_TCG_TIS_CORE=y CONFIG_TCG_TIS=y -# CONFIG_TCG_TIS_I2C_ATMEL is not set -# CONFIG_TCG_TIS_I2C_INFINEON is not set -# CONFIG_TCG_TIS_I2C_NUVOTON is not set # CONFIG_TCG_NSC is not set # CONFIG_TCG_ATMEL is not set # CONFIG_TCG_INFINEON is not set # CONFIG_TCG_CRB is not set # CONFIG_TCG_VTPM_PROXY is not set -# CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TELCLOCK is not set # CONFIG_XILLYBUS is not set -# end of Character devices - +# CONFIG_XILLYUSB is not set CONFIG_RANDOM_TRUST_CPU=y # CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# end of Character devices # # I2C support # -CONFIG_I2C=y -CONFIG_ACPI_I2C_OPREGION=y -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_COMPAT is not set -# CONFIG_I2C_CHARDEV is not set -# CONFIG_I2C_MUX is not set -# CONFIG_I2C_HELPER_AUTO is not set -# CONFIG_I2C_SMBUS is not set - -# -# I2C Algorithms -# -CONFIG_I2C_ALGOBIT=y -# CONFIG_I2C_ALGOPCF is not set -# CONFIG_I2C_ALGOPCA is not set -# end of I2C Algorithms - -# -# I2C Hardware Bus support -# - -# -# PC SMBus host controller drivers -# -# CONFIG_I2C_ALI1535 is not set -# CONFIG_I2C_ALI1563 is not set -# CONFIG_I2C_ALI15X3 is not set -# CONFIG_I2C_AMD756 is not set -# CONFIG_I2C_AMD8111 is not set -# CONFIG_I2C_AMD_MP2 is not set -# CONFIG_I2C_I801 is not set -# CONFIG_I2C_ISCH is not set -# CONFIG_I2C_ISMT is not set -# CONFIG_I2C_PIIX4 is not set -# CONFIG_I2C_NFORCE2 is not set -# CONFIG_I2C_NVIDIA_GPU is not set -# CONFIG_I2C_SIS5595 is not set -# CONFIG_I2C_SIS630 is not set -# CONFIG_I2C_SIS96X is not set -# CONFIG_I2C_VIA is not set -# CONFIG_I2C_VIAPRO is not set - -# -# ACPI drivers -# -# CONFIG_I2C_SCMI is not set - -# -# I2C system bus drivers (mostly embedded / system-on-chip) -# -# CONFIG_I2C_DESIGNWARE_PLATFORM is not set -# CONFIG_I2C_DESIGNWARE_PCI is not set -# CONFIG_I2C_EMEV2 is not set -# CONFIG_I2C_OCORES is not set -# CONFIG_I2C_PCA_PLATFORM is not set -# CONFIG_I2C_SIMTEC is not set -# CONFIG_I2C_XILINX is not set - -# -# External I2C/SMBus adapter drivers -# -# CONFIG_I2C_DIOLAN_U2C is not set -# CONFIG_I2C_ROBOTFUZZ_OSIF is not set -# CONFIG_I2C_TAOS_EVM is not set -# CONFIG_I2C_TINY_USB is not set - -# -# Other I2C/SMBus bus drivers -# -# CONFIG_I2C_MLXCPLD is not set -# end of I2C Hardware Bus support - -# CONFIG_I2C_STUB is not set -CONFIG_I2C_SLAVE=y -# CONFIG_I2C_SLAVE_EEPROM is not set -# CONFIG_I2C_SLAVE_TESTUNIT is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C is not set # end of I2C support # CONFIG_I3C is not set @@ -1596,6 +1619,7 @@ CONFIG_I2C_SLAVE=y # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set +CONFIG_PTP_1588_CLOCK_OPTIONAL=y # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. @@ -1610,22 +1634,12 @@ CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set # CONFIG_TEST_POWER is not set -# CONFIG_CHARGER_ADP5061 is not set -# CONFIG_BATTERY_CW2015 is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set -# CONFIG_BATTERY_DS2782 is not set -# CONFIG_BATTERY_SBS is not set -# CONFIG_CHARGER_SBS is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set # CONFIG_BATTERY_BQ27XXX is not set -# CONFIG_BATTERY_MAX17040 is not set -# CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set -# CONFIG_CHARGER_LP8727 is not set -# CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_SMB347 is not set -# CONFIG_BATTERY_GAUGE_LTC2941 is not set -# CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_GOLDFISH is not set # CONFIG_HWMON is not set CONFIG_THERMAL=y # CONFIG_THERMAL_NETLINK is not set @@ -1645,6 +1659,7 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # Intel thermal drivers # # CONFIG_INTEL_POWERCLAMP is not set +CONFIG_X86_THERMAL_VECTOR=y # CONFIG_X86_PKG_TEMP_THERMAL is not set # CONFIG_INTEL_SOC_DTS_THERMAL is not set @@ -1655,6 +1670,9 @@ CONFIG_THERMAL_GOV_STEP_WISE=y # end of ACPI INT340X thermal drivers # CONFIG_INTEL_PCH_THERMAL is not set +# CONFIG_INTEL_TCC_COOLING is not set +# CONFIG_INTEL_MENLOW is not set +# CONFIG_INTEL_HFI_THERMAL is not set # end of Intel thermal drivers # CONFIG_WATCHDOG is not set @@ -1666,94 +1684,46 @@ CONFIG_BCMA_POSSIBLE=y # # Multifunction device drivers # -# CONFIG_MFD_AS3711 is not set -# CONFIG_PMIC_ADP5520 is not set -# CONFIG_MFD_BCM590XX is not set -# CONFIG_MFD_BD9571MWV is not set -# CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set -# CONFIG_PMIC_DA903X is not set -# CONFIG_MFD_DA9052_I2C is not set -# CONFIG_MFD_DA9055 is not set -# CONFIG_MFD_DA9062 is not set -# CONFIG_MFD_DA9063 is not set -# CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set -# CONFIG_MFD_MC13XXX_I2C is not set -# CONFIG_MFD_MP2629 is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set # CONFIG_MFD_INTEL_LPSS_ACPI is not set # CONFIG_MFD_INTEL_LPSS_PCI is not set -# CONFIG_MFD_IQS62X is not set +# CONFIG_MFD_INTEL_PMC_BXT is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set -# CONFIG_MFD_88PM800 is not set -# CONFIG_MFD_88PM805 is not set -# CONFIG_MFD_88PM860X is not set -# CONFIG_MFD_MAX14577 is not set -# CONFIG_MFD_MAX77693 is not set -# CONFIG_MFD_MAX77843 is not set -# CONFIG_MFD_MAX8907 is not set -# CONFIG_MFD_MAX8925 is not set -# CONFIG_MFD_MAX8997 is not set -# CONFIG_MFD_MAX8998 is not set -# CONFIG_MFD_MT6360 is not set # CONFIG_MFD_MT6397 is not set -# CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_VIPERBOARD is not set -# CONFIG_MFD_RETU is not set -# CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_RDC321X is not set -# CONFIG_MFD_RT5033 is not set -# CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_SEC_CORE is not set -# CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set -# CONFIG_MFD_SKY81452 is not set -# CONFIG_ABX500_CORE is not set CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_AM335X_TSCADC is not set -# CONFIG_MFD_LP3943 is not set -# CONFIG_MFD_LP8788 is not set -# CONFIG_MFD_TI_LMU is not set -# CONFIG_MFD_PALMAS is not set -# CONFIG_TPS6105X is not set -# CONFIG_TPS6507X is not set -# CONFIG_MFD_TPS65086 is not set -# CONFIG_MFD_TPS65090 is not set -# CONFIG_MFD_TI_LP873X is not set -# CONFIG_MFD_TPS6586X is not set -# CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS80031 is not set -# CONFIG_TWL4030_CORE is not set -# CONFIG_TWL6040_CORE is not set -# CONFIG_MFD_WL1273_CORE is not set -# CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TQMX86 is not set # CONFIG_MFD_VX855 is not set -# CONFIG_MFD_ARIZONA_I2C is not set -# CONFIG_MFD_WM8400 is not set -# CONFIG_MFD_WM831X_I2C is not set -# CONFIG_MFD_WM8350_I2C is not set -# CONFIG_MFD_WM8994 is not set # end of Multifunction device drivers # CONFIG_REGULATOR is not set # CONFIG_RC_CORE is not set + +# +# CEC support +# # CONFIG_MEDIA_CEC_SUPPORT is not set +# end of CEC support + # CONFIG_MEDIA_SUPPORT is not set # # Graphics support # +CONFIG_APERTURE_HELPERS=y # CONFIG_AGP is not set -CONFIG_VGA_ARB=y -CONFIG_VGA_ARB_MAX_GPUS=16 # CONFIG_VGA_SWITCHEROO is not set # CONFIG_DRM is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set # # ARM devices @@ -1830,12 +1800,6 @@ CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_APPLE is not set # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_SAHARA is not set -# CONFIG_BACKLIGHT_ADP8860 is not set -# CONFIG_BACKLIGHT_ADP8870 is not set -# CONFIG_BACKLIGHT_LM3639 is not set -# CONFIG_BACKLIGHT_LV5207LP is not set -# CONFIG_BACKLIGHT_BD6107 is not set -# CONFIG_BACKLIGHT_ARCXCNN is not set # end of Backlight & LCD device support # @@ -1846,6 +1810,7 @@ CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set # CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set @@ -1871,7 +1836,6 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_A4TECH is not set # CONFIG_HID_ACCUTOUCH is not set # CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set # CONFIG_HID_BELKIN is not set @@ -1898,6 +1862,8 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VRC2 is not set +# CONFIG_HID_XIAOMI is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set @@ -1906,9 +1872,11 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_KENSINGTON is not set # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO is not set +# CONFIG_HID_LETSKETCH is not set # CONFIG_HID_MAGICMOUSE is not set # CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MEGAWORLD_FF is not set # CONFIG_HID_REDRAGON is not set # CONFIG_HID_MICROSOFT is not set # CONFIG_HID_MONTEREY is not set @@ -1921,11 +1889,15 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAZER is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_RETRODE is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SIGMAMICRO is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEAM is not set # CONFIG_HID_STEELSERIES is not set @@ -1935,6 +1907,7 @@ CONFIG_HID_GENERIC=y # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set +# CONFIG_HID_TOPRE is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_UDRAW_PS3 is not set # CONFIG_HID_WACOM is not set @@ -1960,17 +1933,17 @@ CONFIG_USB_HID=m # end of USB HID Boot Protocol drivers # end of USB HID support -# -# I2C HID support -# -# CONFIG_I2C_HID is not set -# end of I2C HID support - # # Intel ISH HID support # # CONFIG_INTEL_ISH_HID is not set # end of Intel ISH HID support + +# +# AMD SFH HID Support +# +# CONFIG_AMD_SFH_HID is not set +# end of AMD SFH HID Support # end of HID support CONFIG_USB_OHCI_LITTLE_ENDIAN=y @@ -2011,9 +1984,7 @@ CONFIG_USB_EHCI_HCD_PLATFORM=m # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_FOTG210_HCD is not set -CONFIG_USB_OHCI_HCD=m -CONFIG_USB_OHCI_HCD_PCI=m -# CONFIG_USB_OHCI_HCD_PLATFORM is not set +# CONFIG_USB_OHCI_HCD is not set # CONFIG_USB_UHCI_HCD is not set # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set @@ -2057,7 +2028,7 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set -# CONFIG_USB_CDNS3 is not set +# CONFIG_USB_CDNS_SUPPORT is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set @@ -2093,9 +2064,6 @@ CONFIG_USB_STORAGE=m # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set -# CONFIG_USB_HUB_USB251XB is not set -# CONFIG_USB_HSIC_USB3503 is not set -# CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set @@ -2103,37 +2071,13 @@ CONFIG_USB_STORAGE=m # USB Physical Layer drivers # # CONFIG_NOP_USB_XCEIV is not set -# CONFIG_USB_ISP1301 is not set # end of USB Physical Layer drivers # CONFIG_USB_GADGET is not set # CONFIG_TYPEC is not set # CONFIG_USB_ROLE_SWITCH is not set -CONFIG_MMC=m -CONFIG_MMC_BLOCK=m -CONFIG_MMC_BLOCK_MINORS=8 -# CONFIG_SDIO_UART is not set -# CONFIG_MMC_TEST is not set - -# -# MMC/SD/SDIO Host Controller Drivers -# -# CONFIG_MMC_DEBUG is not set -CONFIG_MMC_SDHCI=m -# CONFIG_MMC_SDHCI_PCI is not set -# CONFIG_MMC_SDHCI_ACPI is not set -# CONFIG_MMC_SDHCI_PLTFM is not set -# CONFIG_MMC_WBSD is not set -# CONFIG_MMC_TIFM_SD is not set -# CONFIG_MMC_CB710 is not set -# CONFIG_MMC_VIA_SDMMC is not set -# CONFIG_MMC_VUB300 is not set -# CONFIG_MMC_USHC is not set -# CONFIG_MMC_USDHI6ROL0 is not set -CONFIG_MMC_CQHCI=m -# CONFIG_MMC_HSQ is not set -# CONFIG_MMC_TOSHIBA_PCI is not set -# CONFIG_MMC_MTK is not set +# CONFIG_MMC is not set +# CONFIG_SCSI_UFSHCD is not set # CONFIG_MEMSTICK is not set # CONFIG_NEW_LEDS is not set # CONFIG_ACCESSIBILITY is not set @@ -2162,46 +2106,14 @@ CONFIG_RTC_INTF_DEV=y # # I2C RTC drivers # -# CONFIG_RTC_DRV_ABB5ZES3 is not set -# CONFIG_RTC_DRV_ABEOZ9 is not set -# CONFIG_RTC_DRV_ABX80X is not set -# CONFIG_RTC_DRV_DS1307 is not set -# CONFIG_RTC_DRV_DS1374 is not set -# CONFIG_RTC_DRV_DS1672 is not set -# CONFIG_RTC_DRV_MAX6900 is not set -# CONFIG_RTC_DRV_RS5C372 is not set -# CONFIG_RTC_DRV_ISL1208 is not set -# CONFIG_RTC_DRV_ISL12022 is not set -# CONFIG_RTC_DRV_X1205 is not set -# CONFIG_RTC_DRV_PCF8523 is not set -# CONFIG_RTC_DRV_PCF85063 is not set -# CONFIG_RTC_DRV_PCF85363 is not set -# CONFIG_RTC_DRV_PCF8563 is not set -# CONFIG_RTC_DRV_PCF8583 is not set -# CONFIG_RTC_DRV_M41T80 is not set -# CONFIG_RTC_DRV_BQ32K is not set -# CONFIG_RTC_DRV_S35390A is not set -# CONFIG_RTC_DRV_FM3130 is not set -# CONFIG_RTC_DRV_RX8010 is not set -# CONFIG_RTC_DRV_RX8581 is not set -# CONFIG_RTC_DRV_RX8025 is not set -# CONFIG_RTC_DRV_EM3027 is not set -# CONFIG_RTC_DRV_RV3028 is not set -# CONFIG_RTC_DRV_RV3032 is not set -# CONFIG_RTC_DRV_RV8803 is not set -# CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers # -CONFIG_RTC_I2C_AND_SPI=y # # SPI and I2C RTC drivers # -# CONFIG_RTC_DRV_DS3232 is not set -# CONFIG_RTC_DRV_PCF2127 is not set -# CONFIG_RTC_DRV_RV3029C2 is not set # # Platform RTC drivers @@ -2230,6 +2142,7 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # +# CONFIG_RTC_DRV_GOLDFISH is not set # CONFIG_DMADEVICES is not set # @@ -2237,8 +2150,10 @@ CONFIG_RTC_DRV_CMOS=y # CONFIG_SYNC_FILE=y # CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set +# CONFIG_DMABUF_SYSFS_STATS is not set # end of DMABUF options # CONFIG_AUXDISPLAY is not set @@ -2255,21 +2170,68 @@ CONFIG_SYNC_FILE=y # end of Microsoft Hyper-V guest support # CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set # CONFIG_STAGING is not set -# CONFIG_X86_PLATFORM_DEVICES is not set -CONFIG_PMC_ATOM=y # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set +CONFIG_SURFACE_PLATFORMS=y +# CONFIG_SURFACE_GPE is not set +# CONFIG_SURFACE_PRO3_BUTTON is not set +CONFIG_X86_PLATFORM_DEVICES=y +# CONFIG_ACPI_WMI is not set +# CONFIG_ACERHDF is not set +# CONFIG_ACER_WIRELESS is not set +# CONFIG_AMD_PMF is not set +# CONFIG_AMD_PMC is not set +# CONFIG_ADV_SWBUTTON is not set +# CONFIG_APPLE_GMUX is not set +# CONFIG_ASUS_LAPTOP is not set +# CONFIG_ASUS_WIRELESS is not set +# CONFIG_X86_PLATFORM_DRIVERS_DELL is not set +# CONFIG_FUJITSU_LAPTOP is not set +# CONFIG_FUJITSU_TABLET is not set +# CONFIG_GPD_POCKET_FAN is not set +# CONFIG_HP_ACCEL is not set +# CONFIG_WIRELESS_HOTKEY is not set +# CONFIG_IBM_RTL is not set +# CONFIG_SENSORS_HDAPS is not set +# CONFIG_INTEL_SAR_INT1092 is not set +# CONFIG_INTEL_PMC_CORE is not set + +# +# Intel Speed Select Technology interface support +# +# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set +# end of Intel Speed Select Technology interface support + +# +# Intel Uncore Frequency Control +# +# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set +# end of Intel Uncore Frequency Control + +# CONFIG_INTEL_PUNIT_IPC is not set +# CONFIG_INTEL_RST is not set +# CONFIG_INTEL_SMARTCONNECT is not set +# CONFIG_INTEL_TURBO_MAX_3 is not set +# CONFIG_INTEL_VSEC is not set +# CONFIG_SAMSUNG_LAPTOP is not set +# CONFIG_SAMSUNG_Q10 is not set +# CONFIG_TOSHIBA_BT_RFKILL is not set +# CONFIG_TOSHIBA_HAPS is not set +# CONFIG_ACPI_CMPC is not set +# CONFIG_PANASONIC_LAPTOP is not set +# CONFIG_TOPSTAR_LAPTOP is not set +# CONFIG_INTEL_IPS is not set +# CONFIG_INTEL_SCU_PCI is not set +# CONFIG_INTEL_SCU_PLATFORM is not set +# CONFIG_SIEMENS_SIMATIC_IPC is not set +# CONFIG_WINMATE_FM07_KEYS is not set +# CONFIG_P2SB is not set CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y -# CONFIG_COMMON_CLK_MAX9485 is not set -# CONFIG_COMMON_CLK_SI5341 is not set -# CONFIG_COMMON_CLK_SI5351 is not set -# CONFIG_COMMON_CLK_SI544 is not set -# CONFIG_COMMON_CLK_CDCE706 is not set -# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_XILINX_VCU is not set # CONFIG_HWSPINLOCK is not set # @@ -2293,7 +2255,11 @@ CONFIG_IOMMU_SUPPORT=y # # end of Generic IOMMU Pagetable Support +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +CONFIG_IOMMU_DEFAULT_DMA_LAZY=y # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +CONFIG_IOMMU_DMA=y +CONFIG_IOMMU_SVA=y # CONFIG_AMD_IOMMU is not set CONFIG_DMAR_TABLE=y CONFIG_INTEL_IOMMU=y @@ -2327,11 +2293,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of Amlogic SoC drivers -# -# Aspeed SoC drivers -# -# end of Aspeed SoC drivers - # # Broadcom SoC drivers # @@ -2342,11 +2303,21 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # end of NXP/Freescale QorIQ SoC drivers +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + # # i.MX SoC drivers # # end of i.MX SoC drivers +# +# Enable LiteX SoC Builder specific drivers +# +# end of Enable LiteX SoC Builder specific drivers + # # Qualcomm SoC drivers # @@ -2357,7 +2328,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # # Xilinx SoC drivers # -# CONFIG_XILINX_VCU is not set # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers @@ -2366,7 +2336,6 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set -# CONFIG_VME_BUS is not set # CONFIG_PWM is not set # @@ -2382,7 +2351,14 @@ CONFIG_INTEL_IOMMU_FLOPPY_WA=y # CONFIG_GENERIC_PHY=y # CONFIG_USB_LGM_PHY is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# # CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_PHY_INTEL_LGM_EMMC is not set @@ -2402,16 +2378,16 @@ CONFIG_GENERIC_PHY=y # # Android # -# CONFIG_ANDROID is not set +# CONFIG_ANDROID_BINDER_IPC is not set # end of Android CONFIG_LIBNVDIMM=y # CONFIG_BLK_DEV_PMEM is not set -# CONFIG_ND_BLK is not set # CONFIG_BTT is not set # CONFIG_DAX is not set CONFIG_NVMEM=y -# CONFIG_NVMEM_SYSFS is not set +CONFIG_NVMEM_SYSFS=y +# CONFIG_NVMEM_RMEM is not set # # HW tracing support @@ -2421,11 +2397,12 @@ CONFIG_NVMEM=y # end of HW tracing support # CONFIG_FPGA is not set -# CONFIG_UNISYS_VISORBUS is not set # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set # end of Device Drivers # @@ -2451,10 +2428,8 @@ CONFIG_FS_MBCACHE=y # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set -# CONFIG_FS_DAX is not set # CONFIG_EXPORTFS_BLOCK_OPS is not set CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set # CONFIG_FS_VERITY is not set # CONFIG_DNOTIFY is not set @@ -2493,6 +2468,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_EXFAT_FS=y CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" # CONFIG_NTFS_FS is not set +# CONFIG_NTFS3_FS is not set # end of DOS/FAT/EXFAT/NT Filesystems # @@ -2508,9 +2484,10 @@ CONFIG_KERNFS=y CONFIG_SYSFS=y # CONFIG_TMPFS is not set # CONFIG_HUGETLBFS is not set +CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y CONFIG_ARCH_HAS_GIGANTIC_PAGE=y # CONFIG_CONFIGFS_FS is not set -CONFIG_EFIVAR_FS=m +# CONFIG_EFIVAR_FS is not set # end of Pseudo filesystems # CONFIG_MISC_FILESYSTEMS is not set @@ -2579,13 +2556,10 @@ CONFIG_IO_WQ=y # # CONFIG_KEYS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set -# CONFIG_SECURITYFS is not set -# CONFIG_PAGE_TABLE_ISOLATION is not set -CONFIG_INTEL_TXT=y +CONFIG_SECURITYFS=y +# CONFIG_INTEL_TXT is not set CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HARDENED_USERCOPY=y -CONFIG_HARDENED_USERCOPY_FALLBACK=y -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set # CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set @@ -2600,9 +2574,17 @@ CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,bpf" # Memory initialization # CONFIG_INIT_STACK_NONE=y +# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set +# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set +# CONFIG_GCC_PLUGIN_STACKLEAK is not set # CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set # end of Memory initialization + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set # end of Kernel hardening options # end of Security options @@ -2635,7 +2617,7 @@ CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set CONFIG_CRYPTO_SIMD=y -CONFIG_CRYPTO_GLUE_HELPER_X86=y +# end of Crypto core or helper # # Public-key cryptography @@ -2643,114 +2625,90 @@ CONFIG_CRYPTO_GLUE_HELPER_X86=y # CONFIG_CRYPTO_RSA is not set # CONFIG_CRYPTO_DH is not set # CONFIG_CRYPTO_ECDH is not set +# CONFIG_CRYPTO_ECDSA is not set # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_SM2 is not set # CONFIG_CRYPTO_CURVE25519 is not set -# CONFIG_CRYPTO_CURVE25519_X86 is not set +# end of Public-key cryptography # -# Authenticated Encryption with Associated Data +# Block ciphers # -# CONFIG_CRYPTO_CCM is not set -# CONFIG_CRYPTO_GCM is not set -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set -# CONFIG_CRYPTO_SEQIV is not set -# CONFIG_CRYPTO_ECHAINIV is not set +# CONFIG_CRYPTO_AES is not set +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ARIA is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SM4_GENERIC is not set +# CONFIG_CRYPTO_TWOFISH is not set +# end of Block ciphers # -# Block modes +# Length-preserving ciphers and modes # +# CONFIG_CRYPTO_ADIANTUM is not set +# CONFIG_CRYPTO_CHACHA20 is not set CONFIG_CRYPTO_CBC=y # CONFIG_CRYPTO_CFB is not set # CONFIG_CRYPTO_CTR is not set # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_HCTR2 is not set +# CONFIG_CRYPTO_KEYWRAP is not set # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_OFB is not set # CONFIG_CRYPTO_PCBC is not set CONFIG_CRYPTO_XTS=y -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set -# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set -# CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_ESSIV=y +# end of Length-preserving ciphers and modes # -# Hash modes +# AEAD (authenticated encryption with associated data) ciphers # -# CONFIG_CRYPTO_CMAC is not set -CONFIG_CRYPTO_HMAC=y -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_AEGIS128 is not set +# CONFIG_CRYPTO_CHACHA20POLY1305 is not set +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set +# CONFIG_CRYPTO_ECHAINIV is not set +CONFIG_CRYPTO_ESSIV=y +# end of AEAD (authenticated encryption with associated data) ciphers # -# Digest +# Hashes, digests, and MACs # -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CRC32C_INTEL=y -# CONFIG_CRYPTO_CRC32 is not set -# CONFIG_CRYPTO_CRC32_PCLMUL is not set -# CONFIG_CRYPTO_XXHASH is not set # CONFIG_CRYPTO_BLAKE2B is not set -# CONFIG_CRYPTO_BLAKE2S is not set -# CONFIG_CRYPTO_BLAKE2S_X86 is not set -# CONFIG_CRYPTO_CRCT10DIF is not set +# CONFIG_CRYPTO_CMAC is not set # CONFIG_CRYPTO_GHASH is not set -# CONFIG_CRYPTO_POLY1305 is not set -# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_RMD128 is not set +# CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA1_SSSE3=y -CONFIG_CRYPTO_SHA256_SSSE3=y -CONFIG_CRYPTO_SHA512_SSSE3=y CONFIG_CRYPTO_SHA256=y CONFIG_CRYPTO_SHA512=y # CONFIG_CRYPTO_SHA3 is not set -# CONFIG_CRYPTO_SM3 is not set +# CONFIG_CRYPTO_SM3_GENERIC is not set # CONFIG_CRYPTO_STREEBOG is not set -# CONFIG_CRYPTO_TGR192 is not set +# CONFIG_CRYPTO_VMAC is not set # CONFIG_CRYPTO_WP512 is not set -# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +# CONFIG_CRYPTO_XCBC is not set +# CONFIG_CRYPTO_XXHASH is not set +# end of Hashes, digests, and MACs # -# Ciphers +# CRCs (cyclic redundancy checks) # -CONFIG_CRYPTO_AES=y -# CONFIG_CRYPTO_AES_TI is not set -CONFIG_CRYPTO_AES_NI_INTEL=y -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set -# CONFIG_CRYPTO_DES is not set -# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_CHACHA20 is not set -# CONFIG_CRYPTO_CHACHA20_X86_64 is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set -# CONFIG_CRYPTO_SM4 is not set -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_TWOFISH_X86_64 is not set -# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set -# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +CONFIG_CRYPTO_CRC32C=y +# CONFIG_CRYPTO_CRC32 is not set +# CONFIG_CRYPTO_CRCT10DIF is not set +# end of CRCs (cyclic redundancy checks) # # Compression @@ -2761,13 +2719,19 @@ CONFIG_CRYPTO_AES_NI_INTEL=y # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # CONFIG_CRYPTO_ZSTD is not set +# end of Compression # -# Random Number Generation +# Random number generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set # CONFIG_CRYPTO_DRBG_MENU is not set # CONFIG_CRYPTO_JITTERENTROPY is not set +# end of Random number generation + +# +# Userspace interface +# CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y @@ -2775,19 +2739,47 @@ CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_AEAD=y # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set # CONFIG_CRYPTO_STATS is not set +# end of Userspace interface + CONFIG_CRYPTO_HASH_INFO=y # -# Crypto library routines +# Accelerated Cryptographic Algorithms for CPU (x86) # -CONFIG_CRYPTO_LIB_AES=y -# CONFIG_CRYPTO_LIB_BLAKE2S is not set -# CONFIG_CRYPTO_LIB_CHACHA is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -# CONFIG_CRYPTO_LIB_POLY1305 is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -CONFIG_CRYPTO_LIB_SHA256=y +# CONFIG_CRYPTO_CURVE25519_X86 is not set +CONFIG_CRYPTO_AES_NI_INTEL=y +# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set +# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set +# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set +# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64 is not set +# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set +# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set +# CONFIG_CRYPTO_ARIA_AESNI_AVX_X86_64 is not set +# CONFIG_CRYPTO_CHACHA20_X86_64 is not set +# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set +# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set +# CONFIG_CRYPTO_BLAKE2S_X86 is not set +# CONFIG_CRYPTO_POLYVAL_CLMUL_NI is not set +# CONFIG_CRYPTO_POLY1305_X86_64 is not set +CONFIG_CRYPTO_SHA1_SSSE3=y +CONFIG_CRYPTO_SHA256_SSSE3=y +CONFIG_CRYPTO_SHA512_SSSE3=y +# CONFIG_CRYPTO_SM3_AVX_X86_64 is not set +# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set +CONFIG_CRYPTO_CRC32C_INTEL=y +# CONFIG_CRYPTO_CRC32_PCLMUL is not set +# end of Accelerated Cryptographic Algorithms for CPU (x86) + # CONFIG_CRYPTO_HW is not set # @@ -2803,7 +2795,6 @@ CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y -CONFIG_GENERIC_FIND_FIRST_BIT=y # CONFIG_CORDIC is not set # CONFIG_PRIME_NUMBERS is not set CONFIG_RATIONAL=y @@ -2812,9 +2803,26 @@ CONFIG_GENERIC_IOMAP=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +# CONFIG_CRYPTO_LIB_CHACHA is not set +# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 +# CONFIG_CRYPTO_LIB_POLY1305 is not set +# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + # CONFIG_CRC_CCITT is not set CONFIG_CRC16=y # CONFIG_CRC_T10DIF is not set +# CONFIG_CRC64_ROCKSOFT is not set # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set @@ -2835,6 +2843,7 @@ CONFIG_XZ_DEC_X86=y # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set +# CONFIG_XZ_DEC_MICROLZMA is not set CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_XZ=y @@ -2852,6 +2861,7 @@ CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_SWIOTLB=y # CONFIG_DMA_API_DEBUG is not set CONFIG_SGL_ALLOC=y +# CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y @@ -2873,7 +2883,6 @@ CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y CONFIG_ARCH_HAS_COPY_MC=y CONFIG_ARCH_STACKWALK=y CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set # end of Library routines # @@ -2885,6 +2894,7 @@ CONFIG_SBITMAP=y # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 @@ -2895,19 +2905,26 @@ CONFIG_SYMBOLIC_ERRNAME=y # CONFIG_DEBUG_BUGVERBOSE is not set # end of printk and dmesg options +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_MISC is not set + # # Compile-time checks and compiler options # -# CONFIG_DEBUG_INFO is not set -# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_AS_HAS_NON_CONST_LEB128=y +CONFIG_DEBUG_INFO_NONE=y +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +# CONFIG_DEBUG_INFO_DWARF4 is not set +# CONFIG_DEBUG_INFO_DWARF5 is not set CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_HEADERS_INSTALL is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -CONFIG_STACK_VALIDATION=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_OBJTOOL=y +# CONFIG_VMLINUX_MAP is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set # end of Compile-time checks and compiler options @@ -2926,22 +2943,28 @@ CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y CONFIG_HAVE_ARCH_KCSAN=y # end of Generic Kernel Debugging Instruments -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_MISC is not set +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# end of Networking Debugging # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_SLUB_DEBUG is not set # CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_TABLE_CHECK is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set CONFIG_ARCH_HAS_DEBUG_WX=y # CONFIG_DEBUG_WX is not set CONFIG_GENERIC_PTDUMP=y # CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_STACK_USAGE is not set @@ -2953,11 +2976,16 @@ CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_MEMORY_INIT is not set # CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_ARCH_SUPPORTS_KMAP_LOCAL_FORCE_MAP=y +# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set CONFIG_HAVE_ARCH_KASAN=y CONFIG_HAVE_ARCH_KASAN_VMALLOC=y CONFIG_CC_HAS_KASAN_GENERIC=y CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y # CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +CONFIG_HAVE_ARCH_KMSAN=y # end of Memory Debugging # CONFIG_DEBUG_SHIRQ is not set @@ -2971,16 +2999,13 @@ CONFIG_PANIC_TIMEOUT=0 CONFIG_LOCKUP_DETECTOR=y CONFIG_SOFTLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 CONFIG_HARDLOCKUP_DETECTOR_PERF=y CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y CONFIG_HARDLOCKUP_DETECTOR=y # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set -CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 CONFIG_WQ_WATCHDOG=y # CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs @@ -3014,6 +3039,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_CSD_LOCK_WAIT_DEBUG is not set # end of Lock Debugging (spinlocks, mutexes, etc...) +# CONFIG_DEBUG_IRQFLAGS is not set # CONFIG_STACKTRACE is not set # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set @@ -3026,6 +3052,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_DEBUG_SG is not set # CONFIG_DEBUG_NOTIFIERS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set +# CONFIG_DEBUG_MAPLE_TREE is not set # end of Debug kernel data structures # CONFIG_DEBUG_CREDENTIALS is not set @@ -3037,36 +3064,40 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_LATENCYTOP is not set CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_HAVE_RETHOOK=y CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_DYNAMIC_FTRACE_NO_PATCHABLE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y +CONFIG_HAVE_OBJTOOL_MCOUNT=y CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set # CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y # CONFIG_STRICT_DEVMEM is not set # # x86 Debugging # -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y # CONFIG_X86_VERBOSE_BOOTUP is not set CONFIG_EARLY_PRINTK=y # CONFIG_EARLY_PRINTK_DBGP is not set @@ -3075,8 +3106,8 @@ CONFIG_EARLY_PRINTK=y # CONFIG_DEBUG_TLBFLUSH is not set CONFIG_HAVE_MMIOTRACE_SUPPORT=y # CONFIG_X86_DECODER_SELFTEST is not set -CONFIG_IO_DELAY_0X80=y -# CONFIG_IO_DELAY_0XED is not set +# CONFIG_IO_DELAY_0X80 is not set +CONFIG_IO_DELAY_0XED=y # CONFIG_IO_DELAY_UDELAY is not set # CONFIG_IO_DELAY_NONE is not set # CONFIG_CPA_DEBUG is not set @@ -3099,6 +3130,12 @@ CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set # CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_ARCH_USE_MEMTEST=y # CONFIG_MEMTEST is not set # end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking # end of Kernel hacking From cbc0e334bfce1452954047b2d26f54d540662587 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 3 Sep 2024 10:40:02 -0400 Subject: [PATCH 07/17] galp5: blobs, coreboot config; move ifd and me to blobs dir, make config point to them Signed-off-by: Thierry Laurion --- boards/galp5/fd.rom => blobs/galp5/ifd.bin | Bin boards/galp5/me.rom => blobs/galp5/me.bin | Bin config/coreboot-galp5.config | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename boards/galp5/fd.rom => blobs/galp5/ifd.bin (100%) rename boards/galp5/me.rom => blobs/galp5/me.bin (100%) diff --git a/boards/galp5/fd.rom b/blobs/galp5/ifd.bin similarity index 100% rename from boards/galp5/fd.rom rename to blobs/galp5/ifd.bin diff --git a/boards/galp5/me.rom b/blobs/galp5/me.bin similarity index 100% rename from boards/galp5/me.rom rename to blobs/galp5/me.bin diff --git a/config/coreboot-galp5.config b/config/coreboot-galp5.config index 37d210e78..43078422c 100644 --- a/config/coreboot-galp5.config +++ b/config/coreboot-galp5.config @@ -150,8 +150,8 @@ CONFIG_MAX_ACPI_TABLE_SIZE_KB=144 CONFIG_HAVE_INTEL_FIRMWARE=y CONFIG_MRC_SETTINGS_CACHE_SIZE=0x10000 CONFIG_DRIVERS_INTEL_WIFI=y -CONFIG_IFD_BIN_PATH="3rdparty/blobs/mainboard/$(MAINBOARDDIR)/descriptor.bin" -CONFIG_ME_BIN_PATH="3rdparty/blobs/mainboard/$(MAINBOARDDIR)/me.bin" +CONFIG_IFD_BIN_PATH="@BLOB_DIR@/galp5/ifd.bin" +CONFIG_ME_BIN_PATH="@BLOB_DIR@/galp5/me.bin" CONFIG_CONSOLE_CBMEM_BUFFER_SIZE=0x20000 CONFIG_CARDBUS_PLUGIN_SUPPORT=y CONFIG_SPI_FLASH_DONT_INCLUDE_ALL_DRIVERS=y From 9b6c72285bd88d470012fcef550c1368071d1cd2 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 3 Sep 2024 10:42:42 -0400 Subject: [PATCH 08/17] galp5: board dir; remove redundant files in coreboot fork Signed-off-by: Thierry Laurion --- boards/galp5/TigerLakeFspBinPkg/Client/Fsp.fd | Bin 1048576 -> 0 bytes boards/galp5/cmos.default | 5 - boards/galp5/cmos.layout | 40 ---- boards/galp5/memlayout.ld | 48 ----- boards/galp5/tigerlake/chipset.cb | 157 -------------- boards/galp5/tlg-u/board.fmd | 12 -- boards/galp5/tlg-u/devicetree.cb | 139 ------------- boards/galp5/tlg-u/variants/galp5/data.vbt | Bin 8704 -> 0 bytes .../tlg-u/variants/galp5/overridetree.cb | 195 ------------------ 9 files changed, 596 deletions(-) delete mode 100644 boards/galp5/TigerLakeFspBinPkg/Client/Fsp.fd delete mode 100644 boards/galp5/cmos.default delete mode 100644 boards/galp5/cmos.layout delete mode 100644 boards/galp5/memlayout.ld delete mode 100644 boards/galp5/tigerlake/chipset.cb delete mode 100644 boards/galp5/tlg-u/board.fmd delete mode 100644 boards/galp5/tlg-u/devicetree.cb delete mode 100644 boards/galp5/tlg-u/variants/galp5/data.vbt delete mode 100644 boards/galp5/tlg-u/variants/galp5/overridetree.cb diff --git a/boards/galp5/TigerLakeFspBinPkg/Client/Fsp.fd b/boards/galp5/TigerLakeFspBinPkg/Client/Fsp.fd deleted file mode 100644 index ea46ea00f01fcc7ef154eef87181a48025dd1da8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048576 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

    +BnI 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É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 z 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 WKDy7P%RAueO;>p9b?%zrKLbCXN7B#$ literal 0 HcmV?d00001 diff --git a/boards/galp5/galp5.config b/boards/galp5/galp5.config new file mode 100644 index 000000000..f3f11b86b --- /dev/null +++ b/boards/galp5/galp5.config @@ -0,0 +1,59 @@ +CONFIG_LINUX_CONFIG=config/linux-galp5.config +CONFIG_COREBOOT_CONFIG=config/coreboot-galp5.config +export CONFIG_BOOT_DEV="/dev/nvme0n1p1" +export CONFIG_ROOT_DEV="/dev/nvme0n1p3" +CONFIG_CRYPTSETUP2=y +CONFIG_FLASHROM=y +CONFIG_FLASHTOOLS=y +CONFIG_GPG2=y +CONFIG_KEXEC=y +CONFIG_UTIL_LINUX=y +CONFIG_LVM2=y +CONFIG_MBEDTLS=y +CONFIG_PCIUTILS=y +CONFIG_POPT=y +CONFIG_QRENCODE=y +CONFIG_TPMTOTP=y +CONFIG_CAIRO=y +CONFIG_FBWHIPTAIL=y +CONFIG_HOTPKEY=y +CONFIG_LINUX_USB=y +#export CONFIG_TPM=y +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +export CONFIG_BOOTSCRIPT=/bin/gui-init +export CONFIG_BOOT_REQ_HASH=n +export CONFIG_BOOT_REQ_ROLLBACK=n +export CONFIG_BOOT_KERNEL_ADD="" +export CONFIG_BOOT_KERNEL_REMOVE="" +export CONFIG_ROOT_DIRLIST="bin boot lib sbin usr" +export CONFIG_ROOT_CHECK_AT_BOOT="n" +export CONFIG_AUTO_BOOT_TIMEOUT=5 +export CONFIG_COREBOOT=y +export CONFIG_COREBOOT_VERSION=4.22.01 +export CONFIG_LINUX_VERSION=5.10.5 +#export CONFIG_LINUX_VERSION=5.16.19 +export CONFIG_BOARD_NAME="galp5" +CONFIG_IO386=y + +CONFIG_VENDOR_SYSTEM76=y +CONFIG_BOARD_SYSTEM76_GALP5=y +CONFIG_CCACHE=y +CONFIG_CONSOLE_SERIAL=n +CONFIG_CPU_MICROCODE_CBFS_DEFAULT_BINS=y +CONFIG_HAVE_IFD_BIN=y +CONFIG_HAVE_ME_BIN=y +CONFIG_IFD_BIN_PATH="boards/galp5/fd.rom" +CONFIG_ME_BIN_PATH="boards/galp5/me.rom" +CONFIG_PAYLOAD_ELF=y +CONFIG_PAYLOAD_FILE=coreboot.rom +CONFIG_PCIEXP_HOTPLUG_MEM=0x2000000 +CONFIG_PCIEXP_HOTPLUG_PREFETCH_MEM=0x20000000 +CONFIG_POST_IO=n +CONFIG_SMMSTORE=y +CONFIG_SMMSTORE_V2=y +CONFIG_USE_OPTION_TABLE=y +CONFIG_VALIDATE_INTEL_DESCRIPTOR=y +#CONFIG_CONSOLE_SYSTEM76_EC=y diff --git a/boards/galp5/me.rom b/boards/galp5/me.rom new file mode 100644 index 0000000000000000000000000000000000000000..5ab462a14675e9e0db60ada1195884b86b8c425a GIT binary patch literal 5238784 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�~33f>^lJ|F3|qK2BX~sV#KZcxtL^w$|*d-&KDG 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

  • KJ4&cERXfZrPrdf=d4s_N=OC_xiQ! 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 s7ZfbuaOsP_vGD;T7=Jb&qXMTEIi$=E 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É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 z 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 -#include - -/* - * The bootblock linker script should be included before the Cache-As-RAM linker - * script. Indeed, if it is included after and Cache-As-RAM .data section - * support is enabled, the definition order of the sections makes the linker - * create an image with an almost 4 GB hole. - */ -#if ENV_BOOTBLOCK -INCLUDE "bootblock/arch/x86/bootblock.ld" -#endif /* ENV_BOOTBLOCK */ - -SECTIONS -{ - /* - * It would be good to lay down RAMSTAGE, ROMSTAGE, etc consecutively - * like other architectures/chipsets it's not possible because of - * the linking games played during romstage creation by trying - * to find the final landing place in CBFS for XIP. Therefore, - * conditionalize with macros. - */ -#if ENV_RAMSTAGE - /* Relocated at runtime in cbmem so the address does not matter. */ - RAMSTAGE(64M, 8M) - -#elif ENV_SEPARATE_ROMSTAGE - /* The 1M size is not allocated. It's just for basic size checking. - * Link at 32MiB address and rely on cbfstool to relocate to XIP. */ - ROMSTAGE(CONFIG_ROMSTAGE_ADDR, 1M) - - INCLUDE "romstage/arch/x86/car.ld" -#elif ENV_SEPARATE_VERSTAGE - /* The 1M size is not allocated. It's just for basic size checking. - * Link at 32MiB address and rely on cbfstool to relocate to XIP. */ - VERSTAGE(CONFIG_VERSTAGE_ADDR, 1M) - - INCLUDE "verstage/arch/x86/car.ld" -#elif ENV_BOOTBLOCK - - INCLUDE "bootblock/arch/x86/car.ld" - -#elif ENV_POSTCAR - POSTCAR(32M, 1M) -#endif -} diff --git a/boards/galp5/tigerlake/chipset.cb b/boards/galp5/tigerlake/chipset.cb deleted file mode 100644 index f0576ad5e..000000000 --- a/boards/galp5/tigerlake/chipset.cb +++ /dev/null @@ -1,157 +0,0 @@ -chip soc/intel/tigerlake - - device cpu_cluster 0 on end - device domain 0 on - device gpio 0 alias pch_gpio on end - device pci 00.0 alias system_agent on end - device pci 02.0 alias igpu off end - device pci 04.0 alias dptf off end - device pci 05.0 alias ipu off end - device pci 06.0 alias peg off end - device pci 07.0 alias tbt_pcie_rp0 off - chip soc/intel/common/block/usb4 - use tbt_dma0 as usb4_port - device generic 0 on end - end - end - device pci 07.1 alias tbt_pcie_rp1 off - chip soc/intel/common/block/usb4 - use tbt_dma0 as usb4_port - device generic 1 on end - end - end - device pci 07.2 alias tbt_pcie_rp2 off - chip soc/intel/common/block/usb4 - use tbt_dma1 as usb4_port - device generic 0 on end - end - end - device pci 07.3 alias tbt_pcie_rp3 off - chip soc/intel/common/block/usb4 - use tbt_dma1 as usb4_port - device generic 1 on end - end - end - device pci 08.0 alias gna off end - device pci 09.0 alias npk off end - device pci 0a.0 alias crashlog off end - device pci 0d.0 alias north_xhci off - chip drivers/usb/acpi - register "type" = "UPC_TYPE_HUB" - device usb 0.0 alias tcss_root_hub off - chip drivers/usb/acpi - device usb 3.0 alias tcss_usb3_port1 off end - end - chip drivers/usb/acpi - device usb 3.1 alias tcss_usb3_port2 off end - end - chip drivers/usb/acpi - device usb 3.2 alias tcss_usb3_port3 off end - end - chip drivers/usb/acpi - device usb 3.3 alias tcss_usb3_port4 off end - end - end - end - end - device pci 0d.1 alias north_xdci off end - device pci 0d.2 alias tbt_dma0 off end - device pci 0d.3 alias tbt_dma1 off end - device pci 0e.0 alias vmd off end - device pci 10.6 alias thc0 off end - device pci 10.7 alias thc1 off end - device pci 12.0 alias ish off end - device pci 12.6 alias gspi2 off end - device pci 13.0 alias gspi3 off end - device pci 14.0 alias south_xhci off - chip drivers/usb/acpi - register "type" = "UPC_TYPE_HUB" - device usb 0.0 alias xhci_root_hub off - chip drivers/usb/acpi - device usb 2.0 alias usb2_port1 off end - end - chip drivers/usb/acpi - device usb 2.1 alias usb2_port2 off end - end - chip drivers/usb/acpi - device usb 2.2 alias usb2_port3 off end - end - chip drivers/usb/acpi - device usb 2.3 alias usb2_port4 off end - end - chip drivers/usb/acpi - device usb 2.4 alias usb2_port5 off end - end - chip drivers/usb/acpi - device usb 2.5 alias usb2_port6 off end - end - chip drivers/usb/acpi - device usb 2.6 alias usb2_port7 off end - end - chip drivers/usb/acpi - device usb 2.7 alias usb2_port8 off end - end - chip drivers/usb/acpi - device usb 2.8 alias usb2_port9 off end - end - chip drivers/usb/acpi - device usb 2.9 alias usb2_port10 off end - end - chip drivers/usb/acpi - device usb 3.0 alias usb3_port1 off end - end - chip drivers/usb/acpi - device usb 3.1 alias usb3_port2 off end - end - chip drivers/usb/acpi - device usb 3.2 alias usb3_port3 off end - end - chip drivers/usb/acpi - device usb 3.3 alias usb3_port4 off end - end - end - end - end - device pci 14.1 alias south_xdci off end - device pci 14.2 alias shared_ram off end - device pci 14.3 alias cnvi_wifi off end - device pci 15.0 alias i2c0 off end - device pci 15.1 alias i2c1 off end - device pci 15.2 alias i2c2 off end - device pci 15.3 alias i2c3 off end - device pci 16.0 alias heci1 off end - device pci 16.1 alias heci2 off end - device pci 16.2 alias csme1 off end - device pci 16.3 alias csme2 off end - device pci 16.4 alias heci3 off end - device pci 16.5 alias heci4 off end - device pci 17.0 alias sata off end - device pci 19.0 alias i2c4 off end - device pci 19.1 alias i2c5 off end - device pci 19.2 alias uart2 off end - device pci 1c.0 alias pcie_rp1 off end - device pci 1c.1 alias pcie_rp2 off end - device pci 1c.2 alias pcie_rp3 off end - device pci 1c.3 alias pcie_rp4 off end - device pci 1c.4 alias pcie_rp5 off end - device pci 1c.5 alias pcie_rp6 off end - device pci 1c.6 alias pcie_rp7 off end - device pci 1c.7 alias pcie_rp8 off end - device pci 1d.0 alias pcie_rp9 off end - device pci 1d.1 alias pcie_rp10 off end - device pci 1d.2 alias pcie_rp11 off end - device pci 1d.3 alias pcie_rp12 off end - device pci 1e.0 alias uart0 off end - device pci 1e.1 alias uart1 off end - device pci 1e.2 alias gspi0 off end - device pci 1e.3 alias gspi1 off end - device pci 1f.0 alias pch_espi on end - device pci 1f.1 alias p2sb off end - device pci 1f.2 alias pmc hidden end - device pci 1f.3 alias hda off end - device pci 1f.4 alias smbus off end - device pci 1f.5 alias fast_spi on end - device pci 1f.6 alias gbe off end - device pci 1f.7 alias tracehub off end - end -end diff --git a/boards/galp5/tlg-u/board.fmd b/boards/galp5/tlg-u/board.fmd deleted file mode 100644 index 6f3a0381d..000000000 --- a/boards/galp5/tlg-u/board.fmd +++ /dev/null @@ -1,12 +0,0 @@ -FLASH 16M { - SI_DESC 4K - SI_ME 5116K - SI_BIOS 11M { - RW_MRC_CACHE 64K - SMMSTORE(PRESERVE) 256K - WP_RO { - FMAP 4K - COREBOOT(CBFS) - } - } -} diff --git a/boards/galp5/tlg-u/devicetree.cb b/boards/galp5/tlg-u/devicetree.cb deleted file mode 100644 index f056da771..000000000 --- a/boards/galp5/tlg-u/devicetree.cb +++ /dev/null @@ -1,139 +0,0 @@ -chip soc/intel/tigerlake - register "common_soc_config" = "{ - // Touchpad I2C bus - .i2c[0] = { - .speed = I2C_SPEED_FAST, - .rise_time_ns = 80, - .fall_time_ns = 110, - }, - }" - -# ACPI (soc/intel/tigerlake/acpi.c) - # Enable Enhanced Intel SpeedStep - register "eist_enable" = "1" - - # Enable s0ix, required for TGL-U - register "s0ix_enable" = "1" - -# FSP Memory (soc/intel/tigerlake/romstage/fsp_params.c) - # Enable C6 DRAM - register "enable_c6dram" = "1" - - # System Agent dynamic frequency support - register "SaGv" = "SaGv_Enabled" - -# FSP Silicon (soc/intel/tigerlake/fsp_params.c) - # Acoustic settings - register "AcousticNoiseMitigation" = "1" - register "SlowSlewRate" = "SLEW_FAST_8" - register "FastPkgCRampDisable" = "1" - - # FIVR configuration - # Read EXT_RAIL_CONFIG to determine bitmaps - # sudo devmem2 0xfe0011b8 - # 0x0 - # Read EXT_V1P05_VR_CONFIG - # sudo devmem2 0xfe0011c0 - # 0x1a42000 - # Read EXT_VNN_VR_CONFIG0 - # sudo devmem2 0xfe0011c4 - # 0x1a42000 - # TODO: v1p05 voltage and vnn icc max? - register "ext_fivr_settings" = "{ - .configure_ext_fivr = 1, - .v1p05_enable_bitmap = 0, - .vnn_enable_bitmap = 0, - .v1p05_supported_voltage_bitmap = 0, - .vnn_supported_voltage_bitmap = 0, - .v1p05_icc_max_ma = 500, - .vnn_sx_voltage_mv = 1050, - }" - - # Read LPM_EN, make sure to invert the bits - register "LpmStateDisableMask" = " - LPM_S0i2_1 | - LPM_S0i2_2 | - LPM_S0i3_1 | - LPM_S0i3_2 | - LPM_S0i3_3 | - LPM_S0i3_4 - " - - # Thermal - register "tcc_offset" = "12" - -# Actual device tree - device cpu_cluster 0 on end - - device domain 0 on - device ref system_agent on end - device ref igpu on - # DDIA is eDP - register "DdiPortAConfig" = "DDI_PORT_CFG_EDP" - register "DdiPortAHpd" = "1" - register "DdiPortADdc" = "0" - - # DDIB is HDMI - register "DdiPortBConfig" = "DDI_PORT_CFG_NO_LFP" - register "DdiPortBHpd" = "1" - register "DdiPortBDdc" = "1" - - register "gfx" = "GMA_DEFAULT_PANEL(0)" - end - device ref dptf on end - device ref tbt_pcie_rp0 on end - device ref gna on end - device ref shared_ram on end - device ref cnvi_wifi on - register "CnviBtCore" = true - register "CnviBtAudioOffload" = true - chip drivers/wifi/generic - register "wake" = "GPE0_PME_B0" - device generic 0 on end - end - end - device ref i2c0 on - # Touchpad I2C bus - register "SerialIoI2cMode[PchSerialIoIndexI2C0]" = "PchSerialIoPci" - chip drivers/i2c/hid - register "generic.hid" = ""ELAN0412"" - register "generic.desc" = ""ELAN Touchpad"" - register "generic.irq_gpio" = "ACPI_GPIO_IRQ_LEVEL_LOW(GPP_B3)" - register "generic.detect" = "1" - register "hid_desc_reg_offset" = "0x01" - device i2c 15 on end - end - chip drivers/i2c/hid - register "generic.hid" = ""FTCS1000"" - register "generic.desc" = ""FocalTech Touchpad"" - register "generic.irq_gpio" = "ACPI_GPIO_IRQ_LEVEL_LOW(GPP_B3)" - register "generic.detect" = "1" - register "hid_desc_reg_offset" = "0x01" - device i2c 38 on end - end - end - device ref i2c1 on - # TODO: USB-PD? - register "SerialIoI2cMode[PchSerialIoIndexI2C1]" = "PchSerialIoPci" - end - device ref heci1 on end - device ref uart2 on - # Debug console - register "SerialIoUartMode[PchSerialIoIndexUART2]" = "PchSerialIoSkipInit" - end - device ref pch_espi on - register "gen1_dec" = "0x00040069" - register "gen2_dec" = "0x00fc0E01" - register "gen3_dec" = "0x00fc0F01" - chip drivers/pc80/tpm - device pnp 0c31.0 on end - end - end - device ref p2sb on end - device ref hda on - register "PchHdaAudioLinkHdaEnable" = "1" - end - device ref smbus on end - device ref fast_spi on end - end -end diff --git a/boards/galp5/tlg-u/variants/galp5/data.vbt b/boards/galp5/tlg-u/variants/galp5/data.vbt deleted file mode 100644 index e3b164fd1d4e7dfe9f8a529ed2a9297811704795..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8704 zcmeHMO-vg{6n?X|*N(FkBctHZgbqnW3=Ob22_?u<);2$J0>L(fI8rMNvD=_H!39#$ z9|>3DKyNEmsz}-@R;8+yPxRD7FTS)w>cvW>s)rspMp3I=I3{)9%yM4xZWH{l-|30$JT z!y&lX{Kq4JI3b6nE?Mph-kwh+-H}#0JTo<&Omy}o=5EfUphGKHce&yUwDdx2wDN?713y zUw>d^I20W6jRi+8(~$`63y%6mNBf8UL)U01GIAm4503Ts)!55i2+XA3ot=K`#yoWg zTB!%yY3F*m$uuxCo9dvxWRgZ0W{yS@bBWn^67h~2J5!Vco0$L*3)JR-z*9dsz=rzM z$Yx{(nIb!o1!TnPHIjH z-07LkYU8+6!)BZv^41N)YCNx;@lI?H;npX)LY+=b^3YU%t-%_9wzXEZT#bMc0e2J5 zX>&$NOEc`lmCb5}wlPcE+G9@Fy~HO!+pL7+KPpH(-5?H3Ewv}1Q26;kTBYkp9k$pp zt!7jAB7W6bUK+Q6X>SdgS_)m!Bh;O)FKW=f&6R419|pw-EwXF5Thrj`UNmWQwq$tW z#mQ%PFXT2@34^T2DQD3J3tvcp1hpv}^I|Uz3pCv5P#l{y5Y@u8RjA?X&V}`GV~Y}9 zDcL|&k!w)IRo)lRw&B8gMV?yqC`zuRK?Ez;P+4ER**u;NLz6t9>V3f?sj`I?pec^_{<*OO&i%Pt3d()ZJ>T%T2#@Yoy4HlJ8r&7kURKbY4*P6+P zmyXGyyZV|8HJE@el_W*1M1$O>ti_h%vMbCMlbQ`C>_{Yu&4hc8>TP3^+rZah`0CIK zG(2jAOo%qfk{n>|@;I1Od>_#UV^p(2zWb;adeg4Ad)k#~d#Nu>z!!NEu9n5UM|G}rn2`mzvbhcxN|K?0&_rnRb|QIs z@>b%76gmy_pJV!J9T6|8M2u$lxUT`j{H=Ro3kh2&g#PWsY?)dKvoX9AvoBR8Y}-Po zdf~SLtQ*87^A)r#4yVW`xPrmSCC4u`i>HUS5WwR?hfH9(Nc$s;z9JdBf`2_dUEEp% zoax37h>Gts|Fmg_74L<@d5k;&`-n0t^L!@J_SdzGubi*P4r3j+8+pB8^Gvr4bQ3r} zecOYZxe2!y*elPse3({SF2$}I?SFoRZ4m8ZTfV=VEA>oyPUO_{fPVwaMf<&UE@HP7 z50v)1GgbSm5vWF>8i8sAsu8G0pc;W{1YS%8dcP2k!0S^0X+gz9rx>i0qxv5>_8S*K z`3!)XfVd$IQN$AM+?C57K1G08Aud?PbLbX4?h?5dX}qt0iKon#6(U0lF*4S}y)04= znaLI`lsHh;Wi4g0{DJ_AC<_W|Sv7mgWKV_(j9ao~093T431!;Z zU>e)|B~L&VGav&+olQkMb0|}<36QpGvQ_hO^j-Tk$YkaWfs7?jLU0$BOvg~Cw#Q~N z=7S=xfeXSYi!(H`=HG5{$)Ws24U0<#xAbU@sR3)1;!@woY;mFQ?a*UxFSGOBhXNiZ c;=gKkz9%}-7Sw~3Lw;8O{U2n^&lgUA0_b;IE&u=k diff --git a/boards/galp5/tlg-u/variants/galp5/overridetree.cb b/boards/galp5/tlg-u/variants/galp5/overridetree.cb deleted file mode 100644 index 22ff85126..000000000 --- a/boards/galp5/tlg-u/variants/galp5/overridetree.cb +++ /dev/null @@ -1,195 +0,0 @@ -chip soc/intel/tigerlake - # Power limits - register "power_limits_config[POWER_LIMITS_U_4_CORE]" = "{ - .tdp_pl1_override = 28, - .tdp_pl2_override = 51, - }" - register "power_limits_config[POWER_LIMITS_U_2_CORE]" = "{ - .tdp_pl1_override = 28, - .tdp_pl2_override = 51, - }" - - # GPE configuration - register "pmc_gpe0_dw0" = "PMC_GPP_A" - register "pmc_gpe0_dw1" = "PMC_GPP_R" - register "pmc_gpe0_dw2" = "PMC_GPD" - - device domain 0 on - subsystemid 0x1558 0x4018 inherit - - device ref peg on - # PCIe PEG0 x4, Clock 0 (SSD1) - register "PcieClkSrcUsage[0]" = "0x40" - register "PcieClkSrcClkReq[0]" = "0" - chip soc/intel/common/block/pcie/rtd3 - register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_D14)" # SSD1_PWR_DN# - register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_H0)" # GPP_H0_RTD3 - register "srcclk_pin" = "0" # SSD1_CLKREQ# - device generic 0 on end - end - end - device ref north_xhci on # J_TYPEC2 - register "UsbTcPortEn" = "1" - register "TcssXhciEn" = "1" - chip drivers/usb/acpi - device ref tcss_root_hub on - chip drivers/usb/acpi - register "desc" = ""USB3 J_TYPEC2"" - register "type" = "UPC_TYPE_C_USB2_SS_SWITCH" - register "group" = "ACPI_PLD_GROUP(1, 1)" - device ref tcss_usb3_port1 on end - end - end - end - end - device ref tbt_dma0 on # J_TYPEC2 - chip drivers/intel/usb4/retimer - register "dfp[0].power_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_A23)" - use tcss_usb3_port1 as dfp[0].typec_port - device generic 0 on end - end - end - - device ref south_xhci on - register "usb2_ports" = "{ - [0] = USB2_PORT_MID(OC_SKIP), /* J_USB3_2 */ - [1] = USB2_PORT_TYPE_C(OC_SKIP), /* J_TYPEC1 */ - [2] = USB2_PORT_MID(OC_SKIP), /* J_USB3_1 */ - [4] = USB2_PORT_MID(OC_SKIP), /* Fingerprint */ - [5] = USB2_PORT_TYPE_C(OC_SKIP), /* J_TYPEC2 */ - [6] = USB2_PORT_MID(OC_SKIP), /* Camera */ - [9] = USB2_PORT_MID(OC_SKIP), /* Bluetooth */ - }" - register "usb3_ports" = "{ - [0] = USB3_PORT_DEFAULT(OC_SKIP), /* J_USB3_2 */ - [1] = USB3_PORT_DEFAULT(OC_SKIP), /* J_TYPEC1 CH0 */ - [2] = USB3_PORT_DEFAULT(OC_SKIP), /* J_USB3_1 */ - [3] = USB3_PORT_DEFAULT(OC_SKIP), /* J_TYPEC1 CH1 */ - }" - # ACPI - chip drivers/usb/acpi - device ref xhci_root_hub on - chip drivers/usb/acpi - register "desc" = ""USB2 J_USB3_2"" - register "type" = "UPC_TYPE_A" - register "group" = "ACPI_PLD_GROUP(1, 2)" - device ref usb2_port1 on end - end - chip drivers/usb/acpi - register "desc" = ""USB2 J_TYPEC1"" - register "type" = "UPC_TYPE_C_USB2_SS_SWITCH" - register "group" = "ACPI_PLD_GROUP(2, 1)" - device ref usb2_port2 on end - end - chip drivers/usb/acpi - register "desc" = ""USB2 J_USB3_1"" - register "type" = "UPC_TYPE_A" - register "group" = "ACPI_PLD_GROUP(2, 2)" - device ref usb2_port3 on end - end - chip drivers/usb/acpi - register "desc" = ""USB2 Fingerprint"" - register "type" = "UPC_TYPE_INTERNAL" - device ref usb2_port5 on end - end - chip drivers/usb/acpi - register "desc" = ""USB2 J_TYPEC2"" - register "type" = "UPC_TYPE_C_USB2_SS_SWITCH" - register "group" = "ACPI_PLD_GROUP(1, 1)" - device ref usb2_port6 on end - end - chip drivers/usb/acpi - register "desc" = ""USB2 Camera"" - register "type" = "UPC_TYPE_INTERNAL" - device ref usb2_port7 on end - end - chip drivers/usb/acpi - register "desc" = ""USB2 Bluetooth"" - register "type" = "UPC_TYPE_INTERNAL" - device ref usb2_port10 on end - end - chip drivers/usb/acpi - register "desc" = ""USB3 J_USB3_2"" - register "type" = "UPC_TYPE_A" - register "group" = "ACPI_PLD_GROUP(1, 2)" - device ref usb3_port1 on end - end - chip drivers/usb/acpi - register "desc" = ""USB3 J_TYPEC1 CH0"" - register "type" = "UPC_TYPE_A" - register "group" = "ACPI_PLD_GROUP(2, 1)" - device ref usb3_port2 on end - end - chip drivers/usb/acpi - register "desc" = ""USB3 J_USB3_1"" - register "type" = "UPC_TYPE_A" - register "group" = "ACPI_PLD_GROUP(2, 2)" - device ref usb3_port3 on end - end - chip drivers/usb/acpi - register "desc" = ""USB3 J_TYPEC1 CH1"" - register "type" = "UPC_TYPE_A" - register "group" = "ACPI_PLD_GROUP(2, 1)" - device ref usb3_port4 on end - end - end - end - end - device ref i2c2 on - # TODO: Pantone ROM? - register "SerialIoI2cMode[PchSerialIoIndexI2C2]" = "PchSerialIoPci" - end - device ref pcie_rp5 on - # PCIe root port #5 x4, Clock 2 (NVIDIA GPU) - register "PcieRpLtrEnable[4]" = "1" - register "PcieClkSrcUsage[2]" = "4" - register "PcieClkSrcClkReq[2]" = "2" - chip drivers/gfx/nvidia - device pci 00.0 on end # VGA controller - device pci 00.1 on end # Audio device - device pci 00.2 on end # USB xHCI Host controller - device pci 00.3 on end # USB Type-C UCSI controller - end - end - device ref pcie_rp9 on - # PCIe root port #9 x1, Clock 3 (CARD) - register "PcieRpLtrEnable[8]" = "1" - register "PcieClkSrcUsage[3]" = "8" - register "PcieClkSrcClkReq[3]" = "3" - end - device ref pcie_rp10 on - # PCIe root port #10 x1, Clock 4 (GLAN) - register "PcieRpLtrEnable[9]" = "1" - register "PcieClkSrcUsage[4]" = "9" - register "PcieClkSrcClkReq[4]" = "4" - chip soc/intel/common/block/pcie/rtd3 - register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_F9)" # GPIO_LAN_EN - register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_F7)" # GPIO_LANRTD3 - register "srcclk_pin" = "4" # LAN_CLKREQ# - device generic 0 on end - end - end - device ref pcie_rp11 on - # PCIe root port #11 x1, Clock 1 (WLAN) - register "PcieRpLtrEnable[10]" = "1" - register "PcieClkSrcUsage[1]" = "10" - register "PcieClkSrcClkReq[1]" = "1" - register "PcieRpSlotImplemented[10]" = "1" - end - device ref pmc hidden - # The pmc_mux chip driver is a placeholder for the - # PMC.MUX device in the ACPI hierarchy. - chip drivers/intel/pmc_mux - device generic 0 on - chip drivers/intel/pmc_mux/conn - # J_TYPEC2 - use usb2_port6 as usb2_port - use tcss_usb3_port1 as usb3_port - # SBU & HSL follow CC - device generic 0 alias conn0 on end - end - end - end - end - end -end From cda47409738a30bf7600414162a2d476f8f87ac4 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 3 Sep 2024 10:44:50 -0400 Subject: [PATCH 09/17] CircleCI: add galp5 based on librem_14 since sharing kernel, but not coreboot fork Signed-off-by: Thierry Laurion --- .circleci/config.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9c72f1d2a..8c33e303e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -240,6 +240,14 @@ workflows: requires: - x230-hotp-maximized + # coreboot system76 + - build_and_persist: + name: galp5 + target: galp5 + subcommand: "" + requires: + - librem_14 + # coreboot nitropad # Nitropads depending on x230-hotp-maximized cache since kernel is 6.x and coreboot is git is unshared # We use nitropad's coreboot's fork crossgcc From 103468bee482c79207065594b2a9a1a2a2adc608 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 3 Sep 2024 11:21:42 -0400 Subject: [PATCH 10/17] BOARD_TESTERS.md: add Galago 5 board owner/tester at the get go Signed-off-by: Thierry Laurion --- BOARD_TESTERS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BOARD_TESTERS.md b/BOARD_TESTERS.md index d93375907..d6cec7382 100644 --- a/BOARD_TESTERS.md +++ b/BOARD_TESTERS.md @@ -40,6 +40,9 @@ Librems: - [ ] Librem 15v3 (Skylake): @JonathonHall-Purism - [ ] Librem 15v4 (Kabylake): @JonathonHall-Purism +System76: +- [ ] Galago Pro 5 (Tiger Lake-U, Intel 11th Gen CPU, iGPU): @loftlifter31 + Clevo: === - [ ] Nitropad NS50 (AlderLake) : @daringer From cb84802cad991f83947ebeb3ae6214c43d1b486b Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Tue, 3 Sep 2024 11:23:17 -0400 Subject: [PATCH 11/17] galp5 board: add HCL information in header as comment Signed-off-by: Thierry Laurion --- boards/galp5/galp5.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards/galp5/galp5.config b/boards/galp5/galp5.config index 54f49de68..adb980a5b 100644 --- a/boards/galp5/galp5.config +++ b/boards/galp5/galp5.config @@ -1,4 +1,4 @@ -# Configuration System76 Galago Pro 5 +# Configuration System76 Galago Pro 5 https://tech-docs.system76.com/models/galp5/README.html CONFIG_LINUX_CONFIG=config/linux-galp5.config CONFIG_COREBOOT_CONFIG=config/coreboot-galp5.config From e383df4a6dfd265aa16773c808692d6dfee6e8fb Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 5 Sep 2024 13:36:10 -0400 Subject: [PATCH 12/17] galp5 board config: merge needed changed to pack tpm2 toolstack, unify config as comments based on qemu-coreboot-fbwhiptail-tpm2-hotp Signed-off-by: Thierry Laurion --- boards/galp5/galp5.config | 60 ++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/boards/galp5/galp5.config b/boards/galp5/galp5.config index adb980a5b..3630b3c25 100644 --- a/boards/galp5/galp5.config +++ b/boards/galp5/galp5.config @@ -6,6 +6,29 @@ export CONFIG_COREBOOT=y export CONFIG_COREBOOT_VERSION=system76 export CONFIG_LINUX_VERSION=6.1.8 +#Enable only one RESTRICTED/BASIC boot modes below to test them manually (we cannot inject config under QEMU (no internal flashing) +#export CONFIG_RESTRICTED_BOOT=y +#export CONFIG_BASIC=y + +#Enable HAVE_GPG_KEY_BACKUP to test GPG key backup drive (we cannot inject config under QEMU (no internal flashing)) +#export CONFIG_HAVE_GPG_KEY_BACKUP=y + +#Enable DEBUG output +#export CONFIG_DEBUG_OUTPUT=y +#export CONFIG_ENABLE_FUNCTION_TRACING_OUTPUT=y +#Enable TPM2 pcap output under /tmp +#export CONFIG_TPM2_CAPTURE_PCAP=y + +#On-demand hardware support (modules.cpio) +CONFIG_LINUX_USB=y +CONFIG_LINUX_E1000=y +CONFIG_MOBILE_TETHERING=y +#Runtime on-demand additional hardware support (modules.cpio) +export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y + + + +#Modules packed into tools.cpio CONFIG_CRYPTSETUP2=y CONFIG_FLASHROM=y CONFIG_FLASHTOOLS=y @@ -15,21 +38,44 @@ CONFIG_UTIL_LINUX=y CONFIG_LVM2=y CONFIG_MBEDTLS=y CONFIG_PCIUTILS=y +#Runtime tools to write to MSR +CONFIG_MSRTOOLS=y +#Remote attestation support +# TPM2 requirements +CONFIG_TPM2_TSS=y +CONFIG_OPENSSL=y +#Remote Attestation common tools CONFIG_POPT=y CONFIG_QRENCODE=y CONFIG_TPMTOTP=y - +#HOTP based remote attestation for supported USB Security dongle +#With/Without TPM support +CONFIG_HOTPKEY=y +#Nitrokey Storage admin tool (deprecated) +#CONFIG_NKSTORECLI=n +#GUI Support +#Console based Whiptail support(Console based, no FB): +#CONFIG_SLANG=y +#CONFIG_NEWT=y +#FBWhiptail based (Graphical): CONFIG_CAIRO=y CONFIG_FBWHIPTAIL=y -CONFIG_HOTPKEY=y +#Additional tools (tools.cpio): +#SSH server (requires ethernet drivers, eg: CONFIG_LINUX_E1000E) +#CONFIG_DROPBEAR=y -CONFIG_LINUX_USB=y -CONFIG_MOBILE_TETHERING=y - -export CONFIG_TPM=y -export CONFIG_SUPPORT_USB_KEYBOARD=y +#Runtime configuration +#Automatically boot if HOTP is valid +export CONFIG_AUTO_BOOT_TIMEOUT=5 +#TPM2 requirements +export CONFIG_TPM2_TOOLS=y +export CONFIG_PRIMARY_KEY_TYPE=ecc +#TPM1 requirements +#export CONFIG_TPM=y export CONFIG_BOOTSCRIPT=/bin/gui-init +#text-based original init: +#export CONFIG_BOOTSCRIPT=/bin/generic-init export CONFIG_BOOT_REQ_HASH=n export CONFIG_BOOT_REQ_ROLLBACK=n export CONFIG_BOOT_KERNEL_ADD="" From cc99c5e730fe49c57a0f9fad93113dafe5eaff4b Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 5 Sep 2024 13:47:28 -0400 Subject: [PATCH 13/17] galp5 board config: add runtime configurable USB Keyboard support, comment USB1 support Signed-off-by: Thierry Laurion --- boards/galp5/galp5.config | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/boards/galp5/galp5.config b/boards/galp5/galp5.config index 3630b3c25..83b99829e 100644 --- a/boards/galp5/galp5.config +++ b/boards/galp5/galp5.config @@ -24,7 +24,9 @@ CONFIG_LINUX_USB=y CONFIG_LINUX_E1000=y CONFIG_MOBILE_TETHERING=y #Runtime on-demand additional hardware support (modules.cpio) -export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y +#export CONFIG_LINUX_USB_COMPANION_CONTROLLER=y +#Pack but not use USB keyboard support by default (Needs runtime+ flash under config menu) +export CONFIG_SUPPORT_USB_KEYBOARD=y From 860538611fcca62e4e522883fdfd1c037c46434a Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 5 Sep 2024 14:00:46 -0400 Subject: [PATCH 14/17] galp5 : change CONFIG_HEAP_SIZE to 0x400000 copy patch from patches/coreboot-24.02.01/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch to patches/coreboot-system76-unrelease. Others might be needed, see patches/coreboot-24.02.01/* Signed-off-by: Thierry Laurion --- config/coreboot-galp5.config | 2 +- ...rom1mb_to4mb_when_bootpslash_enabled.patch | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 patches/coreboot-system76-unreleased/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch diff --git a/config/coreboot-galp5.config b/config/coreboot-galp5.config index 43078422c..1c78745b4 100644 --- a/config/coreboot-galp5.config +++ b/config/coreboot-galp5.config @@ -732,7 +732,7 @@ CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y CONFIG_RTC=y -CONFIG_HEAP_SIZE=0x100000 +CONFIG_HEAP_SIZE=0x400000 # # Console diff --git a/patches/coreboot-system76-unreleased/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch b/patches/coreboot-system76-unreleased/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch new file mode 100644 index 000000000..a31118c14 --- /dev/null +++ b/patches/coreboot-system76-unreleased/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch @@ -0,0 +1,44 @@ +From 00d695849a5fb503d87203e3515f761fa8dac850 Mon Sep 17 00:00:00 2001 +From: Jonathon Hall +Date: Mon, 15 Jul 2024 16:37:40 -0400 +Subject: [PATCH] bootsplash: Increase heap from 1 MB to 4 MB when bootsplash + is enabled + +Since commit 1d029b40c9de ("lib/jpeg: Replace decoder with Wuffs' +implementation"), a relatively large heap allocation is needed to +decode many JPEGs for use as work area. The prior decoder did not need +this, but also had many limitations in the JPEGs it could decode. + +A 1024x768 non-progressive JPEG used in Heads needs 1179648 bytes of +work area; about 1.2 MB. While the work area will also depend on the +subsampling of each channel, it's generally proportional to the image +size. + +Increasing the heap size to 4 MB when bootsplash is enabled should be +enough to decode bootsplashes up to 1920x1080 with some headroom. + +Change-Id: Ia4348d39effbc16c1b42ab01bcf1e4ec5d652fa9 +Signed-off-by: Jonathon Hall +--- + src/device/Kconfig | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/src/device/Kconfig b/src/device/Kconfig +index 243e23e52a..4dd03eba21 100644 +--- a/src/device/Kconfig ++++ b/src/device/Kconfig +@@ -501,6 +501,11 @@ config BOOTSPLASH + image in the 'General' section or add it manually to CBFS, using, + for example, cbfstool. + ++# The bootsplash JPEG decoder requires heap space approximately proportional to ++# the image size. This usually needs a larger heap. ++config HEAP_SIZE ++ default 0x400000 if BOOTSPLASH ++ + config LINEAR_FRAMEBUFFER_MAX_WIDTH + int "Maximum width in pixels" + depends on LINEAR_FRAMEBUFFER && MAINBOARD_USE_LIBGFXINIT +-- +2.39.2 + From 1e840fcb4b397ea3e87f40abcb961a41965de155 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Thu, 5 Sep 2024 14:38:30 -0400 Subject: [PATCH 15/17] galp5 : add console debug output to SPI so that unbootable system can have flash externally backup and inspected TODO: turn on additional debugging in case more is needed with docker run -e DISPLAY=$DISPLAY --network host --rm -ti -v $(pwd):$(pwd) -w $(pwd) tlaurion/heads-dev-env:latest -- make BOARD=galp5 coreboot.modify_and_save_oldconfig_in_place in DEBUGGING settings of coreboot menuconfig menu. Signed-off-by: Thierry Laurion --- config/coreboot-galp5.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/coreboot-galp5.config b/config/coreboot-galp5.config index 1c78745b4..2b019c116 100644 --- a/config/coreboot-galp5.config +++ b/config/coreboot-galp5.config @@ -559,6 +559,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y +CONFIG_HEAP_SIZE=0x400000 # end of Display CONFIG_PCI=y @@ -716,7 +717,6 @@ CONFIG_PLATFORM_HAS_DRAM_CLEAR=y CONFIG_BOOTMEDIA_LOCK_NONE=y # CONFIG_BOOTMEDIA_LOCK_CONTROLLER is not set # CONFIG_BOOTMEDIA_LOCK_CHIP is not set -# CONFIG_BOOTMEDIA_SMM_BWP is not set # end of Security CONFIG_ACPI_HAVE_PCAT_8259=y @@ -732,7 +732,6 @@ CONFIG_BOOT_DEVICE_SPI_FLASH=y CONFIG_BOOT_DEVICE_MEMORY_MAPPED=y CONFIG_BOOT_DEVICE_SUPPORTS_WRITES=y CONFIG_RTC=y -CONFIG_HEAP_SIZE=0x400000 # # Console @@ -758,7 +757,8 @@ CONFIG_TTYS0_LCS=3 # CONFIG_SPKMODEM is not set # CONFIG_CONSOLE_NE2K is not set CONFIG_CONSOLE_CBMEM=y -# CONFIG_CONSOLE_SPI_FLASH is not set +CONFIG_CONSOLE_SPI_FLASH=y +CONFIG_CONSOLE_SPI_FLASH_BUFFER_SIZE=0x20000 # CONFIG_CONSOLE_I2C_SMBUS is not set # CONFIG_CONSOLE_SYSTEM76_EC is not set # CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8 is not set From 753e1e681525561e379c63d1135854a69d443647 Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 11 Sep 2024 17:04:35 -0400 Subject: [PATCH 16/17] coreboot Makefile helper: make sure real.remove_canary_files-extract_patch_rebuild_what_changed helper deletes coreboot .patched files so that a rebuild will patch coreboot if needed Signed-off-by: Thierry Laurion --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index c952ab001..73ef70e99 100644 --- a/Makefile +++ b/Makefile @@ -881,6 +881,7 @@ real.remove_canary_files-extract_patch_rebuild_what_changed: @echo "Only a minimal time is needed for rebuilding, which is also good for your SSD." @echo "*** USE THIS APPROACH FIRST ***" find ./build/ -type f -name ".canary" -print -delete + find ./build/ -type f -name ".patched" -print -delete find ./install/*/* -print -exec rm -rf {} + real.gitclean_keep_packages_and_build: From 37f809e156c4cf0c8fce898c478f435bf33b964d Mon Sep 17 00:00:00 2001 From: Thierry Laurion Date: Wed, 11 Sep 2024 17:11:44 -0400 Subject: [PATCH 17/17] coreboot patches: remove lib/jpeg patches for heap increase and alloc failure. Add https://review.coreboot.org/c/coreboot/+/83895 Repro: rm patches/coreboot-24.02.01/0001* patches/coreboot-24.02.01/0002* git fetch https://review.coreboot.org/coreboot refs/changes/94/83894/2 && git format-patch -1 --stdout FETCH_HEAD > patches/coreboot-24.02.01/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch git fetch https://review.coreboot.org/coreboot refs/changes/95/83895/3 && git format-patch -1 --stdout FETCH_HEAD > patches/coreboot-24.02.01/0002-lib_jpeg-avoidcalling-malloc-and-free.patch cp patches/coreboot-24.02.01/0001* patches/coreboot-system76-unreleased/ cp patches/coreboot-24.02.01/0002* patches/coreboot-system76-unreleased/ sed -i 's/CONFIG_HEAP_SIZE=0x400000/CONFIG_HEAP_SIZE=0x100000/g' config/coreboot-* Signed-off-by: Thierry Laurion --- config/coreboot-galp5.config | 2 +- config/coreboot-librem_11.config | 2 +- config/coreboot-librem_13v2.config | 2 +- config/coreboot-librem_13v4.config | 2 +- config/coreboot-librem_14.config | 2 +- config/coreboot-librem_15v3.config | 2 +- config/coreboot-librem_15v4.config | 2 +- config/coreboot-librem_l1um_v2.config | 2 +- config/coreboot-librem_mini.config | 2 +- config/coreboot-librem_mini_v2.config | 2 +- config/coreboot-qemu-tpm1.config | 2 +- config/coreboot-qemu-tpm2.config | 2 +- config/coreboot-t420-maximized.config | 2 +- config/coreboot-t430-maximized.config | 2 +- config/coreboot-t440p.config | 2 +- config/coreboot-t530-maximized.config | 2 +- config/coreboot-w530-maximized.config | 2 +- config/coreboot-w541.config | 2 +- config/coreboot-x220-maximized.config | 2 +- config/coreboot-x230-legacy-flash.config | 2 +- config/coreboot-x230-legacy.config | 2 +- config/coreboot-x230-maximized-fhd_edp.config | 2 +- config/coreboot-x230-maximized.config | 2 +- config/coreboot-z220-cmt.config | 2 +- ...h_heap_allocation_failure_to_booting.patch | 80 - ...wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch | 111421 +++++++++++++++ ...rom1mb_to4mb_when_bootpslash_enabled.patch | 44 - ...ib_jpeg-avoidcalling-malloc-and-free.patch | 91 + ...wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch | 111421 +++++++++++++++ ...rom1mb_to4mb_when_bootpslash_enabled.patch | 44 - ...ib_jpeg-avoidcalling-malloc-and-free.patch | 91 + 31 files changed, 223048 insertions(+), 192 deletions(-) delete mode 100644 patches/coreboot-24.02.01/0001-prevent_bootsplash_heap_allocation_failure_to_booting.patch create mode 100644 patches/coreboot-24.02.01/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch delete mode 100644 patches/coreboot-24.02.01/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch create mode 100644 patches/coreboot-24.02.01/0002-lib_jpeg-avoidcalling-malloc-and-free.patch create mode 100644 patches/coreboot-system76-unreleased/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch delete mode 100644 patches/coreboot-system76-unreleased/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch create mode 100644 patches/coreboot-system76-unreleased/0002-lib_jpeg-avoidcalling-malloc-and-free.patch diff --git a/config/coreboot-galp5.config b/config/coreboot-galp5.config index 2b019c116..d8c19de61 100644 --- a/config/coreboot-galp5.config +++ b/config/coreboot-galp5.config @@ -559,7 +559,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_11.config b/config/coreboot-librem_11.config index b153955fa..e4fb403d6 100644 --- a/config/coreboot-librem_11.config +++ b/config/coreboot-librem_11.config @@ -478,7 +478,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_13v2.config b/config/coreboot-librem_13v2.config index 001115ac8..699c54a30 100644 --- a/config/coreboot-librem_13v2.config +++ b/config/coreboot-librem_13v2.config @@ -501,7 +501,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_13v4.config b/config/coreboot-librem_13v4.config index 9eb08a478..84b37ae2e 100644 --- a/config/coreboot-librem_13v4.config +++ b/config/coreboot-librem_13v4.config @@ -501,7 +501,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_14.config b/config/coreboot-librem_14.config index 4bdcee327..f72db4392 100644 --- a/config/coreboot-librem_14.config +++ b/config/coreboot-librem_14.config @@ -498,7 +498,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_15v3.config b/config/coreboot-librem_15v3.config index 012f3742d..395a8be81 100644 --- a/config/coreboot-librem_15v3.config +++ b/config/coreboot-librem_15v3.config @@ -501,7 +501,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_15v4.config b/config/coreboot-librem_15v4.config index 998fe2790..dd16e94c0 100644 --- a/config/coreboot-librem_15v4.config +++ b/config/coreboot-librem_15v4.config @@ -501,7 +501,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_l1um_v2.config b/config/coreboot-librem_l1um_v2.config index aa599988b..ca70ea96f 100644 --- a/config/coreboot-librem_l1um_v2.config +++ b/config/coreboot-librem_l1um_v2.config @@ -498,7 +498,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_mini.config b/config/coreboot-librem_mini.config index 82f908104..62d2c37df 100644 --- a/config/coreboot-librem_mini.config +++ b/config/coreboot-librem_mini.config @@ -502,7 +502,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-librem_mini_v2.config b/config/coreboot-librem_mini_v2.config index 02d16d24c..85ed80b70 100644 --- a/config/coreboot-librem_mini_v2.config +++ b/config/coreboot-librem_mini_v2.config @@ -504,7 +504,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-qemu-tpm1.config b/config/coreboot-qemu-tpm1.config index 104371b7a..c8e213ef3 100644 --- a/config/coreboot-qemu-tpm1.config +++ b/config/coreboot-qemu-tpm1.config @@ -327,7 +327,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-qemu-tpm2.config b/config/coreboot-qemu-tpm2.config index aea23cf93..f041c9953 100644 --- a/config/coreboot-qemu-tpm2.config +++ b/config/coreboot-qemu-tpm2.config @@ -324,7 +324,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-t420-maximized.config b/config/coreboot-t420-maximized.config index 44f4610e5..fdd176c2d 100644 --- a/config/coreboot-t420-maximized.config +++ b/config/coreboot-t420-maximized.config @@ -424,7 +424,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-t430-maximized.config b/config/coreboot-t430-maximized.config index 1e6c97dec..530583227 100644 --- a/config/coreboot-t430-maximized.config +++ b/config/coreboot-t430-maximized.config @@ -424,7 +424,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-t440p.config b/config/coreboot-t440p.config index 392c87b17..ac28f6754 100644 --- a/config/coreboot-t440p.config +++ b/config/coreboot-t440p.config @@ -422,7 +422,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-t530-maximized.config b/config/coreboot-t530-maximized.config index 2fad20d33..2008200d9 100644 --- a/config/coreboot-t530-maximized.config +++ b/config/coreboot-t530-maximized.config @@ -424,7 +424,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-w530-maximized.config b/config/coreboot-w530-maximized.config index ae1ae5e24..b30af7dba 100644 --- a/config/coreboot-w530-maximized.config +++ b/config/coreboot-w530-maximized.config @@ -427,7 +427,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-w541.config b/config/coreboot-w541.config index b8ccf8e4c..5515e064e 100644 --- a/config/coreboot-w541.config +++ b/config/coreboot-w541.config @@ -422,7 +422,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-x220-maximized.config b/config/coreboot-x220-maximized.config index e2bd2aa72..5809a48ad 100644 --- a/config/coreboot-x220-maximized.config +++ b/config/coreboot-x220-maximized.config @@ -424,7 +424,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-x230-legacy-flash.config b/config/coreboot-x230-legacy-flash.config index a2b3d0efa..ad2a9680b 100644 --- a/config/coreboot-x230-legacy-flash.config +++ b/config/coreboot-x230-legacy-flash.config @@ -413,7 +413,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-x230-legacy.config b/config/coreboot-x230-legacy.config index dc57f10d9..336170d9a 100644 --- a/config/coreboot-x230-legacy.config +++ b/config/coreboot-x230-legacy.config @@ -413,7 +413,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-x230-maximized-fhd_edp.config b/config/coreboot-x230-maximized-fhd_edp.config index f7b59b0fc..56eaea73b 100644 --- a/config/coreboot-x230-maximized-fhd_edp.config +++ b/config/coreboot-x230-maximized-fhd_edp.config @@ -425,7 +425,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-x230-maximized.config b/config/coreboot-x230-maximized.config index 64d57bfba..1f898e3fa 100644 --- a/config/coreboot-x230-maximized.config +++ b/config/coreboot-x230-maximized.config @@ -424,7 +424,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/config/coreboot-z220-cmt.config b/config/coreboot-z220-cmt.config index d4c965eb9..4afc284da 100644 --- a/config/coreboot-z220-cmt.config +++ b/config/coreboot-z220-cmt.config @@ -403,7 +403,7 @@ CONFIG_NO_EARLY_GFX_INIT=y CONFIG_GENERIC_LINEAR_FRAMEBUFFER=y CONFIG_LINEAR_FRAMEBUFFER=y CONFIG_BOOTSPLASH=y -CONFIG_HEAP_SIZE=0x400000 +CONFIG_HEAP_SIZE=0x100000 # end of Display CONFIG_PCI=y diff --git a/patches/coreboot-24.02.01/0001-prevent_bootsplash_heap_allocation_failure_to_booting.patch b/patches/coreboot-24.02.01/0001-prevent_bootsplash_heap_allocation_failure_to_booting.patch deleted file mode 100644 index 3913ba10c..000000000 --- a/patches/coreboot-24.02.01/0001-prevent_bootsplash_heap_allocation_failure_to_booting.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 8b6fc3a877d8169091d034ea6ac6d15593cc69a0 Mon Sep 17 00:00:00 2001 -From: Jonathon Hall -Date: Mon, 15 Jul 2024 15:01:52 -0400 -Subject: [PATCH] src/lib/malloc.c: If allocation fails, leave the heap - unchanged - -If an allocation fails because it is too large for the rest of the heap, -don't consume the rest of the heap needlessly. - -This started occurring with the Heads bootsplash image in 24.02.01, -following the switch to the Wuffs JPEG decoder. The work area needed -was too large for the heap. The bootsplash failed to show, but worse, -the boot failed entirely because we were then out of heap space, even -though we did not actually use the large allocation that failed. - -With this change, that failure no longer prevents boot. - -The error message is improved slightly also: -* missing line break is added -* "Tried to round up" now shows the beginning of the allocation before - and after rounding instead of the unrounded beginning and rounded end - (misleading, looked like it was trying to align by 1 MB when it - was actually allocating 1 MB) - -Change-Id: Ie72814027d9daa517c0794f3ea7abec2b9a9d596 -Signed-off-by: Jonathon Hall ---- - src/lib/malloc.c | 25 ++++++++++++------------- - 1 file changed, 12 insertions(+), 13 deletions(-) - -diff --git a/src/lib/malloc.c b/src/lib/malloc.c -index 30298064d9..281792c3d5 100644 ---- a/src/lib/malloc.c -+++ b/src/lib/malloc.c -@@ -26,30 +26,29 @@ void *memalign(size_t boundary, size_t size) - MALLOCDBG("%s Enter, boundary %zu, size %zu, free_mem_ptr %p\n", - __func__, boundary, size, free_mem_ptr); - -- free_mem_ptr = (void *)ALIGN_UP((unsigned long)free_mem_ptr, boundary); -+ p = (void *)ALIGN_UP((unsigned long)free_mem_ptr, boundary); - -- p = free_mem_ptr; -- free_mem_ptr += size; -- /* -- * Store last allocation pointer after ALIGN, as malloc() will -- * return it. This may cause n bytes of gap between allocations -- * where n < boundary. -- */ -- free_last_alloc_ptr = p; -- -- if (free_mem_ptr >= free_mem_end_ptr) { -+ if (p + size >= free_mem_end_ptr) { - printk(BIOS_ERR, "%s(boundary=%zu, size=%zu): failed: ", - __func__, boundary, size); - printk(BIOS_ERR, "Tried to round up free_mem_ptr %p to %p\n", -- p, free_mem_ptr); -+ free_mem_ptr, p); - printk(BIOS_ERR, "but free_mem_end_ptr is %p\n", - free_mem_end_ptr); - printk(BIOS_ERR, "Error! %s: Out of memory " -- "(free_mem_ptr >= free_mem_end_ptr)", -+ "(free_mem_ptr >= free_mem_end_ptr)\n", - __func__); - return NULL; - } - -+ free_mem_ptr = p + size; -+ /* -+ * Store last allocation pointer after ALIGN, as malloc() will -+ * return it. This may cause n bytes of gap between allocations -+ * where n < boundary. -+ */ -+ free_last_alloc_ptr = p; -+ - MALLOCDBG("%s %p\n", __func__, p); - - return p; --- -2.39.2 - diff --git a/patches/coreboot-24.02.01/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch b/patches/coreboot-24.02.01/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch new file mode 100644 index 000000000..7208d5ebc --- /dev/null +++ b/patches/coreboot-24.02.01/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch @@ -0,0 +1,111421 @@ +From b598d05d389e137baa10e277a37fca2c363fb295 Mon Sep 17 00:00:00 2001 +From: Nigel Tao +Date: Tue, 13 Aug 2024 22:10:52 +1000 +Subject: [PATCH] vc/wuffs: upgrade to Wuffs 0.4.0-alpha.8 + +We were previously at Wuffs 0.4.0-alpha.2. The C file was copied from +https://github.com/google/wuffs-mirror-release-c and its hash matches +https://github.com/google/wuffs-mirror-release-c/blob/90e4d81a6a8b7b601e8e568da32a105d7f7705e5/sync.txt#L9-L10 + +$ sha256sum src/vendorcode/wuffs/wuffs-v0.4.c +6c22caff4af929112601379a73f72461bc4719a5215366bcc90d599cbc442bb6 src/vendorcode/wuffs/wuffs-v0.4.c + +Change-Id: Ie90d989384e0db2b23d7d1b3d9a57920ac8a95a2 +Signed-off-by: Nigel Tao +Reviewed-on: https://review.coreboot.org/c/coreboot/+/83894 +Reviewed-by: Felix Singer +Reviewed-by: Nico Huber +Tested-by: build bot (Jenkins) +--- + src/vendorcode/wuffs/wuffs-v0.4.c | 101194 ++++++++++++++++----------- + 1 file changed, 58878 insertions(+), 42316 deletions(-) + +diff --git a/src/vendorcode/wuffs/wuffs-v0.4.c b/src/vendorcode/wuffs/wuffs-v0.4.c +index bce9eb9798..0c6616a652 100644 +--- a/src/vendorcode/wuffs/wuffs-v0.4.c ++++ b/src/vendorcode/wuffs/wuffs-v0.4.c +@@ -81,15 +81,43 @@ extern "C" { + // each major.minor branch, the commit count should increase monotonically. + // + // WUFFS_VERSION was overridden by "wuffs gen -version" based on revision +-// ae8531f7f846fbbe3a7340bf88499ad294a1367b committed on 2023-10-07. ++// 5d69840f8e7ca481551b02c7e8d4c5fb69521bb9 committed on 2024-08-12. + #define WUFFS_VERSION 0x000040000 + #define WUFFS_VERSION_MAJOR 0 + #define WUFFS_VERSION_MINOR 4 + #define WUFFS_VERSION_PATCH 0 +-#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.2" +-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3603 +-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20231007 +-#define WUFFS_VERSION_STRING "0.4.0-alpha.2+3603.20231007" ++#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.8" ++#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3796 ++#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20240812 ++#define WUFFS_VERSION_STRING "0.4.0-alpha.8+3796.20240812" ++ ++// ---------------- Private Implementation Macros Re-definition Check ++ ++// Users (those who #include the "wuffs-vM.N.c" file) should not define any ++// WUFFS_PRIVATE_IMPL__ETC macros, only WUFFS_CONFIG__ETC macros (and ++// WUFFS_IMPLEMENTATION). Mucking about with the private implementation macros ++// is not supported and may break when upgrading to newer Wuffs versions. ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) || \ ++ defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) || \ ++ defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) || \ ++ defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) || \ ++ defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) || \ ++ defined(WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) || \ ++ defined(WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) || \ ++ defined(WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) || \ ++ defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U16) || \ ++ defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32) || \ ++ defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64) || \ ++ defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U8) ++ ++#if defined(__GNUC__) || defined(__clang__) ++#warning "Defining WUFFS_PRIVATE_IMPL__ETC yourself is not supported" ++#elif defined(_MSC_VER) ++#pragma message("Defining WUFFS_PRIVATE_IMPL__ETC yourself is not supported") ++#endif ++ ++#endif + + // ---------------- Configuration + +@@ -117,11 +145,11 @@ extern "C" { + // intrinsics. Look for __ARM_FEATURE_CRC32 instead. + #if defined(__ARM_FEATURE_CRC32) + #include +-#define WUFFS_BASE__CPU_ARCH__ARM_CRC32 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32 + #endif // defined(__ARM_FEATURE_CRC32) + #if defined(__ARM_NEON) + #include +-#define WUFFS_BASE__CPU_ARCH__ARM_NEON ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON + #endif // defined(__ARM_NEON) + #endif // defined(__ARM_FEATURE_UNALIGNED) etc + +@@ -129,26 +157,82 @@ extern "C" { + // POPCNT. This is checked at runtime via cpuid, not at compile time. + // + // Likewise, "cpu_arch >= x86_avx2" also requires PCLMUL, POPCNT and SSE4.2. +-#if defined(__i386__) || defined(__x86_64__) ++// ++// ---- ++// ++// Technically, we could use the SSE family on 32-bit x86, not just 64-bit x86. ++// But some intrinsics don't compile in 32-bit mode. It's not worth the hassle. ++// https://github.com/google/wuffs/issues/145 ++#if defined(__x86_64__) + #if !defined(__native_client__) + #include + #include +-// X86_FAMILY means X86 (32-bit) or X86_64 (64-bit, obviously). +-#define WUFFS_BASE__CPU_ARCH__X86_FAMILY +-#if defined(__x86_64__) +-#define WUFFS_BASE__CPU_ARCH__X86_64 +-#endif // defined(__x86_64__) ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3 + #endif // !defined(__native_client__) +-#endif // defined(__i386__) || defined(__x86_64__) ++#endif // defined(__x86_64__) + + #elif defined(_MSC_VER) // (#if-chain ref AVOID_CPU_ARCH_1) + +-#if defined(_M_IX86) || defined(_M_X64) +-#if defined(__AVX__) || defined(__clang__) ++#if defined(_M_X64) ++ ++// On X86_64, Microsoft Visual C/C++ (MSVC) only supports SSE2 by default. ++// There are /arch:SSE2, /arch:AVX and /arch:AVX2 compiler flags (the AVX2 one ++// is roughly equivalent to X86_64_V3), but there is no /arch:SSE42 compiler ++// flag that's equivalent to X86_64_V2. ++// ++// For getting maximum performance with X86_64 MSVC and Wuffs, pass /arch:AVX2 ++// (and then test on the oldest hardware you intend to support). ++// ++// Absent that compiler flag, either define one of the three macros listed ++// below or else the X86_64 SIMD code will be disabled and you'll get a #pragma ++// message stating this library "performs best with /arch:AVX2". This message ++// is harmless and ignorable, in that the non-SIMD code is still correct and ++// reasonably performant, but is a reminder that when combining Wuffs and MSVC, ++// some compiler configuration is required for maximum performance. ++// ++// - WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY ++// - WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V2 (enables SSE4.2 and below) ++// - WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V3 (enables AVX2 and below) ++// ++// Defining the first one (WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY) ++// or defining none of those three (the default state) are equivalent (in that ++// both disable the SIMD code paths), other than that pragma message. ++// ++// When defining these WUFFS_CONFIG__ENABLE_ETC macros with MSVC, be aware that ++// some users report it leading to ICEs (Internal Compiler Errors), but other ++// users report no problems at all (and improved performance). It's unclear ++// exactly what combination of SIMD code and MSVC configuration lead to ICEs. ++// Do your own testing with your own MSVC version and configuration. ++// ++// https://github.com/google/wuffs/issues/148 ++// https://github.com/google/wuffs/issues/151 ++// https://developercommunity.visualstudio.com/t/fatal--error-C1001:-Internal-compiler-er/10703305 ++// ++// Clang (including clang-cl) and GCC don't need this WUFFS_CONFIG__ETC macro ++// machinery, or having the Wuffs-the-library user to fiddle with compiler ++// flags, because they support "__attribute__((target(arg)))". ++#if defined(__AVX2__) || defined(__clang__) || \ ++ defined(WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V3) ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3 ++#elif defined(WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V2) ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2 ++#elif !defined(WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY) ++#pragma message("Wuffs with MSVC+X64 performs best with /arch:AVX2") ++#endif // defined(__AVX2__) || defined(__clang__) || etc ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) ++ ++#if defined(WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY) ++#error "MSVC_CPU_ARCH simultaneously enabled and disabled" ++#endif + +-// We need for the __cpuid function. + #include +-// That's not enough for X64 SIMD, with clang-cl, if we want to use ++// intrin.h isn't enough for X64 SIMD, with clang-cl, if we want to use + // "__attribute__((target(arg)))" without e.g. "/arch:AVX". + // + // Some web pages suggest that is all you need, as it pulls in +@@ -157,25 +241,9 @@ extern "C" { + #include // AVX, AVX2, FMA, POPCNT + #include // SSE4.2 + #include // AES, PCLMUL +-// X86_FAMILY means X86 (32-bit) or X86_64 (64-bit, obviously). +-#define WUFFS_BASE__CPU_ARCH__X86_FAMILY +-#if defined(_M_X64) +-#define WUFFS_BASE__CPU_ARCH__X86_64 +-#endif // defined(_M_X64) +- +-#else // defined(__AVX__) || defined(__clang__) +- +-// clang-cl (which defines both __clang__ and _MSC_VER) supports +-// "__attribute__((target(arg)))". +-// +-// For MSVC's cl.exe (unlike clang or gcc), SIMD capability is a compile-time +-// property of the source file (e.g. a /arch:AVX or -mavx compiler flag), not +-// of individual functions (that can be conditionally selected at runtime). +-#pragma message("Wuffs with MSVC+IX86/X64 needs /arch:AVX for best performance") +- +-#endif // defined(__AVX__) || defined(__clang__) +-#endif // defined(_M_IX86) || defined(_M_X64) + ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) ++#endif // defined(_M_X64) + #endif // (#if-chain ref AVOID_CPU_ARCH_1) + #endif // (#if-chain ref AVOID_CPU_ARCH_0) + +@@ -198,20 +266,20 @@ extern "C" { + + static inline bool // + wuffs_base__cpu_arch__have_arm_crc32(void) { +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) + return true; + #else + return false; +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) + } + + static inline bool // + wuffs_base__cpu_arch__have_arm_neon(void) { +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + return true; + #else + return false; +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + } + + static inline bool // +@@ -220,7 +288,7 @@ wuffs_base__cpu_arch__have_x86_avx2(void) { + defined(__AVX2__) + return true; + #else +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + // GCC defines these macros but MSVC does not. + // - bit_AVX2 = (1 << 5) + const unsigned int avx2_ebx7 = 0x00000020; +@@ -258,9 +326,9 @@ wuffs_base__cpu_arch__have_x86_avx2(void) { + } + } + #else +-#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler" ++#error "WUFFS_PRIVATE_IMPL__CPU_ARCH__ETC combined with an unsupported compiler" + #endif // defined(__GNUC__); defined(_MSC_VER) +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + return false; + #endif // defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__) && + // defined(__AVX2__) +@@ -271,7 +339,7 @@ wuffs_base__cpu_arch__have_x86_bmi2(void) { + #if defined(__BMI2__) + return true; + #else +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + // GCC defines these macros but MSVC does not. + // - bit_BMI2 = (1 << 8) + const unsigned int bmi2_ebx7 = 0x00000100; +@@ -293,9 +361,9 @@ wuffs_base__cpu_arch__have_x86_bmi2(void) { + return true; + } + #else +-#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler" ++#error "WUFFS_PRIVATE_IMPL__CPU_ARCH__ETC combined with an unsupported compiler" + #endif // defined(__GNUC__); defined(_MSC_VER) +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + return false; + #endif // defined(__BMI2__) + } +@@ -305,7 +373,7 @@ wuffs_base__cpu_arch__have_x86_sse42(void) { + #if defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__) + return true; + #else +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + // GCC defines these macros but MSVC does not. + // - bit_PCLMUL = (1 << 1) + // - bit_POPCNT = (1 << 23) +@@ -329,9 +397,9 @@ wuffs_base__cpu_arch__have_x86_sse42(void) { + return true; + } + #else +-#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler" ++#error "WUFFS_PRIVATE_IMPL__CPU_ARCH__ETC combined with an unsupported compiler" + #endif // defined(__GNUC__); defined(_MSC_VER) +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + return false; + #endif // defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__) + } +@@ -350,9 +418,15 @@ wuffs_base__cpu_arch__have_x86_sse42(void) { + // The "defined(__clang__)" isn't redundant. While vanilla clang defines + // __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. + #if defined(__GNUC__) || defined(__clang__) ++#define WUFFS_BASE__FORCE_INLINE __attribute__((__always_inline__)) + #define WUFFS_BASE__POTENTIALLY_UNUSED __attribute__((unused)) + #define WUFFS_BASE__WARN_UNUSED_RESULT __attribute__((warn_unused_result)) ++#elif defined(_MSC_VER) ++#define WUFFS_BASE__FORCE_INLINE __forceinline ++#define WUFFS_BASE__POTENTIALLY_UNUSED ++#define WUFFS_BASE__WARN_UNUSED_RESULT + #else ++#define WUFFS_BASE__FORCE_INLINE + #define WUFFS_BASE__POTENTIALLY_UNUSED + #define WUFFS_BASE__WARN_UNUSED_RESULT + #endif +@@ -415,6 +489,37 @@ struct wuffs_unique_ptr_deleter { + + // -------- + ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wcast-qual" ++#endif ++ ++static inline uint8_t* // ++wuffs_base__strip_const_from_u8_ptr(const uint8_t* ptr) { ++ return (uint8_t*)ptr; ++} ++ ++static inline uint16_t* // ++wuffs_base__strip_const_from_u16_ptr(const uint16_t* ptr) { ++ return (uint16_t*)ptr; ++} ++ ++static inline uint32_t* // ++wuffs_base__strip_const_from_u32_ptr(const uint32_t* ptr) { ++ return (uint32_t*)ptr; ++} ++ ++static inline uint64_t* // ++wuffs_base__strip_const_from_u64_ptr(const uint64_t* ptr) { ++ return (uint64_t*)ptr; ++} ++ ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ ++// -------- ++ + // wuffs_base__empty_struct is used when a Wuffs function returns an empty + // struct. In C, if a function f returns void, you can't say "x = f()", but in + // Wuffs, if a function g returns empty, you can say "y = g()". +@@ -483,6 +588,7 @@ extern const char wuffs_base__suspension__even_more_information[]; + extern const char wuffs_base__suspension__mispositioned_read[]; + extern const char wuffs_base__suspension__mispositioned_write[]; + extern const char wuffs_base__suspension__short_read[]; ++extern const char wuffs_base__suspension__short_workbuf[]; + extern const char wuffs_base__suspension__short_write[]; + extern const char wuffs_base__error__bad_i_o_position[]; + extern const char wuffs_base__error__bad_argument_length_too_short[]; +@@ -496,9 +602,11 @@ extern const char wuffs_base__error__bad_vtable[]; + extern const char wuffs_base__error__bad_workbuf_length[]; + extern const char wuffs_base__error__bad_wuffs_version[]; + extern const char wuffs_base__error__cannot_return_a_suspension[]; ++extern const char wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist[]; + extern const char wuffs_base__error__disabled_by_previous_error[]; + extern const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[]; + extern const char wuffs_base__error__initialize_not_called[]; ++extern const char wuffs_base__error__insufficient_history[]; + extern const char wuffs_base__error__interleaved_coroutine_calls[]; + extern const char wuffs_base__error__no_more_information[]; + extern const char wuffs_base__error__not_enough_data[]; +@@ -728,6 +836,9 @@ typedef struct wuffs_base__transform__output__struct { + // Lempel–Ziv 4. + #define WUFFS_BASE__FOURCC__LZ4 0x4C5A3420 + ++// Lzip. ++#define WUFFS_BASE__FOURCC__LZIP 0x4C5A4950 ++ + // Lempel–Ziv Markov-chain Algorithm. + #define WUFFS_BASE__FOURCC__LZMA 0x4C5A4D41 + +@@ -839,6 +950,8 @@ typedef struct wuffs_base__transform__output__struct { + + #define WUFFS_BASE__QUIRK_IGNORE_CHECKSUM 1 + ++#define WUFFS_BASE__QUIRK_QUALITY 2 ++ + // -------- + + // Flicks are a unit of time. One flick (frame-tick) is 1 / 705_600_000 of a +@@ -1092,6 +1205,96 @@ wuffs_base__multiply_u64(uint64_t x, uint64_t y) { + + // -------- + ++typedef struct wuffs_base__bitvec256__struct { ++ // elements_u64[0] holds the LSBs (least significant bits) and ++ // elements_u64[3] holds the MSBs (most significant bits). ++ uint64_t elements_u64[4]; ++} wuffs_base__bitvec256; ++ ++static inline wuffs_base__bitvec256 // ++wuffs_base__make_bitvec256(uint64_t e00, ++ uint64_t e01, ++ uint64_t e02, ++ uint64_t e03) { ++ wuffs_base__bitvec256 res; ++ res.elements_u64[0] = e00; ++ res.elements_u64[1] = e01; ++ res.elements_u64[2] = e02; ++ res.elements_u64[3] = e03; ++ return res; ++} ++ ++static inline uint64_t // ++wuffs_base__bitvec256__get_u64(const wuffs_base__bitvec256* b, uint32_t i) { ++ return b->elements_u64[i & 3]; ++} ++ ++// -------- ++ ++// wuffs_base__optional_u63 is like a std::optional, but for C (not ++// just C++) and the value can only hold 63 bits (not 64). ++// ++// Do not manipulate repr directly; it is a private implementation detail. ++typedef struct wuffs_base__optional_u63__struct { ++ uint64_t repr; ++ ++#ifdef __cplusplus ++ inline bool has_value() const; ++ inline uint64_t value() const; ++ inline uint64_t value_or(uint64_t default_value) const; ++#endif // __cplusplus ++ ++} wuffs_base__optional_u63; ++ ++// wuffs_base__make_optional_u63 ignores value when has_value is false. ++// ++// Preconditions: ++// - value < (1 << 63). ++static inline wuffs_base__optional_u63 // ++wuffs_base__make_optional_u63(bool has_value, uint64_t value) { ++ wuffs_base__optional_u63 res; ++ res.repr = has_value ? ((value << 1u) | 1u) : 0u; ++ return res; ++} ++ ++static inline bool // ++wuffs_base__optional_u63__has_value(const wuffs_base__optional_u63* o) { ++ return o->repr; ++} ++ ++// wuffs_base__optional_u63__value returns zero when o does not have a value. ++static inline uint64_t // ++wuffs_base__optional_u63__value(const wuffs_base__optional_u63* o) { ++ return o->repr >> 1u; ++} ++ ++static inline uint64_t // ++wuffs_base__optional_u63__value_or(const wuffs_base__optional_u63* o, ++ uint64_t default_value) { ++ return o->repr ? (o->repr >> 1u) : default_value; ++} ++ ++#ifdef __cplusplus ++ ++inline bool // ++wuffs_base__optional_u63::has_value() const { ++ return wuffs_base__optional_u63__has_value(this); ++} ++ ++inline uint64_t // ++wuffs_base__optional_u63::value() const { ++ return wuffs_base__optional_u63__value(this); ++} ++ ++inline uint64_t // ++wuffs_base__optional_u63::value_or(uint64_t default_value) const { ++ return wuffs_base__optional_u63__value_or(this, default_value); ++} ++ ++#endif // __cplusplus ++ ++// -------- ++ + // The "defined(__clang__)" isn't redundant. While vanilla clang defines + // __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. + #if (defined(__GNUC__) || defined(__clang__)) && (__SIZEOF_LONG__ == 8) +@@ -1529,7 +1732,7 @@ wuffs_base__make_slice_u64(uint64_t* ptr, size_t len) { + static inline wuffs_base__slice_u8 // + wuffs_base__make_slice_u8_ij(uint8_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u8 ret; +- ret.ptr = ptr + i; ++ ret.ptr = ptr ? (ptr + i) : NULL; + ret.len = (j >= i) ? (j - i) : 0; + return ret; + } +@@ -1537,7 +1740,7 @@ wuffs_base__make_slice_u8_ij(uint8_t* ptr, size_t i, size_t j) { + static inline wuffs_base__slice_u16 // + wuffs_base__make_slice_u16_ij(uint16_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u16 ret; +- ret.ptr = ptr + i; ++ ret.ptr = ptr ? (ptr + i) : NULL; + ret.len = (j >= i) ? (j - i) : 0; + return ret; + } +@@ -1545,7 +1748,7 @@ wuffs_base__make_slice_u16_ij(uint16_t* ptr, size_t i, size_t j) { + static inline wuffs_base__slice_u32 // + wuffs_base__make_slice_u32_ij(uint32_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u32 ret; +- ret.ptr = ptr + i; ++ ret.ptr = ptr ? (ptr + i) : NULL; + ret.len = (j >= i) ? (j - i) : 0; + return ret; + } +@@ -1553,7 +1756,7 @@ wuffs_base__make_slice_u32_ij(uint32_t* ptr, size_t i, size_t j) { + static inline wuffs_base__slice_u64 // + wuffs_base__make_slice_u64_ij(uint64_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u64 ret; +- ret.ptr = ptr + i; ++ ret.ptr = ptr ? (ptr + i) : NULL; + ret.len = (j >= i) ? (j - i) : 0; + return ret; + } +@@ -1696,7 +1899,7 @@ wuffs_base__slice_u8__subslice_i(wuffs_base__slice_u8 s, uint64_t i) { + if ((i <= SIZE_MAX) && (i <= s.len)) { + return wuffs_base__make_slice_u8(s.ptr + i, ((size_t)(s.len - i))); + } +- return wuffs_base__make_slice_u8(NULL, 0); ++ return wuffs_base__empty_slice_u8(); + } + + // wuffs_base__slice_u8__subslice_j returns s[:j]. +@@ -1707,7 +1910,7 @@ wuffs_base__slice_u8__subslice_j(wuffs_base__slice_u8 s, uint64_t j) { + if ((j <= SIZE_MAX) && (j <= s.len)) { + return wuffs_base__make_slice_u8(s.ptr, ((size_t)j)); + } +- return wuffs_base__make_slice_u8(NULL, 0); ++ return wuffs_base__empty_slice_u8(); + } + + // wuffs_base__slice_u8__subslice_ij returns s[i:j]. +@@ -1720,7 +1923,7 @@ wuffs_base__slice_u8__subslice_ij(wuffs_base__slice_u8 s, + if ((i <= j) && (j <= SIZE_MAX) && (j <= s.len)) { + return wuffs_base__make_slice_u8(s.ptr + i, ((size_t)(j - i))); + } +- return wuffs_base__make_slice_u8(NULL, 0); ++ return wuffs_base__empty_slice_u8(); + } + + // wuffs_base__table_u8__subtable_ij returns t[ix:jx, iy:jy]. +@@ -1814,6 +2017,20 @@ WUFFS_BASE__MAYBE_STATIC int32_t // + wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data, + bool prefix_closed); + ++// ---------------- Quirk Values ++ ++// These constants are the value half of a key-value pair, where the key is ++// WUFFS_BASE__QUIRK_QUALITY. ++// ++// In the Wuffs API, set_quirk takes a u64 value. These macro definitions are ++// likewise unsigned values (uint64_t) but for this particular key, they are ++// best interpreted as signed values (int64_t). "Lower-than-default quality" ++// and "higher-than-default quality", as signed values, are -1 and +1. ++// ++// See doc/note/quirks.md for some more discussion about trade-offs. ++#define WUFFS_BASE__QUIRK_QUALITY__VALUE__LOWER_QUALITY UINT64_MAX ++#define WUFFS_BASE__QUIRK_QUALITY__VALUE__HIGHER_QUALITY ((uint64_t)1) ++ + // ---------------- Ranges and Rects + + // See https://github.com/google/wuffs/blob/main/doc/note/ranges-and-rects.md +@@ -3011,7 +3228,8 @@ wuffs_base__io_buffer__compact(wuffs_base__io_buffer* buf) { + // wuffs_base__io_buffer__compact_retaining moves any written but unread bytes + // closer to the start of the buffer. It retains H bytes of history (the most + // recently read bytes), where H is min(buf->meta.ri, history_retain_length). +-// A postcondition is that buf->meta.ri == H. ++// It is therefore a no-op if history_retain_length is UINT64_MAX. A ++// postcondition is that buf->meta.ri == H. + // + // wuffs_base__io_buffer__compact_retaining(0) is equivalent to + // wuffs_base__io_buffer__compact(). +@@ -3056,7 +3274,7 @@ wuffs_base__io_buffer__reader_length(const wuffs_base__io_buffer* buf) { + + static inline uint8_t* // + wuffs_base__io_buffer__reader_pointer(const wuffs_base__io_buffer* buf) { +- return buf ? (buf->data.ptr + buf->meta.ri) : NULL; ++ return (buf && buf->data.ptr) ? (buf->data.ptr + buf->meta.ri) : NULL; + } + + static inline uint64_t // +@@ -3066,7 +3284,8 @@ wuffs_base__io_buffer__reader_position(const wuffs_base__io_buffer* buf) { + + static inline wuffs_base__slice_u8 // + wuffs_base__io_buffer__reader_slice(const wuffs_base__io_buffer* buf) { +- return buf ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.ri, ++ return (buf && buf->data.ptr) ++ ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.ri, + buf->meta.wi - buf->meta.ri) + : wuffs_base__empty_slice_u8(); + } +@@ -3078,7 +3297,7 @@ wuffs_base__io_buffer__writer_length(const wuffs_base__io_buffer* buf) { + + static inline uint8_t* // + wuffs_base__io_buffer__writer_pointer(const wuffs_base__io_buffer* buf) { +- return buf ? (buf->data.ptr + buf->meta.wi) : NULL; ++ return (buf && buf->data.ptr) ? (buf->data.ptr + buf->meta.wi) : NULL; + } + + static inline uint64_t // +@@ -3088,7 +3307,8 @@ wuffs_base__io_buffer__writer_position(const wuffs_base__io_buffer* buf) { + + static inline wuffs_base__slice_u8 // + wuffs_base__io_buffer__writer_slice(const wuffs_base__io_buffer* buf) { +- return buf ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.wi, ++ return (buf && buf->data.ptr) ++ ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.wi, + buf->data.len - buf->meta.wi) + : wuffs_base__empty_slice_u8(); + } +@@ -3183,49 +3403,53 @@ wuffs_base__make_token(uint64_t repr) { + + // -------- + ++// clang-format off ++ ++// -------- ++ + #define WUFFS_BASE__TOKEN__LENGTH__MAX_INCL 0xFFFF + +-#define WUFFS_BASE__TOKEN__VALUE__SHIFT 17 +-#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 17 +-#define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT 42 +-#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 17 ++#define WUFFS_BASE__TOKEN__VALUE__SHIFT 17 ++#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 17 ++#define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT 42 ++#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 17 + #define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 38 +-#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 17 +-#define WUFFS_BASE__TOKEN__CONTINUED__SHIFT 16 +-#define WUFFS_BASE__TOKEN__LENGTH__SHIFT 0 ++#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 17 ++#define WUFFS_BASE__TOKEN__CONTINUED__SHIFT 16 ++#define WUFFS_BASE__TOKEN__LENGTH__SHIFT 0 + +-#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS 46 ++#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS 46 + + // -------- + +-#define WUFFS_BASE__TOKEN__VBC__FILLER 0 +-#define WUFFS_BASE__TOKEN__VBC__STRUCTURE 1 +-#define WUFFS_BASE__TOKEN__VBC__STRING 2 +-#define WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT 3 +-#define WUFFS_BASE__TOKEN__VBC__LITERAL 4 +-#define WUFFS_BASE__TOKEN__VBC__NUMBER 5 +-#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED 6 ++#define WUFFS_BASE__TOKEN__VBC__FILLER 0 ++#define WUFFS_BASE__TOKEN__VBC__STRUCTURE 1 ++#define WUFFS_BASE__TOKEN__VBC__STRING 2 ++#define WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT 3 ++#define WUFFS_BASE__TOKEN__VBC__LITERAL 4 ++#define WUFFS_BASE__TOKEN__VBC__NUMBER 5 ++#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED 6 + #define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED 7 + + // -------- + +-#define WUFFS_BASE__TOKEN__VBD__FILLER__PUNCTUATION 0x00001 ++#define WUFFS_BASE__TOKEN__VBD__FILLER__PUNCTUATION 0x00001 + #define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_BLOCK 0x00002 +-#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_LINE 0x00004 ++#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_LINE 0x00004 + + // COMMENT_ANY is a bit-wise or of COMMENT_BLOCK AND COMMENT_LINE. +-#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_ANY 0x00006 ++#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_ANY 0x00006 + + // -------- + +-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH 0x00001 +-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP 0x00002 ++#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH 0x00001 ++#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP 0x00002 + #define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE 0x00010 + #define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST 0x00020 + #define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT 0x00040 +-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE 0x01000 +-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST 0x02000 +-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT 0x04000 ++#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE 0x01000 ++#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST 0x02000 ++#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT 0x04000 + + // -------- + +@@ -3245,11 +3469,11 @@ wuffs_base__make_token(uint64_t repr) { + // + // The lack of any particular bit is conservative: it is valid for all-ASCII + // strings, in a single- or multi-token chain, to have none of these bits set. +-#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_UTF_8 0x00001 +-#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8 0x00002 ++#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_UTF_8 0x00001 ++#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8 0x00002 + #define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_UTF_8 0x00004 +-#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_ASCII 0x00010 +-#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_ASCII 0x00020 ++#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_ASCII 0x00010 ++#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_ASCII 0x00020 + #define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_ASCII 0x00040 + + // CONVERT_D_DST_S_SRC means that multiples of S source bytes (possibly padded) +@@ -3264,22 +3488,22 @@ wuffs_base__make_token(uint64_t repr) { + // When src is the empty string, multiple conversion algorithms are applicable + // (so these bits are not necessarily mutually exclusive), all producing the + // same empty dst string. +-#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP 0x00100 +-#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY 0x00200 ++#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP 0x00100 ++#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY 0x00200 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_2_SRC_HEXADECIMAL 0x00400 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_4_SRC_BACKSLASH_X 0x00800 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_STD 0x01000 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_URL 0x02000 +-#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_4_DST_5_SRC_ASCII_85 0x04000 ++#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_4_DST_5_SRC_ASCII_85 0x04000 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_HEX 0x08000 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_STD 0x10000 + + // -------- + + #define WUFFS_BASE__TOKEN__VBD__LITERAL__UNDEFINED 0x00001 +-#define WUFFS_BASE__TOKEN__VBD__LITERAL__NULL 0x00002 +-#define WUFFS_BASE__TOKEN__VBD__LITERAL__FALSE 0x00004 +-#define WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE 0x00008 ++#define WUFFS_BASE__TOKEN__VBD__LITERAL__NULL 0x00002 ++#define WUFFS_BASE__TOKEN__VBD__LITERAL__FALSE 0x00004 ++#define WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE 0x00008 + + // -------- + +@@ -3292,8 +3516,8 @@ wuffs_base__make_token(uint64_t repr) { + // For a source string of "+123" or "-0x9A", only the first two are valid. + // + // For a source string of "123.", only the first one is valid. +-#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT 0x00001 +-#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED 0x00002 ++#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT 0x00001 ++#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED 0x00002 + #define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_UNSIGNED 0x00004 + + #define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_INF 0x00010 +@@ -3305,11 +3529,15 @@ wuffs_base__make_token(uint64_t repr) { + // "300", which are big-endian, little-endian or text. For binary formats, the + // token length (after adjusting for FORMAT_IGNORE_ETC) discriminates + // e.g. u16 little-endian vs u32 little-endian. +-#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN 0x00100 ++#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN 0x00100 + #define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_LITTLE_ENDIAN 0x00200 +-#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT 0x00400 ++#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT 0x00400 ++ ++#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE 0x01000 ++ ++// -------- + +-#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE 0x01000 ++// clang-format on + + // -------- + +@@ -3421,6 +3649,22 @@ wuffs_base__token::length() const { + + // -------- + ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wcast-qual" ++#endif ++ ++static inline wuffs_base__token* // ++wuffs_base__strip_const_from_token_ptr(const wuffs_base__token* ptr) { ++ return (wuffs_base__token*)ptr; ++} ++ ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ ++// -------- ++ + typedef WUFFS_BASE__SLICE(wuffs_base__token) wuffs_base__slice_token; + + static inline wuffs_base__slice_token // +@@ -3574,7 +3818,8 @@ wuffs_base__token_buffer__compact(wuffs_base__token_buffer* buf) { + // wuffs_base__token_buffer__compact_retaining moves any written but unread + // tokens closer to the start of the buffer. It retains H tokens of history + // (the most recently read tokens), where H is min(buf->meta.ri, +-// history_retain_length). A postcondition is that buf->meta.ri == H. ++// history_retain_length). It is therefore a no-op if history_retain_length is ++// UINT64_MAX. A postcondition is that buf->meta.ri == H. + // + // wuffs_base__token_buffer__compact_retaining(0) is equivalent to + // wuffs_base__token_buffer__compact(). +@@ -3730,51 +3975,51 @@ wuffs_base__token_buffer::writer_token_position() const { + // + // You can pass the C stdlib's malloc as the malloc_func. + // +-// It returns an empty slice (containing a NULL ptr field) if (num_uxx * +-// sizeof(uintxx_t)) would overflow SIZE_MAX. ++// It returns an empty slice (containing a NULL ptr field) if num_uxx is zero ++// or if (num_uxx * sizeof(uintxx_t)) would overflow SIZE_MAX. + + static inline wuffs_base__slice_u8 // + wuffs_base__malloc_slice_u8(void* (*malloc_func)(size_t), uint64_t num_u8) { +- if (malloc_func && (num_u8 <= (SIZE_MAX / sizeof(uint8_t)))) { ++ if (malloc_func && num_u8 && (num_u8 <= (SIZE_MAX / sizeof(uint8_t)))) { + void* p = (*malloc_func)((size_t)(num_u8 * sizeof(uint8_t))); + if (p) { + return wuffs_base__make_slice_u8((uint8_t*)(p), (size_t)num_u8); + } + } +- return wuffs_base__make_slice_u8(NULL, 0); ++ return wuffs_base__empty_slice_u8(); + } + + static inline wuffs_base__slice_u16 // + wuffs_base__malloc_slice_u16(void* (*malloc_func)(size_t), uint64_t num_u16) { +- if (malloc_func && (num_u16 <= (SIZE_MAX / sizeof(uint16_t)))) { ++ if (malloc_func && num_u16 && (num_u16 <= (SIZE_MAX / sizeof(uint16_t)))) { + void* p = (*malloc_func)((size_t)(num_u16 * sizeof(uint16_t))); + if (p) { + return wuffs_base__make_slice_u16((uint16_t*)(p), (size_t)num_u16); + } + } +- return wuffs_base__make_slice_u16(NULL, 0); ++ return wuffs_base__empty_slice_u16(); + } + + static inline wuffs_base__slice_u32 // + wuffs_base__malloc_slice_u32(void* (*malloc_func)(size_t), uint64_t num_u32) { +- if (malloc_func && (num_u32 <= (SIZE_MAX / sizeof(uint32_t)))) { ++ if (malloc_func && num_u32 && (num_u32 <= (SIZE_MAX / sizeof(uint32_t)))) { + void* p = (*malloc_func)((size_t)(num_u32 * sizeof(uint32_t))); + if (p) { + return wuffs_base__make_slice_u32((uint32_t*)(p), (size_t)num_u32); + } + } +- return wuffs_base__make_slice_u32(NULL, 0); ++ return wuffs_base__empty_slice_u32(); + } + + static inline wuffs_base__slice_u64 // + wuffs_base__malloc_slice_u64(void* (*malloc_func)(size_t), uint64_t num_u64) { +- if (malloc_func && (num_u64 <= (SIZE_MAX / sizeof(uint64_t)))) { ++ if (malloc_func && num_u64 && (num_u64 <= (SIZE_MAX / sizeof(uint64_t)))) { + void* p = (*malloc_func)((size_t)(num_u64 * sizeof(uint64_t))); + if (p) { + return wuffs_base__make_slice_u64((uint64_t*)(p), (size_t)num_u64); + } + } +- return wuffs_base__make_slice_u64(NULL, 0); ++ return wuffs_base__empty_slice_u64(); + } + + // ---------------- Images +@@ -3838,6 +4083,26 @@ wuffs_base__color_u32_argb_premul__as__color_u8_gray( + return (uint8_t)(weighted_average >> 24); + } + ++static inline uint16_t // ++wuffs_base__color_u32_argb_premul__as__color_u16_alpha_gray_nonpremul( ++ wuffs_base__color_u32_argb_premul c) { ++ uint32_t a = 0xFF & (c >> 24); ++ if (a == 0) { ++ return 0; ++ } ++ uint32_t a16 = a * 0x101; ++ ++ uint32_t cr = 0xFF & (c >> 16); ++ cr = (cr * (0x101 * 0xFFFF)) / a16; ++ uint32_t cg = 0xFF & (c >> 8); ++ cg = (cg * (0x101 * 0xFFFF)) / a16; ++ uint32_t cb = 0xFF & (c >> 0); ++ cb = (cb * (0x101 * 0xFFFF)) / a16; ++ ++ uint32_t weighted_average = (19595 * cr) + (38470 * cg) + (7471 * cb) + 32768; ++ return (uint16_t)((a16 & 0xFF00) | (weighted_average >> 24)); ++} ++ + static inline uint16_t // + wuffs_base__color_u32_argb_premul__as__color_u16_gray( + wuffs_base__color_u32_argb_premul c) { +@@ -4114,49 +4379,53 @@ wuffs_base__make_pixel_format(uint32_t repr) { + // Common 8-bit-depth pixel formats. This list is not exhaustive; not all valid + // wuffs_base__pixel_format values are present. + +-#define WUFFS_BASE__PIXEL_FORMAT__INVALID 0x00000000 ++// clang-format off ++ ++#define WUFFS_BASE__PIXEL_FORMAT__INVALID 0x00000000 + +-#define WUFFS_BASE__PIXEL_FORMAT__A 0x02000008 ++#define WUFFS_BASE__PIXEL_FORMAT__A 0x02000008 + +-#define WUFFS_BASE__PIXEL_FORMAT__Y 0x20000008 +-#define WUFFS_BASE__PIXEL_FORMAT__Y_16LE 0x2000000B +-#define WUFFS_BASE__PIXEL_FORMAT__Y_16BE 0x2010000B +-#define WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL 0x21000008 +-#define WUFFS_BASE__PIXEL_FORMAT__YA_PREMUL 0x22000008 ++#define WUFFS_BASE__PIXEL_FORMAT__Y 0x20000008 ++#define WUFFS_BASE__PIXEL_FORMAT__Y_16LE 0x2000000B ++#define WUFFS_BASE__PIXEL_FORMAT__Y_16BE 0x2010000B ++#define WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL 0x21000088 ++#define WUFFS_BASE__PIXEL_FORMAT__YA_PREMUL 0x22000088 + +-#define WUFFS_BASE__PIXEL_FORMAT__YCBCR 0x40020888 +-#define WUFFS_BASE__PIXEL_FORMAT__YCBCRA_NONPREMUL 0x41038888 +-#define WUFFS_BASE__PIXEL_FORMAT__YCBCRK 0x50038888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCBCR 0x40020888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCBCRA_NONPREMUL 0x41038888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCBCRK 0x50038888 + +-#define WUFFS_BASE__PIXEL_FORMAT__YCOCG 0x60020888 +-#define WUFFS_BASE__PIXEL_FORMAT__YCOCGA_NONPREMUL 0x61038888 +-#define WUFFS_BASE__PIXEL_FORMAT__YCOCGK 0x70038888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCOCG 0x60020888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCOCGA_NONPREMUL 0x61038888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCOCGK 0x70038888 + +-#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL 0x81040008 +-#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL 0x82040008 +-#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY 0x83040008 ++#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL 0x81040008 ++#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL 0x82040008 ++#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY 0x83040008 + +-#define WUFFS_BASE__PIXEL_FORMAT__BGR_565 0x80000565 +-#define WUFFS_BASE__PIXEL_FORMAT__BGR 0x80000888 +-#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL 0x81008888 +-#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE 0x8100BBBB +-#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL 0x82008888 +-#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE 0x8200BBBB +-#define WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY 0x83008888 +-#define WUFFS_BASE__PIXEL_FORMAT__BGRX 0x90008888 ++#define WUFFS_BASE__PIXEL_FORMAT__BGR_565 0x80000565 ++#define WUFFS_BASE__PIXEL_FORMAT__BGR 0x80000888 ++#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL 0x81008888 ++#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE 0x8100BBBB ++#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL 0x82008888 ++#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE 0x8200BBBB ++#define WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY 0x83008888 ++#define WUFFS_BASE__PIXEL_FORMAT__BGRX 0x90008888 + +-#define WUFFS_BASE__PIXEL_FORMAT__RGB 0xA0000888 +-#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL 0xA1008888 +-#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE 0xA100BBBB +-#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL 0xA2008888 +-#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE 0xA200BBBB +-#define WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY 0xA3008888 +-#define WUFFS_BASE__PIXEL_FORMAT__RGBX 0xB0008888 ++#define WUFFS_BASE__PIXEL_FORMAT__RGB 0xA0000888 ++#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL 0xA1008888 ++#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE 0xA100BBBB ++#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL 0xA2008888 ++#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE 0xA200BBBB ++#define WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY 0xA3008888 ++#define WUFFS_BASE__PIXEL_FORMAT__RGBX 0xB0008888 + +-#define WUFFS_BASE__PIXEL_FORMAT__CMY 0xC0020888 +-#define WUFFS_BASE__PIXEL_FORMAT__CMYK 0xD0038888 ++#define WUFFS_BASE__PIXEL_FORMAT__CMY 0xC0020888 ++#define WUFFS_BASE__PIXEL_FORMAT__CMYK 0xD0038888 + +-extern const uint32_t wuffs_base__pixel_format__bits_per_channel[16]; ++// clang-format on ++ ++extern const uint32_t wuffs_private_impl__pixel_format__bits_per_channel[16]; + + static inline bool // + wuffs_base__pixel_format__is_valid(const wuffs_base__pixel_format* f) { +@@ -4170,10 +4439,14 @@ wuffs_base__pixel_format__bits_per_pixel(const wuffs_base__pixel_format* f) { + if (((f->repr >> 16) & 0x03) != 0) { + return 0; + } +- return wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 0)] + +- wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 4)] + +- wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 8)] + +- wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 12)]; ++ return wuffs_private_impl__pixel_format__bits_per_channel[0x0F & ++ (f->repr >> 0)] + ++ wuffs_private_impl__pixel_format__bits_per_channel[0x0F & ++ (f->repr >> 4)] + ++ wuffs_private_impl__pixel_format__bits_per_channel[0x0F & ++ (f->repr >> 8)] + ++ wuffs_private_impl__pixel_format__bits_per_channel[0x0F & ++ (f->repr >> 12)]; + } + + static inline bool // +@@ -4391,15 +4664,20 @@ wuffs_base__pixel_config__set(wuffs_base__pixel_config* c, + return; + } + if (pixfmt_repr) { +- uint64_t wh = ((uint64_t)width) * ((uint64_t)height); +- // TODO: handle things other than 1 byte per pixel. +- if (wh <= ((uint64_t)SIZE_MAX)) { ++ do { ++#if SIZE_MAX < 0xFFFFFFFFFFFFFFFFull ++ uint64_t wh = ((uint64_t)width) * ((uint64_t)height); ++ // TODO: handle things other than 1 byte per pixel. ++ if (wh > ((uint64_t)SIZE_MAX)) { ++ break; ++ } ++#endif + c->private_impl.pixfmt.repr = pixfmt_repr; + c->private_impl.pixsub.repr = pixsub_repr; + c->private_impl.width = width; + c->private_impl.height = height; + return; +- } ++ } while (0); + } + + c->private_impl.pixfmt.repr = 0; +@@ -5117,7 +5395,7 @@ wuffs_base__pixel_buffer__palette(wuffs_base__pixel_buffer* pb) { + tab->ptr, WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH); + } + } +- return wuffs_base__make_slice_u8(NULL, 0); ++ return wuffs_base__empty_slice_u8(); + } + + static inline wuffs_base__slice_u8 // +@@ -6202,6 +6480,113 @@ struct wuffs_base__hasher_u64__struct { + + // -------- + ++extern const char wuffs_base__hasher_bitvec256__vtable_name[]; ++ ++typedef struct wuffs_base__hasher_bitvec256__func_ptrs__struct { ++ wuffs_base__bitvec256 (*checksum_bitvec256)( ++ const void* self); ++ uint64_t (*get_quirk)( ++ const void* self, ++ uint32_t a_key); ++ wuffs_base__status (*set_quirk)( ++ void* self, ++ uint32_t a_key, ++ uint64_t a_value); ++ wuffs_base__empty_struct (*update)( ++ void* self, ++ wuffs_base__slice_u8 a_x); ++ wuffs_base__bitvec256 (*update_bitvec256)( ++ void* self, ++ wuffs_base__slice_u8 a_x); ++} wuffs_base__hasher_bitvec256__func_ptrs; ++ ++typedef struct wuffs_base__hasher_bitvec256__struct wuffs_base__hasher_bitvec256; ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_base__hasher_bitvec256__checksum_bitvec256( ++ const wuffs_base__hasher_bitvec256* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_bitvec256__get_quirk( ++ const wuffs_base__hasher_bitvec256* self, ++ uint32_t a_key); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__hasher_bitvec256__set_quirk( ++ wuffs_base__hasher_bitvec256* self, ++ uint32_t a_key, ++ uint64_t a_value); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_base__hasher_bitvec256__update( ++ wuffs_base__hasher_bitvec256* self, ++ wuffs_base__slice_u8 a_x); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_base__hasher_bitvec256__update_bitvec256( ++ wuffs_base__hasher_bitvec256* self, ++ wuffs_base__slice_u8 a_x); ++ ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_base__hasher_bitvec256__struct { ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable first_vtable; ++ } private_impl; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++#endif ++ ++ inline wuffs_base__bitvec256 ++ checksum_bitvec256() const { ++ return wuffs_base__hasher_bitvec256__checksum_bitvec256(this); ++ } ++ ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_base__hasher_bitvec256__get_quirk( ++ this, a_key); ++ } ++ ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_base__hasher_bitvec256__set_quirk( ++ this, a_key, a_value); ++ } ++ ++ inline wuffs_base__empty_struct ++ update( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_base__hasher_bitvec256__update( ++ this, a_x); ++ } ++ ++ inline wuffs_base__bitvec256 ++ update_bitvec256( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_base__hasher_bitvec256__update_bitvec256( ++ this, a_x); ++ } ++ ++#endif // __cplusplus ++}; // struct wuffs_base__hasher_bitvec256__struct ++ ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++// -------- ++ + extern const char wuffs_base__image_decoder__vtable_name[]; + + typedef struct wuffs_base__image_decoder__func_ptrs__struct { +@@ -6225,8 +6610,6 @@ typedef struct wuffs_base__image_decoder__func_ptrs__struct { + uint64_t (*get_quirk)( + const void* self, + uint32_t a_key); +- uint64_t (*history_retain_length)( +- const void* self); + uint32_t (*num_animation_loops)( + const void* self); + uint64_t (*num_decoded_frame_configs)( +@@ -6291,11 +6674,6 @@ wuffs_base__image_decoder__get_quirk( + const wuffs_base__image_decoder* self, + uint32_t a_key); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__image_decoder__history_retain_length( +- const wuffs_base__image_decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t + wuffs_base__image_decoder__num_animation_loops( +@@ -6398,11 +6776,6 @@ struct wuffs_base__image_decoder__struct { + this, a_key); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_base__image_decoder__history_retain_length(this); +- } +- + inline uint32_t + num_animation_loops() const { + return wuffs_base__image_decoder__num_animation_loops(this); +@@ -6466,11 +6839,11 @@ struct wuffs_base__image_decoder__struct { + extern const char wuffs_base__io_transformer__vtable_name[]; + + typedef struct wuffs_base__io_transformer__func_ptrs__struct { ++ wuffs_base__optional_u63 (*dst_history_retain_length)( ++ const void* self); + uint64_t (*get_quirk)( + const void* self, + uint32_t a_key); +- uint64_t (*history_retain_length)( +- const void* self); + wuffs_base__status (*set_quirk)( + void* self, + uint32_t a_key, +@@ -6486,17 +6859,17 @@ typedef struct wuffs_base__io_transformer__func_ptrs__struct { + + typedef struct wuffs_base__io_transformer__struct wuffs_base__io_transformer; + ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_base__io_transformer__dst_history_retain_length( ++ const wuffs_base__io_transformer* self); ++ + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t + wuffs_base__io_transformer__get_quirk( + const wuffs_base__io_transformer* self, + uint32_t a_key); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__io_transformer__history_retain_length( +- const wuffs_base__io_transformer* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status + wuffs_base__io_transformer__set_quirk( +@@ -6531,6 +6904,11 @@ struct wuffs_base__io_transformer__struct { + using unique_ptr = std::unique_ptr; + #endif + ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_base__io_transformer__dst_history_retain_length(this); ++ } ++ + inline uint64_t + get_quirk( + uint32_t a_key) const { +@@ -6538,11 +6916,6 @@ struct wuffs_base__io_transformer__struct { + this, a_key); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_base__io_transformer__history_retain_length(this); +- } +- + inline wuffs_base__status + set_quirk( + uint32_t a_key, +@@ -6583,8 +6956,6 @@ typedef struct wuffs_base__token_decoder__func_ptrs__struct { + uint64_t (*get_quirk)( + const void* self, + uint32_t a_key); +- uint64_t (*history_retain_length)( +- const void* self); + wuffs_base__status (*set_quirk)( + void* self, + uint32_t a_key, +@@ -6609,11 +6980,6 @@ wuffs_base__token_decoder__get_quirk( + const wuffs_base__token_decoder* self, + uint32_t a_key); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__token_decoder__history_retain_length( +- const wuffs_base__token_decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status + wuffs_base__token_decoder__set_quirk( +@@ -6656,11 +7022,6 @@ struct wuffs_base__token_decoder__struct { + this, a_key); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_base__token_decoder__history_retain_length(this); +- } +- + inline wuffs_base__status + set_quirk( + uint32_t a_key, +@@ -6918,9 +7279,7 @@ extern const char wuffs_bmp__error__unsupported_bmp_file[]; + + // ---------------- Public Consts + +-#define WUFFS_BMP__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 +- +-#define WUFFS_BMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_BMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + + // ---------------- Struct Declarations + +@@ -7053,11 +7412,6 @@ wuffs_bmp__decoder__tell_me_more( + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bmp__decoder__history_retain_length( +- const wuffs_bmp__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_bmp__decoder__workbuf_len( +@@ -7116,14 +7470,14 @@ struct wuffs_bmp__decoder__struct { + bool f_rle_padded; + wuffs_base__pixel_swizzler f_swizzler; + +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; +- uint32_t p_tell_me_more[1]; +- uint32_t p_read_palette[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_tell_me_more; ++ uint32_t p_read_palette; + } private_impl; + + struct { +@@ -7132,14 +7486,14 @@ struct wuffs_bmp__decoder__struct { + + struct { + uint64_t scratch; +- } s_do_decode_image_config[1]; ++ } s_do_decode_image_config; + struct { + uint64_t scratch; +- } s_do_decode_frame[1]; ++ } s_do_decode_frame; + struct { + uint32_t v_i; + uint64_t scratch; +- } s_read_palette[1]; ++ } s_read_palette; + } private_data; + + #ifdef __cplusplus +@@ -7283,11 +7637,6 @@ struct wuffs_bmp__decoder__struct { + return wuffs_bmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_bmp__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_bmp__decoder__workbuf_len(this); +@@ -7316,9 +7665,9 @@ extern const char wuffs_bzip2__error__unsupported_block_randomization[]; + + // ---------------- Public Consts + +-#define WUFFS_BZIP2__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_BZIP2__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_BZIP2__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_BZIP2__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + + // ---------------- Struct Declarations + +@@ -7386,8 +7735,8 @@ wuffs_bzip2__decoder__set_quirk( + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bzip2__decoder__history_retain_length( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_bzip2__decoder__dst_history_retain_length( + const wuffs_bzip2__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +@@ -7452,12 +7801,12 @@ struct wuffs_bzip2__decoder__struct { + uint32_t f_num_sections; + uint32_t f_code_lengths_bitmask; + +- uint32_t p_transform_io[1]; +- uint32_t p_do_transform_io[1]; +- uint32_t p_prepare_block[1]; +- uint32_t p_read_code_lengths[1]; +- uint32_t p_flush_slow[1]; +- uint32_t p_decode_huffman_slow[1]; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; ++ uint32_t p_prepare_block; ++ uint32_t p_read_code_lengths; ++ uint32_t p_flush_slow; ++ uint32_t p_decode_huffman_slow; + } private_impl; + + struct { +@@ -7474,15 +7823,15 @@ struct wuffs_bzip2__decoder__struct { + uint32_t v_i; + uint64_t v_tag; + uint32_t v_final_checksum_want; +- } s_do_transform_io[1]; ++ } s_do_transform_io; + struct { + uint32_t v_i; + uint32_t v_selector; +- } s_prepare_block[1]; ++ } s_prepare_block; + struct { + uint32_t v_i; + uint32_t v_code_length; +- } s_read_code_lengths[1]; ++ } s_read_code_lengths; + struct { + uint32_t v_flush_pointer; + uint32_t v_flush_repeat_count; +@@ -7491,10 +7840,10 @@ struct wuffs_bzip2__decoder__struct { + uint32_t v_block_size; + uint8_t v_curr; + uint64_t scratch; +- } s_flush_slow[1]; ++ } s_flush_slow; + struct { + uint32_t v_node_index; +- } s_decode_huffman_slow[1]; ++ } s_decode_huffman_slow; + } private_data; + + #ifdef __cplusplus +@@ -7572,9 +7921,9 @@ struct wuffs_bzip2__decoder__struct { + return wuffs_bzip2__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_bzip2__decoder__history_retain_length(this); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_bzip2__decoder__dst_history_retain_length(this); + } + + inline wuffs_base__range_ii_u64 +@@ -7606,25 +7955,23 @@ extern const char wuffs_cbor__error__unsupported_recursion_depth[]; + + // ---------------- Public Consts + +-#define WUFFS_CBOR__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_CBOR__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_CBOR__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_CBOR__DECODER_DEPTH_MAX_INCL 1024u + +-#define WUFFS_CBOR__DECODER_DEPTH_MAX_INCL 1024 ++#define WUFFS_CBOR__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 2u + +-#define WUFFS_CBOR__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 2 ++#define WUFFS_CBOR__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 9u + +-#define WUFFS_CBOR__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 9 ++#define WUFFS_CBOR__TOKEN_VALUE_MAJOR 787997u + +-#define WUFFS_CBOR__TOKEN_VALUE_MAJOR 787997 ++#define WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK 262143u + +-#define WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK 262143 ++#define WUFFS_CBOR__TOKEN_VALUE_MINOR__MINUS_1_MINUS_X 16777216u + +-#define WUFFS_CBOR__TOKEN_VALUE_MINOR__MINUS_1_MINUS_X 16777216 ++#define WUFFS_CBOR__TOKEN_VALUE_MINOR__SIMPLE_VALUE 8388608u + +-#define WUFFS_CBOR__TOKEN_VALUE_MINOR__SIMPLE_VALUE 8388608 +- +-#define WUFFS_CBOR__TOKEN_VALUE_MINOR__TAG 4194304 ++#define WUFFS_CBOR__TOKEN_VALUE_MINOR__TAG 4194304u + + // ---------------- Struct Declarations + +@@ -7691,11 +8038,6 @@ wuffs_cbor__decoder__set_quirk( + uint32_t a_key, + uint64_t a_value); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_cbor__decoder__history_retain_length( +- const wuffs_cbor__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_cbor__decoder__workbuf_len( +@@ -7738,7 +8080,7 @@ struct wuffs_cbor__decoder__struct { + + bool f_end_of_data; + +- uint32_t p_decode_tokens[1]; ++ uint32_t p_decode_tokens; + } private_impl; + + struct { +@@ -7750,7 +8092,7 @@ struct wuffs_cbor__decoder__struct { + uint32_t v_depth; + bool v_tagged; + uint8_t v_indefinite_string_major_type; +- } s_decode_tokens[1]; ++ } s_decode_tokens; + } private_data; + + #ifdef __cplusplus +@@ -7828,11 +8170,6 @@ struct wuffs_cbor__decoder__struct { + return wuffs_cbor__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_cbor__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_cbor__decoder__workbuf_len(this); +@@ -8074,6 +8411,227 @@ struct wuffs_crc32__ieee_hasher__struct { + + #endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) || defined(WUFFS_NONMONOLITHIC) + ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) || defined(WUFFS_NONMONOLITHIC) ++ ++// ---------------- Status Codes ++ ++// ---------------- Public Consts ++ ++// ---------------- Struct Declarations ++ ++typedef struct wuffs_crc64__ecma_hasher__struct wuffs_crc64__ecma_hasher; ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++// ---------------- Public Initializer Prototypes ++ ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_crc64__ecma_hasher__initialize( ++ wuffs_crc64__ecma_hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); ++ ++size_t ++sizeof__wuffs_crc64__ecma_hasher(void); ++ ++// ---------------- Allocs ++ ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. ++ ++wuffs_crc64__ecma_hasher* ++wuffs_crc64__ecma_hasher__alloc(void); ++ ++static inline wuffs_base__hasher_u64* ++wuffs_crc64__ecma_hasher__alloc_as__wuffs_base__hasher_u64(void) { ++ return (wuffs_base__hasher_u64*)(wuffs_crc64__ecma_hasher__alloc()); ++} ++ ++// ---------------- Upcasts ++ ++static inline wuffs_base__hasher_u64* ++wuffs_crc64__ecma_hasher__upcast_as__wuffs_base__hasher_u64( ++ wuffs_crc64__ecma_hasher* p) { ++ return (wuffs_base__hasher_u64*)p; ++} ++ ++// ---------------- Public Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_crc64__ecma_hasher__get_quirk( ++ const wuffs_crc64__ecma_hasher* self, ++ uint32_t a_key); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_crc64__ecma_hasher__set_quirk( ++ wuffs_crc64__ecma_hasher* self, ++ uint32_t a_key, ++ uint64_t a_value); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__update( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_crc64__ecma_hasher__update_u64( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_crc64__ecma_hasher__checksum_u64( ++ const wuffs_crc64__ecma_hasher* self); ++ ++#ifdef __cplusplus ++} // extern "C" ++#endif ++ ++// ---------------- Struct Definitions ++ ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C ++ ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_crc64__ecma_hasher__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. ++ ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__hasher_u64; ++ wuffs_base__vtable null_vtable; ++ ++ uint64_t f_state; ++ ++ wuffs_base__empty_struct (*choosy_up)( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); ++ } private_impl; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++ ++ // On failure, the alloc_etc functions return nullptr. They don't throw. ++ ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_crc64__ecma_hasher__alloc()); ++ } ++ ++ static inline wuffs_base__hasher_u64::unique_ptr ++ alloc_as__wuffs_base__hasher_u64() { ++ return wuffs_base__hasher_u64::unique_ptr( ++ wuffs_crc64__ecma_hasher__alloc_as__wuffs_base__hasher_u64()); ++ } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_crc64__ecma_hasher__struct() = delete; ++ wuffs_crc64__ecma_hasher__struct(const wuffs_crc64__ecma_hasher__struct&) = delete; ++ wuffs_crc64__ecma_hasher__struct& operator=( ++ const wuffs_crc64__ecma_hasher__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) ++ ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_crc64__ecma_hasher__initialize( ++ this, sizeof_star_self, wuffs_version, options); ++ } ++ ++ inline wuffs_base__hasher_u64* ++ upcast_as__wuffs_base__hasher_u64() { ++ return (wuffs_base__hasher_u64*)this; ++ } ++ ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_crc64__ecma_hasher__get_quirk(this, a_key); ++ } ++ ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_crc64__ecma_hasher__set_quirk(this, a_key, a_value); ++ } ++ ++ inline wuffs_base__empty_struct ++ update( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_crc64__ecma_hasher__update(this, a_x); ++ } ++ ++ inline uint64_t ++ update_u64( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_crc64__ecma_hasher__update_u64(this, a_x); ++ } ++ ++ inline uint64_t ++ checksum_u64() const { ++ return wuffs_crc64__ecma_hasher__checksum_u64(this); ++ } ++ ++#endif // __cplusplus ++}; // struct wuffs_crc64__ecma_hasher__struct ++ ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) || defined(WUFFS_NONMONOLITHIC) ++ + #if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes +@@ -8095,9 +8653,9 @@ extern const char wuffs_deflate__error__truncated_input[]; + + // ---------------- Public Consts + +-#define WUFFS_DEFLATE__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_DEFLATE__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_DEFLATE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1 ++#define WUFFS_DEFLATE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u + + // ---------------- Struct Declarations + +@@ -8171,8 +8729,8 @@ wuffs_deflate__decoder__set_quirk( + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_deflate__decoder__history_retain_length( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_deflate__decoder__dst_history_retain_length( + const wuffs_deflate__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +@@ -8222,16 +8780,16 @@ struct wuffs_deflate__decoder__struct { + uint32_t f_n_huffs_bits[2]; + bool f_end_of_block; + +- uint32_t p_transform_io[1]; +- uint32_t p_do_transform_io[1]; +- uint32_t p_decode_blocks[1]; +- uint32_t p_decode_uncompressed[1]; +- uint32_t p_init_dynamic_huffman[1]; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; ++ uint32_t p_decode_blocks; ++ uint32_t p_decode_uncompressed; ++ uint32_t p_init_dynamic_huffman; + wuffs_base__status (*choosy_decode_huffman_fast64)( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src); +- uint32_t p_decode_huffman_slow[1]; ++ uint32_t p_decode_huffman_slow; + } private_impl; + + struct { +@@ -8241,11 +8799,11 @@ struct wuffs_deflate__decoder__struct { + + struct { + uint32_t v_final; +- } s_decode_blocks[1]; ++ } s_decode_blocks; + struct { + uint32_t v_length; + uint64_t scratch; +- } s_decode_uncompressed[1]; ++ } s_decode_uncompressed; + struct { + uint32_t v_bits; + uint32_t v_n_bits; +@@ -8257,7 +8815,7 @@ struct wuffs_deflate__decoder__struct { + uint32_t v_n_extra_bits; + uint8_t v_rep_symbol; + uint32_t v_rep_count; +- } s_init_dynamic_huffman[1]; ++ } s_init_dynamic_huffman; + struct { + uint32_t v_bits; + uint32_t v_n_bits; +@@ -8269,7 +8827,7 @@ struct wuffs_deflate__decoder__struct { + uint32_t v_length; + uint32_t v_dist_minus_1; + uint64_t scratch; +- } s_decode_huffman_slow[1]; ++ } s_decode_huffman_slow; + } private_data; + + #ifdef __cplusplus +@@ -8353,9 +8911,9 @@ struct wuffs_deflate__decoder__struct { + return wuffs_deflate__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_deflate__decoder__history_retain_length(this); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_deflate__decoder__dst_history_retain_length(this); + } + + inline wuffs_base__range_ii_u64 +@@ -8393,23 +8951,21 @@ extern const char wuffs_gif__error__truncated_input[]; + + // ---------------- Public Consts + +-#define WUFFS_GIF__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_GIF__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_GIF__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_GIF__QUIRK_DELAY_NUM_DECODED_FRAMES 1041635328u + +-#define WUFFS_GIF__QUIRK_DELAY_NUM_DECODED_FRAMES 1041635328 ++#define WUFFS_GIF__QUIRK_FIRST_FRAME_LOCAL_PALETTE_MEANS_BLACK_BACKGROUND 1041635329u + +-#define WUFFS_GIF__QUIRK_FIRST_FRAME_LOCAL_PALETTE_MEANS_BLACK_BACKGROUND 1041635329 ++#define WUFFS_GIF__QUIRK_HONOR_BACKGROUND_COLOR 1041635330u + +-#define WUFFS_GIF__QUIRK_HONOR_BACKGROUND_COLOR 1041635330 ++#define WUFFS_GIF__QUIRK_IGNORE_TOO_MUCH_PIXEL_DATA 1041635331u + +-#define WUFFS_GIF__QUIRK_IGNORE_TOO_MUCH_PIXEL_DATA 1041635331 ++#define WUFFS_GIF__QUIRK_IMAGE_BOUNDS_ARE_STRICT 1041635332u + +-#define WUFFS_GIF__QUIRK_IMAGE_BOUNDS_ARE_STRICT 1041635332 ++#define WUFFS_GIF__QUIRK_REJECT_EMPTY_FRAME 1041635333u + +-#define WUFFS_GIF__QUIRK_REJECT_EMPTY_FRAME 1041635333 +- +-#define WUFFS_GIF__QUIRK_REJECT_EMPTY_PALETTE 1041635334 ++#define WUFFS_GIF__QUIRK_REJECT_EMPTY_PALETTE 1041635334u + + // ---------------- Struct Declarations + +@@ -8518,11 +9074,6 @@ WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 + wuffs_gif__decoder__frame_dirty_rect( + const wuffs_gif__decoder* self); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gif__decoder__history_retain_length( +- const wuffs_gif__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_gif__decoder__workbuf_len( +@@ -8627,25 +9178,25 @@ struct wuffs_gif__decoder__struct { + uint32_t f_lzw_read_from_return_value; + uint16_t f_lzw_prefixes[4096]; + +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_tell_me_more[1]; +- uint32_t p_do_tell_me_more[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_skip_frame[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; +- uint32_t p_decode_up_to_id_part1[1]; +- uint32_t p_decode_header[1]; +- uint32_t p_decode_lsd[1]; +- uint32_t p_decode_extension[1]; +- uint32_t p_skip_blocks[1]; +- uint32_t p_decode_ae[1]; +- uint32_t p_decode_gc[1]; +- uint32_t p_decode_id_part0[1]; +- uint32_t p_decode_id_part1[1]; +- uint32_t p_decode_id_part2[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_tell_me_more; ++ uint32_t p_do_tell_me_more; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_skip_frame; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_decode_up_to_id_part1; ++ uint32_t p_decode_header; ++ uint32_t p_decode_lsd; ++ uint32_t p_decode_extension; ++ uint32_t p_skip_blocks; ++ uint32_t p_decode_ae; ++ uint32_t p_decode_gc; ++ uint32_t p_decode_id_part0; ++ uint32_t p_decode_id_part1; ++ uint32_t p_decode_id_part2; + } private_impl; + + struct { +@@ -8658,24 +9209,23 @@ struct wuffs_gif__decoder__struct { + + struct { + uint32_t v_background_color; +- } s_do_decode_frame_config[1]; ++ } s_do_decode_frame_config; + struct { + uint64_t scratch; +- } s_skip_frame[1]; ++ } s_skip_frame; + struct { +- uint8_t v_c[6]; +- uint32_t v_i; +- } s_decode_header[1]; ++ uint64_t scratch; ++ } s_decode_header; + struct { + uint8_t v_flags; + uint8_t v_background_color_index; + uint32_t v_num_palette_entries; + uint32_t v_i; + uint64_t scratch; +- } s_decode_lsd[1]; ++ } s_decode_lsd; + struct { + uint64_t scratch; +- } s_skip_blocks[1]; ++ } s_skip_blocks; + struct { + uint8_t v_block_size; + bool v_is_animexts; +@@ -8683,24 +9233,24 @@ struct wuffs_gif__decoder__struct { + bool v_is_iccp; + bool v_is_xmp; + uint64_t scratch; +- } s_decode_ae[1]; ++ } s_decode_ae; + struct { + uint64_t scratch; +- } s_decode_gc[1]; ++ } s_decode_gc; + struct { + uint64_t scratch; +- } s_decode_id_part0[1]; ++ } s_decode_id_part0; + struct { + uint8_t v_which_palette; + uint32_t v_num_palette_entries; + uint32_t v_i; + uint64_t scratch; +- } s_decode_id_part1[1]; ++ } s_decode_id_part1; + struct { + uint64_t v_block_size; + bool v_need_block_size; + uint64_t scratch; +- } s_decode_id_part2[1]; ++ } s_decode_id_part2; + } private_data; + + #ifdef __cplusplus +@@ -8820,11 +9370,6 @@ struct wuffs_gif__decoder__struct { + return wuffs_gif__decoder__frame_dirty_rect(this); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_gif__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_gif__decoder__workbuf_len(this); +@@ -8873,9 +9418,9 @@ extern const char wuffs_gzip__error__truncated_input[]; + + // ---------------- Public Consts + +-#define WUFFS_GZIP__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_GZIP__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_GZIP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1 ++#define WUFFS_GZIP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u + + // ---------------- Struct Declarations + +@@ -8943,8 +9488,8 @@ wuffs_gzip__decoder__set_quirk( + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gzip__decoder__history_retain_length( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_gzip__decoder__dst_history_retain_length( + const wuffs_gzip__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +@@ -8989,8 +9534,8 @@ struct wuffs_gzip__decoder__struct { + + bool f_ignore_checksum; + +- uint32_t p_transform_io[1]; +- uint32_t p_do_transform_io[1]; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; + } private_impl; + + struct { +@@ -8999,11 +9544,11 @@ struct wuffs_gzip__decoder__struct { + + struct { + uint8_t v_flags; +- uint32_t v_checksum_got; +- uint32_t v_decoded_length_got; ++ uint32_t v_checksum_have; ++ uint32_t v_decoded_length_have; + uint32_t v_checksum_want; + uint64_t scratch; +- } s_do_transform_io[1]; ++ } s_do_transform_io; + } private_data; + + #ifdef __cplusplus +@@ -9081,9 +9626,9 @@ struct wuffs_gzip__decoder__struct { + return wuffs_gzip__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_gzip__decoder__history_retain_length(this); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_gzip__decoder__dst_history_retain_length(this); + } + + inline wuffs_base__range_ii_u64 +@@ -9117,8 +9662,10 @@ extern const char wuffs_jpeg__error__bad_sof_marker[]; + extern const char wuffs_jpeg__error__bad_sos_marker[]; + extern const char wuffs_jpeg__error__bad_header[]; + extern const char wuffs_jpeg__error__bad_marker[]; ++extern const char wuffs_jpeg__error__bad_scan_count[]; + extern const char wuffs_jpeg__error__missing_huffman_table[]; + extern const char wuffs_jpeg__error__missing_quantization_table[]; ++extern const char wuffs_jpeg__error__rejected_progressive_jpeg[]; + extern const char wuffs_jpeg__error__truncated_input[]; + extern const char wuffs_jpeg__error__unsupported_arithmetic_coding[]; + extern const char wuffs_jpeg__error__unsupported_color_model[]; +@@ -9134,9 +9681,9 @@ extern const char wuffs_jpeg__error__unsupported_scan_count[]; + + // ---------------- Public Consts + +-#define WUFFS_JPEG__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_JPEG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 51552191232u + +-#define WUFFS_JPEG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 51552191232 ++#define WUFFS_JPEG__QUIRK_REJECT_PROGRESSIVE_JPEGS 1220532224u + + // ---------------- Struct Declarations + +@@ -9269,11 +9816,6 @@ wuffs_jpeg__decoder__tell_me_more( + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_jpeg__decoder__history_retain_length( +- const wuffs_jpeg__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_jpeg__decoder__workbuf_len( +@@ -9368,6 +9910,13 @@ struct wuffs_jpeg__decoder__struct { + uint32_t f_bitstream_ri; + uint32_t f_bitstream_wi; + bool f_bitstream_is_closed; ++ bool f_expect_multiple_scans; ++ bool f_use_lower_quality; ++ bool f_reject_progressive_jpegs; ++ bool f_swizzle_immediately; ++ wuffs_base__status f_swizzle_immediately_status; ++ uint32_t f_swizzle_immediately_b_offsets[10]; ++ uint32_t f_swizzle_immediately_c_offsets[5]; + uint32_t f_bitstream_padding; + uint16_t f_quant_tables[4][64]; + uint16_t f_saved_quant_tables[4][64]; +@@ -9381,28 +9930,29 @@ struct wuffs_jpeg__decoder__struct { + wuffs_base__slice_u8 a_dst_buffer, + uint64_t a_dst_stride, + uint32_t a_q); +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_dqt[1]; +- uint32_t p_decode_dri[1]; +- uint32_t p_decode_appn[1]; +- uint32_t p_decode_sof[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; +- uint32_t p_decode_dht[1]; +- uint32_t p_decode_sos[1]; +- uint32_t p_prepare_scan[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_dqt; ++ uint32_t p_decode_dri; ++ uint32_t p_decode_appn; ++ uint32_t p_decode_sof; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_decode_dht; ++ uint32_t p_decode_sos; ++ uint32_t p_prepare_scan; + wuffs_base__empty_struct (*choosy_load_mcu_blocks_for_single_component)( + wuffs_jpeg__decoder* self, + uint32_t a_mx, + uint32_t a_my, + wuffs_base__slice_u8 a_workbuf, + uint32_t a_csel); +- uint32_t p_skip_past_the_next_restart_marker[1]; ++ uint32_t p_skip_past_the_next_restart_marker; + uint32_t (*choosy_decode_mcu)( + wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, + wuffs_base__slice_u8 a_workbuf, + uint32_t a_mx, + uint32_t a_my); +@@ -9411,6 +9961,7 @@ struct wuffs_jpeg__decoder__struct { + struct { + uint8_t f_bitstream_buffer[2048]; + uint16_t f_mcu_blocks[10][64]; ++ uint8_t f_swizzle_immediately_buffer[640]; + uint8_t f_swizzle_ycck_scratch_buffer_2k[2048]; + uint8_t f_dht_temp_counts[16]; + uint8_t f_dht_temp_bit_lengths[256]; +@@ -9420,38 +9971,38 @@ struct wuffs_jpeg__decoder__struct { + struct { + uint8_t v_marker; + uint64_t scratch; +- } s_do_decode_image_config[1]; ++ } s_do_decode_image_config; + struct { + uint8_t v_q; + uint32_t v_i; +- } s_decode_dqt[1]; ++ } s_decode_dqt; + struct { + uint64_t scratch; +- } s_decode_dri[1]; ++ } s_decode_dri; + struct { + uint64_t scratch; +- } s_decode_appn[1]; ++ } s_decode_appn; + struct { + uint32_t v_i; + uint64_t scratch; +- } s_decode_sof[1]; ++ } s_decode_sof; + struct { + uint8_t v_marker; + uint64_t scratch; +- } s_do_decode_frame[1]; ++ } s_do_decode_frame; + struct { + uint8_t v_tc4_th; + uint32_t v_total_count; + uint32_t v_i; +- } s_decode_dht[1]; ++ } s_decode_dht; + struct { + uint32_t v_my; + uint32_t v_mx; +- } s_decode_sos[1]; ++ } s_decode_sos; + struct { + uint32_t v_i; + uint64_t scratch; +- } s_prepare_scan[1]; ++ } s_prepare_scan; + } private_data; + + #ifdef __cplusplus +@@ -9595,11 +10146,6 @@ struct wuffs_jpeg__decoder__struct { + return wuffs_jpeg__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_jpeg__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_jpeg__decoder__workbuf_len(this); +@@ -9627,55 +10173,53 @@ extern const char wuffs_json__error__unsupported_recursion_depth[]; + + // ---------------- Public Consts + +-#define WUFFS_JSON__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 +- +-#define WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_JSON__DECODER_DEPTH_MAX_INCL 1024 ++#define WUFFS_JSON__DECODER_DEPTH_MAX_INCL 1024u + +-#define WUFFS_JSON__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 1 ++#define WUFFS_JSON__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 1u + +-#define WUFFS_JSON__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 100 ++#define WUFFS_JSON__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 100u + +-#define WUFFS_JSON__QUIRK_ALLOW_ASCII_CONTROL_CODES 1225364480 ++#define WUFFS_JSON__QUIRK_ALLOW_ASCII_CONTROL_CODES 1225364480u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_A 1225364481 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_A 1225364481u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_CAPITAL_U 1225364482 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_CAPITAL_U 1225364482u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_E 1225364483 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_E 1225364483u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_NEW_LINE 1225364484 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_NEW_LINE 1225364484u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_QUESTION_MARK 1225364485 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_QUESTION_MARK 1225364485u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_SINGLE_QUOTE 1225364486 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_SINGLE_QUOTE 1225364486u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_V 1225364487 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_V 1225364487u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_X_AS_CODE_POINTS 1225364489 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_X_AS_CODE_POINTS 1225364489u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_ZERO 1225364490 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_ZERO 1225364490u + +-#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_BLOCK 1225364491 ++#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_BLOCK 1225364491u + +-#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_LINE 1225364492 ++#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_LINE 1225364492u + +-#define WUFFS_JSON__QUIRK_ALLOW_EXTRA_COMMA 1225364493 ++#define WUFFS_JSON__QUIRK_ALLOW_EXTRA_COMMA 1225364493u + +-#define WUFFS_JSON__QUIRK_ALLOW_INF_NAN_NUMBERS 1225364494 ++#define WUFFS_JSON__QUIRK_ALLOW_INF_NAN_NUMBERS 1225364494u + +-#define WUFFS_JSON__QUIRK_ALLOW_LEADING_ASCII_RECORD_SEPARATOR 1225364495 ++#define WUFFS_JSON__QUIRK_ALLOW_LEADING_ASCII_RECORD_SEPARATOR 1225364495u + +-#define WUFFS_JSON__QUIRK_ALLOW_LEADING_UNICODE_BYTE_ORDER_MARK 1225364496 ++#define WUFFS_JSON__QUIRK_ALLOW_LEADING_UNICODE_BYTE_ORDER_MARK 1225364496u + +-#define WUFFS_JSON__QUIRK_ALLOW_TRAILING_FILLER 1225364497 ++#define WUFFS_JSON__QUIRK_ALLOW_TRAILING_FILLER 1225364497u + +-#define WUFFS_JSON__QUIRK_EXPECT_TRAILING_NEW_LINE_OR_EOF 1225364498 ++#define WUFFS_JSON__QUIRK_EXPECT_TRAILING_NEW_LINE_OR_EOF 1225364498u + +-#define WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T 1225364499 ++#define WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T 1225364499u + +-#define WUFFS_JSON__QUIRK_REPLACE_INVALID_UNICODE 1225364500 ++#define WUFFS_JSON__QUIRK_REPLACE_INVALID_UNICODE 1225364500u + + // ---------------- Struct Declarations + +@@ -9742,11 +10286,6 @@ wuffs_json__decoder__set_quirk( + uint32_t a_key, + uint64_t a_value); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_json__decoder__history_retain_length( +- const wuffs_json__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_json__decoder__workbuf_len( +@@ -9794,11 +10333,11 @@ struct wuffs_json__decoder__struct { + uint8_t f_trailer_stop; + uint8_t f_comment_type; + +- uint32_t p_decode_tokens[1]; +- uint32_t p_decode_leading[1]; +- uint32_t p_decode_comment[1]; +- uint32_t p_decode_inf_nan[1]; +- uint32_t p_decode_trailer[1]; ++ uint32_t p_decode_tokens; ++ uint32_t p_decode_leading; ++ uint32_t p_decode_comment; ++ uint32_t p_decode_inf_nan; ++ uint32_t p_decode_trailer; + } private_impl; + + struct { +@@ -9808,7 +10347,7 @@ struct wuffs_json__decoder__struct { + uint32_t v_depth; + uint32_t v_expect; + uint32_t v_expect_after_value; +- } s_decode_tokens[1]; ++ } s_decode_tokens; + } private_data; + + #ifdef __cplusplus +@@ -9886,11 +10425,6 @@ struct wuffs_json__decoder__struct { + return wuffs_json__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_json__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_json__decoder__workbuf_len(this); +@@ -9911,24 +10445,33 @@ struct wuffs_json__decoder__struct { + + #endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +-extern const char wuffs_lzw__error__bad_code[]; +-extern const char wuffs_lzw__error__truncated_input[]; ++extern const char wuffs_lzma__error__bad_lzma2_header[]; ++extern const char wuffs_lzma__error__bad_bitstream_trailer[]; ++extern const char wuffs_lzma__error__bad_code[]; ++extern const char wuffs_lzma__error__bad_decoded_length[]; ++extern const char wuffs_lzma__error__bad_distance[]; ++extern const char wuffs_lzma__error__bad_header[]; ++extern const char wuffs_lzma__error__truncated_input[]; ++extern const char wuffs_lzma__error__unsupported_decoded_length[]; ++extern const char wuffs_lzma__error__unsupported_properties[]; + + // ---------------- Public Consts + +-#define WUFFS_LZW__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_LZMA__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_LZW__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_LZMA__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u + +-#define WUFFS_LZW__QUIRK_LITERAL_WIDTH_PLUS_ONE 1348378624 ++#define WUFFS_LZMA__QUIRK_ALLOW_NON_ZERO_INITIAL_BYTE 1348001792u ++ ++#define WUFFS_LZMA__QUIRK_FORMAT_EXTENSION 1348001793u + + // ---------------- Struct Declarations + +-typedef struct wuffs_lzw__decoder__struct wuffs_lzw__decoder; ++typedef struct wuffs_lzma__decoder__struct wuffs_lzma__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -9943,14 +10486,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_lzw__decoder__initialize( +- wuffs_lzw__decoder* self, ++wuffs_lzma__decoder__initialize( ++ wuffs_lzma__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_lzw__decoder(void); ++sizeof__wuffs_lzma__decoder(void); + + // ---------------- Allocs + +@@ -9960,19 +10503,19 @@ sizeof__wuffs_lzw__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_lzw__decoder* +-wuffs_lzw__decoder__alloc(void); ++wuffs_lzma__decoder* ++wuffs_lzma__decoder__alloc(void); + + static inline wuffs_base__io_transformer* +-wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer(void) { +- return (wuffs_base__io_transformer*)(wuffs_lzw__decoder__alloc()); ++wuffs_lzma__decoder__alloc_as__wuffs_base__io_transformer(void) { ++ return (wuffs_base__io_transformer*)(wuffs_lzma__decoder__alloc()); + } + + // ---------------- Upcasts + + static inline wuffs_base__io_transformer* +-wuffs_lzw__decoder__upcast_as__wuffs_base__io_transformer( +- wuffs_lzw__decoder* p) { ++wuffs_lzma__decoder__upcast_as__wuffs_base__io_transformer( ++ wuffs_lzma__decoder* p) { + return (wuffs_base__io_transformer*)p; + } + +@@ -9980,40 +10523,35 @@ wuffs_lzw__decoder__upcast_as__wuffs_base__io_transformer( + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_lzw__decoder__get_quirk( +- const wuffs_lzw__decoder* self, ++wuffs_lzma__decoder__get_quirk( ++ const wuffs_lzma__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_lzw__decoder__set_quirk( +- wuffs_lzw__decoder* self, ++wuffs_lzma__decoder__set_quirk( ++ wuffs_lzma__decoder* self, + uint32_t a_key, + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_lzw__decoder__history_retain_length( +- const wuffs_lzw__decoder* self); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzma__decoder__dst_history_retain_length( ++ const wuffs_lzma__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_lzw__decoder__workbuf_len( +- const wuffs_lzw__decoder* self); ++wuffs_lzma__decoder__workbuf_len( ++ const wuffs_lzma__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_lzw__decoder__transform_io( +- wuffs_lzw__decoder* self, ++wuffs_lzma__decoder__transform_io( ++ wuffs_lzma__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8 +-wuffs_lzw__decoder__flush( +- wuffs_lzw__decoder* self); +- + #ifdef __cplusplus + } // extern "C" + #endif +@@ -10027,7 +10565,7 @@ wuffs_lzw__decoder__flush( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_lzw__decoder__struct { ++struct wuffs_lzma__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -10041,45 +10579,113 @@ struct wuffs_lzw__decoder__struct { + wuffs_base__vtable vtable_for__wuffs_base__io_transformer; + wuffs_base__vtable null_vtable; + +- uint32_t f_pending_literal_width_plus_one; +- uint32_t f_literal_width; +- uint32_t f_clear_code; +- uint32_t f_end_code; +- uint32_t f_save_code; +- uint32_t f_prev_code; +- uint32_t f_width; +- uint32_t f_bits; +- uint32_t f_n_bits; +- uint32_t f_output_ri; +- uint32_t f_output_wi; +- uint32_t f_read_from_return_value; +- uint16_t f_prefixes[4096]; +- +- uint32_t p_transform_io[1]; +- uint32_t p_write_to[1]; ++ uint32_t f_lc; ++ uint32_t f_lp; ++ uint32_t f_pb; ++ uint32_t f_format_extension; ++ uint32_t f_dict_size; ++ uint32_t f_dict_workbuf_index; ++ uint32_t f_dict_seen; ++ uint64_t f_decoded_length; ++ uint64_t f_lzma2_encoded_length_have; ++ uint64_t f_lzma2_encoded_length_want; ++ bool f_lzma2_need_prob_reset; ++ bool f_lzma2_need_properties; ++ bool f_lzma2_need_dict_reset; ++ bool f_prev_lzma2_chunk_was_uncompressed; ++ bool f_allow_non_zero_initial_byte; ++ bool f_end_of_chunk; ++ uint8_t f_stashed_bytes[2]; ++ uint32_t f_stashed_bits; ++ uint32_t f_stashed_range; ++ uint32_t f_stashed_state; ++ uint32_t f_stashed_rep0; ++ uint32_t f_stashed_rep1; ++ uint32_t f_stashed_rep2; ++ uint32_t f_stashed_rep3; ++ uint64_t f_stashed_pos; ++ uint64_t f_stashed_pos_end; ++ ++ uint32_t p_decode_bitstream_slow; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; ++ uint32_t p_decode_bitstream; ++ uint32_t p_update_stashed_bytes; ++ uint32_t p_decode_optional_end_of_stream; + } private_impl; + + struct { +- uint8_t f_suffixes[4096][8]; +- uint16_t f_lm1s[4096]; +- uint8_t f_output[8199]; ++ uint16_t f_probs_ao00[192]; ++ uint16_t f_probs_ao20[12]; ++ uint16_t f_probs_ao40[12]; ++ uint16_t f_probs_ao41[192]; ++ uint16_t f_probs_ao60[12]; ++ uint16_t f_probs_ao63[12]; ++ uint16_t f_probs_match_len_low[16][8]; ++ uint16_t f_probs_match_len_mid[16][8]; ++ uint16_t f_probs_match_len_high[1][256]; ++ uint16_t f_probs_longrep_len_low[16][8]; ++ uint16_t f_probs_longrep_len_mid[16][8]; ++ uint16_t f_probs_longrep_len_high[1][256]; ++ uint16_t f_probs_slot[4][64]; ++ uint16_t f_probs_small_dist[128]; ++ uint16_t f_probs_large_dist[16]; ++ uint16_t f_probs_lit[16][768]; ++ ++ struct { ++ uint32_t v_bits; ++ uint32_t v_range; ++ uint32_t v_state; ++ uint32_t v_rep0; ++ uint32_t v_rep1; ++ uint32_t v_rep2; ++ uint32_t v_rep3; ++ uint32_t v_rep; ++ uint64_t v_pos; ++ uint64_t v_pos_end; ++ uint32_t v_lc; ++ uint64_t v_lp_mask; ++ uint64_t v_pb_mask; ++ uint32_t v_tree_node; ++ uint8_t v_prev_byte; ++ uint32_t v_match_byte; ++ uint32_t v_len_state; ++ uint32_t v_slot; ++ uint32_t v_len; ++ uint32_t v_lanl_offset; ++ uint32_t v_num_extra_bits; ++ uint32_t v_dist_extra_bits; ++ uint32_t v_i; ++ uint32_t v_index_lit; ++ uint32_t v_index_len; ++ uint32_t v_index_small_dist_base; ++ uint32_t v_index_small_dist_extra; ++ uint32_t v_index_large_dist; ++ uint32_t v_dist; ++ uint64_t scratch; ++ } s_decode_bitstream_slow; ++ struct { ++ uint8_t v_header_byte; ++ uint32_t v_length; ++ uint64_t scratch; ++ } s_do_transform_io; + } private_data; + + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_lzw__decoder__alloc()); ++ return unique_ptr(wuffs_lzma__decoder__alloc()); + } + + static inline wuffs_base__io_transformer::unique_ptr + alloc_as__wuffs_base__io_transformer() { + return wuffs_base__io_transformer::unique_ptr( +- wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer()); ++ wuffs_lzma__decoder__alloc_as__wuffs_base__io_transformer()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -10095,10 +10701,10 @@ struct wuffs_lzw__decoder__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_lzw__decoder__struct() = delete; +- wuffs_lzw__decoder__struct(const wuffs_lzw__decoder__struct&) = delete; +- wuffs_lzw__decoder__struct& operator=( +- const wuffs_lzw__decoder__struct&) = delete; ++ wuffs_lzma__decoder__struct() = delete; ++ wuffs_lzma__decoder__struct(const wuffs_lzma__decoder__struct&) = delete; ++ wuffs_lzma__decoder__struct& operator=( ++ const wuffs_lzma__decoder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -10118,7 +10724,7 @@ struct wuffs_lzw__decoder__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_lzw__decoder__initialize( ++ return wuffs_lzma__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +@@ -10130,24 +10736,24 @@ struct wuffs_lzw__decoder__struct { + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_lzw__decoder__get_quirk(this, a_key); ++ return wuffs_lzma__decoder__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_lzw__decoder__set_quirk(this, a_key, a_value); ++ return wuffs_lzma__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_lzw__decoder__history_retain_length(this); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_lzma__decoder__dst_history_retain_length(this); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { +- return wuffs_lzw__decoder__workbuf_len(this); ++ return wuffs_lzma__decoder__workbuf_len(this); + } + + inline wuffs_base__status +@@ -10155,38 +10761,34 @@ struct wuffs_lzw__decoder__struct { + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { +- return wuffs_lzw__decoder__transform_io(this, a_dst, a_src, a_workbuf); +- } +- +- inline wuffs_base__slice_u8 +- flush() { +- return wuffs_lzw__decoder__flush(this); ++ return wuffs_lzma__decoder__transform_io(this, a_dst, a_src, a_workbuf); + } + + #endif // __cplusplus +-}; // struct wuffs_lzw__decoder__struct ++}; // struct wuffs_lzma__decoder__struct + + #endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +-extern const char wuffs_netpbm__error__bad_header[]; +-extern const char wuffs_netpbm__error__truncated_input[]; +-extern const char wuffs_netpbm__error__unsupported_netpbm_file[]; ++extern const char wuffs_lzip__error__bad_checksum[]; ++extern const char wuffs_lzip__error__bad_footer[]; ++extern const char wuffs_lzip__error__bad_header[]; ++extern const char wuffs_lzip__error__truncated_input[]; + + // ---------------- Public Consts + +-#define WUFFS_NETPBM__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_LZIP__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_NETPBM__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_LZIP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u + + // ---------------- Struct Declarations + +-typedef struct wuffs_netpbm__decoder__struct wuffs_netpbm__decoder; ++typedef struct wuffs_lzip__decoder__struct wuffs_lzip__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -10201,14 +10803,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_netpbm__decoder__initialize( +- wuffs_netpbm__decoder* self, ++wuffs_lzip__decoder__initialize( ++ wuffs_lzip__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_netpbm__decoder(void); ++sizeof__wuffs_lzip__decoder(void); + + // ---------------- Allocs + +@@ -10218,112 +10820,54 @@ sizeof__wuffs_netpbm__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_netpbm__decoder* +-wuffs_netpbm__decoder__alloc(void); ++wuffs_lzip__decoder* ++wuffs_lzip__decoder__alloc(void); + +-static inline wuffs_base__image_decoder* +-wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder(void) { +- return (wuffs_base__image_decoder*)(wuffs_netpbm__decoder__alloc()); ++static inline wuffs_base__io_transformer* ++wuffs_lzip__decoder__alloc_as__wuffs_base__io_transformer(void) { ++ return (wuffs_base__io_transformer*)(wuffs_lzip__decoder__alloc()); + } + + // ---------------- Upcasts + +-static inline wuffs_base__image_decoder* +-wuffs_netpbm__decoder__upcast_as__wuffs_base__image_decoder( +- wuffs_netpbm__decoder* p) { +- return (wuffs_base__image_decoder*)p; ++static inline wuffs_base__io_transformer* ++wuffs_lzip__decoder__upcast_as__wuffs_base__io_transformer( ++ wuffs_lzip__decoder* p) { ++ return (wuffs_base__io_transformer*)p; + } + + // ---------------- Public Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__get_quirk( +- const wuffs_netpbm__decoder* self, ++wuffs_lzip__decoder__get_quirk( ++ const wuffs_lzip__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__set_quirk( +- wuffs_netpbm__decoder* self, ++wuffs_lzip__decoder__set_quirk( ++ wuffs_lzip__decoder* self, + uint32_t a_key, + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_image_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_frame_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_frame( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_netpbm__decoder__frame_dirty_rect( +- const wuffs_netpbm__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_netpbm__decoder__num_animation_loops( +- const wuffs_netpbm__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__num_decoded_frame_configs( +- const wuffs_netpbm__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__num_decoded_frames( +- const wuffs_netpbm__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__restart_frame( +- wuffs_netpbm__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzip__decoder__dst_history_retain_length( ++ const wuffs_lzip__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_netpbm__decoder__set_report_metadata( +- wuffs_netpbm__decoder* self, +- uint32_t a_fourcc, +- bool a_report); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_lzip__decoder__workbuf_len( ++ const wuffs_lzip__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__tell_me_more( +- wuffs_netpbm__decoder* self, ++wuffs_lzip__decoder__transform_io( ++ wuffs_lzip__decoder* self, + wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__history_retain_length( +- const wuffs_netpbm__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_netpbm__decoder__workbuf_len( +- const wuffs_netpbm__decoder* self); ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); + + #ifdef __cplusplus + } // extern "C" +@@ -10338,7 +10882,7 @@ wuffs_netpbm__decoder__workbuf_len( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_netpbm__decoder__struct { ++struct wuffs_lzip__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -10349,42 +10893,41 @@ struct wuffs_netpbm__decoder__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; +- wuffs_base__vtable vtable_for__wuffs_base__image_decoder; ++ wuffs_base__vtable vtable_for__wuffs_base__io_transformer; + wuffs_base__vtable null_vtable; + +- uint32_t f_pixfmt; +- uint32_t f_width; +- uint32_t f_height; +- uint32_t f_max_value; +- uint8_t f_call_sequence; +- uint64_t f_frame_config_io_position; +- uint32_t f_dst_x; +- uint32_t f_dst_y; +- wuffs_base__pixel_swizzler f_swizzler; ++ bool f_ignore_checksum; ++ uint64_t f_dsize_have; ++ uint64_t f_ssize_have; + +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; + } private_impl; + ++ struct { ++ wuffs_crc32__ieee_hasher f_crc32; ++ wuffs_lzma__decoder f_lzma; ++ ++ struct { ++ uint64_t scratch; ++ } s_do_transform_io; ++ } private_data; ++ + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_netpbm__decoder__alloc()); ++ return unique_ptr(wuffs_lzip__decoder__alloc()); + } + +- static inline wuffs_base__image_decoder::unique_ptr +- alloc_as__wuffs_base__image_decoder() { +- return wuffs_base__image_decoder::unique_ptr( +- wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder()); ++ static inline wuffs_base__io_transformer::unique_ptr ++ alloc_as__wuffs_base__io_transformer() { ++ return wuffs_base__io_transformer::unique_ptr( ++ wuffs_lzip__decoder__alloc_as__wuffs_base__io_transformer()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -10400,10 +10943,10 @@ struct wuffs_netpbm__decoder__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_netpbm__decoder__struct() = delete; +- wuffs_netpbm__decoder__struct(const wuffs_netpbm__decoder__struct&) = delete; +- wuffs_netpbm__decoder__struct& operator=( +- const wuffs_netpbm__decoder__struct&) = delete; ++ wuffs_lzip__decoder__struct() = delete; ++ wuffs_lzip__decoder__struct(const wuffs_lzip__decoder__struct&) = delete; ++ wuffs_lzip__decoder__struct& operator=( ++ const wuffs_lzip__decoder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -10423,128 +10966,327 @@ struct wuffs_netpbm__decoder__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_netpbm__decoder__initialize( ++ return wuffs_lzip__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +- inline wuffs_base__image_decoder* +- upcast_as__wuffs_base__image_decoder() { +- return (wuffs_base__image_decoder*)this; ++ inline wuffs_base__io_transformer* ++ upcast_as__wuffs_base__io_transformer() { ++ return (wuffs_base__io_transformer*)this; + } + + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_netpbm__decoder__get_quirk(this, a_key); ++ return wuffs_lzip__decoder__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_netpbm__decoder__set_quirk(this, a_key, a_value); ++ return wuffs_lzip__decoder__set_quirk(this, a_key, a_value); + } + +- inline wuffs_base__status +- decode_image_config( +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- return wuffs_netpbm__decoder__decode_image_config(this, a_dst, a_src); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_lzip__decoder__dst_history_retain_length(this); + } + +- inline wuffs_base__status +- decode_frame_config( +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- return wuffs_netpbm__decoder__decode_frame_config(this, a_dst, a_src); ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_lzip__decoder__workbuf_len(this); + } + + inline wuffs_base__status +- decode_frame( +- wuffs_base__pixel_buffer* a_dst, ++ transform_io( ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- return wuffs_netpbm__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); +- } +- +- inline wuffs_base__rect_ie_u32 +- frame_dirty_rect() const { +- return wuffs_netpbm__decoder__frame_dirty_rect(this); ++ wuffs_base__slice_u8 a_workbuf) { ++ return wuffs_lzip__decoder__transform_io(this, a_dst, a_src, a_workbuf); + } + +- inline uint32_t +- num_animation_loops() const { +- return wuffs_netpbm__decoder__num_animation_loops(this); +- } ++#endif // __cplusplus ++}; // struct wuffs_lzip__decoder__struct + +- inline uint64_t +- num_decoded_frame_configs() const { +- return wuffs_netpbm__decoder__num_decoded_frame_configs(this); +- } ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- inline uint64_t +- num_decoded_frames() const { +- return wuffs_netpbm__decoder__num_decoded_frames(this); +- } ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) || defined(WUFFS_NONMONOLITHIC) + +- inline wuffs_base__status +- restart_frame( +- uint64_t a_index, +- uint64_t a_io_position) { +- return wuffs_netpbm__decoder__restart_frame(this, a_index, a_io_position); +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC) + +- inline wuffs_base__empty_struct +- set_report_metadata( +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_netpbm__decoder__set_report_metadata(this, a_fourcc, a_report); +- } ++// ---------------- Status Codes + +- inline wuffs_base__status +- tell_me_more( +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- return wuffs_netpbm__decoder__tell_me_more(this, a_dst, a_minfo, a_src); +- } ++extern const char wuffs_lzw__error__bad_code[]; ++extern const char wuffs_lzw__error__truncated_input[]; + +- inline uint64_t +- history_retain_length() const { +- return wuffs_netpbm__decoder__history_retain_length(this); +- } ++// ---------------- Public Consts + +- inline wuffs_base__range_ii_u64 +- workbuf_len() const { +- return wuffs_netpbm__decoder__workbuf_len(this); +- } ++#define WUFFS_LZW__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#endif // __cplusplus +-}; // struct wuffs_netpbm__decoder__struct ++#define WUFFS_LZW__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++#define WUFFS_LZW__QUIRK_LITERAL_WIDTH_PLUS_ONE 1348378624u + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC) ++// ---------------- Struct Declarations + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC) ++typedef struct wuffs_lzw__decoder__struct wuffs_lzw__decoder; + +-// ---------------- Status Codes ++#ifdef __cplusplus ++extern "C" { ++#endif + +-extern const char wuffs_nie__error__bad_header[]; +-extern const char wuffs_nie__error__truncated_input[]; +-extern const char wuffs_nie__error__unsupported_nie_file[]; ++// ---------------- Public Initializer Prototypes + +-// ---------------- Public Consts ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_lzw__decoder__initialize( ++ wuffs_lzw__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); ++ ++size_t ++sizeof__wuffs_lzw__decoder(void); ++ ++// ---------------- Allocs ++ ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. ++ ++wuffs_lzw__decoder* ++wuffs_lzw__decoder__alloc(void); ++ ++static inline wuffs_base__io_transformer* ++wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer(void) { ++ return (wuffs_base__io_transformer*)(wuffs_lzw__decoder__alloc()); ++} ++ ++// ---------------- Upcasts ++ ++static inline wuffs_base__io_transformer* ++wuffs_lzw__decoder__upcast_as__wuffs_base__io_transformer( ++ wuffs_lzw__decoder* p) { ++ return (wuffs_base__io_transformer*)p; ++} ++ ++// ---------------- Public Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_lzw__decoder__get_quirk( ++ const wuffs_lzw__decoder* self, ++ uint32_t a_key); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzw__decoder__set_quirk( ++ wuffs_lzw__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzw__decoder__dst_history_retain_length( ++ const wuffs_lzw__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_lzw__decoder__workbuf_len( ++ const wuffs_lzw__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzw__decoder__transform_io( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8 ++wuffs_lzw__decoder__flush( ++ wuffs_lzw__decoder* self); ++ ++#ifdef __cplusplus ++} // extern "C" ++#endif ++ ++// ---------------- Struct Definitions ++ ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C ++ ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_lzw__decoder__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. ++ ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__io_transformer; ++ wuffs_base__vtable null_vtable; ++ ++ uint32_t f_pending_literal_width_plus_one; ++ uint32_t f_literal_width; ++ uint32_t f_clear_code; ++ uint32_t f_end_code; ++ uint32_t f_save_code; ++ uint32_t f_prev_code; ++ uint32_t f_width; ++ uint32_t f_bits; ++ uint32_t f_n_bits; ++ uint32_t f_output_ri; ++ uint32_t f_output_wi; ++ uint32_t f_read_from_return_value; ++ uint16_t f_prefixes[4096]; ++ ++ uint32_t p_transform_io; ++ uint32_t p_write_to; ++ } private_impl; ++ ++ struct { ++ uint8_t f_suffixes[4096][8]; ++ uint16_t f_lm1s[4096]; ++ uint8_t f_output[8199]; ++ } private_data; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++ ++ // On failure, the alloc_etc functions return nullptr. They don't throw. ++ ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_lzw__decoder__alloc()); ++ } ++ ++ static inline wuffs_base__io_transformer::unique_ptr ++ alloc_as__wuffs_base__io_transformer() { ++ return wuffs_base__io_transformer::unique_ptr( ++ wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer()); ++ } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_lzw__decoder__struct() = delete; ++ wuffs_lzw__decoder__struct(const wuffs_lzw__decoder__struct&) = delete; ++ wuffs_lzw__decoder__struct& operator=( ++ const wuffs_lzw__decoder__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) ++ ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_lzw__decoder__initialize( ++ this, sizeof_star_self, wuffs_version, options); ++ } ++ ++ inline wuffs_base__io_transformer* ++ upcast_as__wuffs_base__io_transformer() { ++ return (wuffs_base__io_transformer*)this; ++ } ++ ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_lzw__decoder__get_quirk(this, a_key); ++ } ++ ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_lzw__decoder__set_quirk(this, a_key, a_value); ++ } ++ ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_lzw__decoder__dst_history_retain_length(this); ++ } ++ ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_lzw__decoder__workbuf_len(this); ++ } ++ ++ inline wuffs_base__status ++ transform_io( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ return wuffs_lzw__decoder__transform_io(this, a_dst, a_src, a_workbuf); ++ } ++ ++ inline wuffs_base__slice_u8 ++ flush() { ++ return wuffs_lzw__decoder__flush(this); ++ } ++ ++#endif // __cplusplus ++}; // struct wuffs_lzw__decoder__struct ++ ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC) ++ ++// ---------------- Status Codes ++ ++extern const char wuffs_netpbm__error__bad_header[]; ++extern const char wuffs_netpbm__error__truncated_input[]; ++extern const char wuffs_netpbm__error__unsupported_netpbm_file[]; + +-#define WUFFS_NIE__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++// ---------------- Public Consts + +-#define WUFFS_NIE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_NETPBM__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + + // ---------------- Struct Declarations + +-typedef struct wuffs_nie__decoder__struct wuffs_nie__decoder; ++typedef struct wuffs_netpbm__decoder__struct wuffs_netpbm__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -10559,14 +11301,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_nie__decoder__initialize( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__initialize( ++ wuffs_netpbm__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_nie__decoder(void); ++sizeof__wuffs_netpbm__decoder(void); + + // ---------------- Allocs + +@@ -10576,19 +11318,19 @@ sizeof__wuffs_nie__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_nie__decoder* +-wuffs_nie__decoder__alloc(void); ++wuffs_netpbm__decoder* ++wuffs_netpbm__decoder__alloc(void); + + static inline wuffs_base__image_decoder* +-wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder(void) { +- return (wuffs_base__image_decoder*)(wuffs_nie__decoder__alloc()); ++wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_netpbm__decoder__alloc()); + } + + // ---------------- Upcasts + + static inline wuffs_base__image_decoder* +-wuffs_nie__decoder__upcast_as__wuffs_base__image_decoder( +- wuffs_nie__decoder* p) { ++wuffs_netpbm__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_netpbm__decoder* p) { + return (wuffs_base__image_decoder*)p; + } + +@@ -10596,35 +11338,35 @@ wuffs_nie__decoder__upcast_as__wuffs_base__image_decoder( + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__get_quirk( +- const wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__get_quirk( ++ const wuffs_netpbm__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__set_quirk( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__set_quirk( ++ wuffs_netpbm__decoder* self, + uint32_t a_key, + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_image_config( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__decode_image_config( ++ wuffs_netpbm__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_frame_config( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__decode_frame_config( ++ wuffs_netpbm__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_frame( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__decode_frame( ++ wuffs_netpbm__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, +@@ -10633,55 +11375,50 @@ wuffs_nie__decoder__decode_frame( + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_nie__decoder__frame_dirty_rect( +- const wuffs_nie__decoder* self); ++wuffs_netpbm__decoder__frame_dirty_rect( ++ const wuffs_netpbm__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_nie__decoder__num_animation_loops( +- const wuffs_nie__decoder* self); ++wuffs_netpbm__decoder__num_animation_loops( ++ const wuffs_netpbm__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__num_decoded_frame_configs( +- const wuffs_nie__decoder* self); ++wuffs_netpbm__decoder__num_decoded_frame_configs( ++ const wuffs_netpbm__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__num_decoded_frames( +- const wuffs_nie__decoder* self); ++wuffs_netpbm__decoder__num_decoded_frames( ++ const wuffs_netpbm__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__restart_frame( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__restart_frame( ++ wuffs_netpbm__decoder* self, + uint64_t a_index, + uint64_t a_io_position); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_nie__decoder__set_report_metadata( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__set_report_metadata( ++ wuffs_netpbm__decoder* self, + uint32_t a_fourcc, + bool a_report); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__tell_me_more( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__tell_me_more( ++ wuffs_netpbm__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__history_retain_length( +- const wuffs_nie__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_nie__decoder__workbuf_len( +- const wuffs_nie__decoder* self); ++wuffs_netpbm__decoder__workbuf_len( ++ const wuffs_netpbm__decoder* self); + + #ifdef __cplusplus + } // extern "C" +@@ -10696,7 +11433,7 @@ wuffs_nie__decoder__workbuf_len( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_nie__decoder__struct { ++struct wuffs_netpbm__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -10713,40 +11450,36 @@ struct wuffs_nie__decoder__struct { + uint32_t f_pixfmt; + uint32_t f_width; + uint32_t f_height; ++ uint32_t f_max_value; + uint8_t f_call_sequence; ++ uint64_t f_frame_config_io_position; + uint32_t f_dst_x; + uint32_t f_dst_y; + wuffs_base__pixel_swizzler f_swizzler; + +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; + } private_impl; + +- struct { +- struct { +- uint64_t scratch; +- } s_do_decode_image_config[1]; +- } private_data; +- + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_nie__decoder__alloc()); ++ return unique_ptr(wuffs_netpbm__decoder__alloc()); + } + + static inline wuffs_base__image_decoder::unique_ptr + alloc_as__wuffs_base__image_decoder() { + return wuffs_base__image_decoder::unique_ptr( +- wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder()); ++ wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -10762,10 +11495,10 @@ struct wuffs_nie__decoder__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_nie__decoder__struct() = delete; +- wuffs_nie__decoder__struct(const wuffs_nie__decoder__struct&) = delete; +- wuffs_nie__decoder__struct& operator=( +- const wuffs_nie__decoder__struct&) = delete; ++ wuffs_netpbm__decoder__struct() = delete; ++ wuffs_netpbm__decoder__struct(const wuffs_netpbm__decoder__struct&) = delete; ++ wuffs_netpbm__decoder__struct& operator=( ++ const wuffs_netpbm__decoder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -10785,7 +11518,7 @@ struct wuffs_nie__decoder__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_nie__decoder__initialize( ++ return wuffs_netpbm__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +@@ -10797,28 +11530,28 @@ struct wuffs_nie__decoder__struct { + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_nie__decoder__get_quirk(this, a_key); ++ return wuffs_netpbm__decoder__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_nie__decoder__set_quirk(this, a_key, a_value); ++ return wuffs_netpbm__decoder__set_quirk(this, a_key, a_value); + } + + inline wuffs_base__status + decode_image_config( + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { +- return wuffs_nie__decoder__decode_image_config(this, a_dst, a_src); ++ return wuffs_netpbm__decoder__decode_image_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame_config( + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { +- return wuffs_nie__decoder__decode_frame_config(this, a_dst, a_src); ++ return wuffs_netpbm__decoder__decode_frame_config(this, a_dst, a_src); + } + + inline wuffs_base__status +@@ -10828,41 +11561,41 @@ struct wuffs_nie__decoder__struct { + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { +- return wuffs_nie__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ return wuffs_netpbm__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); + } + + inline wuffs_base__rect_ie_u32 + frame_dirty_rect() const { +- return wuffs_nie__decoder__frame_dirty_rect(this); ++ return wuffs_netpbm__decoder__frame_dirty_rect(this); + } + + inline uint32_t + num_animation_loops() const { +- return wuffs_nie__decoder__num_animation_loops(this); ++ return wuffs_netpbm__decoder__num_animation_loops(this); + } + + inline uint64_t + num_decoded_frame_configs() const { +- return wuffs_nie__decoder__num_decoded_frame_configs(this); ++ return wuffs_netpbm__decoder__num_decoded_frame_configs(this); + } + + inline uint64_t + num_decoded_frames() const { +- return wuffs_nie__decoder__num_decoded_frames(this); ++ return wuffs_netpbm__decoder__num_decoded_frames(this); + } + + inline wuffs_base__status + restart_frame( + uint64_t a_index, + uint64_t a_io_position) { +- return wuffs_nie__decoder__restart_frame(this, a_index, a_io_position); ++ return wuffs_netpbm__decoder__restart_frame(this, a_index, a_io_position); + } + + inline wuffs_base__empty_struct + set_report_metadata( + uint32_t a_fourcc, + bool a_report) { +- return wuffs_nie__decoder__set_report_metadata(this, a_fourcc, a_report); ++ return wuffs_netpbm__decoder__set_report_metadata(this, a_fourcc, a_report); + } + + inline wuffs_base__status +@@ -10870,49 +11603,36 @@ struct wuffs_nie__decoder__struct { + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { +- return wuffs_nie__decoder__tell_me_more(this, a_dst, a_minfo, a_src); +- } +- +- inline uint64_t +- history_retain_length() const { +- return wuffs_nie__decoder__history_retain_length(this); ++ return wuffs_netpbm__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { +- return wuffs_nie__decoder__workbuf_len(this); ++ return wuffs_netpbm__decoder__workbuf_len(this); + } + + #endif // __cplusplus +-}; // struct wuffs_nie__decoder__struct ++}; // struct wuffs_netpbm__decoder__struct + + #endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +-extern const char wuffs_zlib__note__dictionary_required[]; +-extern const char wuffs_zlib__error__bad_checksum[]; +-extern const char wuffs_zlib__error__bad_compression_method[]; +-extern const char wuffs_zlib__error__bad_compression_window_size[]; +-extern const char wuffs_zlib__error__bad_parity_check[]; +-extern const char wuffs_zlib__error__incorrect_dictionary[]; +-extern const char wuffs_zlib__error__truncated_input[]; ++extern const char wuffs_nie__error__bad_header[]; ++extern const char wuffs_nie__error__truncated_input[]; ++extern const char wuffs_nie__error__unsupported_nie_file[]; + + // ---------------- Public Consts + +-#define WUFFS_ZLIB__QUIRK_JUST_RAW_DEFLATE 2113790976 +- +-#define WUFFS_ZLIB__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 +- +-#define WUFFS_ZLIB__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1 ++#define WUFFS_NIE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + + // ---------------- Struct Declarations + +-typedef struct wuffs_zlib__decoder__struct wuffs_zlib__decoder; ++typedef struct wuffs_nie__decoder__struct wuffs_nie__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -10927,14 +11647,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_zlib__decoder__initialize( +- wuffs_zlib__decoder* self, ++wuffs_nie__decoder__initialize( ++ wuffs_nie__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_zlib__decoder(void); ++sizeof__wuffs_nie__decoder(void); + + // ---------------- Allocs + +@@ -10944,65 +11664,107 @@ sizeof__wuffs_zlib__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_zlib__decoder* +-wuffs_zlib__decoder__alloc(void); ++wuffs_nie__decoder* ++wuffs_nie__decoder__alloc(void); + +-static inline wuffs_base__io_transformer* +-wuffs_zlib__decoder__alloc_as__wuffs_base__io_transformer(void) { +- return (wuffs_base__io_transformer*)(wuffs_zlib__decoder__alloc()); ++static inline wuffs_base__image_decoder* ++wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_nie__decoder__alloc()); + } + + // ---------------- Upcasts + +-static inline wuffs_base__io_transformer* +-wuffs_zlib__decoder__upcast_as__wuffs_base__io_transformer( +- wuffs_zlib__decoder* p) { +- return (wuffs_base__io_transformer*)p; ++static inline wuffs_base__image_decoder* ++wuffs_nie__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_nie__decoder* p) { ++ return (wuffs_base__image_decoder*)p; + } + + // ---------------- Public Function Prototypes + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_zlib__decoder__dictionary_id( +- const wuffs_zlib__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_zlib__decoder__add_dictionary( +- wuffs_zlib__decoder* self, +- wuffs_base__slice_u8 a_dict); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_zlib__decoder__get_quirk( +- const wuffs_zlib__decoder* self, ++wuffs_nie__decoder__get_quirk( ++ const wuffs_nie__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_zlib__decoder__set_quirk( +- wuffs_zlib__decoder* self, ++wuffs_nie__decoder__set_quirk( ++ wuffs_nie__decoder* self, + uint32_t a_key, + uint64_t a_value); + ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_image_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_frame_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_frame( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_nie__decoder__frame_dirty_rect( ++ const wuffs_nie__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_nie__decoder__num_animation_loops( ++ const wuffs_nie__decoder* self); ++ + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_zlib__decoder__history_retain_length( +- const wuffs_zlib__decoder* self); ++wuffs_nie__decoder__num_decoded_frame_configs( ++ const wuffs_nie__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_zlib__decoder__workbuf_len( +- const wuffs_zlib__decoder* self); ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_nie__decoder__num_decoded_frames( ++ const wuffs_nie__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_zlib__decoder__transform_io( +- wuffs_zlib__decoder* self, ++wuffs_nie__decoder__restart_frame( ++ wuffs_nie__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_nie__decoder__set_report_metadata( ++ wuffs_nie__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__tell_me_more( ++ wuffs_nie__decoder* self, + wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_nie__decoder__workbuf_len( ++ const wuffs_nie__decoder* self); + + #ifdef __cplusplus + } // extern "C" +@@ -11017,7 +11779,7 @@ wuffs_zlib__decoder__transform_io( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_zlib__decoder__struct { ++struct wuffs_nie__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -11028,20 +11790,336 @@ struct wuffs_zlib__decoder__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; +- wuffs_base__vtable vtable_for__wuffs_base__io_transformer; ++ wuffs_base__vtable vtable_for__wuffs_base__image_decoder; + wuffs_base__vtable null_vtable; + +- bool f_bad_call_sequence; +- bool f_header_complete; ++ uint32_t f_pixfmt; ++ uint32_t f_width; ++ uint32_t f_height; ++ uint8_t f_call_sequence; ++ uint32_t f_dst_x; ++ uint32_t f_dst_y; ++ wuffs_base__pixel_swizzler f_swizzler; ++ ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ } private_impl; ++ ++ struct { ++ struct { ++ uint64_t scratch; ++ } s_do_decode_image_config; ++ } private_data; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++ ++ // On failure, the alloc_etc functions return nullptr. They don't throw. ++ ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_nie__decoder__alloc()); ++ } ++ ++ static inline wuffs_base__image_decoder::unique_ptr ++ alloc_as__wuffs_base__image_decoder() { ++ return wuffs_base__image_decoder::unique_ptr( ++ wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder()); ++ } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_nie__decoder__struct() = delete; ++ wuffs_nie__decoder__struct(const wuffs_nie__decoder__struct&) = delete; ++ wuffs_nie__decoder__struct& operator=( ++ const wuffs_nie__decoder__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) ++ ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_nie__decoder__initialize( ++ this, sizeof_star_self, wuffs_version, options); ++ } ++ ++ inline wuffs_base__image_decoder* ++ upcast_as__wuffs_base__image_decoder() { ++ return (wuffs_base__image_decoder*)this; ++ } ++ ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_nie__decoder__get_quirk(this, a_key); ++ } ++ ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_nie__decoder__set_quirk(this, a_key, a_value); ++ } ++ ++ inline wuffs_base__status ++ decode_image_config( ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_nie__decoder__decode_image_config(this, a_dst, a_src); ++ } ++ ++ inline wuffs_base__status ++ decode_frame_config( ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_nie__decoder__decode_frame_config(this, a_dst, a_src); ++ } ++ ++ inline wuffs_base__status ++ decode_frame( ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ return wuffs_nie__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ } ++ ++ inline wuffs_base__rect_ie_u32 ++ frame_dirty_rect() const { ++ return wuffs_nie__decoder__frame_dirty_rect(this); ++ } ++ ++ inline uint32_t ++ num_animation_loops() const { ++ return wuffs_nie__decoder__num_animation_loops(this); ++ } ++ ++ inline uint64_t ++ num_decoded_frame_configs() const { ++ return wuffs_nie__decoder__num_decoded_frame_configs(this); ++ } ++ ++ inline uint64_t ++ num_decoded_frames() const { ++ return wuffs_nie__decoder__num_decoded_frames(this); ++ } ++ ++ inline wuffs_base__status ++ restart_frame( ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ return wuffs_nie__decoder__restart_frame(this, a_index, a_io_position); ++ } ++ ++ inline wuffs_base__empty_struct ++ set_report_metadata( ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_nie__decoder__set_report_metadata(this, a_fourcc, a_report); ++ } ++ ++ inline wuffs_base__status ++ tell_me_more( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_nie__decoder__tell_me_more(this, a_dst, a_minfo, a_src); ++ } ++ ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_nie__decoder__workbuf_len(this); ++ } ++ ++#endif // __cplusplus ++}; // struct wuffs_nie__decoder__struct ++ ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) || defined(WUFFS_NONMONOLITHIC) ++ ++// ---------------- Status Codes ++ ++extern const char wuffs_zlib__note__dictionary_required[]; ++extern const char wuffs_zlib__error__bad_checksum[]; ++extern const char wuffs_zlib__error__bad_compression_method[]; ++extern const char wuffs_zlib__error__bad_compression_window_size[]; ++extern const char wuffs_zlib__error__bad_parity_check[]; ++extern const char wuffs_zlib__error__incorrect_dictionary[]; ++extern const char wuffs_zlib__error__truncated_input[]; ++ ++// ---------------- Public Consts ++ ++#define WUFFS_ZLIB__QUIRK_JUST_RAW_DEFLATE 2113790976u ++ ++#define WUFFS_ZLIB__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u ++ ++#define WUFFS_ZLIB__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u ++ ++// ---------------- Struct Declarations ++ ++typedef struct wuffs_zlib__decoder__struct wuffs_zlib__decoder; ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++// ---------------- Public Initializer Prototypes ++ ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_zlib__decoder__initialize( ++ wuffs_zlib__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); ++ ++size_t ++sizeof__wuffs_zlib__decoder(void); ++ ++// ---------------- Allocs ++ ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. ++ ++wuffs_zlib__decoder* ++wuffs_zlib__decoder__alloc(void); ++ ++static inline wuffs_base__io_transformer* ++wuffs_zlib__decoder__alloc_as__wuffs_base__io_transformer(void) { ++ return (wuffs_base__io_transformer*)(wuffs_zlib__decoder__alloc()); ++} ++ ++// ---------------- Upcasts ++ ++static inline wuffs_base__io_transformer* ++wuffs_zlib__decoder__upcast_as__wuffs_base__io_transformer( ++ wuffs_zlib__decoder* p) { ++ return (wuffs_base__io_transformer*)p; ++} ++ ++// ---------------- Public Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_zlib__decoder__dictionary_id( ++ const wuffs_zlib__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_zlib__decoder__add_dictionary( ++ wuffs_zlib__decoder* self, ++ wuffs_base__slice_u8 a_dict); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_zlib__decoder__get_quirk( ++ const wuffs_zlib__decoder* self, ++ uint32_t a_key); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_zlib__decoder__set_quirk( ++ wuffs_zlib__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_zlib__decoder__dst_history_retain_length( ++ const wuffs_zlib__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_zlib__decoder__workbuf_len( ++ const wuffs_zlib__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_zlib__decoder__transform_io( ++ wuffs_zlib__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++#ifdef __cplusplus ++} // extern "C" ++#endif ++ ++// ---------------- Struct Definitions ++ ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C ++ ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_zlib__decoder__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. ++ ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__io_transformer; ++ wuffs_base__vtable null_vtable; ++ ++ bool f_bad_call_sequence; ++ bool f_header_complete; + bool f_got_dictionary; + bool f_want_dictionary; + bool f_quirks[1]; + bool f_ignore_checksum; +- uint32_t f_dict_id_got; ++ uint32_t f_dict_id_have; + uint32_t f_dict_id_want; + +- uint32_t p_transform_io[1]; +- uint32_t p_do_transform_io[1]; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; + } private_impl; + + struct { +@@ -11050,9 +12128,9 @@ struct wuffs_zlib__decoder__struct { + wuffs_deflate__decoder f_flate; + + struct { +- uint32_t v_checksum_got; ++ uint32_t v_checksum_have; + uint64_t scratch; +- } s_do_transform_io[1]; ++ } s_do_transform_io; + } private_data; + + #ifdef __cplusplus +@@ -11141,9 +12219,9 @@ struct wuffs_zlib__decoder__struct { + return wuffs_zlib__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_zlib__decoder__history_retain_length(this); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_zlib__decoder__dst_history_retain_length(this); + } + + inline wuffs_base__range_ii_u64 +@@ -11184,11 +12262,9 @@ extern const char wuffs_png__error__unsupported_png_file[]; + + // ---------------- Public Consts + +-#define WUFFS_PNG__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_PNG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 2251799562027015u + +-#define WUFFS_PNG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 2251799562027015 +- +-#define WUFFS_PNG__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 8 ++#define WUFFS_PNG__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 8u + + // ---------------- Struct Declarations + +@@ -11321,11 +12397,6 @@ wuffs_png__decoder__tell_me_more( + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_png__decoder__history_retain_length( +- const wuffs_png__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_png__decoder__workbuf_len( +@@ -11438,26 +12509,26 @@ struct wuffs_png__decoder__struct { + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_ihdr[1]; +- uint32_t p_decode_other_chunk[1]; +- uint32_t p_decode_actl[1]; +- uint32_t p_decode_chrm[1]; +- uint32_t p_decode_fctl[1]; +- uint32_t p_decode_gama[1]; +- uint32_t p_decode_iccp[1]; +- uint32_t p_decode_plte[1]; +- uint32_t p_decode_srgb[1]; +- uint32_t p_decode_trns[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_skip_frame[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; +- uint32_t p_decode_pass[1]; +- uint32_t p_tell_me_more[1]; +- uint32_t p_do_tell_me_more[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_ihdr; ++ uint32_t p_decode_other_chunk; ++ uint32_t p_decode_actl; ++ uint32_t p_decode_chrm; ++ uint32_t p_decode_fctl; ++ uint32_t p_decode_gama; ++ uint32_t p_decode_iccp; ++ uint32_t p_decode_plte; ++ uint32_t p_decode_srgb; ++ uint32_t p_decode_trns; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_skip_frame; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_decode_pass; ++ uint32_t p_tell_me_more; ++ uint32_t p_do_tell_me_more; + wuffs_base__status (*choosy_filter_and_swizzle)( + wuffs_png__decoder* self, + wuffs_base__pixel_buffer* a_dst, +@@ -11473,54 +12544,54 @@ struct wuffs_png__decoder__struct { + struct { + uint32_t v_checksum_have; + uint64_t scratch; +- } s_do_decode_image_config[1]; ++ } s_do_decode_image_config; + struct { + uint64_t scratch; +- } s_decode_ihdr[1]; ++ } s_decode_ihdr; + struct { + uint64_t scratch; +- } s_decode_other_chunk[1]; ++ } s_decode_other_chunk; + struct { + uint64_t scratch; +- } s_decode_actl[1]; ++ } s_decode_actl; + struct { + uint64_t scratch; +- } s_decode_chrm[1]; ++ } s_decode_chrm; + struct { + uint32_t v_x0; + uint32_t v_x1; + uint32_t v_y1; + uint64_t scratch; +- } s_decode_fctl[1]; ++ } s_decode_fctl; + struct { + uint64_t scratch; +- } s_decode_gama[1]; ++ } s_decode_gama; + struct { + uint32_t v_num_entries; + uint32_t v_i; + uint64_t scratch; +- } s_decode_plte[1]; ++ } s_decode_plte; + struct { + uint32_t v_i; + uint32_t v_n; + uint64_t scratch; +- } s_decode_trns[1]; ++ } s_decode_trns; + struct { + uint64_t scratch; +- } s_do_decode_frame_config[1]; ++ } s_do_decode_frame_config; + struct { + uint64_t scratch; +- } s_skip_frame[1]; ++ } s_skip_frame; + struct { + uint64_t scratch; +- } s_do_decode_frame[1]; ++ } s_do_decode_frame; + struct { + uint64_t scratch; +- } s_decode_pass[1]; ++ } s_decode_pass; + struct { + wuffs_base__status v_zlib_status; + uint64_t scratch; +- } s_do_tell_me_more[1]; ++ } s_do_tell_me_more; + } private_data; + + #ifdef __cplusplus +@@ -11664,11 +12735,6 @@ struct wuffs_png__decoder__struct { + return wuffs_png__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_png__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_png__decoder__workbuf_len(this); +@@ -11681,24 +12747,21 @@ struct wuffs_png__decoder__struct { + + #endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +-extern const char wuffs_tga__error__bad_header[]; +-extern const char wuffs_tga__error__bad_run_length_encoding[]; +-extern const char wuffs_tga__error__truncated_input[]; +-extern const char wuffs_tga__error__unsupported_tga_file[]; ++extern const char wuffs_qoi__error__bad_footer[]; ++extern const char wuffs_qoi__error__bad_header[]; ++extern const char wuffs_qoi__error__truncated_input[]; + + // ---------------- Public Consts + +-#define WUFFS_TGA__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 +- +-#define WUFFS_TGA__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_QOI__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + + // ---------------- Struct Declarations + +-typedef struct wuffs_tga__decoder__struct wuffs_tga__decoder; ++typedef struct wuffs_qoi__decoder__struct wuffs_qoi__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -11713,14 +12776,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_tga__decoder__initialize( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__initialize( ++ wuffs_qoi__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_tga__decoder(void); ++sizeof__wuffs_qoi__decoder(void); + + // ---------------- Allocs + +@@ -11730,19 +12793,19 @@ sizeof__wuffs_tga__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_tga__decoder* +-wuffs_tga__decoder__alloc(void); ++wuffs_qoi__decoder* ++wuffs_qoi__decoder__alloc(void); + + static inline wuffs_base__image_decoder* +-wuffs_tga__decoder__alloc_as__wuffs_base__image_decoder(void) { +- return (wuffs_base__image_decoder*)(wuffs_tga__decoder__alloc()); ++wuffs_qoi__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_qoi__decoder__alloc()); + } + + // ---------------- Upcasts + + static inline wuffs_base__image_decoder* +-wuffs_tga__decoder__upcast_as__wuffs_base__image_decoder( +- wuffs_tga__decoder* p) { ++wuffs_qoi__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_qoi__decoder* p) { + return (wuffs_base__image_decoder*)p; + } + +@@ -11750,35 +12813,35 @@ wuffs_tga__decoder__upcast_as__wuffs_base__image_decoder( + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__get_quirk( +- const wuffs_tga__decoder* self, ++wuffs_qoi__decoder__get_quirk( ++ const wuffs_qoi__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__set_quirk( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__set_quirk( ++ wuffs_qoi__decoder* self, + uint32_t a_key, + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_image_config( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__decode_image_config( ++ wuffs_qoi__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_frame_config( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__decode_frame_config( ++ wuffs_qoi__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_frame( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__decode_frame( ++ wuffs_qoi__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, +@@ -11787,55 +12850,50 @@ wuffs_tga__decoder__decode_frame( + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_tga__decoder__frame_dirty_rect( +- const wuffs_tga__decoder* self); ++wuffs_qoi__decoder__frame_dirty_rect( ++ const wuffs_qoi__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_tga__decoder__num_animation_loops( +- const wuffs_tga__decoder* self); ++wuffs_qoi__decoder__num_animation_loops( ++ const wuffs_qoi__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__num_decoded_frame_configs( +- const wuffs_tga__decoder* self); ++wuffs_qoi__decoder__num_decoded_frame_configs( ++ const wuffs_qoi__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__num_decoded_frames( +- const wuffs_tga__decoder* self); ++wuffs_qoi__decoder__num_decoded_frames( ++ const wuffs_qoi__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__restart_frame( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__restart_frame( ++ wuffs_qoi__decoder* self, + uint64_t a_index, + uint64_t a_io_position); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_tga__decoder__set_report_metadata( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__set_report_metadata( ++ wuffs_qoi__decoder* self, + uint32_t a_fourcc, + bool a_report); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__tell_me_more( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__tell_me_more( ++ wuffs_qoi__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__history_retain_length( +- const wuffs_tga__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_tga__decoder__workbuf_len( +- const wuffs_tga__decoder* self); ++wuffs_qoi__decoder__workbuf_len( ++ const wuffs_qoi__decoder* self); + + #ifdef __cplusplus + } // extern "C" +@@ -11850,7 +12908,7 @@ wuffs_tga__decoder__workbuf_len( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_tga__decoder__struct { ++struct wuffs_qoi__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -11864,69 +12922,58 @@ struct wuffs_tga__decoder__struct { + wuffs_base__vtable vtable_for__wuffs_base__image_decoder; + wuffs_base__vtable null_vtable; + ++ uint32_t f_pixfmt; + uint32_t f_width; + uint32_t f_height; ++ uint64_t f_remaining_pixels_times_4; + uint8_t f_call_sequence; +- uint8_t f_header_id_length; +- uint8_t f_header_color_map_type; +- uint8_t f_header_image_type; +- uint16_t f_header_color_map_first_entry_index; +- uint16_t f_header_color_map_length; +- uint8_t f_header_color_map_entry_size; +- uint8_t f_header_pixel_depth; +- uint8_t f_header_image_descriptor; +- bool f_opaque; +- uint32_t f_scratch_bytes_per_pixel; +- uint32_t f_src_bytes_per_pixel; +- uint32_t f_src_pixfmt; +- uint64_t f_frame_config_io_position; ++ uint32_t f_buffer_index; ++ uint32_t f_dst_x; ++ uint32_t f_dst_y; + wuffs_base__pixel_swizzler f_swizzler; + +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_from_src_to_buffer; + } private_impl; + + struct { +- uint8_t f_dst_palette[1024]; +- uint8_t f_src_palette[1024]; +- uint8_t f_scratch[4]; ++ uint8_t f_pixel[4]; ++ uint8_t f_cache[256]; ++ uint8_t f_buffer[8196]; + + struct { +- uint32_t v_i; + uint64_t scratch; +- } s_do_decode_image_config[1]; ++ } s_do_decode_image_config; + struct { +- uint64_t v_dst_bytes_per_pixel; +- uint32_t v_dst_x; +- uint32_t v_dst_y; +- uint64_t v_mark; +- uint32_t v_num_pixels32; +- uint32_t v_lit_length; +- uint32_t v_run_length; +- uint64_t v_num_dst_bytes; + uint64_t scratch; +- } s_do_decode_frame[1]; ++ } s_do_decode_frame; ++ struct { ++ uint8_t v_dg; ++ uint32_t v_bi; ++ uint32_t v_bk; ++ } s_from_src_to_buffer; + } private_data; + + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_tga__decoder__alloc()); ++ return unique_ptr(wuffs_qoi__decoder__alloc()); + } + + static inline wuffs_base__image_decoder::unique_ptr + alloc_as__wuffs_base__image_decoder() { + return wuffs_base__image_decoder::unique_ptr( +- wuffs_tga__decoder__alloc_as__wuffs_base__image_decoder()); ++ wuffs_qoi__decoder__alloc_as__wuffs_base__image_decoder()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -11942,10 +12989,10 @@ struct wuffs_tga__decoder__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_tga__decoder__struct() = delete; +- wuffs_tga__decoder__struct(const wuffs_tga__decoder__struct&) = delete; +- wuffs_tga__decoder__struct& operator=( +- const wuffs_tga__decoder__struct&) = delete; ++ wuffs_qoi__decoder__struct() = delete; ++ wuffs_qoi__decoder__struct(const wuffs_qoi__decoder__struct&) = delete; ++ wuffs_qoi__decoder__struct& operator=( ++ const wuffs_qoi__decoder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -11965,7 +13012,7 @@ struct wuffs_tga__decoder__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_tga__decoder__initialize( ++ return wuffs_qoi__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +@@ -11977,28 +13024,28 @@ struct wuffs_tga__decoder__struct { + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_tga__decoder__get_quirk(this, a_key); ++ return wuffs_qoi__decoder__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_tga__decoder__set_quirk(this, a_key, a_value); ++ return wuffs_qoi__decoder__set_quirk(this, a_key, a_value); + } + + inline wuffs_base__status + decode_image_config( + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { +- return wuffs_tga__decoder__decode_image_config(this, a_dst, a_src); ++ return wuffs_qoi__decoder__decode_image_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame_config( + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { +- return wuffs_tga__decoder__decode_frame_config(this, a_dst, a_src); ++ return wuffs_qoi__decoder__decode_frame_config(this, a_dst, a_src); + } + + inline wuffs_base__status +@@ -12008,41 +13055,41 @@ struct wuffs_tga__decoder__struct { + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { +- return wuffs_tga__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ return wuffs_qoi__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); + } + + inline wuffs_base__rect_ie_u32 + frame_dirty_rect() const { +- return wuffs_tga__decoder__frame_dirty_rect(this); ++ return wuffs_qoi__decoder__frame_dirty_rect(this); + } + + inline uint32_t + num_animation_loops() const { +- return wuffs_tga__decoder__num_animation_loops(this); ++ return wuffs_qoi__decoder__num_animation_loops(this); + } + + inline uint64_t + num_decoded_frame_configs() const { +- return wuffs_tga__decoder__num_decoded_frame_configs(this); ++ return wuffs_qoi__decoder__num_decoded_frame_configs(this); + } + + inline uint64_t + num_decoded_frames() const { +- return wuffs_tga__decoder__num_decoded_frames(this); ++ return wuffs_qoi__decoder__num_decoded_frames(this); + } + + inline wuffs_base__status + restart_frame( + uint64_t a_index, + uint64_t a_io_position) { +- return wuffs_tga__decoder__restart_frame(this, a_index, a_io_position); ++ return wuffs_qoi__decoder__restart_frame(this, a_index, a_io_position); + } + + inline wuffs_base__empty_struct + set_report_metadata( + uint32_t a_fourcc, + bool a_report) { +- return wuffs_tga__decoder__set_report_metadata(this, a_fourcc, a_report); ++ return wuffs_qoi__decoder__set_report_metadata(this, a_fourcc, a_report); + } + + inline wuffs_base__status +@@ -12050,42 +13097,30 @@ struct wuffs_tga__decoder__struct { + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { +- return wuffs_tga__decoder__tell_me_more(this, a_dst, a_minfo, a_src); +- } +- +- inline uint64_t +- history_retain_length() const { +- return wuffs_tga__decoder__history_retain_length(this); ++ return wuffs_qoi__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { +- return wuffs_tga__decoder__workbuf_len(this); ++ return wuffs_qoi__decoder__workbuf_len(this); + } + + #endif // __cplusplus +-}; // struct wuffs_tga__decoder__struct ++}; // struct wuffs_qoi__decoder__struct + + #endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) || defined(WUFFS_NONMONOLITHIC) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +-extern const char wuffs_wbmp__error__bad_header[]; +-extern const char wuffs_wbmp__error__truncated_input[]; +- + // ---------------- Public Consts + +-#define WUFFS_WBMP__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 +- +-#define WUFFS_WBMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 +- + // ---------------- Struct Declarations + +-typedef struct wuffs_wbmp__decoder__struct wuffs_wbmp__decoder; ++typedef struct wuffs_sha256__hasher__struct wuffs_sha256__hasher; + + #ifdef __cplusplus + extern "C" { +@@ -12100,14 +13135,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_wbmp__decoder__initialize( +- wuffs_wbmp__decoder* self, ++wuffs_sha256__hasher__initialize( ++ wuffs_sha256__hasher* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_wbmp__decoder(void); ++sizeof__wuffs_sha256__hasher(void); + + // ---------------- Allocs + +@@ -12117,112 +13152,53 @@ sizeof__wuffs_wbmp__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_wbmp__decoder* +-wuffs_wbmp__decoder__alloc(void); ++wuffs_sha256__hasher* ++wuffs_sha256__hasher__alloc(void); + +-static inline wuffs_base__image_decoder* +-wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder(void) { +- return (wuffs_base__image_decoder*)(wuffs_wbmp__decoder__alloc()); ++static inline wuffs_base__hasher_bitvec256* ++wuffs_sha256__hasher__alloc_as__wuffs_base__hasher_bitvec256(void) { ++ return (wuffs_base__hasher_bitvec256*)(wuffs_sha256__hasher__alloc()); + } + + // ---------------- Upcasts + +-static inline wuffs_base__image_decoder* +-wuffs_wbmp__decoder__upcast_as__wuffs_base__image_decoder( +- wuffs_wbmp__decoder* p) { +- return (wuffs_base__image_decoder*)p; ++static inline wuffs_base__hasher_bitvec256* ++wuffs_sha256__hasher__upcast_as__wuffs_base__hasher_bitvec256( ++ wuffs_sha256__hasher* p) { ++ return (wuffs_base__hasher_bitvec256*)p; + } + + // ---------------- Public Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__get_quirk( +- const wuffs_wbmp__decoder* self, ++wuffs_sha256__hasher__get_quirk( ++ const wuffs_sha256__hasher* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__set_quirk( +- wuffs_wbmp__decoder* self, ++wuffs_sha256__hasher__set_quirk( ++ wuffs_sha256__hasher* self, + uint32_t a_key, + uint64_t a_value); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_image_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_frame_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_frame( +- wuffs_wbmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_wbmp__decoder__frame_dirty_rect( +- const wuffs_wbmp__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_wbmp__decoder__num_animation_loops( +- const wuffs_wbmp__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__num_decoded_frame_configs( +- const wuffs_wbmp__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__num_decoded_frames( +- const wuffs_wbmp__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__restart_frame( +- wuffs_wbmp__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_wbmp__decoder__set_report_metadata( +- wuffs_wbmp__decoder* self, +- uint32_t a_fourcc, +- bool a_report); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__tell_me_more( +- wuffs_wbmp__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src); ++wuffs_sha256__hasher__update( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__history_retain_length( +- const wuffs_wbmp__decoder* self); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_sha256__hasher__update_bitvec256( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_wbmp__decoder__workbuf_len( +- const wuffs_wbmp__decoder* self); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_sha256__hasher__checksum_bitvec256( ++ const wuffs_sha256__hasher* self); + + #ifdef __cplusplus + } // extern "C" +@@ -12237,7 +13213,7 @@ wuffs_wbmp__decoder__workbuf_len( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_wbmp__decoder__struct { ++struct wuffs_sha256__hasher__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -12248,52 +13224,41 @@ struct wuffs_wbmp__decoder__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; +- wuffs_base__vtable vtable_for__wuffs_base__image_decoder; ++ wuffs_base__vtable vtable_for__wuffs_base__hasher_bitvec256; + wuffs_base__vtable null_vtable; + +- uint32_t f_width; +- uint32_t f_height; +- uint8_t f_call_sequence; +- uint64_t f_frame_config_io_position; +- wuffs_base__pixel_swizzler f_swizzler; +- +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; ++ uint64_t f_length_modulo_u64; ++ bool f_length_overflows_u64; ++ uint8_t f_padding0; ++ uint8_t f_padding1; ++ uint8_t f_padding2; ++ uint32_t f_buf_len; ++ uint8_t f_buf_data[64]; ++ uint32_t f_h0; ++ uint32_t f_h1; ++ uint32_t f_h2; ++ uint32_t f_h3; ++ uint32_t f_h4; ++ uint32_t f_h5; ++ uint32_t f_h6; ++ uint32_t f_h7; + } private_impl; + +- struct { +- struct { +- uint32_t v_i; +- uint32_t v_p; +- } s_do_decode_image_config[1]; +- struct { +- uint64_t v_dst_bytes_per_pixel; +- uint32_t v_dst_x; +- uint32_t v_dst_y; +- uint8_t v_src[1]; +- uint8_t v_c; +- } s_do_decode_frame[1]; +- } private_data; +- + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_wbmp__decoder__alloc()); ++ return unique_ptr(wuffs_sha256__hasher__alloc()); + } + +- static inline wuffs_base__image_decoder::unique_ptr +- alloc_as__wuffs_base__image_decoder() { +- return wuffs_base__image_decoder::unique_ptr( +- wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder()); ++ static inline wuffs_base__hasher_bitvec256::unique_ptr ++ alloc_as__wuffs_base__hasher_bitvec256() { ++ return wuffs_base__hasher_bitvec256::unique_ptr( ++ wuffs_sha256__hasher__alloc_as__wuffs_base__hasher_bitvec256()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -12309,10 +13274,10 @@ struct wuffs_wbmp__decoder__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_wbmp__decoder__struct() = delete; +- wuffs_wbmp__decoder__struct(const wuffs_wbmp__decoder__struct&) = delete; +- wuffs_wbmp__decoder__struct& operator=( +- const wuffs_wbmp__decoder__struct&) = delete; ++ wuffs_sha256__hasher__struct() = delete; ++ wuffs_sha256__hasher__struct(const wuffs_sha256__hasher__struct&) = delete; ++ wuffs_sha256__hasher__struct& operator=( ++ const wuffs_sha256__hasher__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -12332,120 +13297,68 @@ struct wuffs_wbmp__decoder__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_wbmp__decoder__initialize( ++ return wuffs_sha256__hasher__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +- inline wuffs_base__image_decoder* +- upcast_as__wuffs_base__image_decoder() { +- return (wuffs_base__image_decoder*)this; ++ inline wuffs_base__hasher_bitvec256* ++ upcast_as__wuffs_base__hasher_bitvec256() { ++ return (wuffs_base__hasher_bitvec256*)this; + } + + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_wbmp__decoder__get_quirk(this, a_key); ++ return wuffs_sha256__hasher__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_wbmp__decoder__set_quirk(this, a_key, a_value); +- } +- +- inline wuffs_base__status +- decode_image_config( +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- return wuffs_wbmp__decoder__decode_image_config(this, a_dst, a_src); +- } +- +- inline wuffs_base__status +- decode_frame_config( +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- return wuffs_wbmp__decoder__decode_frame_config(this, a_dst, a_src); +- } +- +- inline wuffs_base__status +- decode_frame( +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- return wuffs_wbmp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); +- } +- +- inline wuffs_base__rect_ie_u32 +- frame_dirty_rect() const { +- return wuffs_wbmp__decoder__frame_dirty_rect(this); +- } +- +- inline uint32_t +- num_animation_loops() const { +- return wuffs_wbmp__decoder__num_animation_loops(this); +- } +- +- inline uint64_t +- num_decoded_frame_configs() const { +- return wuffs_wbmp__decoder__num_decoded_frame_configs(this); +- } +- +- inline uint64_t +- num_decoded_frames() const { +- return wuffs_wbmp__decoder__num_decoded_frames(this); +- } +- +- inline wuffs_base__status +- restart_frame( +- uint64_t a_index, +- uint64_t a_io_position) { +- return wuffs_wbmp__decoder__restart_frame(this, a_index, a_io_position); ++ return wuffs_sha256__hasher__set_quirk(this, a_key, a_value); + } + + inline wuffs_base__empty_struct +- set_report_metadata( +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_wbmp__decoder__set_report_metadata(this, a_fourcc, a_report); +- } +- +- inline wuffs_base__status +- tell_me_more( +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- return wuffs_wbmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src); ++ update( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_sha256__hasher__update(this, a_x); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_wbmp__decoder__history_retain_length(this); ++ inline wuffs_base__bitvec256 ++ update_bitvec256( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_sha256__hasher__update_bitvec256(this, a_x); + } + +- inline wuffs_base__range_ii_u64 +- workbuf_len() const { +- return wuffs_wbmp__decoder__workbuf_len(this); ++ inline wuffs_base__bitvec256 ++ checksum_bitvec256() const { ++ return wuffs_sha256__hasher__checksum_bitvec256(this); + } + + #endif // __cplusplus +-}; // struct wuffs_wbmp__decoder__struct ++}; // struct wuffs_sha256__hasher__struct + + #endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + ++extern const char wuffs_tga__error__bad_header[]; ++extern const char wuffs_tga__error__bad_run_length_encoding[]; ++extern const char wuffs_tga__error__truncated_input[]; ++extern const char wuffs_tga__error__unsupported_tga_file[]; ++ + // ---------------- Public Consts + ++#define WUFFS_TGA__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u ++ + // ---------------- Struct Declarations + +-typedef struct wuffs_xxhash32__hasher__struct wuffs_xxhash32__hasher; ++typedef struct wuffs_tga__decoder__struct wuffs_tga__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -12460,14 +13373,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_xxhash32__hasher__initialize( +- wuffs_xxhash32__hasher* self, ++wuffs_tga__decoder__initialize( ++ wuffs_tga__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_xxhash32__hasher(void); ++sizeof__wuffs_tga__decoder(void); + + // ---------------- Allocs + +@@ -12477,53 +13390,107 @@ sizeof__wuffs_xxhash32__hasher(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_xxhash32__hasher* +-wuffs_xxhash32__hasher__alloc(void); ++wuffs_tga__decoder* ++wuffs_tga__decoder__alloc(void); + +-static inline wuffs_base__hasher_u32* +-wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32(void) { +- return (wuffs_base__hasher_u32*)(wuffs_xxhash32__hasher__alloc()); ++static inline wuffs_base__image_decoder* ++wuffs_tga__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_tga__decoder__alloc()); + } + + // ---------------- Upcasts + +-static inline wuffs_base__hasher_u32* +-wuffs_xxhash32__hasher__upcast_as__wuffs_base__hasher_u32( +- wuffs_xxhash32__hasher* p) { +- return (wuffs_base__hasher_u32*)p; ++static inline wuffs_base__image_decoder* ++wuffs_tga__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_tga__decoder* p) { ++ return (wuffs_base__image_decoder*)p; + } + + // ---------------- Public Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash32__hasher__get_quirk( +- const wuffs_xxhash32__hasher* self, ++wuffs_tga__decoder__get_quirk( ++ const wuffs_tga__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_xxhash32__hasher__set_quirk( +- wuffs_xxhash32__hasher* self, ++wuffs_tga__decoder__set_quirk( ++ wuffs_tga__decoder* self, + uint32_t a_key, + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_xxhash32__hasher__update( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_image_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_xxhash32__hasher__update_u32( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_frame_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_frame( ++ wuffs_tga__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_tga__decoder__frame_dirty_rect( ++ const wuffs_tga__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_xxhash32__hasher__checksum_u32( +- const wuffs_xxhash32__hasher* self); ++wuffs_tga__decoder__num_animation_loops( ++ const wuffs_tga__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_tga__decoder__num_decoded_frame_configs( ++ const wuffs_tga__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_tga__decoder__num_decoded_frames( ++ const wuffs_tga__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__restart_frame( ++ wuffs_tga__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_tga__decoder__set_report_metadata( ++ wuffs_tga__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__tell_me_more( ++ wuffs_tga__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_tga__decoder__workbuf_len( ++ const wuffs_tga__decoder* self); + + #ifdef __cplusplus + } // extern "C" +@@ -12538,7 +13505,7 @@ wuffs_xxhash32__hasher__checksum_u32( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_xxhash32__hasher__struct { ++struct wuffs_tga__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -12549,36 +13516,72 @@ struct wuffs_xxhash32__hasher__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; +- wuffs_base__vtable vtable_for__wuffs_base__hasher_u32; ++ wuffs_base__vtable vtable_for__wuffs_base__image_decoder; + wuffs_base__vtable null_vtable; + +- uint32_t f_length_modulo_u32; +- bool f_length_overflows_u32; +- uint8_t f_padding0; +- uint8_t f_padding1; +- uint8_t f_buf_len; +- uint8_t f_buf_data[16]; +- uint32_t f_v0; +- uint32_t f_v1; +- uint32_t f_v2; +- uint32_t f_v3; ++ uint32_t f_width; ++ uint32_t f_height; ++ uint8_t f_call_sequence; ++ uint8_t f_header_id_length; ++ uint8_t f_header_color_map_type; ++ uint8_t f_header_image_type; ++ uint16_t f_header_color_map_first_entry_index; ++ uint16_t f_header_color_map_length; ++ uint8_t f_header_color_map_entry_size; ++ uint8_t f_header_pixel_depth; ++ uint8_t f_header_image_descriptor; ++ bool f_opaque; ++ uint32_t f_scratch_bytes_per_pixel; ++ uint32_t f_src_bytes_per_pixel; ++ uint32_t f_src_pixfmt; ++ uint64_t f_frame_config_io_position; ++ wuffs_base__pixel_swizzler f_swizzler; ++ ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; + } private_impl; + ++ struct { ++ uint8_t f_dst_palette[1024]; ++ uint8_t f_src_palette[1024]; ++ uint8_t f_scratch[4]; ++ ++ struct { ++ uint32_t v_i; ++ uint64_t scratch; ++ } s_do_decode_image_config; ++ struct { ++ uint64_t v_dst_bytes_per_pixel; ++ uint32_t v_dst_x; ++ uint32_t v_dst_y; ++ uint64_t v_mark; ++ uint32_t v_num_pixels32; ++ uint32_t v_lit_length; ++ uint32_t v_run_length; ++ uint64_t v_num_dst_bytes; ++ uint64_t scratch; ++ } s_do_decode_frame; ++ } private_data; ++ + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_xxhash32__hasher__alloc()); ++ return unique_ptr(wuffs_tga__decoder__alloc()); + } + +- static inline wuffs_base__hasher_u32::unique_ptr +- alloc_as__wuffs_base__hasher_u32() { +- return wuffs_base__hasher_u32::unique_ptr( +- wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32()); ++ static inline wuffs_base__image_decoder::unique_ptr ++ alloc_as__wuffs_base__image_decoder() { ++ return wuffs_base__image_decoder::unique_ptr( ++ wuffs_tga__decoder__alloc_as__wuffs_base__image_decoder()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -12594,10 +13597,10 @@ struct wuffs_xxhash32__hasher__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_xxhash32__hasher__struct() = delete; +- wuffs_xxhash32__hasher__struct(const wuffs_xxhash32__hasher__struct&) = delete; +- wuffs_xxhash32__hasher__struct& operator=( +- const wuffs_xxhash32__hasher__struct&) = delete; ++ wuffs_tga__decoder__struct() = delete; ++ wuffs_tga__decoder__struct(const wuffs_tga__decoder__struct&) = delete; ++ wuffs_tga__decoder__struct& operator=( ++ const wuffs_tga__decoder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -12617,53 +13620,107 @@ struct wuffs_xxhash32__hasher__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_xxhash32__hasher__initialize( ++ return wuffs_tga__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +- inline wuffs_base__hasher_u32* +- upcast_as__wuffs_base__hasher_u32() { +- return (wuffs_base__hasher_u32*)this; ++ inline wuffs_base__image_decoder* ++ upcast_as__wuffs_base__image_decoder() { ++ return (wuffs_base__image_decoder*)this; + } + + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_xxhash32__hasher__get_quirk(this, a_key); ++ return wuffs_tga__decoder__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_xxhash32__hasher__set_quirk(this, a_key, a_value); ++ return wuffs_tga__decoder__set_quirk(this, a_key, a_value); + } + +- inline wuffs_base__empty_struct +- update( +- wuffs_base__slice_u8 a_x) { +- return wuffs_xxhash32__hasher__update(this, a_x); ++ inline wuffs_base__status ++ decode_image_config( ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_tga__decoder__decode_image_config(this, a_dst, a_src); + } + +- inline uint32_t +- update_u32( +- wuffs_base__slice_u8 a_x) { +- return wuffs_xxhash32__hasher__update_u32(this, a_x); ++ inline wuffs_base__status ++ decode_frame_config( ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_tga__decoder__decode_frame_config(this, a_dst, a_src); ++ } ++ ++ inline wuffs_base__status ++ decode_frame( ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ return wuffs_tga__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ } ++ ++ inline wuffs_base__rect_ie_u32 ++ frame_dirty_rect() const { ++ return wuffs_tga__decoder__frame_dirty_rect(this); + } + + inline uint32_t +- checksum_u32() const { +- return wuffs_xxhash32__hasher__checksum_u32(this); ++ num_animation_loops() const { ++ return wuffs_tga__decoder__num_animation_loops(this); ++ } ++ ++ inline uint64_t ++ num_decoded_frame_configs() const { ++ return wuffs_tga__decoder__num_decoded_frame_configs(this); ++ } ++ ++ inline uint64_t ++ num_decoded_frames() const { ++ return wuffs_tga__decoder__num_decoded_frames(this); ++ } ++ ++ inline wuffs_base__status ++ restart_frame( ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ return wuffs_tga__decoder__restart_frame(this, a_index, a_io_position); ++ } ++ ++ inline wuffs_base__empty_struct ++ set_report_metadata( ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_tga__decoder__set_report_metadata(this, a_fourcc, a_report); ++ } ++ ++ inline wuffs_base__status ++ tell_me_more( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_tga__decoder__tell_me_more(this, a_dst, a_minfo, a_src); ++ } ++ ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_tga__decoder__workbuf_len(this); + } + + #endif // __cplusplus +-}; // struct wuffs_xxhash32__hasher__struct ++}; // struct wuffs_tga__decoder__struct + + #endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +@@ -12671,7 +13728,7 @@ struct wuffs_xxhash32__hasher__struct { + + // ---------------- Struct Declarations + +-typedef struct wuffs_xxhash64__hasher__struct wuffs_xxhash64__hasher; ++typedef struct wuffs_vp8__placeholder__struct wuffs_vp8__placeholder; + + #ifdef __cplusplus + extern "C" { +@@ -12686,14 +13743,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_xxhash64__hasher__initialize( +- wuffs_xxhash64__hasher* self, ++wuffs_vp8__placeholder__initialize( ++ wuffs_vp8__placeholder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_xxhash64__hasher(void); ++sizeof__wuffs_vp8__placeholder(void); + + // ---------------- Allocs + +@@ -12703,54 +13760,13 @@ sizeof__wuffs_xxhash64__hasher(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_xxhash64__hasher* +-wuffs_xxhash64__hasher__alloc(void); +- +-static inline wuffs_base__hasher_u64* +-wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64(void) { +- return (wuffs_base__hasher_u64*)(wuffs_xxhash64__hasher__alloc()); +-} ++wuffs_vp8__placeholder* ++wuffs_vp8__placeholder__alloc(void); + + // ---------------- Upcasts + +-static inline wuffs_base__hasher_u64* +-wuffs_xxhash64__hasher__upcast_as__wuffs_base__hasher_u64( +- wuffs_xxhash64__hasher* p) { +- return (wuffs_base__hasher_u64*)p; +-} +- + // ---------------- Public Function Prototypes + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__get_quirk( +- const wuffs_xxhash64__hasher* self, +- uint32_t a_key); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_xxhash64__hasher__set_quirk( +- wuffs_xxhash64__hasher* self, +- uint32_t a_key, +- uint64_t a_value); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_xxhash64__hasher__update( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__update_u64( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__checksum_u64( +- const wuffs_xxhash64__hasher* self); +- + #ifdef __cplusplus + } // extern "C" + #endif +@@ -12764,7 +13780,7 @@ wuffs_xxhash64__hasher__checksum_u64( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_xxhash64__hasher__struct { ++struct wuffs_vp8__placeholder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -12775,37 +13791,20 @@ struct wuffs_xxhash64__hasher__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; +- wuffs_base__vtable vtable_for__wuffs_base__hasher_u64; + wuffs_base__vtable null_vtable; + +- uint64_t f_length_modulo_u64; +- bool f_length_overflows_u64; +- uint8_t f_padding0; +- uint8_t f_padding1; +- uint8_t f_padding2; +- uint32_t f_buf_len; +- uint8_t f_buf_data[32]; +- uint64_t f_v0; +- uint64_t f_v1; +- uint64_t f_v2; +- uint64_t f_v3; ++ uint32_t f_placeholder; + } private_impl; + + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_xxhash64__hasher__alloc()); +- } +- +- static inline wuffs_base__hasher_u64::unique_ptr +- alloc_as__wuffs_base__hasher_u64() { +- return wuffs_base__hasher_u64::unique_ptr( +- wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64()); ++ return unique_ptr(wuffs_vp8__placeholder__alloc()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -12821,10 +13820,10 @@ struct wuffs_xxhash64__hasher__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_xxhash64__hasher__struct() = delete; +- wuffs_xxhash64__hasher__struct(const wuffs_xxhash64__hasher__struct&) = delete; +- wuffs_xxhash64__hasher__struct& operator=( +- const wuffs_xxhash64__hasher__struct&) = delete; ++ wuffs_vp8__placeholder__struct() = delete; ++ wuffs_vp8__placeholder__struct(const wuffs_vp8__placeholder__struct&) = delete; ++ wuffs_vp8__placeholder__struct& operator=( ++ const wuffs_vp8__placeholder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -12844,9372 +13843,9377 @@ struct wuffs_xxhash64__hasher__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_xxhash64__hasher__initialize( ++ return wuffs_vp8__placeholder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +- inline wuffs_base__hasher_u64* +- upcast_as__wuffs_base__hasher_u64() { +- return (wuffs_base__hasher_u64*)this; +- } ++#endif // __cplusplus ++}; // struct wuffs_vp8__placeholder__struct + +- inline uint64_t +- get_quirk( +- uint32_t a_key) const { +- return wuffs_xxhash64__hasher__get_quirk(this, a_key); +- } ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- inline wuffs_base__status +- set_quirk( +- uint32_t a_key, +- uint64_t a_value) { +- return wuffs_xxhash64__hasher__set_quirk(this, a_key, a_value); +- } ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) || defined(WUFFS_NONMONOLITHIC) + +- inline wuffs_base__empty_struct +- update( +- wuffs_base__slice_u8 a_x) { +- return wuffs_xxhash64__hasher__update(this, a_x); +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC) + +- inline uint64_t +- update_u64( +- wuffs_base__slice_u8 a_x) { +- return wuffs_xxhash64__hasher__update_u64(this, a_x); +- } ++// ---------------- Status Codes + +- inline uint64_t +- checksum_u64() const { +- return wuffs_xxhash64__hasher__checksum_u64(this); +- } ++extern const char wuffs_wbmp__error__bad_header[]; ++extern const char wuffs_wbmp__error__truncated_input[]; + +-#endif // __cplusplus +-}; // struct wuffs_xxhash64__hasher__struct ++// ---------------- Public Consts + +-#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++#define WUFFS_WBMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC) ++// ---------------- Struct Declarations + +-#if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++typedef struct wuffs_wbmp__decoder__struct wuffs_wbmp__decoder; + +-// ---------------- Auxiliary - Base ++#ifdef __cplusplus ++extern "C" { ++#endif + +-// Auxiliary code is discussed at +-// https://github.com/google/wuffs/blob/main/doc/note/auxiliary-code.md ++// ---------------- Public Initializer Prototypes + +-#include ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +-#include ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_wbmp__decoder__initialize( ++ wuffs_wbmp__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); + +-namespace wuffs_aux { ++size_t ++sizeof__wuffs_wbmp__decoder(void); + +-using IOBuffer = wuffs_base__io_buffer; ++// ---------------- Allocs + +-// MemOwner represents ownership of some memory. Dynamically allocated memory +-// (e.g. from malloc or new) is typically paired with free or delete, invoked +-// when the std::unique_ptr is destroyed. Statically allocated memory might use +-// MemOwner(nullptr, &free), even if that statically allocated memory is not +-// nullptr, since calling free(nullptr) is a no-op. +-using MemOwner = std::unique_ptr; ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. + +-namespace sync_io { ++wuffs_wbmp__decoder* ++wuffs_wbmp__decoder__alloc(void); + +-// -------- ++static inline wuffs_base__image_decoder* ++wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_wbmp__decoder__alloc()); ++} + +-// DynIOBuffer is an IOBuffer that is backed by a dynamically sized byte array. +-// It owns that backing array and will free it in its destructor. +-// +-// The array size can be explicitly extended (by calling the grow method) but, +-// unlike a C++ std::vector, there is no implicit extension (e.g. by calling +-// std::vector::insert) and its maximum size is capped by the max_incl +-// constructor argument. +-// +-// It contains an IOBuffer-typed field whose reader side provides access to +-// previously written bytes and whose writer side provides access to the +-// allocated but not-yet-written-to slack space. For Go programmers, this slack +-// space is roughly analogous to the s[len(s):cap(s)] space of a slice s. +-class DynIOBuffer { +- public: +- enum GrowResult { +- OK = 0, +- FailedMaxInclExceeded = 1, +- FailedOutOfMemory = 2, +- }; ++// ---------------- Upcasts + +- // m_buf holds the dynamically sized byte array and its read/write indexes: +- // - m_buf.meta.wi is roughly analogous to a Go slice's length. +- // - m_buf.data.len is roughly analogous to a Go slice's capacity. It is +- // also equal to the m_buf.data.ptr malloc/realloc size. +- // +- // Users should not modify the m_buf.data.ptr or m_buf.data.len fields (as +- // they are conceptually private to this class), but they can modify the +- // bytes referenced by that pointer-length pair (e.g. compactions). +- IOBuffer m_buf; ++static inline wuffs_base__image_decoder* ++wuffs_wbmp__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_wbmp__decoder* p) { ++ return (wuffs_base__image_decoder*)p; ++} + +- // m_max_incl is an inclusive upper bound on the backing array size. +- const uint64_t m_max_incl; ++// ---------------- Public Function Prototypes + +- // Constructor and destructor. +- explicit DynIOBuffer(uint64_t max_incl); +- ~DynIOBuffer(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_wbmp__decoder__get_quirk( ++ const wuffs_wbmp__decoder* self, ++ uint32_t a_key); + +- // Drop frees the byte array and resets m_buf. The DynIOBuffer can still be +- // used after a drop call. It just restarts from zero. +- void drop(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__set_quirk( ++ wuffs_wbmp__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value); + +- // grow ensures that the byte array size is at least min_incl and at most +- // max_incl. It returns FailedMaxInclExceeded if that would require +- // allocating more than max_incl bytes, including the case where (min_incl > +- // max_incl). It returns FailedOutOfMemory if memory allocation failed. +- GrowResult grow(uint64_t min_incl); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__decode_image_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- private: +- // Delete the copy and assign constructors. +- DynIOBuffer(const DynIOBuffer&) = delete; +- DynIOBuffer& operator=(const DynIOBuffer&) = delete; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__decode_frame_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- static uint64_t round_up(uint64_t min_incl, uint64_t max_incl); +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__decode_frame( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); + +-// -------- ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_wbmp__decoder__frame_dirty_rect( ++ const wuffs_wbmp__decoder* self); + +-class Input { +- public: +- virtual ~Input(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_wbmp__decoder__num_animation_loops( ++ const wuffs_wbmp__decoder* self); + +- virtual IOBuffer* BringsItsOwnIOBuffer(); +- virtual std::string CopyIn(IOBuffer* dst, uint64_t history_retain_length) = 0; +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_wbmp__decoder__num_decoded_frame_configs( ++ const wuffs_wbmp__decoder* self); + +-// -------- ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_wbmp__decoder__num_decoded_frames( ++ const wuffs_wbmp__decoder* self); + +-// FileInput is an Input that reads from a file source. +-// +-// It does not take responsibility for closing the file when done. +-class FileInput : public Input { +- public: +- FileInput(FILE* f); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__restart_frame( ++ wuffs_wbmp__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position); + +- virtual std::string CopyIn(IOBuffer* dst, uint64_t history_retain_length); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_wbmp__decoder__set_report_metadata( ++ wuffs_wbmp__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report); + +- private: +- FILE* m_f; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__tell_me_more( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); + +- // Delete the copy and assign constructors. +- FileInput(const FileInput&) = delete; +- FileInput& operator=(const FileInput&) = delete; +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_wbmp__decoder__workbuf_len( ++ const wuffs_wbmp__decoder* self); + +-// -------- ++#ifdef __cplusplus ++} // extern "C" ++#endif + +-// MemoryInput is an Input that reads from an in-memory source. ++// ---------------- Struct Definitions ++ ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. + // +-// It does not take responsibility for freeing the memory when done. +-class MemoryInput : public Input { +- public: +- MemoryInput(const char* ptr, size_t len); +- MemoryInput(const uint8_t* ptr, size_t len); ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +- virtual IOBuffer* BringsItsOwnIOBuffer(); +- virtual std::string CopyIn(IOBuffer* dst, uint64_t history_retain_length); ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- private: +- IOBuffer m_io; ++struct wuffs_wbmp__decoder__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + +- // Delete the copy and assign constructors. +- MemoryInput(const MemoryInput&) = delete; +- MemoryInput& operator=(const MemoryInput&) = delete; +-}; ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__image_decoder; ++ wuffs_base__vtable null_vtable; + +-// -------- ++ uint32_t f_width; ++ uint32_t f_height; ++ uint8_t f_call_sequence; ++ uint64_t f_frame_config_io_position; ++ wuffs_base__pixel_swizzler f_swizzler; + +-} // namespace sync_io ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ } private_impl; + +-} // namespace wuffs_aux ++ struct { ++ struct { ++ uint32_t v_i; ++ uint32_t v_p; ++ } s_do_decode_image_config; ++ struct { ++ uint64_t v_dst_bytes_per_pixel; ++ uint32_t v_dst_x; ++ uint32_t v_dst_y; ++ uint8_t v_src[1]; ++ uint8_t v_c8; ++ } s_do_decode_frame; ++ } private_data; + +-// ---------------- Auxiliary - CBOR ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; + +-namespace wuffs_aux { ++ // On failure, the alloc_etc functions return nullptr. They don't throw. + +-struct DecodeCborResult { +- DecodeCborResult(std::string&& error_message0, uint64_t cursor_position0); ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_wbmp__decoder__alloc()); ++ } + +- std::string error_message; +- uint64_t cursor_position; +-}; ++ static inline wuffs_base__image_decoder::unique_ptr ++ alloc_as__wuffs_base__image_decoder() { ++ return wuffs_base__image_decoder::unique_ptr( ++ wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder()); ++ } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +-class DecodeCborCallbacks { +- public: +- virtual ~DecodeCborCallbacks(); ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_wbmp__decoder__struct() = delete; ++ wuffs_wbmp__decoder__struct(const wuffs_wbmp__decoder__struct&) = delete; ++ wuffs_wbmp__decoder__struct& operator=( ++ const wuffs_wbmp__decoder__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +- // AppendXxx are called for leaf nodes: literals, numbers, strings, etc. ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) + +- virtual std::string AppendNull() = 0; +- virtual std::string AppendUndefined() = 0; +- virtual std::string AppendBool(bool val) = 0; +- virtual std::string AppendF64(double val) = 0; +- virtual std::string AppendI64(int64_t val) = 0; +- virtual std::string AppendU64(uint64_t val) = 0; +- virtual std::string AppendByteString(std::string&& val) = 0; +- virtual std::string AppendTextString(std::string&& val) = 0; +- virtual std::string AppendMinus1MinusX(uint64_t val) = 0; +- virtual std::string AppendCborSimpleValue(uint8_t val) = 0; +- virtual std::string AppendCborTag(uint64_t val) = 0; ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_wbmp__decoder__initialize( ++ this, sizeof_star_self, wuffs_version, options); ++ } + +- // Push and Pop are called for container nodes: CBOR arrays (lists) and CBOR +- // maps (dictionaries). +- // +- // The flags bits combine exactly one of: +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT +- // and exactly one of: +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT ++ inline wuffs_base__image_decoder* ++ upcast_as__wuffs_base__image_decoder() { ++ return (wuffs_base__image_decoder*)this; ++ } + +- virtual std::string Push(uint32_t flags) = 0; +- virtual std::string Pop(uint32_t flags) = 0; ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_wbmp__decoder__get_quirk(this, a_key); ++ } + +- // Done is always the last Callback method called by DecodeCbor, whether or +- // not parsing the input as CBOR encountered an error. Even when successful, +- // trailing data may remain in input and buffer. +- // +- // Do not keep a reference to buffer or buffer.data.ptr after Done returns, +- // as DecodeCbor may then de-allocate the backing array. +- // +- // The default Done implementation is a no-op. +- virtual void // +- Done(DecodeCborResult& result, sync_io::Input& input, IOBuffer& buffer); +-}; ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_wbmp__decoder__set_quirk(this, a_key, a_value); ++ } + +-// The FooArgBar types add structure to Foo's optional arguments. They wrap +-// inner representations for several reasons: +-// - It provides a home for the DefaultValue static method, for Foo callers +-// that want to override some but not all optional arguments. +-// - It provides the "Bar" name at Foo call sites, which can help self- +-// document Foo calls with many arguemnts. +-// - It provides some type safety against accidentally transposing or omitting +-// adjacent fundamentally-numeric-typed optional arguments. ++ inline wuffs_base__status ++ decode_image_config( ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_wbmp__decoder__decode_image_config(this, a_dst, a_src); ++ } + +-// DecodeCborArgQuirks wraps an optional argument to DecodeCbor. +-struct DecodeCborArgQuirks { +- explicit DecodeCborArgQuirks(wuffs_base__slice_u32 repr0); +- explicit DecodeCborArgQuirks(uint32_t* ptr, size_t len); ++ inline wuffs_base__status ++ decode_frame_config( ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_wbmp__decoder__decode_frame_config(this, a_dst, a_src); ++ } + +- // DefaultValue returns an empty slice. +- static DecodeCborArgQuirks DefaultValue(); ++ inline wuffs_base__status ++ decode_frame( ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ return wuffs_wbmp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ } + +- wuffs_base__slice_u32 repr; +-}; ++ inline wuffs_base__rect_ie_u32 ++ frame_dirty_rect() const { ++ return wuffs_wbmp__decoder__frame_dirty_rect(this); ++ } + +-// DecodeCbor calls callbacks based on the CBOR-formatted data in input. +-// +-// On success, the returned error_message is empty and cursor_position counts +-// the number of bytes consumed. On failure, error_message is non-empty and +-// cursor_position is the location of the error. That error may be a content +-// error (invalid CBOR) or an input error (e.g. network failure). +-DecodeCborResult // +-DecodeCbor(DecodeCborCallbacks& callbacks, +- sync_io::Input& input, +- DecodeCborArgQuirks quirks = DecodeCborArgQuirks::DefaultValue()); ++ inline uint32_t ++ num_animation_loops() const { ++ return wuffs_wbmp__decoder__num_animation_loops(this); ++ } + +-} // namespace wuffs_aux ++ inline uint64_t ++ num_decoded_frame_configs() const { ++ return wuffs_wbmp__decoder__num_decoded_frame_configs(this); ++ } + +-// ---------------- Auxiliary - Image ++ inline uint64_t ++ num_decoded_frames() const { ++ return wuffs_wbmp__decoder__num_decoded_frames(this); ++ } + +-namespace wuffs_aux { ++ inline wuffs_base__status ++ restart_frame( ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ return wuffs_wbmp__decoder__restart_frame(this, a_index, a_io_position); ++ } + +-struct DecodeImageResult { +- DecodeImageResult(MemOwner&& pixbuf_mem_owner0, +- wuffs_base__pixel_buffer pixbuf0, +- std::string&& error_message0); +- DecodeImageResult(std::string&& error_message0); ++ inline wuffs_base__empty_struct ++ set_report_metadata( ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_wbmp__decoder__set_report_metadata(this, a_fourcc, a_report); ++ } + +- MemOwner pixbuf_mem_owner; +- wuffs_base__pixel_buffer pixbuf; +- std::string error_message; +-}; ++ inline wuffs_base__status ++ tell_me_more( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_wbmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src); ++ } + +-// DecodeImageCallbacks are the callbacks given to DecodeImage. They are always +-// called in this order: +-// 1. SelectDecoder +-// 2. HandleMetadata +-// 3. SelectPixfmt +-// 4. AllocPixbuf +-// 5. AllocWorkbuf +-// 6. Done +-// +-// It may return early - the third callback might not be invoked if the second +-// one fails - but the final callback (Done) is always invoked. +-class DecodeImageCallbacks { +- public: +- // AllocPixbufResult holds a memory allocation (the result of malloc or new, +- // a statically allocated pointer, etc), or an error message. The memory is +- // de-allocated when mem_owner goes out of scope and is destroyed. +- struct AllocPixbufResult { +- AllocPixbufResult(MemOwner&& mem_owner0, wuffs_base__pixel_buffer pixbuf0); +- AllocPixbufResult(std::string&& error_message0); ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_wbmp__decoder__workbuf_len(this); ++ } + +- MemOwner mem_owner; +- wuffs_base__pixel_buffer pixbuf; +- std::string error_message; +- }; ++#endif // __cplusplus ++}; // struct wuffs_wbmp__decoder__struct + +- // AllocWorkbufResult holds a memory allocation (the result of malloc or new, +- // a statically allocated pointer, etc), or an error message. The memory is +- // de-allocated when mem_owner goes out of scope and is destroyed. +- struct AllocWorkbufResult { +- AllocWorkbufResult(MemOwner&& mem_owner0, wuffs_base__slice_u8 workbuf0); +- AllocWorkbufResult(std::string&& error_message0); ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- MemOwner mem_owner; +- wuffs_base__slice_u8 workbuf; +- std::string error_message; +- }; ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC) + +- virtual ~DecodeImageCallbacks(); ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) || defined(WUFFS_NONMONOLITHIC) + +- // SelectDecoder returns the image decoder for the input data's file format. +- // Returning a nullptr means failure (DecodeImage_UnsupportedImageFormat). +- // +- // Common formats will have a FourCC value in the range [1 ..= 0x7FFF_FFFF], +- // such as WUFFS_BASE__FOURCC__JPEG. A zero FourCC value means that Wuffs' +- // standard library did not recognize the image format but if SelectDecoder +- // was overridden, it may examine the input data's starting bytes and still +- // provide its own image decoder, e.g. for an exotic image file format that's +- // not in Wuffs' standard library. The prefix_etc fields have the same +- // meaning as wuffs_base__magic_number_guess_fourcc arguments. SelectDecoder +- // implementations should not modify prefix_data's contents. +- // +- // SelectDecoder might be called more than once, since some image file +- // formats can wrap others. For example, a nominal BMP file can actually +- // contain a JPEG or a PNG. +- // +- // The default SelectDecoder accepts the FOURCC codes listed below. For +- // modular builds (i.e. when #define'ing WUFFS_CONFIG__MODULES), acceptance +- // of the ETC file format is optional (for each value of ETC) and depends on +- // the corresponding module to be enabled at compile time (i.e. #define'ing +- // WUFFS_CONFIG__MODULE__ETC). +- // - WUFFS_BASE__FOURCC__BMP +- // - WUFFS_BASE__FOURCC__GIF +- // - WUFFS_BASE__FOURCC__JPEG +- // - WUFFS_BASE__FOURCC__NIE +- // - WUFFS_BASE__FOURCC__NPBM +- // - WUFFS_BASE__FOURCC__PNG +- // - WUFFS_BASE__FOURCC__TGA +- // - WUFFS_BASE__FOURCC__WBMP +- virtual wuffs_base__image_decoder::unique_ptr // +- SelectDecoder(uint32_t fourcc, +- wuffs_base__slice_u8 prefix_data, +- bool prefix_closed); +- +- // HandleMetadata acknowledges image metadata. minfo.flavor will be one of: +- // - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH +- // - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED +- // If it is ETC__METADATA_RAW_ETC then raw contains the metadata bytes. Those +- // bytes should not be retained beyond the the HandleMetadata call. +- // +- // minfo.metadata__fourcc() will typically match one of the +- // DecodeImageArgFlags bits. For example, if (REPORT_METADATA_CHRM | +- // REPORT_METADATA_GAMA) was passed to DecodeImage then the metadata FourCC +- // will be either WUFFS_BASE__FOURCC__CHRM or WUFFS_BASE__FOURCC__GAMA. +- // +- // It returns an error message, or an empty string on success. +- virtual std::string // +- HandleMetadata(const wuffs_base__more_information& minfo, +- wuffs_base__slice_u8 raw); +- +- // SelectPixfmt returns the destination pixel format for AllocPixbuf. It +- // should return wuffs_base__make_pixel_format(etc) called with one of: +- // - WUFFS_BASE__PIXEL_FORMAT__BGR_565 +- // - WUFFS_BASE__PIXEL_FORMAT__BGR +- // - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL +- // - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE +- // - WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL +- // - WUFFS_BASE__PIXEL_FORMAT__RGB +- // - WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL +- // - WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL +- // or return image_config.pixcfg.pixel_format(). The latter means to use the +- // image file's natural pixel format. For example, GIF images' natural pixel +- // format is an indexed one. +- // +- // Returning otherwise means failure (DecodeImage_UnsupportedPixelFormat). +- // +- // The default SelectPixfmt implementation returns +- // wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL) which +- // is 4 bytes per pixel (8 bits per channel × 4 channels). +- virtual wuffs_base__pixel_format // +- SelectPixfmt(const wuffs_base__image_config& image_config); ++// ---------------- Status Codes + +- // AllocPixbuf allocates the pixel buffer. +- // +- // allow_uninitialized_memory will be true if a valid background_color was +- // passed to DecodeImage, since the pixel buffer's contents will be +- // overwritten with that color after AllocPixbuf returns. +- // +- // The default AllocPixbuf implementation allocates either uninitialized or +- // zeroed memory. Zeroed memory typically corresponds to filling with opaque +- // black or transparent black, depending on the pixel format. +- virtual AllocPixbufResult // +- AllocPixbuf(const wuffs_base__image_config& image_config, +- bool allow_uninitialized_memory); ++extern const char wuffs_webp__error__bad_huffman_code_over_subscribed[]; ++extern const char wuffs_webp__error__bad_huffman_code_under_subscribed[]; ++extern const char wuffs_webp__error__bad_huffman_code[]; ++extern const char wuffs_webp__error__bad_back_reference[]; ++extern const char wuffs_webp__error__bad_color_cache[]; ++extern const char wuffs_webp__error__bad_header[]; ++extern const char wuffs_webp__error__bad_transform[]; ++extern const char wuffs_webp__error__short_chunk[]; ++extern const char wuffs_webp__error__truncated_input[]; ++extern const char wuffs_webp__error__unsupported_number_of_huffman_groups[]; ++extern const char wuffs_webp__error__unsupported_transform_after_color_indexing_transform[]; ++extern const char wuffs_webp__error__unsupported_webp_file[]; + +- // AllocWorkbuf allocates the work buffer. The allocated buffer's length +- // should be at least len_range.min_incl, but larger allocations (up to +- // len_range.max_incl) may have better performance (by using more memory). +- // +- // The default AllocWorkbuf implementation allocates len_range.max_incl bytes +- // of either uninitialized or zeroed memory. +- virtual AllocWorkbufResult // +- AllocWorkbuf(wuffs_base__range_ii_u64 len_range, +- bool allow_uninitialized_memory); ++// ---------------- Public Consts + +- // Done is always the last Callback method called by DecodeImage, whether or +- // not parsing the input encountered an error. Even when successful, trailing +- // data may remain in input and buffer. +- // +- // The image_decoder is the one returned by SelectDecoder (if SelectDecoder +- // was successful), or a no-op unique_ptr otherwise. Like any unique_ptr, +- // ownership moves to the Done implementation. +- // +- // Do not keep a reference to buffer or buffer.data.ptr after Done returns, +- // as DecodeImage may then de-allocate the backing array. +- // +- // The default Done implementation is a no-op, other than running the +- // image_decoder unique_ptr destructor. +- virtual void // +- Done(DecodeImageResult& result, +- sync_io::Input& input, +- IOBuffer& buffer, +- wuffs_base__image_decoder::unique_ptr image_decoder); +-}; ++#define WUFFS_WEBP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-extern const char DecodeImage_BufferIsTooShort[]; +-extern const char DecodeImage_MaxInclDimensionExceeded[]; +-extern const char DecodeImage_MaxInclMetadataLengthExceeded[]; +-extern const char DecodeImage_OutOfMemory[]; +-extern const char DecodeImage_UnexpectedEndOfFile[]; +-extern const char DecodeImage_UnsupportedImageFormat[]; +-extern const char DecodeImage_UnsupportedMetadata[]; +-extern const char DecodeImage_UnsupportedPixelBlend[]; +-extern const char DecodeImage_UnsupportedPixelConfiguration[]; +-extern const char DecodeImage_UnsupportedPixelFormat[]; ++// ---------------- Struct Declarations + +-// The FooArgBar types add structure to Foo's optional arguments. They wrap +-// inner representations for several reasons: +-// - It provides a home for the DefaultValue static method, for Foo callers +-// that want to override some but not all optional arguments. +-// - It provides the "Bar" name at Foo call sites, which can help self- +-// document Foo calls with many arguemnts. +-// - It provides some type safety against accidentally transposing or omitting +-// adjacent fundamentally-numeric-typed optional arguments. ++typedef struct wuffs_webp__decoder__struct wuffs_webp__decoder; + +-// DecodeImageArgQuirks wraps an optional argument to DecodeImage. +-struct DecodeImageArgQuirks { +- explicit DecodeImageArgQuirks(wuffs_base__slice_u32 repr0); +- explicit DecodeImageArgQuirks(uint32_t* ptr, size_t len); ++#ifdef __cplusplus ++extern "C" { ++#endif + +- // DefaultValue returns an empty slice. +- static DecodeImageArgQuirks DefaultValue(); ++// ---------------- Public Initializer Prototypes + +- wuffs_base__slice_u32 repr; +-}; ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +-// DecodeImageArgFlags wraps an optional argument to DecodeImage. +-struct DecodeImageArgFlags { +- explicit DecodeImageArgFlags(uint64_t repr0); ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_webp__decoder__initialize( ++ wuffs_webp__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); + +- // DefaultValue returns 0. +- static DecodeImageArgFlags DefaultValue(); ++size_t ++sizeof__wuffs_webp__decoder(void); + +- // TODO: support all of the REPORT_METADATA_ETC flags, not just CHRM, EXIF, +- // GAMA, ICCP, KVP, SRGB and XMP. ++// ---------------- Allocs + +- // Background Color. +- static constexpr uint64_t REPORT_METADATA_BGCL = 0x0001; +- // Primary Chromaticities and White Point. +- static constexpr uint64_t REPORT_METADATA_CHRM = 0x0002; +- // Exchangeable Image File Format. +- static constexpr uint64_t REPORT_METADATA_EXIF = 0x0004; +- // Gamma Correction. +- static constexpr uint64_t REPORT_METADATA_GAMA = 0x0008; +- // International Color Consortium Profile. +- static constexpr uint64_t REPORT_METADATA_ICCP = 0x0010; +- // Key-Value Pair. +- // +- // For PNG files, this includes iTXt, tEXt and zTXt chunks. In the +- // HandleMetadata callback, the raw argument contains UTF-8 strings. +- static constexpr uint64_t REPORT_METADATA_KVP = 0x0020; +- // Modification Time. +- static constexpr uint64_t REPORT_METADATA_MTIM = 0x0040; +- // Offset (2-Dimensional). +- static constexpr uint64_t REPORT_METADATA_OFS2 = 0x0080; +- // Physical Dimensions. +- static constexpr uint64_t REPORT_METADATA_PHYD = 0x0100; +- // Standard Red Green Blue (Rendering Intent). +- static constexpr uint64_t REPORT_METADATA_SRGB = 0x0200; +- // Extensible Metadata Platform. +- static constexpr uint64_t REPORT_METADATA_XMP = 0x0400; ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. + +- uint64_t repr; +-}; ++wuffs_webp__decoder* ++wuffs_webp__decoder__alloc(void); + +-// DecodeImageArgPixelBlend wraps an optional argument to DecodeImage. +-struct DecodeImageArgPixelBlend { +- explicit DecodeImageArgPixelBlend(wuffs_base__pixel_blend repr0); ++static inline wuffs_base__image_decoder* ++wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_webp__decoder__alloc()); ++} + +- // DefaultValue returns WUFFS_BASE__PIXEL_BLEND__SRC. +- static DecodeImageArgPixelBlend DefaultValue(); ++// ---------------- Upcasts + +- wuffs_base__pixel_blend repr; +-}; ++static inline wuffs_base__image_decoder* ++wuffs_webp__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_webp__decoder* p) { ++ return (wuffs_base__image_decoder*)p; ++} + +-// DecodeImageArgBackgroundColor wraps an optional argument to DecodeImage. +-struct DecodeImageArgBackgroundColor { +- explicit DecodeImageArgBackgroundColor( +- wuffs_base__color_u32_argb_premul repr0); ++// ---------------- Public Function Prototypes + +- // DefaultValue returns 1, an invalid wuffs_base__color_u32_argb_premul. +- static DecodeImageArgBackgroundColor DefaultValue(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_webp__decoder__get_quirk( ++ const wuffs_webp__decoder* self, ++ uint32_t a_key); + +- wuffs_base__color_u32_argb_premul repr; +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__set_quirk( ++ wuffs_webp__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value); + +-// DecodeImageArgMaxInclDimension wraps an optional argument to DecodeImage. +-struct DecodeImageArgMaxInclDimension { +- explicit DecodeImageArgMaxInclDimension(uint32_t repr0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__decode_image_config( ++ wuffs_webp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- // DefaultValue returns 1048575 = 0x000F_FFFF, more than 1 million pixels. +- static DecodeImageArgMaxInclDimension DefaultValue(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__decode_frame_config( ++ wuffs_webp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- uint32_t repr; +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__decode_frame( ++ wuffs_webp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); + +-// DecodeImageArgMaxInclMetadataLength wraps an optional argument to +-// DecodeImage. +-struct DecodeImageArgMaxInclMetadataLength { +- explicit DecodeImageArgMaxInclMetadataLength(uint64_t repr0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_webp__decoder__frame_dirty_rect( ++ const wuffs_webp__decoder* self); + +- // DefaultValue returns 16777215 = 0x00FF_FFFF, one less than 16 MiB. +- static DecodeImageArgMaxInclMetadataLength DefaultValue(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_webp__decoder__num_animation_loops( ++ const wuffs_webp__decoder* self); + +- uint64_t repr; +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_webp__decoder__num_decoded_frame_configs( ++ const wuffs_webp__decoder* self); + +-// DecodeImage decodes the image data in input. A variety of image file formats +-// can be decoded, depending on what callbacks.SelectDecoder returns. +-// +-// For animated formats, only the first frame is returned, since the API is +-// simpler for synchronous I/O and having DecodeImage only return when +-// completely done, but rendering animation often involves handling other +-// events in between animation frames. To decode multiple frames of animated +-// images, or for asynchronous I/O (e.g. when decoding an image streamed over +-// the network), use Wuffs' lower level C API instead of its higher level, +-// simplified C++ API (the wuffs_aux API). +-// +-// The DecodeImageResult's fields depend on whether decoding succeeded: +-// - On total success, the error_message is empty and pixbuf.pixcfg.is_valid() +-// is true. +-// - On partial success (e.g. the input file was truncated but we are still +-// able to decode some of the pixels), error_message is non-empty but +-// pixbuf.pixcfg.is_valid() is still true. It is up to the caller whether to +-// accept or reject partial success. +-// - On failure, the error_message is non_empty and pixbuf.pixcfg.is_valid() +-// is false. +-// +-// The callbacks allocate the pixel buffer memory and work buffer memory. On +-// success, pixel buffer memory ownership is passed to the DecodeImage caller +-// as the returned pixbuf_mem_owner. Regardless of success or failure, the work +-// buffer memory is deleted. +-// +-// The pixel_blend (one of the constants listed below) determines how to +-// composite the decoded image over the pixel buffer's original pixels (as +-// returned by callbacks.AllocPixbuf): +-// - WUFFS_BASE__PIXEL_BLEND__SRC +-// - WUFFS_BASE__PIXEL_BLEND__SRC_OVER +-// +-// The background_color is used to fill the pixel buffer after +-// callbacks.AllocPixbuf returns, if it is valid in the +-// wuffs_base__color_u32_argb_premul__is_valid sense. The default value, +-// 0x0000_0001, is not valid since its Blue channel value (0x01) is greater +-// than its Alpha channel value (0x00). A valid background_color will typically +-// be overwritten when pixel_blend is WUFFS_BASE__PIXEL_BLEND__SRC, but might +-// still be visible on partial (not total) success or when pixel_blend is +-// WUFFS_BASE__PIXEL_BLEND__SRC_OVER and the decoded image is not fully opaque. +-// +-// Decoding fails (with DecodeImage_MaxInclDimensionExceeded) if the image's +-// width or height is greater than max_incl_dimension or if any opted-in (via +-// flags bits) metadata is longer than max_incl_metadata_length. +-DecodeImageResult // +-DecodeImage(DecodeImageCallbacks& callbacks, +- sync_io::Input& input, +- DecodeImageArgQuirks quirks = DecodeImageArgQuirks::DefaultValue(), +- DecodeImageArgFlags flags = DecodeImageArgFlags::DefaultValue(), +- DecodeImageArgPixelBlend pixel_blend = +- DecodeImageArgPixelBlend::DefaultValue(), +- DecodeImageArgBackgroundColor background_color = +- DecodeImageArgBackgroundColor::DefaultValue(), +- DecodeImageArgMaxInclDimension max_incl_dimension = +- DecodeImageArgMaxInclDimension::DefaultValue(), +- DecodeImageArgMaxInclMetadataLength max_incl_metadata_length = +- DecodeImageArgMaxInclMetadataLength::DefaultValue()); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_webp__decoder__num_decoded_frames( ++ const wuffs_webp__decoder* self); + +-} // namespace wuffs_aux ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__restart_frame( ++ wuffs_webp__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position); + +-// ---------------- Auxiliary - JSON ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_webp__decoder__set_report_metadata( ++ wuffs_webp__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report); + +-namespace wuffs_aux { ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__tell_me_more( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); + +-struct DecodeJsonResult { +- DecodeJsonResult(std::string&& error_message0, uint64_t cursor_position0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_webp__decoder__workbuf_len( ++ const wuffs_webp__decoder* self); + +- std::string error_message; +- uint64_t cursor_position; +-}; ++#ifdef __cplusplus ++} // extern "C" ++#endif + +-class DecodeJsonCallbacks { +- public: +- virtual ~DecodeJsonCallbacks(); ++// ---------------- Struct Definitions + +- // AppendXxx are called for leaf nodes: literals, numbers and strings. For +- // strings, the Callbacks implementation is responsible for tracking map keys +- // versus other values. ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +- virtual std::string AppendNull() = 0; +- virtual std::string AppendBool(bool val) = 0; +- virtual std::string AppendF64(double val) = 0; +- virtual std::string AppendI64(int64_t val) = 0; +- virtual std::string AppendTextString(std::string&& val) = 0; ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- // Push and Pop are called for container nodes: JSON arrays (lists) and JSON +- // objects (dictionaries). ++struct wuffs_webp__decoder__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. + // +- // The flags bits combine exactly one of: +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT +- // and exactly one of: +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + +- virtual std::string Push(uint32_t flags) = 0; +- virtual std::string Pop(uint32_t flags) = 0; ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__image_decoder; ++ wuffs_base__vtable null_vtable; + +- // Done is always the last Callback method called by DecodeJson, whether or +- // not parsing the input as JSON encountered an error. Even when successful, +- // trailing data may remain in input and buffer. See "Unintuitive JSON +- // Parsing" (https://nullprogram.com/blog/2019/12/28/) which discusses JSON +- // parsing and when it stops. +- // +- // Do not keep a reference to buffer or buffer.data.ptr after Done returns, +- // as DecodeJson may then de-allocate the backing array. +- // +- // The default Done implementation is a no-op. +- virtual void // +- Done(DecodeJsonResult& result, sync_io::Input& input, IOBuffer& buffer); +-}; ++ uint32_t f_pixfmt; ++ uint32_t f_width; ++ uint32_t f_height; ++ uint8_t f_call_sequence; ++ uint8_t f_code_length_code_lengths[19]; ++ bool f_sub_chunk_has_padding; ++ uint64_t f_frame_config_io_position; ++ uint32_t f_riff_chunk_length; ++ uint32_t f_sub_chunk_length; ++ uint32_t f_bits; ++ uint32_t f_n_bits; ++ bool f_seen_transform[4]; ++ uint8_t f_transform_type[4]; ++ uint8_t f_transform_tile_size_log2[4]; ++ uint32_t f_n_transforms; ++ uint32_t f_color_cache_bits; ++ uint32_t f_overall_color_cache_bits; ++ uint32_t f_overall_tile_size_log2; ++ uint32_t f_overall_n_huffman_groups; ++ uint32_t f_ht_n_symbols; ++ uint32_t f_ht_code_lengths_remaining; ++ uint32_t f_color_indexing_palette_size; ++ uint32_t f_color_indexing_width; ++ uint32_t f_workbuf_offset_for_transform[4]; ++ uint32_t f_workbuf_offset_for_color_indexing; ++ wuffs_base__pixel_swizzler f_swizzler; + +-extern const char DecodeJson_BadJsonPointer[]; +-extern const char DecodeJson_NoMatch[]; ++ uint32_t p_decode_huffman_groups; ++ uint32_t p_decode_huffman_tree; ++ uint32_t p_decode_huffman_tree_simple; ++ uint32_t p_decode_code_length_code_lengths; ++ uint32_t p_build_code_lengths; ++ uint32_t p_decode_pixels_slow; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_do_decode_image_config_limited; ++ uint32_t p_do_decode_image_config_limited_vp8l; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_decode_transform; ++ uint32_t p_decode_color_cache_parameters; ++ uint32_t p_decode_hg_table; ++ uint32_t p_decode_pixels; ++ } private_impl; + +-// The FooArgBar types add structure to Foo's optional arguments. They wrap +-// inner representations for several reasons: +-// - It provides a home for the DefaultValue static method, for Foo callers +-// that want to override some but not all optional arguments. +-// - It provides the "Bar" name at Foo call sites, which can help self- +-// document Foo calls with many arguemnts. +-// - It provides some type safety against accidentally transposing or omitting +-// adjacent fundamentally-numeric-typed optional arguments. ++ struct { ++ uint8_t f_palette[1024]; ++ uint32_t f_color_cache[2048]; ++ uint16_t f_codes[2328]; ++ uint16_t f_code_lengths[2328]; ++ uint16_t f_code_lengths_huffman_nodes[37]; ++ uint16_t f_huffman_nodes[256][6267]; + +-// DecodeJsonArgQuirks wraps an optional argument to DecodeJson. +-struct DecodeJsonArgQuirks { +- explicit DecodeJsonArgQuirks(wuffs_base__slice_u32 repr0); +- explicit DecodeJsonArgQuirks(uint32_t* ptr, size_t len); ++ struct { ++ uint32_t v_hg; ++ uint32_t v_ht; ++ } s_decode_huffman_groups; ++ struct { ++ uint32_t v_use_second_symbol; ++ uint32_t v_first_symbol_n_bits; ++ uint32_t v_symbol0; ++ uint32_t v_base_offset; ++ } s_decode_huffman_tree_simple; ++ struct { ++ uint32_t v_n_codes; ++ uint32_t v_i; ++ } s_decode_code_length_code_lengths; ++ struct { ++ uint32_t v_length_n_bits; ++ uint16_t v_prev_code_length; ++ uint32_t v_s; ++ uint32_t v_s_max; ++ uint16_t v_node; ++ uint16_t v_repeat_value; ++ uint32_t v_repeat_n_bits; ++ } s_build_code_lengths; ++ struct { ++ uint64_t v_p; ++ uint64_t v_p_max; ++ uint32_t v_tile_size_log2; ++ uint32_t v_width_in_tiles; ++ uint32_t v_x; ++ uint32_t v_y; ++ uint32_t v_hg; ++ uint16_t v_node; ++ uint32_t v_color; ++ uint32_t v_back_ref_len_n_bits; ++ uint32_t v_back_ref_len_minus_1; ++ uint32_t v_back_ref_dist_n_bits; ++ uint32_t v_back_ref_dist_premap_minus_1; ++ uint64_t v_color_cache_p; ++ } s_decode_pixels_slow; ++ struct { ++ uint64_t scratch; ++ } s_do_decode_image_config; ++ struct { ++ uint64_t scratch; ++ } s_do_decode_image_config_limited; ++ struct { ++ uint64_t scratch; ++ } s_do_decode_image_config_limited_vp8l; ++ struct { ++ uint32_t v_width; ++ } s_do_decode_frame; ++ struct { ++ uint32_t v_transform_type; ++ uint32_t v_tile_size_log2; ++ } s_decode_transform; ++ struct { ++ uint32_t v_tile_size_log2; ++ } s_decode_hg_table; ++ } private_data; + +- // DefaultValue returns an empty slice. +- static DecodeJsonArgQuirks DefaultValue(); ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; + +- wuffs_base__slice_u32 repr; +-}; ++ // On failure, the alloc_etc functions return nullptr. They don't throw. + +-// DecodeJsonArgJsonPointer wraps an optional argument to DecodeJson. +-struct DecodeJsonArgJsonPointer { +- explicit DecodeJsonArgJsonPointer(std::string repr0); ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_webp__decoder__alloc()); ++ } + +- // DefaultValue returns an empty string. +- static DecodeJsonArgJsonPointer DefaultValue(); ++ static inline wuffs_base__image_decoder::unique_ptr ++ alloc_as__wuffs_base__image_decoder() { ++ return wuffs_base__image_decoder::unique_ptr( ++ wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder()); ++ } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +- std::string repr; +-}; ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_webp__decoder__struct() = delete; ++ wuffs_webp__decoder__struct(const wuffs_webp__decoder__struct&) = delete; ++ wuffs_webp__decoder__struct& operator=( ++ const wuffs_webp__decoder__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +-// DecodeJson calls callbacks based on the JSON-formatted data in input. +-// +-// On success, the returned error_message is empty and cursor_position counts +-// the number of bytes consumed. On failure, error_message is non-empty and +-// cursor_position is the location of the error. That error may be a content +-// error (invalid JSON) or an input error (e.g. network failure). +-// +-// json_pointer is a query in the JSON Pointer (RFC 6901) syntax. The callbacks +-// run for the input's sub-node that matches the query. DecodeJson_NoMatch is +-// returned if no matching sub-node was found. The empty query matches the +-// input's root node, consistent with JSON Pointer semantics. +-// +-// The JSON Pointer implementation is greedy: duplicate keys are not rejected +-// but only the first match for each '/'-separated fragment is followed. +-DecodeJsonResult // +-DecodeJson(DecodeJsonCallbacks& callbacks, +- sync_io::Input& input, +- DecodeJsonArgQuirks quirks = DecodeJsonArgQuirks::DefaultValue(), +- DecodeJsonArgJsonPointer json_pointer = +- DecodeJsonArgJsonPointer::DefaultValue()); ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) + +-} // namespace wuffs_aux ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_webp__decoder__initialize( ++ this, sizeof_star_self, wuffs_version, options); ++ } + +-#endif // defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ inline wuffs_base__image_decoder* ++ upcast_as__wuffs_base__image_decoder() { ++ return (wuffs_base__image_decoder*)this; ++ } + +-// ‼ WUFFS C HEADER ENDS HERE. +-#ifdef WUFFS_IMPLEMENTATION ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_webp__decoder__get_quirk(this, a_key); ++ } + +-#ifdef __cplusplus +-extern "C" { +-#endif ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_webp__decoder__set_quirk(this, a_key, a_value); ++ } + +-// ---------------- Fundamentals ++ inline wuffs_base__status ++ decode_image_config( ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_webp__decoder__decode_image_config(this, a_dst, a_src); ++ } + +-// WUFFS_BASE__MAGIC is a magic number to check that initializers are called. +-// It's not foolproof, given C doesn't automatically zero memory before use, +-// but it should catch 99.99% of cases. +-// +-// Its (non-zero) value is arbitrary, based on md5sum("wuffs"). +-#define WUFFS_BASE__MAGIC ((uint32_t)0x3CCB6C71) ++ inline wuffs_base__status ++ decode_frame_config( ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_webp__decoder__decode_frame_config(this, a_dst, a_src); ++ } + +-// WUFFS_BASE__DISABLED is a magic number to indicate that a non-recoverable +-// error was previously encountered. +-// +-// Its (non-zero) value is arbitrary, based on md5sum("disabled"). +-#define WUFFS_BASE__DISABLED ((uint32_t)0x075AE3D2) ++ inline wuffs_base__status ++ decode_frame( ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ return wuffs_webp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ } + +-// Use switch cases for coroutine suspension points, similar to the technique +-// in https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html +-// +-// The implicit fallthrough is intentional. +-// +-// We use trivial macros instead of an explicit assignment and case statement +-// so that clang-format doesn't get confused by the unusual "case"s. +-#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0 case 0:; +-#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT(n) \ +- coro_susp_point = n; \ +- case n:; ++ inline wuffs_base__rect_ie_u32 ++ frame_dirty_rect() const { ++ return wuffs_webp__decoder__frame_dirty_rect(this); ++ } + +-#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \ +- if (!status.repr) { \ +- goto ok; \ +- } else if (*status.repr != '$') { \ +- goto exit; \ +- } \ +- coro_susp_point = n; \ +- goto suspend; \ +- case n:; ++ inline uint32_t ++ num_animation_loops() const { ++ return wuffs_webp__decoder__num_animation_loops(this); ++ } + +-// The "defined(__clang__)" isn't redundant. While vanilla clang defines +-// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. +-#if defined(__GNUC__) || defined(__clang__) +-#define WUFFS_BASE__LIKELY(expr) (__builtin_expect(!!(expr), 1)) +-#define WUFFS_BASE__UNLIKELY(expr) (__builtin_expect(!!(expr), 0)) +-#else +-#define WUFFS_BASE__LIKELY(expr) (expr) +-#define WUFFS_BASE__UNLIKELY(expr) (expr) +-#endif ++ inline uint64_t ++ num_decoded_frame_configs() const { ++ return wuffs_webp__decoder__num_decoded_frame_configs(this); ++ } + +-// -------- ++ inline uint64_t ++ num_decoded_frames() const { ++ return wuffs_webp__decoder__num_decoded_frames(this); ++ } + +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wcast-qual" +-#endif +-static inline uint8_t* // +-wuffs_base__strip_const_from_u8_ptr(const uint8_t* ptr) { +- return (uint8_t*)ptr; +-} +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++ inline wuffs_base__status ++ restart_frame( ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ return wuffs_webp__decoder__restart_frame(this, a_index, a_io_position); ++ } + +-// -------- ++ inline wuffs_base__empty_struct ++ set_report_metadata( ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_webp__decoder__set_report_metadata(this, a_fourcc, a_report); ++ } + +-static inline wuffs_base__empty_struct // +-wuffs_base__ignore_status(wuffs_base__status z) { +- return wuffs_base__make_empty_struct(); +-} ++ inline wuffs_base__status ++ tell_me_more( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_webp__decoder__tell_me_more(this, a_dst, a_minfo, a_src); ++ } + +-static inline wuffs_base__status // +-wuffs_base__status__ensure_not_a_suspension(wuffs_base__status z) { +- if (z.repr && (*z.repr == '$')) { +- z.repr = wuffs_base__error__cannot_return_a_suspension; ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_webp__decoder__workbuf_len(this); + } +- return z; +-} + +-// -------- ++#endif // __cplusplus ++}; // struct wuffs_webp__decoder__struct + +-// wuffs_base__iterate_total_advance returns the exclusive pointer-offset at +-// which iteration should stop. The overall slice has length total_len, each +-// iteration's sub-slice has length iter_len and are placed iter_advance apart. +-// +-// The iter_advance may not be larger than iter_len. The iter_advance may be +-// smaller than iter_len, in which case the sub-slices will overlap. +-// +-// The return value r satisfies ((0 <= r) && (r <= total_len)). +-// +-// For example, if total_len = 15, iter_len = 5 and iter_advance = 3, there are +-// four iterations at offsets 0, 3, 6 and 9. This function returns 12. +-// +-// 0123456789012345 +-// [....] +-// [....] +-// [....] +-// [....] +-// $ +-// 0123456789012345 +-// +-// For example, if total_len = 15, iter_len = 5 and iter_advance = 5, there are +-// three iterations at offsets 0, 5 and 10. This function returns 15. ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) || defined(WUFFS_NONMONOLITHIC) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC) ++ ++// ---------------- Status Codes ++ ++// ---------------- Public Consts ++ ++// ---------------- Struct Declarations ++ ++typedef struct wuffs_xxhash32__hasher__struct wuffs_xxhash32__hasher; ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++// ---------------- Public Initializer Prototypes ++ ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". + // +-// 0123456789012345 +-// [....] +-// [....] +-// [....] +-// $ +-// 0123456789012345 +-static inline size_t // +-wuffs_base__iterate_total_advance(size_t total_len, +- size_t iter_len, +- size_t iter_advance) { +- if (total_len >= iter_len) { +- size_t n = total_len - iter_len; +- return ((n / iter_advance) * iter_advance) + iter_advance; +- } +- return 0; +-} ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +-// ---------------- Numeric Types ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_xxhash32__hasher__initialize( ++ wuffs_xxhash32__hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); + +-extern const uint8_t wuffs_base__low_bits_mask__u8[8]; +-extern const uint16_t wuffs_base__low_bits_mask__u16[16]; +-extern const uint32_t wuffs_base__low_bits_mask__u32[32]; +-extern const uint64_t wuffs_base__low_bits_mask__u64[64]; ++size_t ++sizeof__wuffs_xxhash32__hasher(void); + +-#define WUFFS_BASE__LOW_BITS_MASK__U8(n) (wuffs_base__low_bits_mask__u8[n]) +-#define WUFFS_BASE__LOW_BITS_MASK__U16(n) (wuffs_base__low_bits_mask__u16[n]) +-#define WUFFS_BASE__LOW_BITS_MASK__U32(n) (wuffs_base__low_bits_mask__u32[n]) +-#define WUFFS_BASE__LOW_BITS_MASK__U64(n) (wuffs_base__low_bits_mask__u64[n]) ++// ---------------- Allocs + +-// -------- ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. + +-static inline void // +-wuffs_base__u8__sat_add_indirect(uint8_t* x, uint8_t y) { +- *x = wuffs_base__u8__sat_add(*x, y); +-} ++wuffs_xxhash32__hasher* ++wuffs_xxhash32__hasher__alloc(void); + +-static inline void // +-wuffs_base__u8__sat_sub_indirect(uint8_t* x, uint8_t y) { +- *x = wuffs_base__u8__sat_sub(*x, y); ++static inline wuffs_base__hasher_u32* ++wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32(void) { ++ return (wuffs_base__hasher_u32*)(wuffs_xxhash32__hasher__alloc()); + } + +-static inline void // +-wuffs_base__u16__sat_add_indirect(uint16_t* x, uint16_t y) { +- *x = wuffs_base__u16__sat_add(*x, y); +-} ++// ---------------- Upcasts + +-static inline void // +-wuffs_base__u16__sat_sub_indirect(uint16_t* x, uint16_t y) { +- *x = wuffs_base__u16__sat_sub(*x, y); ++static inline wuffs_base__hasher_u32* ++wuffs_xxhash32__hasher__upcast_as__wuffs_base__hasher_u32( ++ wuffs_xxhash32__hasher* p) { ++ return (wuffs_base__hasher_u32*)p; + } + +-static inline void // +-wuffs_base__u32__sat_add_indirect(uint32_t* x, uint32_t y) { +- *x = wuffs_base__u32__sat_add(*x, y); +-} ++// ---------------- Public Function Prototypes + +-static inline void // +-wuffs_base__u32__sat_sub_indirect(uint32_t* x, uint32_t y) { +- *x = wuffs_base__u32__sat_sub(*x, y); +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xxhash32__hasher__get_quirk( ++ const wuffs_xxhash32__hasher* self, ++ uint32_t a_key); + +-static inline void // +-wuffs_base__u64__sat_add_indirect(uint64_t* x, uint64_t y) { +- *x = wuffs_base__u64__sat_add(*x, y); +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_xxhash32__hasher__set_quirk( ++ wuffs_xxhash32__hasher* self, ++ uint32_t a_key, ++ uint64_t a_value); + +-static inline void // +-wuffs_base__u64__sat_sub_indirect(uint64_t* x, uint64_t y) { +- *x = wuffs_base__u64__sat_sub(*x, y); +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_xxhash32__hasher__update( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x); + +-// ---------------- Numeric Types (Utility) ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_xxhash32__hasher__update_u32( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x); + +-#define wuffs_base__utility__sign_extend_convert_u16_u32(a) \ +- ((uint32_t)(int32_t)(int16_t)(a)) ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_xxhash32__hasher__checksum_u32( ++ const wuffs_xxhash32__hasher* self); + +-#define wuffs_base__utility__sign_extend_rshift_u32(a, n) \ +- ((uint32_t)(((int32_t)(a)) >> (n))) ++#ifdef __cplusplus ++} // extern "C" ++#endif + +-#define wuffs_base__utility__sign_extend_rshift_u64(a, n) \ +- ((uint64_t)(((int64_t)(a)) >> (n))) ++// ---------------- Struct Definitions + +-// ---------------- Slices and Tables ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +-// wuffs_base__slice_u8__prefix returns up to the first up_to bytes of s. +-static inline wuffs_base__slice_u8 // +-wuffs_base__slice_u8__prefix(wuffs_base__slice_u8 s, uint64_t up_to) { +- if (((uint64_t)(s.len)) > up_to) { +- s.len = ((size_t)up_to); ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_xxhash32__hasher__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. ++ ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__hasher_u32; ++ wuffs_base__vtable null_vtable; ++ ++ uint32_t f_length_modulo_u32; ++ bool f_length_overflows_u32; ++ uint8_t f_padding0; ++ uint8_t f_padding1; ++ uint8_t f_buf_len; ++ uint8_t f_buf_data[16]; ++ uint32_t f_v0; ++ uint32_t f_v1; ++ uint32_t f_v2; ++ uint32_t f_v3; ++ } private_impl; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++ ++ // On failure, the alloc_etc functions return nullptr. They don't throw. ++ ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_xxhash32__hasher__alloc()); + } +- return s; +-} + +-// wuffs_base__slice_u8__suffix returns up to the last up_to bytes of s. +-static inline wuffs_base__slice_u8 // +-wuffs_base__slice_u8__suffix(wuffs_base__slice_u8 s, uint64_t up_to) { +- if (((uint64_t)(s.len)) > up_to) { +- s.ptr += ((uint64_t)(s.len)) - up_to; +- s.len = ((size_t)up_to); ++ static inline wuffs_base__hasher_u32::unique_ptr ++ alloc_as__wuffs_base__hasher_u32() { ++ return wuffs_base__hasher_u32::unique_ptr( ++ wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32()); + } +- return s; +-} ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +-// wuffs_base__slice_u8__copy_from_slice calls memmove(dst.ptr, src.ptr, len) +-// where len is the minimum of dst.len and src.len. +-// +-// Passing a wuffs_base__slice_u8 with all fields NULL or zero (a valid, empty +-// slice) is valid and results in a no-op. +-static inline uint64_t // +-wuffs_base__slice_u8__copy_from_slice(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src) { +- size_t len = dst.len < src.len ? dst.len : src.len; +- if (len > 0) { +- memmove(dst.ptr, src.ptr, len); ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_xxhash32__hasher__struct() = delete; ++ wuffs_xxhash32__hasher__struct(const wuffs_xxhash32__hasher__struct&) = delete; ++ wuffs_xxhash32__hasher__struct& operator=( ++ const wuffs_xxhash32__hasher__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) ++ ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_xxhash32__hasher__initialize( ++ this, sizeof_star_self, wuffs_version, options); + } +- return len; +-} + +-static inline wuffs_base__empty_struct // +-wuffs_base__bulk_load_host_endian(void* ptr, +- size_t len, +- wuffs_base__slice_u8 src) { +- if (len && (len <= src.len)) { +- memmove(ptr, src.ptr, len); ++ inline wuffs_base__hasher_u32* ++ upcast_as__wuffs_base__hasher_u32() { ++ return (wuffs_base__hasher_u32*)this; + } +- return wuffs_base__make_empty_struct(); +-} + +-static inline wuffs_base__empty_struct // +-wuffs_base__bulk_memset(void* ptr, size_t len, uint8_t byte_value) { +- if (len) { +- memset(ptr, byte_value, len); ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_xxhash32__hasher__get_quirk(this, a_key); + } +- return wuffs_base__make_empty_struct(); +-} + +-static inline wuffs_base__empty_struct // +-wuffs_base__bulk_save_host_endian(void* ptr, +- size_t len, +- wuffs_base__slice_u8 dst) { +- if (len && (len <= dst.len)) { +- memmove(dst.ptr, ptr, len); ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_xxhash32__hasher__set_quirk(this, a_key, a_value); + } +- return wuffs_base__make_empty_struct(); +-} + +-// -------- ++ inline wuffs_base__empty_struct ++ update( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_xxhash32__hasher__update(this, a_x); ++ } + +-static inline wuffs_base__slice_u8 // +-wuffs_base__table_u8__row_u32(wuffs_base__table_u8 t, uint32_t y) { +- if (y < t.height) { +- return wuffs_base__make_slice_u8(t.ptr + (t.stride * y), t.width); ++ inline uint32_t ++ update_u32( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_xxhash32__hasher__update_u32(this, a_x); + } +- return wuffs_base__make_slice_u8(NULL, 0); +-} + +-// ---------------- Slices and Tables (Utility) ++ inline uint32_t ++ checksum_u32() const { ++ return wuffs_xxhash32__hasher__checksum_u32(this); ++ } + +-#define wuffs_base__utility__empty_slice_u8 wuffs_base__empty_slice_u8 ++#endif // __cplusplus ++}; // struct wuffs_xxhash32__hasher__struct + +-// ---------------- Ranges and Rects ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-static inline uint32_t // +-wuffs_base__range_ii_u32__get_min_incl(const wuffs_base__range_ii_u32* r) { +- return r->min_incl; +-} ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC) + +-static inline uint32_t // +-wuffs_base__range_ii_u32__get_max_incl(const wuffs_base__range_ii_u32* r) { +- return r->max_incl; +-} ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC) + +-static inline uint32_t // +-wuffs_base__range_ie_u32__get_min_incl(const wuffs_base__range_ie_u32* r) { +- return r->min_incl; +-} ++// ---------------- Status Codes + +-static inline uint32_t // +-wuffs_base__range_ie_u32__get_max_excl(const wuffs_base__range_ie_u32* r) { +- return r->max_excl; +-} ++// ---------------- Public Consts + +-static inline uint64_t // +-wuffs_base__range_ii_u64__get_min_incl(const wuffs_base__range_ii_u64* r) { +- return r->min_incl; +-} ++// ---------------- Struct Declarations + +-static inline uint64_t // +-wuffs_base__range_ii_u64__get_max_incl(const wuffs_base__range_ii_u64* r) { +- return r->max_incl; +-} ++typedef struct wuffs_xxhash64__hasher__struct wuffs_xxhash64__hasher; + +-static inline uint64_t // +-wuffs_base__range_ie_u64__get_min_incl(const wuffs_base__range_ie_u64* r) { +- return r->min_incl; +-} ++#ifdef __cplusplus ++extern "C" { ++#endif + +-static inline uint64_t // +-wuffs_base__range_ie_u64__get_max_excl(const wuffs_base__range_ie_u64* r) { +- return r->max_excl; +-} ++// ---------------- Public Initializer Prototypes + +-// ---------------- Ranges and Rects (Utility) ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +-#define wuffs_base__utility__empty_range_ii_u32 wuffs_base__empty_range_ii_u32 +-#define wuffs_base__utility__empty_range_ie_u32 wuffs_base__empty_range_ie_u32 +-#define wuffs_base__utility__empty_range_ii_u64 wuffs_base__empty_range_ii_u64 +-#define wuffs_base__utility__empty_range_ie_u64 wuffs_base__empty_range_ie_u64 +-#define wuffs_base__utility__empty_rect_ii_u32 wuffs_base__empty_rect_ii_u32 +-#define wuffs_base__utility__empty_rect_ie_u32 wuffs_base__empty_rect_ie_u32 +-#define wuffs_base__utility__make_range_ii_u32 wuffs_base__make_range_ii_u32 +-#define wuffs_base__utility__make_range_ie_u32 wuffs_base__make_range_ie_u32 +-#define wuffs_base__utility__make_range_ii_u64 wuffs_base__make_range_ii_u64 +-#define wuffs_base__utility__make_range_ie_u64 wuffs_base__make_range_ie_u64 +-#define wuffs_base__utility__make_rect_ii_u32 wuffs_base__make_rect_ii_u32 +-#define wuffs_base__utility__make_rect_ie_u32 wuffs_base__make_rect_ie_u32 ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_xxhash64__hasher__initialize( ++ wuffs_xxhash64__hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); + +-// ---------------- I/O ++size_t ++sizeof__wuffs_xxhash64__hasher(void); + +-static inline uint64_t // +-wuffs_base__io__count_since(uint64_t mark, uint64_t index) { +- if (index >= mark) { +- return index - mark; +- } +- return 0; +-} ++// ---------------- Allocs + +-// TODO: drop the "const" in "const uint8_t* ptr". Some though required about +-// the base.io_reader.since method returning a mutable "slice base.u8". +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wcast-qual" +-#endif +-static inline wuffs_base__slice_u8 // +-wuffs_base__io__since(uint64_t mark, uint64_t index, const uint8_t* ptr) { +- if (index >= mark) { +- return wuffs_base__make_slice_u8(((uint8_t*)ptr) + mark, +- ((size_t)(index - mark))); +- } +- return wuffs_base__make_slice_u8(NULL, 0); +-} +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. + +-// -------- ++wuffs_xxhash64__hasher* ++wuffs_xxhash64__hasher__alloc(void); + +-static inline void // +-wuffs_base__io_reader__limit(const uint8_t** ptr_io2_r, +- const uint8_t* iop_r, +- uint64_t limit) { +- if (((uint64_t)(*ptr_io2_r - iop_r)) > limit) { +- *ptr_io2_r = iop_r + limit; +- } ++static inline wuffs_base__hasher_u64* ++wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64(void) { ++ return (wuffs_base__hasher_u64*)(wuffs_xxhash64__hasher__alloc()); + } + +-static inline uint32_t // +-wuffs_base__io_reader__limited_copy_u32_to_slice(const uint8_t** ptr_iop_r, +- const uint8_t* io2_r, +- uint32_t length, +- wuffs_base__slice_u8 dst) { +- const uint8_t* iop_r = *ptr_iop_r; +- size_t n = dst.len; +- if (n > length) { +- n = length; +- } +- if (n > ((size_t)(io2_r - iop_r))) { +- n = (size_t)(io2_r - iop_r); +- } +- if (n > 0) { +- memmove(dst.ptr, iop_r, n); +- *ptr_iop_r += n; +- } +- return (uint32_t)(n); ++// ---------------- Upcasts ++ ++static inline wuffs_base__hasher_u64* ++wuffs_xxhash64__hasher__upcast_as__wuffs_base__hasher_u64( ++ wuffs_xxhash64__hasher* p) { ++ return (wuffs_base__hasher_u64*)p; + } + +-// wuffs_base__io_reader__match7 returns whether the io_reader's upcoming bytes +-// start with the given prefix (up to 7 bytes long). It is peek-like, not +-// read-like, in that there are no side-effects. +-// +-// The low 3 bits of a hold the prefix length, n. +-// +-// The high 56 bits of a hold the prefix itself, in little-endian order. The +-// first prefix byte is in bits 8..=15, the second prefix byte is in bits +-// 16..=23, etc. The high (8 * (7 - n)) bits are ignored. +-// +-// There are three possible return values: +-// - 0 means success. +-// - 1 means inconclusive, equivalent to "$short read". +-// - 2 means failure. +-static inline uint32_t // +-wuffs_base__io_reader__match7(const uint8_t* iop_r, +- const uint8_t* io2_r, +- wuffs_base__io_buffer* r, +- uint64_t a) { +- uint32_t n = a & 7; +- a >>= 8; +- if ((io2_r - iop_r) >= 8) { +- uint64_t x = wuffs_base__peek_u64le__no_bounds_check(iop_r); +- uint32_t shift = 8 * (8 - n); +- return ((a << shift) == (x << shift)) ? 0 : 2; +- } +- for (; n > 0; n--) { +- if (iop_r >= io2_r) { +- return (r && r->meta.closed) ? 2 : 1; +- } else if (*iop_r != ((uint8_t)(a))) { +- return 2; +- } +- iop_r++; +- a >>= 8; +- } +- return 0; +-} ++// ---------------- Public Function Prototypes + +-static inline wuffs_base__io_buffer* // +-wuffs_base__io_reader__set(wuffs_base__io_buffer* b, +- const uint8_t** ptr_iop_r, +- const uint8_t** ptr_io0_r, +- const uint8_t** ptr_io1_r, +- const uint8_t** ptr_io2_r, +- wuffs_base__slice_u8 data, +- uint64_t history_position) { +- b->data = data; +- b->meta.wi = data.len; +- b->meta.ri = 0; +- b->meta.pos = history_position; +- b->meta.closed = false; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xxhash64__hasher__get_quirk( ++ const wuffs_xxhash64__hasher* self, ++ uint32_t a_key); + +- *ptr_iop_r = data.ptr; +- *ptr_io0_r = data.ptr; +- *ptr_io1_r = data.ptr; +- *ptr_io2_r = data.ptr + data.len; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_xxhash64__hasher__set_quirk( ++ wuffs_xxhash64__hasher* self, ++ uint32_t a_key, ++ uint64_t a_value); + +- return b; +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_xxhash64__hasher__update( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x); + +-// -------- ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xxhash64__hasher__update_u64( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x); + +-static inline uint64_t // +-wuffs_base__io_writer__copy_from_slice(uint8_t** ptr_iop_w, +- uint8_t* io2_w, +- wuffs_base__slice_u8 src) { +- uint8_t* iop_w = *ptr_iop_w; +- size_t n = src.len; +- if (n > ((size_t)(io2_w - iop_w))) { +- n = (size_t)(io2_w - iop_w); +- } +- if (n > 0) { +- memmove(iop_w, src.ptr, n); +- *ptr_iop_w += n; +- } +- return (uint64_t)(n); +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xxhash64__hasher__checksum_u64( ++ const wuffs_xxhash64__hasher* self); + +-static inline void // +-wuffs_base__io_writer__limit(uint8_t** ptr_io2_w, +- uint8_t* iop_w, +- uint64_t limit) { +- if (((uint64_t)(*ptr_io2_w - iop_w)) > limit) { +- *ptr_io2_w = iop_w + limit; +- } +-} ++#ifdef __cplusplus ++} // extern "C" ++#endif + +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_history(uint8_t** ptr_iop_w, +- uint8_t* io0_w, +- uint8_t* io2_w, +- uint32_t length, +- uint32_t distance) { +- if (!distance) { +- return 0; +- } +- uint8_t* p = *ptr_iop_w; +- if ((size_t)(p - io0_w) < (size_t)(distance)) { +- return 0; +- } +- uint8_t* q = p - distance; +- size_t n = (size_t)(io2_w - p); +- if ((size_t)(length) > n) { +- length = (uint32_t)(n); +- } else { +- n = (size_t)(length); +- } +- // TODO: unrolling by 3 seems best for the std/deflate benchmarks, but that +- // is mostly because 3 is the minimum length for the deflate format. This +- // function implementation shouldn't overfit to that one format. Perhaps the +- // limited_copy_u32_from_history Wuffs method should also take an unroll hint +- // argument, and the cgen can look if that argument is the constant +- // expression '3'. +- // +- // See also wuffs_base__io_writer__limited_copy_u32_from_history_fast below. +- for (; n >= 3; n -= 3) { +- *p++ = *q++; +- *p++ = *q++; +- *p++ = *q++; +- } +- for (; n; n--) { +- *p++ = *q++; +- } +- *ptr_iop_w = p; +- return length; +-} ++// ---------------- Struct Definitions + +-// wuffs_base__io_writer__limited_copy_u32_from_history_fast is like the +-// wuffs_base__io_writer__limited_copy_u32_from_history function above, but has +-// stronger pre-conditions. ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. + // +-// The caller needs to prove that: +-// - length <= (io2_w - *ptr_iop_w) +-// - distance >= 1 +-// - distance <= (*ptr_iop_w - io0_w) +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_history_fast(uint8_t** ptr_iop_w, +- uint8_t* io0_w, +- uint8_t* io2_w, +- uint32_t length, +- uint32_t distance) { +- uint8_t* p = *ptr_iop_w; +- uint8_t* q = p - distance; +- uint32_t n = length; +- for (; n >= 3; n -= 3) { +- *p++ = *q++; +- *p++ = *q++; +- *p++ = *q++; +- } +- for (; n; n--) { +- *p++ = *q++; ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C ++ ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_xxhash64__hasher__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. ++ ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__hasher_u64; ++ wuffs_base__vtable null_vtable; ++ ++ uint64_t f_length_modulo_u64; ++ bool f_length_overflows_u64; ++ uint8_t f_padding0; ++ uint8_t f_padding1; ++ uint8_t f_padding2; ++ uint32_t f_buf_len; ++ uint8_t f_buf_data[32]; ++ uint64_t f_v0; ++ uint64_t f_v1; ++ uint64_t f_v2; ++ uint64_t f_v3; ++ } private_impl; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++ ++ // On failure, the alloc_etc functions return nullptr. They don't throw. ++ ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_xxhash64__hasher__alloc()); + } +- *ptr_iop_w = p; +- return length; +-} + +-// wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast +-// copies the previous byte (the one immediately before *ptr_iop_w), copying 8 +-// byte chunks at a time. Each chunk contains 8 repetitions of the same byte. +-// +-// In terms of number of bytes copied, length is rounded up to a multiple of 8. +-// As a special case, a zero length rounds up to 8 (even though 0 is already a +-// multiple of 8), since there is always at least one 8 byte chunk copied. +-// +-// In terms of advancing *ptr_iop_w, length is not rounded up. +-// +-// The caller needs to prove that: +-// - (length + 8) <= (io2_w - *ptr_iop_w) +-// - distance == 1 +-// - distance <= (*ptr_iop_w - io0_w) +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( +- uint8_t** ptr_iop_w, +- uint8_t* io0_w, +- uint8_t* io2_w, +- uint32_t length, +- uint32_t distance) { +- uint8_t* p = *ptr_iop_w; +- uint64_t x = p[-1]; +- x |= x << 8; +- x |= x << 16; +- x |= x << 32; +- uint32_t n = length; +- while (1) { +- wuffs_base__poke_u64le__no_bounds_check(p, x); +- if (n <= 8) { +- p += n; +- break; +- } +- p += 8; +- n -= 8; ++ static inline wuffs_base__hasher_u64::unique_ptr ++ alloc_as__wuffs_base__hasher_u64() { ++ return wuffs_base__hasher_u64::unique_ptr( ++ wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64()); + } +- *ptr_iop_w = p; +- return length; +-} ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +-// wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast is +-// like the wuffs_base__io_writer__limited_copy_u32_from_history_fast function +-// above, but copies 8 byte chunks at a time. +-// +-// In terms of number of bytes copied, length is rounded up to a multiple of 8. +-// As a special case, a zero length rounds up to 8 (even though 0 is already a +-// multiple of 8), since there is always at least one 8 byte chunk copied. +-// +-// In terms of advancing *ptr_iop_w, length is not rounded up. +-// +-// The caller needs to prove that: +-// - (length + 8) <= (io2_w - *ptr_iop_w) +-// - distance >= 8 +-// - distance <= (*ptr_iop_w - io0_w) +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( +- uint8_t** ptr_iop_w, +- uint8_t* io0_w, +- uint8_t* io2_w, +- uint32_t length, +- uint32_t distance) { +- uint8_t* p = *ptr_iop_w; +- uint8_t* q = p - distance; +- uint32_t n = length; +- while (1) { +- memcpy(p, q, 8); +- if (n <= 8) { +- p += n; +- break; +- } +- p += 8; +- q += 8; +- n -= 8; ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_xxhash64__hasher__struct() = delete; ++ wuffs_xxhash64__hasher__struct(const wuffs_xxhash64__hasher__struct&) = delete; ++ wuffs_xxhash64__hasher__struct& operator=( ++ const wuffs_xxhash64__hasher__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) ++ ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_xxhash64__hasher__initialize( ++ this, sizeof_star_self, wuffs_version, options); + } +- *ptr_iop_w = p; +- return length; +-} + +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_reader(uint8_t** ptr_iop_w, +- uint8_t* io2_w, +- uint32_t length, +- const uint8_t** ptr_iop_r, +- const uint8_t* io2_r) { +- uint8_t* iop_w = *ptr_iop_w; +- size_t n = length; +- if (n > ((size_t)(io2_w - iop_w))) { +- n = (size_t)(io2_w - iop_w); ++ inline wuffs_base__hasher_u64* ++ upcast_as__wuffs_base__hasher_u64() { ++ return (wuffs_base__hasher_u64*)this; + } +- const uint8_t* iop_r = *ptr_iop_r; +- if (n > ((size_t)(io2_r - iop_r))) { +- n = (size_t)(io2_r - iop_r); ++ ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_xxhash64__hasher__get_quirk(this, a_key); + } +- if (n > 0) { +- memmove(iop_w, iop_r, n); +- *ptr_iop_w += n; +- *ptr_iop_r += n; ++ ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_xxhash64__hasher__set_quirk(this, a_key, a_value); + } +- return (uint32_t)(n); +-} + +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_slice(uint8_t** ptr_iop_w, +- uint8_t* io2_w, +- uint32_t length, +- wuffs_base__slice_u8 src) { +- uint8_t* iop_w = *ptr_iop_w; +- size_t n = src.len; +- if (n > length) { +- n = length; ++ inline wuffs_base__empty_struct ++ update( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_xxhash64__hasher__update(this, a_x); + } +- if (n > ((size_t)(io2_w - iop_w))) { +- n = (size_t)(io2_w - iop_w); ++ ++ inline uint64_t ++ update_u64( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_xxhash64__hasher__update_u64(this, a_x); + } +- if (n > 0) { +- memmove(iop_w, src.ptr, n); +- *ptr_iop_w += n; ++ ++ inline uint64_t ++ checksum_u64() const { ++ return wuffs_xxhash64__hasher__checksum_u64(this); + } +- return (uint32_t)(n); +-} + +-static inline wuffs_base__io_buffer* // +-wuffs_base__io_writer__set(wuffs_base__io_buffer* b, +- uint8_t** ptr_iop_w, +- uint8_t** ptr_io0_w, +- uint8_t** ptr_io1_w, +- uint8_t** ptr_io2_w, +- wuffs_base__slice_u8 data, +- uint64_t history_position) { +- b->data = data; +- b->meta.wi = 0; +- b->meta.ri = 0; +- b->meta.pos = history_position; +- b->meta.closed = false; ++#endif // __cplusplus ++}; // struct wuffs_xxhash64__hasher__struct + +- *ptr_iop_w = data.ptr; +- *ptr_io0_w = data.ptr; +- *ptr_io1_w = data.ptr; +- *ptr_io2_w = data.ptr + data.len; ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- return b; +-} ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC) + +-// ---------------- I/O (Utility) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) || defined(WUFFS_NONMONOLITHIC) + +-#define wuffs_base__utility__empty_io_reader wuffs_base__empty_io_reader +-#define wuffs_base__utility__empty_io_writer wuffs_base__empty_io_writer ++// ---------------- Status Codes + +-// ---------------- Tokens ++extern const char wuffs_xz__error__bad_bcj_offset[]; ++extern const char wuffs_xz__error__bad_block_header[]; ++extern const char wuffs_xz__error__bad_checksum[]; ++extern const char wuffs_xz__error__bad_filter[]; ++extern const char wuffs_xz__error__bad_footer[]; ++extern const char wuffs_xz__error__bad_header[]; ++extern const char wuffs_xz__error__bad_header_concatenated_stream[]; ++extern const char wuffs_xz__error__bad_index[]; ++extern const char wuffs_xz__error__bad_padding[]; ++extern const char wuffs_xz__error__truncated_input[]; ++extern const char wuffs_xz__error__unsupported_checksum_algorithm[]; ++extern const char wuffs_xz__error__unsupported_filter[]; ++extern const char wuffs_xz__error__unsupported_filter_combination[]; + +-// ---------------- Tokens (Utility) ++// ---------------- Public Consts + +-// ---------------- Memory Allocation ++#define WUFFS_XZ__QUIRK_DECODE_STANDALONE_CONCATENATED_STREAMS 2021322752u + +-// ---------------- Images ++#define WUFFS_XZ__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( +- const wuffs_base__pixel_swizzler* p, +- uint32_t up_to_num_pixels, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- const uint8_t** ptr_iop_r, +- const uint8_t* io2_r); ++#define WUFFS_XZ__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- const uint8_t** ptr_iop_r, +- const uint8_t* io2_r); ++// ---------------- Struct Declarations + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- uint64_t num_pixels); ++typedef struct wuffs_xz__decoder__struct wuffs_xz__decoder; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +-wuffs_base__pixel_swizzler__swizzle_ycck( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_buffer* dst, +- wuffs_base__slice_u8 dst_palette, +- uint32_t width, +- uint32_t height, +- wuffs_base__slice_u8 src0, +- wuffs_base__slice_u8 src1, +- wuffs_base__slice_u8 src2, +- wuffs_base__slice_u8 src3, +- uint32_t width0, +- uint32_t width1, +- uint32_t width2, +- uint32_t width3, +- uint32_t height0, +- uint32_t height1, +- uint32_t height2, +- uint32_t height3, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t stride3, +- uint8_t h0, +- uint8_t h1, +- uint8_t h2, +- uint8_t h3, +- uint8_t v0, +- uint8_t v1, +- uint8_t v2, +- uint8_t v3, +- bool is_rgb_or_cmyk, +- bool triangle_filter_for_2to1, +- wuffs_base__slice_u8 scratch_buffer_2k); ++#ifdef __cplusplus ++extern "C" { ++#endif + +-// ---------------- Images (Utility) ++// ---------------- Public Initializer Prototypes + +-#define wuffs_base__utility__make_pixel_format wuffs_base__make_pixel_format ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +-// ---------------- String Conversions ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_xz__decoder__initialize( ++ wuffs_xz__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); + +-// ---------------- Unicode and UTF-8 ++size_t ++sizeof__wuffs_xz__decoder(void); + +-// ---------------- ++// ---------------- Allocs + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__CORE) ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. + +-const uint8_t wuffs_base__low_bits_mask__u8[8] = { +- 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, +-}; ++wuffs_xz__decoder* ++wuffs_xz__decoder__alloc(void); + +-const uint16_t wuffs_base__low_bits_mask__u16[16] = { +- 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, +- 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, +-}; ++static inline wuffs_base__io_transformer* ++wuffs_xz__decoder__alloc_as__wuffs_base__io_transformer(void) { ++ return (wuffs_base__io_transformer*)(wuffs_xz__decoder__alloc()); ++} + +-const uint32_t wuffs_base__low_bits_mask__u32[32] = { +- 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, +- 0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF, +- 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 0x0001FFFF, +- 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, +- 0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF, +- 0x3FFFFFFF, 0x7FFFFFFF, +-}; ++// ---------------- Upcasts + +-const uint64_t wuffs_base__low_bits_mask__u64[64] = { +- 0x0000000000000000, 0x0000000000000001, 0x0000000000000003, +- 0x0000000000000007, 0x000000000000000F, 0x000000000000001F, +- 0x000000000000003F, 0x000000000000007F, 0x00000000000000FF, +- 0x00000000000001FF, 0x00000000000003FF, 0x00000000000007FF, +- 0x0000000000000FFF, 0x0000000000001FFF, 0x0000000000003FFF, +- 0x0000000000007FFF, 0x000000000000FFFF, 0x000000000001FFFF, +- 0x000000000003FFFF, 0x000000000007FFFF, 0x00000000000FFFFF, +- 0x00000000001FFFFF, 0x00000000003FFFFF, 0x00000000007FFFFF, +- 0x0000000000FFFFFF, 0x0000000001FFFFFF, 0x0000000003FFFFFF, +- 0x0000000007FFFFFF, 0x000000000FFFFFFF, 0x000000001FFFFFFF, +- 0x000000003FFFFFFF, 0x000000007FFFFFFF, 0x00000000FFFFFFFF, +- 0x00000001FFFFFFFF, 0x00000003FFFFFFFF, 0x00000007FFFFFFFF, +- 0x0000000FFFFFFFFF, 0x0000001FFFFFFFFF, 0x0000003FFFFFFFFF, +- 0x0000007FFFFFFFFF, 0x000000FFFFFFFFFF, 0x000001FFFFFFFFFF, +- 0x000003FFFFFFFFFF, 0x000007FFFFFFFFFF, 0x00000FFFFFFFFFFF, +- 0x00001FFFFFFFFFFF, 0x00003FFFFFFFFFFF, 0x00007FFFFFFFFFFF, +- 0x0000FFFFFFFFFFFF, 0x0001FFFFFFFFFFFF, 0x0003FFFFFFFFFFFF, +- 0x0007FFFFFFFFFFFF, 0x000FFFFFFFFFFFFF, 0x001FFFFFFFFFFFFF, +- 0x003FFFFFFFFFFFFF, 0x007FFFFFFFFFFFFF, 0x00FFFFFFFFFFFFFF, +- 0x01FFFFFFFFFFFFFF, 0x03FFFFFFFFFFFFFF, 0x07FFFFFFFFFFFFFF, +- 0x0FFFFFFFFFFFFFFF, 0x1FFFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFFF, +- 0x7FFFFFFFFFFFFFFF, +-}; ++static inline wuffs_base__io_transformer* ++wuffs_xz__decoder__upcast_as__wuffs_base__io_transformer( ++ wuffs_xz__decoder* p) { ++ return (wuffs_base__io_transformer*)p; ++} + +-const uint32_t wuffs_base__pixel_format__bits_per_channel[16] = { +- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +- 0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, +-}; ++// ---------------- Public Function Prototypes + +-const char wuffs_base__note__i_o_redirect[] = "@base: I/O redirect"; +-const char wuffs_base__note__end_of_data[] = "@base: end of data"; +-const char wuffs_base__note__metadata_reported[] = "@base: metadata reported"; +-const char wuffs_base__suspension__even_more_information[] = "$base: even more information"; +-const char wuffs_base__suspension__mispositioned_read[] = "$base: mispositioned read"; +-const char wuffs_base__suspension__mispositioned_write[] = "$base: mispositioned write"; +-const char wuffs_base__suspension__short_read[] = "$base: short read"; +-const char wuffs_base__suspension__short_write[] = "$base: short write"; +-const char wuffs_base__error__bad_i_o_position[] = "#base: bad I/O position"; +-const char wuffs_base__error__bad_argument_length_too_short[] = "#base: bad argument (length too short)"; +-const char wuffs_base__error__bad_argument[] = "#base: bad argument"; +-const char wuffs_base__error__bad_call_sequence[] = "#base: bad call sequence"; +-const char wuffs_base__error__bad_data[] = "#base: bad data"; +-const char wuffs_base__error__bad_receiver[] = "#base: bad receiver"; +-const char wuffs_base__error__bad_restart[] = "#base: bad restart"; +-const char wuffs_base__error__bad_sizeof_receiver[] = "#base: bad sizeof receiver"; +-const char wuffs_base__error__bad_vtable[] = "#base: bad vtable"; +-const char wuffs_base__error__bad_workbuf_length[] = "#base: bad workbuf length"; +-const char wuffs_base__error__bad_wuffs_version[] = "#base: bad wuffs version"; +-const char wuffs_base__error__cannot_return_a_suspension[] = "#base: cannot return a suspension"; +-const char wuffs_base__error__disabled_by_previous_error[] = "#base: disabled by previous error"; +-const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[] = "#base: initialize falsely claimed already zeroed"; +-const char wuffs_base__error__initialize_not_called[] = "#base: initialize not called"; +-const char wuffs_base__error__interleaved_coroutine_calls[] = "#base: interleaved coroutine calls"; +-const char wuffs_base__error__no_more_information[] = "#base: no more information"; +-const char wuffs_base__error__not_enough_data[] = "#base: not enough data"; +-const char wuffs_base__error__out_of_bounds[] = "#base: out of bounds"; +-const char wuffs_base__error__unsupported_image_dimension[] = "#base: unsupported image dimension"; +-const char wuffs_base__error__unsupported_method[] = "#base: unsupported method"; +-const char wuffs_base__error__unsupported_option[] = "#base: unsupported option"; +-const char wuffs_base__error__unsupported_pixel_swizzler_option[] = "#base: unsupported pixel swizzler option"; +-const char wuffs_base__error__too_much_data[] = "#base: too much data"; +- +-const char wuffs_base__hasher_u32__vtable_name[] = "{vtable}wuffs_base__hasher_u32"; +-const char wuffs_base__hasher_u64__vtable_name[] = "{vtable}wuffs_base__hasher_u64"; +-const char wuffs_base__image_decoder__vtable_name[] = "{vtable}wuffs_base__image_decoder"; +-const char wuffs_base__io_transformer__vtable_name[] = "{vtable}wuffs_base__io_transformer"; +-const char wuffs_base__token_decoder__vtable_name[] = "{vtable}wuffs_base__token_decoder"; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xz__decoder__get_quirk( ++ const wuffs_xz__decoder* self, ++ uint32_t a_key); + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__CORE) ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_xz__decoder__set_quirk( ++ wuffs_xz__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value); + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES) ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_xz__decoder__dst_history_retain_length( ++ const wuffs_xz__decoder* self); + +-// ---------------- Interface Definitions. ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_xz__decoder__workbuf_len( ++ const wuffs_xz__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_base__hasher_u32__checksum_u32( +- const wuffs_base__hasher_u32* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_xz__decoder__transform_io( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { +- const wuffs_base__hasher_u32__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->checksum_u32)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#ifdef __cplusplus ++} // extern "C" ++#endif + +- return 0; +-} ++// ---------------- Struct Definitions + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__hasher_u32__get_quirk( +- const wuffs_base__hasher_u32* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { +- const wuffs_base__hasher_u32__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->get_quirk)(self, a_key); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- return 0; +-} ++struct wuffs_xz__decoder__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__hasher_u32__set_quirk( +- wuffs_base__hasher_u32* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__io_transformer; ++ wuffs_base__vtable null_vtable; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { +- const wuffs_base__hasher_u32__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_quirk)(self, a_key, a_value); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ uint32_t f_filters[3]; ++ uint32_t f_num_non_final_filters; ++ uint8_t f_checksummer; ++ bool f_ignore_checksum; ++ bool f_standalone_format; ++ bool f_lzma_needs_reset; ++ bool f_block_has_compressed_size; ++ bool f_block_has_uncompressed_size; ++ uint8_t f_bcj_undo_index; ++ uint32_t f_bcj_pos; ++ uint32_t f_bcj_x86_prev_mask; ++ uint64_t f_block_compressed_size; ++ uint64_t f_block_uncompressed_size; ++ uint64_t f_compressed_size_for_index; ++ uint32_t f_verification_have_hashed_sizes[2]; ++ uint32_t f_verification_want_hashed_sizes[2]; ++ uint64_t f_verification_have_total_sizes[2]; ++ uint64_t f_verification_want_total_sizes[2]; ++ uint64_t f_num_actual_blocks; ++ uint64_t f_num_index_blocks; ++ uint64_t f_index_block_compressed_size; ++ uint64_t f_index_block_uncompressed_size; ++ uint64_t f_backwards_size; ++ bool f_started_verify_index; ++ uint16_t f_flags; ++ ++ uint8_t (*choosy_apply_non_final_filters)( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; ++ uint32_t p_decode_block_header_with_padding; ++ uint32_t p_decode_block_header_sans_padding; ++ uint32_t p_verify_index; ++ uint32_t p_verify_footer; ++ } private_impl; + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ struct { ++ uint8_t f_filter_data[3][256]; ++ wuffs_crc32__ieee_hasher f_crc32; ++ wuffs_crc64__ecma_hasher f_crc64; ++ wuffs_sha256__hasher f_sha256; ++ wuffs_lzma__decoder f_lzma; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_base__hasher_u32__update( +- wuffs_base__hasher_u32* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); +- } ++ struct { ++ uint32_t v_checksum32_have; ++ uint32_t v_checksum32_want; ++ wuffs_base__bitvec256 v_checksum256_have; ++ uint64_t v_compressed_size; ++ uint64_t v_uncompressed_size; ++ uint64_t scratch; ++ } s_do_transform_io; ++ struct { ++ uint64_t v_padded_size_have; ++ uint64_t v_padded_size_want; ++ } s_decode_block_header_with_padding; ++ struct { ++ uint8_t v_flags; ++ uint8_t v_filter_id; ++ uint32_t v_shift; ++ uint32_t v_f; ++ uint64_t scratch; ++ } s_decode_block_header_sans_padding; ++ struct { ++ uint32_t v_shift; ++ } s_verify_index; ++ struct { ++ uint64_t scratch; ++ } s_verify_footer; ++ } private_data; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { +- const wuffs_base__hasher_u32__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->update)(self, a_x); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; + +- return wuffs_base__make_empty_struct(); +-} ++ // On failure, the alloc_etc functions return nullptr. They don't throw. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_base__hasher_u32__update_u32( +- wuffs_base__hasher_u32* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return 0; +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_xz__decoder__alloc()); + } + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { +- const wuffs_base__hasher_u32__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->update_u32)(self, a_x); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; ++ static inline wuffs_base__io_transformer::unique_ptr ++ alloc_as__wuffs_base__io_transformer() { ++ return wuffs_base__io_transformer::unique_ptr( ++ wuffs_xz__decoder__alloc_as__wuffs_base__io_transformer()); + } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +- return 0; +-} ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_xz__decoder__struct() = delete; ++ wuffs_xz__decoder__struct(const wuffs_xz__decoder__struct&) = delete; ++ wuffs_xz__decoder__struct& operator=( ++ const wuffs_xz__decoder__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +-// -------- ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__hasher_u64__checksum_u64( +- const wuffs_base__hasher_u64* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_xz__decoder__initialize( ++ this, sizeof_star_self, wuffs_version, options); + } + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { +- const wuffs_base__hasher_u64__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->checksum_u64)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; ++ inline wuffs_base__io_transformer* ++ upcast_as__wuffs_base__io_transformer() { ++ return (wuffs_base__io_transformer*)this; + } + +- return 0; +-} +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__hasher_u64__get_quirk( +- const wuffs_base__hasher_u64* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_xz__decoder__get_quirk(this, a_key); + } + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { +- const wuffs_base__hasher_u64__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->get_quirk)(self, a_key); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_xz__decoder__set_quirk(this, a_key, a_value); + } + +- return 0; +-} +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__hasher_u64__set_quirk( +- wuffs_base__hasher_u64* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_xz__decoder__dst_history_retain_length(this); + } + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { +- const wuffs_base__hasher_u64__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_quirk)(self, a_key, a_value); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_xz__decoder__workbuf_len(this); + } + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_base__hasher_u64__update( +- wuffs_base__hasher_u64* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ inline wuffs_base__status ++ transform_io( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ return wuffs_xz__decoder__transform_io(this, a_dst, a_src, a_workbuf); + } + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { +- const wuffs_base__hasher_u64__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->update)(self, a_x); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#endif // __cplusplus ++}; // struct wuffs_xz__decoder__struct + +- return wuffs_base__make_empty_struct(); +-} ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__hasher_u64__update_u64( +- wuffs_base__hasher_u64* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return 0; +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; +- } ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) || defined(WUFFS_NONMONOLITHIC) + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { +- const wuffs_base__hasher_u64__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->update_u64)(self, a_x); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +- return 0; +-} ++// ---------------- Auxiliary - Base + +-// -------- ++// Auxiliary code is discussed at ++// https://github.com/google/wuffs/blob/main/doc/note/auxiliary-code.md + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__decode_frame( +- wuffs_base__image_decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++#include + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->decode_frame)(self, a_dst, a_src, a_blend, a_workbuf, a_opts); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#include ++#include + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++namespace wuffs_aux { + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__decode_frame_config( +- wuffs_base__image_decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++using IOBuffer = wuffs_base__io_buffer; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->decode_frame_config)(self, a_dst, a_src); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++// MemOwner represents ownership of some memory. Dynamically allocated memory ++// (e.g. from malloc or new) is typically paired with free or delete, invoked ++// when the std::unique_ptr is destroyed. Statically allocated memory might use ++// MemOwner(nullptr, &free), even if that statically allocated memory is not ++// nullptr, since calling free(nullptr) is a no-op. ++using MemOwner = std::unique_ptr; + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++using QuirkKeyValuePair = std::pair; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__decode_image_config( +- wuffs_base__image_decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++namespace sync_io { + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->decode_image_config)(self, a_dst, a_src); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++// -------- + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++// DynIOBuffer is an IOBuffer that is backed by a dynamically sized byte array. ++// It owns that backing array and will free it in its destructor. ++// ++// The array size can be explicitly extended (by calling the grow method) but, ++// unlike a C++ std::vector, there is no implicit extension (e.g. by calling ++// std::vector::insert) and its maximum size is capped by the max_incl ++// constructor argument. ++// ++// It contains an IOBuffer-typed field whose reader side provides access to ++// previously written bytes and whose writer side provides access to the ++// allocated but not-yet-written-to slack space. For Go programmers, this slack ++// space is roughly analogous to the s[len(s):cap(s)] space of a slice s. ++class DynIOBuffer { ++ public: ++ enum GrowResult { ++ OK = 0, ++ FailedMaxInclExceeded = 1, ++ FailedOutOfMemory = 2, ++ }; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_base__image_decoder__frame_dirty_rect( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } ++ // m_buf holds the dynamically sized byte array and its read/write indexes: ++ // - m_buf.meta.wi is roughly analogous to a Go slice's length. ++ // - m_buf.data.len is roughly analogous to a Go slice's capacity. It is ++ // also equal to the m_buf.data.ptr malloc/realloc size. ++ // ++ // Users should not modify the m_buf.data.ptr or m_buf.data.len fields (as ++ // they are conceptually private to this class), but they can modify the ++ // bytes referenced by that pointer-length pair (e.g. compactions). ++ IOBuffer m_buf; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->frame_dirty_rect)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // m_max_incl is an inclusive upper bound on the backing array size. ++ const uint64_t m_max_incl; + +- return wuffs_base__utility__empty_rect_ie_u32(); +-} ++ // Constructor and destructor. ++ explicit DynIOBuffer(uint64_t max_incl); ++ ~DynIOBuffer(); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__image_decoder__get_quirk( +- const wuffs_base__image_decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ // Drop frees the byte array and resets m_buf. The DynIOBuffer can still be ++ // used after a drop call. It just restarts from zero. ++ void drop(); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->get_quirk)(self, a_key); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // grow ensures that the byte array size is at least min_incl and at most ++ // max_incl. It returns FailedMaxInclExceeded if that would require ++ // allocating more than max_incl bytes, including the case where (min_incl > ++ // max_incl). It returns FailedOutOfMemory if memory allocation failed. ++ GrowResult grow(uint64_t min_incl); + +- return 0; +-} ++ private: ++ // Delete the copy and assign constructors. ++ DynIOBuffer(const DynIOBuffer&) = delete; ++ DynIOBuffer& operator=(const DynIOBuffer&) = delete; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__image_decoder__history_retain_length( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ static uint64_t round_up(uint64_t min_incl, uint64_t max_incl); ++}; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->history_retain_length)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++// -------- + +- return 0; +-} ++class Input { ++ public: ++ virtual ~Input(); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_base__image_decoder__num_animation_loops( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ virtual IOBuffer* BringsItsOwnIOBuffer(); ++ virtual std::string CopyIn(IOBuffer* dst) = 0; ++}; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->num_animation_loops)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++// -------- + +- return 0; +-} ++// FileInput is an Input that reads from a file source. ++// ++// It does not take responsibility for closing the file when done. ++class FileInput : public Input { ++ public: ++ FileInput(FILE* f); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__image_decoder__num_decoded_frame_configs( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ virtual std::string CopyIn(IOBuffer* dst); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->num_decoded_frame_configs)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ private: ++ FILE* m_f; + +- return 0; +-} ++ // Delete the copy and assign constructors. ++ FileInput(const FileInput&) = delete; ++ FileInput& operator=(const FileInput&) = delete; ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__image_decoder__num_decoded_frames( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++// -------- + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->num_decoded_frames)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++// MemoryInput is an Input that reads from an in-memory source. ++// ++// It does not take responsibility for freeing the memory when done. ++class MemoryInput : public Input { ++ public: ++ MemoryInput(const char* ptr, size_t len); ++ MemoryInput(const uint8_t* ptr, size_t len); + +- return 0; +-} ++ virtual IOBuffer* BringsItsOwnIOBuffer(); ++ virtual std::string CopyIn(IOBuffer* dst); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__restart_frame( +- wuffs_base__image_decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++ private: ++ IOBuffer m_io; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->restart_frame)(self, a_index, a_io_position); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // Delete the copy and assign constructors. ++ MemoryInput(const MemoryInput&) = delete; ++ MemoryInput& operator=(const MemoryInput&) = delete; ++}; + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++// -------- + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__set_quirk( +- wuffs_base__image_decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++} // namespace sync_io + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_quirk)(self, a_key, a_value); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++} // namespace wuffs_aux + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++// ---------------- Auxiliary - CBOR + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_base__image_decoder__set_report_metadata( +- wuffs_base__image_decoder* self, +- uint32_t a_fourcc, +- bool a_report) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); +- } ++namespace wuffs_aux { + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_report_metadata)(self, a_fourcc, a_report); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++struct DecodeCborResult { ++ DecodeCborResult(std::string&& error_message0, uint64_t cursor_position0); + +- return wuffs_base__make_empty_struct(); +-} ++ std::string error_message; ++ uint64_t cursor_position; ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__tell_me_more( +- wuffs_base__image_decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++class DecodeCborCallbacks { ++ public: ++ virtual ~DecodeCborCallbacks(); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->tell_me_more)(self, a_dst, a_minfo, a_src); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // AppendXxx are called for leaf nodes: literals, numbers, strings, etc. + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ virtual std::string AppendNull() = 0; ++ virtual std::string AppendUndefined() = 0; ++ virtual std::string AppendBool(bool val) = 0; ++ virtual std::string AppendF64(double val) = 0; ++ virtual std::string AppendI64(int64_t val) = 0; ++ virtual std::string AppendU64(uint64_t val) = 0; ++ virtual std::string AppendByteString(std::string&& val) = 0; ++ virtual std::string AppendTextString(std::string&& val) = 0; ++ virtual std::string AppendMinus1MinusX(uint64_t val) = 0; ++ virtual std::string AppendCborSimpleValue(uint8_t val) = 0; ++ virtual std::string AppendCborTag(uint64_t val) = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_base__image_decoder__workbuf_len( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } ++ // Push and Pop are called for container nodes: CBOR arrays (lists) and CBOR ++ // maps (dictionaries). ++ // ++ // The flags bits combine exactly one of: ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT ++ // and exactly one of: ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->workbuf_len)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ virtual std::string Push(uint32_t flags) = 0; ++ virtual std::string Pop(uint32_t flags) = 0; + +- return wuffs_base__utility__empty_range_ii_u64(); +-} ++ // Done is always the last Callback method called by DecodeCbor, whether or ++ // not parsing the input as CBOR encountered an error. Even when successful, ++ // trailing data may remain in input and buffer. ++ // ++ // Do not keep a reference to buffer or buffer.data.ptr after Done returns, ++ // as DecodeCbor may then de-allocate the backing array. ++ // ++ // The default Done implementation is a no-op. ++ virtual void // ++ Done(DecodeCborResult& result, sync_io::Input& input, IOBuffer& buffer); ++}; + +-// -------- ++// The FooArgBar types add structure to Foo's optional arguments. They wrap ++// inner representations for several reasons: ++// - It provides a home for the DefaultValue static method, for Foo callers ++// that want to override some but not all optional arguments. ++// - It provides the "Bar" name at Foo call sites, which can help self- ++// document Foo calls with many arguemnts. ++// - It provides some type safety against accidentally transposing or omitting ++// adjacent fundamentally-numeric-typed optional arguments. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__io_transformer__get_quirk( +- const wuffs_base__io_transformer* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++// DecodeCborArgQuirks wraps an optional argument to DecodeCbor. ++struct DecodeCborArgQuirks { ++ explicit DecodeCborArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { +- const wuffs_base__io_transformer__func_ptrs* func_ptrs = +- (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->get_quirk)(self, a_key); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // DefaultValue returns an empty slice. ++ static DecodeCborArgQuirks DefaultValue(); + +- return 0; +-} ++ const QuirkKeyValuePair* ptr; ++ const size_t len; ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__io_transformer__history_retain_length( +- const wuffs_base__io_transformer* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++// DecodeCbor calls callbacks based on the CBOR-formatted data in input. ++// ++// On success, the returned error_message is empty and cursor_position counts ++// the number of bytes consumed. On failure, error_message is non-empty and ++// cursor_position is the location of the error. That error may be a content ++// error (invalid CBOR) or an input error (e.g. network failure). ++DecodeCborResult // ++DecodeCbor(DecodeCborCallbacks& callbacks, ++ sync_io::Input& input, ++ DecodeCborArgQuirks quirks = DecodeCborArgQuirks::DefaultValue()); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { +- const wuffs_base__io_transformer__func_ptrs* func_ptrs = +- (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->history_retain_length)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++} // namespace wuffs_aux + +- return 0; +-} ++// ---------------- Auxiliary - Image + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__io_transformer__set_quirk( +- wuffs_base__io_transformer* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++namespace wuffs_aux { + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { +- const wuffs_base__io_transformer__func_ptrs* func_ptrs = +- (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_quirk)(self, a_key, a_value); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++struct DecodeImageResult { ++ DecodeImageResult(MemOwner&& pixbuf_mem_owner0, ++ wuffs_base__pixel_buffer pixbuf0, ++ std::string&& error_message0); ++ DecodeImageResult(std::string&& error_message0); + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ MemOwner pixbuf_mem_owner; ++ wuffs_base__pixel_buffer pixbuf; ++ std::string error_message; ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__io_transformer__transform_io( +- wuffs_base__io_transformer* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++// DecodeImageCallbacks are the callbacks given to DecodeImage. They are always ++// called in this order: ++// 1. SelectDecoder ++// 2. HandleMetadata ++// 3. SelectPixfmt ++// 4. AllocPixbuf ++// 5. AllocWorkbuf ++// 6. Done ++// ++// It may return early - the third callback might not be invoked if the second ++// one fails - but the final callback (Done) is always invoked. ++class DecodeImageCallbacks { ++ public: ++ // AllocPixbufResult holds a memory allocation (the result of malloc or new, ++ // a statically allocated pointer, etc), or an error message. The memory is ++ // de-allocated when mem_owner goes out of scope and is destroyed. ++ struct AllocPixbufResult { ++ AllocPixbufResult(MemOwner&& mem_owner0, wuffs_base__pixel_buffer pixbuf0); ++ AllocPixbufResult(std::string&& error_message0); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { +- const wuffs_base__io_transformer__func_ptrs* func_ptrs = +- (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->transform_io)(self, a_dst, a_src, a_workbuf); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ MemOwner mem_owner; ++ wuffs_base__pixel_buffer pixbuf; ++ std::string error_message; ++ }; + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ // AllocWorkbufResult holds a memory allocation (the result of malloc or new, ++ // a statically allocated pointer, etc), or an error message. The memory is ++ // de-allocated when mem_owner goes out of scope and is destroyed. ++ struct AllocWorkbufResult { ++ AllocWorkbufResult(MemOwner&& mem_owner0, wuffs_base__slice_u8 workbuf0); ++ AllocWorkbufResult(std::string&& error_message0); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_base__io_transformer__workbuf_len( +- const wuffs_base__io_transformer* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } ++ MemOwner mem_owner; ++ wuffs_base__slice_u8 workbuf; ++ std::string error_message; ++ }; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { +- const wuffs_base__io_transformer__func_ptrs* func_ptrs = +- (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->workbuf_len)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ virtual ~DecodeImageCallbacks(); + +- return wuffs_base__utility__empty_range_ii_u64(); +-} ++ // SelectDecoder returns the image decoder for the input data's file format. ++ // Returning a nullptr means failure (DecodeImage_UnsupportedImageFormat). ++ // ++ // Common formats will have a FourCC value in the range [1 ..= 0x7FFF_FFFF], ++ // such as WUFFS_BASE__FOURCC__JPEG. A zero FourCC value means that Wuffs' ++ // standard library did not recognize the image format but if SelectDecoder ++ // was overridden, it may examine the input data's starting bytes and still ++ // provide its own image decoder, e.g. for an exotic image file format that's ++ // not in Wuffs' standard library. The prefix_etc fields have the same ++ // meaning as wuffs_base__magic_number_guess_fourcc arguments. SelectDecoder ++ // implementations should not modify prefix_data's contents. ++ // ++ // SelectDecoder might be called more than once, since some image file ++ // formats can wrap others. For example, a nominal BMP file can actually ++ // contain a JPEG or a PNG. ++ // ++ // The default SelectDecoder accepts the FOURCC codes listed below. For ++ // modular builds (i.e. when #define'ing WUFFS_CONFIG__MODULES), acceptance ++ // of the ETC file format is optional (for each value of ETC) and depends on ++ // the corresponding module to be enabled at compile time (i.e. #define'ing ++ // WUFFS_CONFIG__MODULE__ETC). ++ // - WUFFS_BASE__FOURCC__BMP ++ // - WUFFS_BASE__FOURCC__GIF ++ // - WUFFS_BASE__FOURCC__JPEG ++ // - WUFFS_BASE__FOURCC__NIE ++ // - WUFFS_BASE__FOURCC__NPBM ++ // - WUFFS_BASE__FOURCC__PNG ++ // - WUFFS_BASE__FOURCC__QOI ++ // - WUFFS_BASE__FOURCC__TGA ++ // - WUFFS_BASE__FOURCC__WBMP ++ // - WUFFS_BASE__FOURCC__WEBP ++ virtual wuffs_base__image_decoder::unique_ptr // ++ SelectDecoder(uint32_t fourcc, ++ wuffs_base__slice_u8 prefix_data, ++ bool prefix_closed); + +-// -------- ++ // HandleMetadata acknowledges image metadata. minfo.flavor will be one of: ++ // - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH ++ // - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED ++ // If it is ETC__METADATA_RAW_ETC then raw contains the metadata bytes. Those ++ // bytes should not be retained beyond the the HandleMetadata call. ++ // ++ // minfo.metadata__fourcc() will typically match one of the ++ // DecodeImageArgFlags bits. For example, if (REPORT_METADATA_CHRM | ++ // REPORT_METADATA_GAMA) was passed to DecodeImage then the metadata FourCC ++ // will be either WUFFS_BASE__FOURCC__CHRM or WUFFS_BASE__FOURCC__GAMA. ++ // ++ // It returns an error message, or an empty string on success. ++ virtual std::string // ++ HandleMetadata(const wuffs_base__more_information& minfo, ++ wuffs_base__slice_u8 raw); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__token_decoder__decode_tokens( +- wuffs_base__token_decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++ // SelectPixfmt returns the destination pixel format for AllocPixbuf. It ++ // should return wuffs_base__make_pixel_format(etc) called with one of: ++ // - WUFFS_BASE__PIXEL_FORMAT__BGR_565 ++ // - WUFFS_BASE__PIXEL_FORMAT__BGR ++ // - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL ++ // - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE ++ // - WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL ++ // - WUFFS_BASE__PIXEL_FORMAT__RGB ++ // - WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL ++ // - WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL ++ // or return image_config.pixcfg.pixel_format(). The latter means to use the ++ // image file's natural pixel format. For example, GIF images' natural pixel ++ // format is an indexed one. ++ // ++ // Returning otherwise means failure (DecodeImage_UnsupportedPixelFormat). ++ // ++ // The default SelectPixfmt implementation returns ++ // wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL) which ++ // is 4 bytes per pixel (8 bits per channel × 4 channels). ++ virtual wuffs_base__pixel_format // ++ SelectPixfmt(const wuffs_base__image_config& image_config); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { +- const wuffs_base__token_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->decode_tokens)(self, a_dst, a_src, a_workbuf); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // AllocPixbuf allocates the pixel buffer. ++ // ++ // allow_uninitialized_memory will be true if a valid background_color was ++ // passed to DecodeImage, since the pixel buffer's contents will be ++ // overwritten with that color after AllocPixbuf returns. ++ // ++ // The default AllocPixbuf implementation allocates either uninitialized or ++ // zeroed memory. Zeroed memory typically corresponds to filling with opaque ++ // black or transparent black, depending on the pixel format. ++ virtual AllocPixbufResult // ++ AllocPixbuf(const wuffs_base__image_config& image_config, ++ bool allow_uninitialized_memory); + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ // AllocWorkbuf allocates the work buffer. The allocated buffer's length ++ // should be at least len_range.min_incl, but larger allocations (up to ++ // len_range.max_incl) may have better performance (by using more memory). ++ // ++ // The default AllocWorkbuf implementation allocates len_range.max_incl bytes ++ // of either uninitialized or zeroed memory. ++ virtual AllocWorkbufResult // ++ AllocWorkbuf(wuffs_base__range_ii_u64 len_range, ++ bool allow_uninitialized_memory); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__token_decoder__get_quirk( +- const wuffs_base__token_decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ // Done is always the last Callback method called by DecodeImage, whether or ++ // not parsing the input encountered an error. Even when successful, trailing ++ // data may remain in input and buffer. ++ // ++ // The image_decoder is the one returned by SelectDecoder (if SelectDecoder ++ // was successful), or a no-op unique_ptr otherwise. Like any unique_ptr, ++ // ownership moves to the Done implementation. ++ // ++ // Do not keep a reference to buffer or buffer.data.ptr after Done returns, ++ // as DecodeImage may then de-allocate the backing array. ++ // ++ // The default Done implementation is a no-op, other than running the ++ // image_decoder unique_ptr destructor. ++ virtual void // ++ Done(DecodeImageResult& result, ++ sync_io::Input& input, ++ IOBuffer& buffer, ++ wuffs_base__image_decoder::unique_ptr image_decoder); ++}; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { +- const wuffs_base__token_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->get_quirk)(self, a_key); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++extern const char DecodeImage_BufferIsTooShort[]; ++extern const char DecodeImage_MaxInclDimensionExceeded[]; ++extern const char DecodeImage_MaxInclMetadataLengthExceeded[]; ++extern const char DecodeImage_OutOfMemory[]; ++extern const char DecodeImage_UnexpectedEndOfFile[]; ++extern const char DecodeImage_UnsupportedImageFormat[]; ++extern const char DecodeImage_UnsupportedMetadata[]; ++extern const char DecodeImage_UnsupportedPixelBlend[]; ++extern const char DecodeImage_UnsupportedPixelConfiguration[]; ++extern const char DecodeImage_UnsupportedPixelFormat[]; + +- return 0; +-} ++// The FooArgBar types add structure to Foo's optional arguments. They wrap ++// inner representations for several reasons: ++// - It provides a home for the DefaultValue static method, for Foo callers ++// that want to override some but not all optional arguments. ++// - It provides the "Bar" name at Foo call sites, which can help self- ++// document Foo calls with many arguemnts. ++// - It provides some type safety against accidentally transposing or omitting ++// adjacent fundamentally-numeric-typed optional arguments. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__token_decoder__history_retain_length( +- const wuffs_base__token_decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++// DecodeImageArgQuirks wraps an optional argument to DecodeImage. ++struct DecodeImageArgQuirks { ++ explicit DecodeImageArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { +- const wuffs_base__token_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->history_retain_length)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // DefaultValue returns an empty slice. ++ static DecodeImageArgQuirks DefaultValue(); + +- return 0; +-} ++ const QuirkKeyValuePair* ptr; ++ const size_t len; ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__token_decoder__set_quirk( +- wuffs_base__token_decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++// DecodeImageArgFlags wraps an optional argument to DecodeImage. ++struct DecodeImageArgFlags { ++ explicit DecodeImageArgFlags(uint64_t repr0); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { +- const wuffs_base__token_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_quirk)(self, a_key, a_value); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // DefaultValue returns 0. ++ static DecodeImageArgFlags DefaultValue(); + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ // TODO: support all of the REPORT_METADATA_ETC flags, not just CHRM, EXIF, ++ // GAMA, ICCP, KVP, SRGB and XMP. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_base__token_decoder__workbuf_len( +- const wuffs_base__token_decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } ++ // Background Color. ++ static constexpr uint64_t REPORT_METADATA_BGCL = 0x0001; ++ // Primary Chromaticities and White Point. ++ static constexpr uint64_t REPORT_METADATA_CHRM = 0x0002; ++ // Exchangeable Image File Format. ++ static constexpr uint64_t REPORT_METADATA_EXIF = 0x0004; ++ // Gamma Correction. ++ static constexpr uint64_t REPORT_METADATA_GAMA = 0x0008; ++ // International Color Consortium Profile. ++ static constexpr uint64_t REPORT_METADATA_ICCP = 0x0010; ++ // Key-Value Pair. ++ // ++ // For PNG files, this includes iTXt, tEXt and zTXt chunks. In the ++ // HandleMetadata callback, the raw argument contains UTF-8 strings. ++ static constexpr uint64_t REPORT_METADATA_KVP = 0x0020; ++ // Modification Time. ++ static constexpr uint64_t REPORT_METADATA_MTIM = 0x0040; ++ // Offset (2-Dimensional). ++ static constexpr uint64_t REPORT_METADATA_OFS2 = 0x0080; ++ // Physical Dimensions. ++ static constexpr uint64_t REPORT_METADATA_PHYD = 0x0100; ++ // Standard Red Green Blue (Rendering Intent). ++ static constexpr uint64_t REPORT_METADATA_SRGB = 0x0200; ++ // Extensible Metadata Platform. ++ static constexpr uint64_t REPORT_METADATA_XMP = 0x0400; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { +- const wuffs_base__token_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->workbuf_len)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ uint64_t repr; ++}; + +- return wuffs_base__utility__empty_range_ii_u64(); +-} ++// DecodeImageArgPixelBlend wraps an optional argument to DecodeImage. ++struct DecodeImageArgPixelBlend { ++ explicit DecodeImageArgPixelBlend(wuffs_base__pixel_blend repr0); + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES) ++ // DefaultValue returns WUFFS_BASE__PIXEL_BLEND__SRC. ++ static DecodeImageArgPixelBlend DefaultValue(); + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV) ++ wuffs_base__pixel_blend repr; ++}; + +-// ---------------- IEEE 754 Floating Point ++// DecodeImageArgBackgroundColor wraps an optional argument to DecodeImage. ++struct DecodeImageArgBackgroundColor { ++ explicit DecodeImageArgBackgroundColor( ++ wuffs_base__color_u32_argb_premul repr0); + +-// The etc__hpd_left_shift and etc__powers_of_5 tables were printed by +-// script/print-hpd-left-shift.go. That script has an optional -comments flag, +-// whose output is not copied here, which prints further detail. +-// +-// These tables are used in +-// wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits. ++ // DefaultValue returns 1, an invalid wuffs_base__color_u32_argb_premul. ++ static DecodeImageArgBackgroundColor DefaultValue(); ++ ++ wuffs_base__color_u32_argb_premul repr; ++}; ++ ++// DecodeImageArgMaxInclDimension wraps an optional argument to DecodeImage. ++struct DecodeImageArgMaxInclDimension { ++ explicit DecodeImageArgMaxInclDimension(uint32_t repr0); ++ ++ // DefaultValue returns 1048575 = 0x000F_FFFF, more than 1 million pixels. ++ static DecodeImageArgMaxInclDimension DefaultValue(); ++ ++ uint32_t repr; ++}; ++ ++// DecodeImageArgMaxInclMetadataLength wraps an optional argument to ++// DecodeImage. ++struct DecodeImageArgMaxInclMetadataLength { ++ explicit DecodeImageArgMaxInclMetadataLength(uint64_t repr0); ++ ++ // DefaultValue returns 16777215 = 0x00FF_FFFF, one less than 16 MiB. ++ static DecodeImageArgMaxInclMetadataLength DefaultValue(); ++ ++ uint64_t repr; ++}; + +-// wuffs_base__private_implementation__hpd_left_shift[i] encodes the number of +-// new digits created after multiplying a positive integer by (1 << i): the +-// additional length in the decimal representation. For example, shifting "234" +-// by 3 (equivalent to multiplying by 8) will produce "1872". Going from a +-// 3-length string to a 4-length string means that 1 new digit was added (and +-// existing digits may have changed). ++// DecodeImage decodes the image data in input. A variety of image file formats ++// can be decoded, depending on what callbacks.SelectDecoder returns. + // +-// Shifting by i can add either N or N-1 new digits, depending on whether the +-// original positive integer compares >= or < to the i'th power of 5 (as 10 +-// equals 2 * 5). Comparison is lexicographic, not numerical. ++// For animated formats, only the first frame is returned, since the API is ++// simpler for synchronous I/O and having DecodeImage only return when ++// completely done, but rendering animation often involves handling other ++// events in between animation frames. To decode multiple frames of animated ++// images, or for asynchronous I/O (e.g. when decoding an image streamed over ++// the network), use Wuffs' lower level C API instead of its higher level, ++// simplified C++ API (the wuffs_aux API). + // +-// For example, shifting by 4 (i.e. multiplying by 16) can add 1 or 2 new +-// digits, depending on a lexicographic comparison to (5 ** 4), i.e. "625": +-// - ("1" << 4) is "16", which adds 1 new digit. +-// - ("5678" << 4) is "90848", which adds 1 new digit. +-// - ("624" << 4) is "9984", which adds 1 new digit. +-// - ("62498" << 4) is "999968", which adds 1 new digit. +-// - ("625" << 4) is "10000", which adds 2 new digits. +-// - ("625001" << 4) is "10000016", which adds 2 new digits. +-// - ("7008" << 4) is "112128", which adds 2 new digits. +-// - ("99" << 4) is "1584", which adds 2 new digits. ++// The DecodeImageResult's fields depend on whether decoding succeeded: ++// - On total success, the error_message is empty and pixbuf.pixcfg.is_valid() ++// is true. ++// - On partial success (e.g. the input file was truncated but we are still ++// able to decode some of the pixels), error_message is non-empty but ++// pixbuf.pixcfg.is_valid() is still true. It is up to the caller whether to ++// accept or reject partial success. ++// - On failure, the error_message is non_empty and pixbuf.pixcfg.is_valid() ++// is false. + // +-// Thus, when i is 4, N is 2 and (5 ** i) is "625". This etc__hpd_left_shift +-// array encodes this as: +-// - etc__hpd_left_shift[4] is 0x1006 = (2 << 11) | 0x0006. +-// - etc__hpd_left_shift[5] is 0x1009 = (? << 11) | 0x0009. +-// where the ? isn't relevant for i == 4. ++// The callbacks allocate the pixel buffer memory and work buffer memory. On ++// success, pixel buffer memory ownership is passed to the DecodeImage caller ++// as the returned pixbuf_mem_owner. Regardless of success or failure, the work ++// buffer memory is deleted. + // +-// The high 5 bits of etc__hpd_left_shift[i] is N, the higher of the two +-// possible number of new digits. The low 11 bits are an offset into the +-// etc__powers_of_5 array (of length 0x051C, so offsets fit in 11 bits). When i +-// is 4, its offset and the next one is 6 and 9, and etc__powers_of_5[6 .. 9] +-// is the string "\x06\x02\x05", so the relevant power of 5 is "625". ++// The pixel_blend (one of the constants listed below) determines how to ++// composite the decoded image over the pixel buffer's original pixels (as ++// returned by callbacks.AllocPixbuf): ++// - WUFFS_BASE__PIXEL_BLEND__SRC ++// - WUFFS_BASE__PIXEL_BLEND__SRC_OVER + // +-// Thanks to Ken Thompson for the original idea. +-static const uint16_t wuffs_base__private_implementation__hpd_left_shift[65] = { +- 0x0000, 0x0800, 0x0801, 0x0803, 0x1006, 0x1009, 0x100D, 0x1812, 0x1817, +- 0x181D, 0x2024, 0x202B, 0x2033, 0x203C, 0x2846, 0x2850, 0x285B, 0x3067, +- 0x3073, 0x3080, 0x388E, 0x389C, 0x38AB, 0x38BB, 0x40CC, 0x40DD, 0x40EF, +- 0x4902, 0x4915, 0x4929, 0x513E, 0x5153, 0x5169, 0x5180, 0x5998, 0x59B0, +- 0x59C9, 0x61E3, 0x61FD, 0x6218, 0x6A34, 0x6A50, 0x6A6D, 0x6A8B, 0x72AA, +- 0x72C9, 0x72E9, 0x7B0A, 0x7B2B, 0x7B4D, 0x8370, 0x8393, 0x83B7, 0x83DC, +- 0x8C02, 0x8C28, 0x8C4F, 0x9477, 0x949F, 0x94C8, 0x9CF2, 0x051C, 0x051C, +- 0x051C, 0x051C, +-}; +- +-// wuffs_base__private_implementation__powers_of_5 contains the powers of 5, +-// concatenated together: "5", "25", "125", "625", "3125", etc. +-static const uint8_t wuffs_base__private_implementation__powers_of_5[0x051C] = { +- 5, 2, 5, 1, 2, 5, 6, 2, 5, 3, 1, 2, 5, 1, 5, 6, 2, 5, 7, 8, 1, 2, 5, 3, 9, +- 0, 6, 2, 5, 1, 9, 5, 3, 1, 2, 5, 9, 7, 6, 5, 6, 2, 5, 4, 8, 8, 2, 8, 1, 2, +- 5, 2, 4, 4, 1, 4, 0, 6, 2, 5, 1, 2, 2, 0, 7, 0, 3, 1, 2, 5, 6, 1, 0, 3, 5, +- 1, 5, 6, 2, 5, 3, 0, 5, 1, 7, 5, 7, 8, 1, 2, 5, 1, 5, 2, 5, 8, 7, 8, 9, 0, +- 6, 2, 5, 7, 6, 2, 9, 3, 9, 4, 5, 3, 1, 2, 5, 3, 8, 1, 4, 6, 9, 7, 2, 6, 5, +- 6, 2, 5, 1, 9, 0, 7, 3, 4, 8, 6, 3, 2, 8, 1, 2, 5, 9, 5, 3, 6, 7, 4, 3, 1, +- 6, 4, 0, 6, 2, 5, 4, 7, 6, 8, 3, 7, 1, 5, 8, 2, 0, 3, 1, 2, 5, 2, 3, 8, 4, +- 1, 8, 5, 7, 9, 1, 0, 1, 5, 6, 2, 5, 1, 1, 9, 2, 0, 9, 2, 8, 9, 5, 5, 0, 7, +- 8, 1, 2, 5, 5, 9, 6, 0, 4, 6, 4, 4, 7, 7, 5, 3, 9, 0, 6, 2, 5, 2, 9, 8, 0, +- 2, 3, 2, 2, 3, 8, 7, 6, 9, 5, 3, 1, 2, 5, 1, 4, 9, 0, 1, 1, 6, 1, 1, 9, 3, +- 8, 4, 7, 6, 5, 6, 2, 5, 7, 4, 5, 0, 5, 8, 0, 5, 9, 6, 9, 2, 3, 8, 2, 8, 1, +- 2, 5, 3, 7, 2, 5, 2, 9, 0, 2, 9, 8, 4, 6, 1, 9, 1, 4, 0, 6, 2, 5, 1, 8, 6, +- 2, 6, 4, 5, 1, 4, 9, 2, 3, 0, 9, 5, 7, 0, 3, 1, 2, 5, 9, 3, 1, 3, 2, 2, 5, +- 7, 4, 6, 1, 5, 4, 7, 8, 5, 1, 5, 6, 2, 5, 4, 6, 5, 6, 6, 1, 2, 8, 7, 3, 0, +- 7, 7, 3, 9, 2, 5, 7, 8, 1, 2, 5, 2, 3, 2, 8, 3, 0, 6, 4, 3, 6, 5, 3, 8, 6, +- 9, 6, 2, 8, 9, 0, 6, 2, 5, 1, 1, 6, 4, 1, 5, 3, 2, 1, 8, 2, 6, 9, 3, 4, 8, +- 1, 4, 4, 5, 3, 1, 2, 5, 5, 8, 2, 0, 7, 6, 6, 0, 9, 1, 3, 4, 6, 7, 4, 0, 7, +- 2, 2, 6, 5, 6, 2, 5, 2, 9, 1, 0, 3, 8, 3, 0, 4, 5, 6, 7, 3, 3, 7, 0, 3, 6, +- 1, 3, 2, 8, 1, 2, 5, 1, 4, 5, 5, 1, 9, 1, 5, 2, 2, 8, 3, 6, 6, 8, 5, 1, 8, +- 0, 6, 6, 4, 0, 6, 2, 5, 7, 2, 7, 5, 9, 5, 7, 6, 1, 4, 1, 8, 3, 4, 2, 5, 9, +- 0, 3, 3, 2, 0, 3, 1, 2, 5, 3, 6, 3, 7, 9, 7, 8, 8, 0, 7, 0, 9, 1, 7, 1, 2, +- 9, 5, 1, 6, 6, 0, 1, 5, 6, 2, 5, 1, 8, 1, 8, 9, 8, 9, 4, 0, 3, 5, 4, 5, 8, +- 5, 6, 4, 7, 5, 8, 3, 0, 0, 7, 8, 1, 2, 5, 9, 0, 9, 4, 9, 4, 7, 0, 1, 7, 7, +- 2, 9, 2, 8, 2, 3, 7, 9, 1, 5, 0, 3, 9, 0, 6, 2, 5, 4, 5, 4, 7, 4, 7, 3, 5, +- 0, 8, 8, 6, 4, 6, 4, 1, 1, 8, 9, 5, 7, 5, 1, 9, 5, 3, 1, 2, 5, 2, 2, 7, 3, +- 7, 3, 6, 7, 5, 4, 4, 3, 2, 3, 2, 0, 5, 9, 4, 7, 8, 7, 5, 9, 7, 6, 5, 6, 2, +- 5, 1, 1, 3, 6, 8, 6, 8, 3, 7, 7, 2, 1, 6, 1, 6, 0, 2, 9, 7, 3, 9, 3, 7, 9, +- 8, 8, 2, 8, 1, 2, 5, 5, 6, 8, 4, 3, 4, 1, 8, 8, 6, 0, 8, 0, 8, 0, 1, 4, 8, +- 6, 9, 6, 8, 9, 9, 4, 1, 4, 0, 6, 2, 5, 2, 8, 4, 2, 1, 7, 0, 9, 4, 3, 0, 4, +- 0, 4, 0, 0, 7, 4, 3, 4, 8, 4, 4, 9, 7, 0, 7, 0, 3, 1, 2, 5, 1, 4, 2, 1, 0, +- 8, 5, 4, 7, 1, 5, 2, 0, 2, 0, 0, 3, 7, 1, 7, 4, 2, 2, 4, 8, 5, 3, 5, 1, 5, +- 6, 2, 5, 7, 1, 0, 5, 4, 2, 7, 3, 5, 7, 6, 0, 1, 0, 0, 1, 8, 5, 8, 7, 1, 1, +- 2, 4, 2, 6, 7, 5, 7, 8, 1, 2, 5, 3, 5, 5, 2, 7, 1, 3, 6, 7, 8, 8, 0, 0, 5, +- 0, 0, 9, 2, 9, 3, 5, 5, 6, 2, 1, 3, 3, 7, 8, 9, 0, 6, 2, 5, 1, 7, 7, 6, 3, +- 5, 6, 8, 3, 9, 4, 0, 0, 2, 5, 0, 4, 6, 4, 6, 7, 7, 8, 1, 0, 6, 6, 8, 9, 4, +- 5, 3, 1, 2, 5, 8, 8, 8, 1, 7, 8, 4, 1, 9, 7, 0, 0, 1, 2, 5, 2, 3, 2, 3, 3, +- 8, 9, 0, 5, 3, 3, 4, 4, 7, 2, 6, 5, 6, 2, 5, 4, 4, 4, 0, 8, 9, 2, 0, 9, 8, +- 5, 0, 0, 6, 2, 6, 1, 6, 1, 6, 9, 4, 5, 2, 6, 6, 7, 2, 3, 6, 3, 2, 8, 1, 2, +- 5, 2, 2, 2, 0, 4, 4, 6, 0, 4, 9, 2, 5, 0, 3, 1, 3, 0, 8, 0, 8, 4, 7, 2, 6, +- 3, 3, 3, 6, 1, 8, 1, 6, 4, 0, 6, 2, 5, 1, 1, 1, 0, 2, 2, 3, 0, 2, 4, 6, 2, +- 5, 1, 5, 6, 5, 4, 0, 4, 2, 3, 6, 3, 1, 6, 6, 8, 0, 9, 0, 8, 2, 0, 3, 1, 2, +- 5, 5, 5, 5, 1, 1, 1, 5, 1, 2, 3, 1, 2, 5, 7, 8, 2, 7, 0, 2, 1, 1, 8, 1, 5, +- 8, 3, 4, 0, 4, 5, 4, 1, 0, 1, 5, 6, 2, 5, 2, 7, 7, 5, 5, 5, 7, 5, 6, 1, 5, +- 6, 2, 8, 9, 1, 3, 5, 1, 0, 5, 9, 0, 7, 9, 1, 7, 0, 2, 2, 7, 0, 5, 0, 7, 8, +- 1, 2, 5, 1, 3, 8, 7, 7, 7, 8, 7, 8, 0, 7, 8, 1, 4, 4, 5, 6, 7, 5, 5, 2, 9, +- 5, 3, 9, 5, 8, 5, 1, 1, 3, 5, 2, 5, 3, 9, 0, 6, 2, 5, 6, 9, 3, 8, 8, 9, 3, +- 9, 0, 3, 9, 0, 7, 2, 2, 8, 3, 7, 7, 6, 4, 7, 6, 9, 7, 9, 2, 5, 5, 6, 7, 6, +- 2, 6, 9, 5, 3, 1, 2, 5, 3, 4, 6, 9, 4, 4, 6, 9, 5, 1, 9, 5, 3, 6, 1, 4, 1, +- 8, 8, 8, 2, 3, 8, 4, 8, 9, 6, 2, 7, 8, 3, 8, 1, 3, 4, 7, 6, 5, 6, 2, 5, 1, +- 7, 3, 4, 7, 2, 3, 4, 7, 5, 9, 7, 6, 8, 0, 7, 0, 9, 4, 4, 1, 1, 9, 2, 4, 4, +- 8, 1, 3, 9, 1, 9, 0, 6, 7, 3, 8, 2, 8, 1, 2, 5, 8, 6, 7, 3, 6, 1, 7, 3, 7, +- 9, 8, 8, 4, 0, 3, 5, 4, 7, 2, 0, 5, 9, 6, 2, 2, 4, 0, 6, 9, 5, 9, 5, 3, 3, +- 6, 9, 1, 4, 0, 6, 2, 5, +-}; ++// The background_color is used to fill the pixel buffer after ++// callbacks.AllocPixbuf returns, if it is valid in the ++// wuffs_base__color_u32_argb_premul__is_valid sense. The default value, ++// 0x0000_0001, is not valid since its Blue channel value (0x01) is greater ++// than its Alpha channel value (0x00). A valid background_color will typically ++// be overwritten when pixel_blend is WUFFS_BASE__PIXEL_BLEND__SRC, but might ++// still be visible on partial (not total) success or when pixel_blend is ++// WUFFS_BASE__PIXEL_BLEND__SRC_OVER and the decoded image is not fully opaque. ++// ++// Decoding fails (with DecodeImage_MaxInclDimensionExceeded) if the image's ++// width or height is greater than max_incl_dimension or if any opted-in (via ++// flags bits) metadata is longer than max_incl_metadata_length. ++DecodeImageResult // ++DecodeImage(DecodeImageCallbacks& callbacks, ++ sync_io::Input& input, ++ DecodeImageArgQuirks quirks = DecodeImageArgQuirks::DefaultValue(), ++ DecodeImageArgFlags flags = DecodeImageArgFlags::DefaultValue(), ++ DecodeImageArgPixelBlend pixel_blend = ++ DecodeImageArgPixelBlend::DefaultValue(), ++ DecodeImageArgBackgroundColor background_color = ++ DecodeImageArgBackgroundColor::DefaultValue(), ++ DecodeImageArgMaxInclDimension max_incl_dimension = ++ DecodeImageArgMaxInclDimension::DefaultValue(), ++ DecodeImageArgMaxInclMetadataLength max_incl_metadata_length = ++ DecodeImageArgMaxInclMetadataLength::DefaultValue()); + +-// -------- ++} // namespace wuffs_aux + +-// wuffs_base__private_implementation__powers_of_10 contains truncated +-// approximations to the powers of 10, ranging from 1e-307 to 1e+288 inclusive, +-// as 596 pairs of uint64_t values (a 128-bit mantissa). +-// +-// There's also an implicit third column (implied by a linear formula involving +-// the base-10 exponent) that is the base-2 exponent, biased by a magic +-// constant. That constant (1214 or 0x04BE) equals 1023 + 191. 1023 is the bias +-// for IEEE 754 double-precision floating point. 191 is ((3 * 64) - 1) and +-// wuffs_base__private_implementation__parse_number_f64_eisel_lemire works with +-// multiples-of-64-bit mantissas. +-// +-// For example, the third row holds the approximation to 1e-305: +-// 0xE0B62E29_29ABA83C_331ACDAB_FE94DE87 * (2 ** (0x0049 - 0x04BE)) +-// +-// Similarly, 1e+4 is approximated by: +-// 0x9C400000_00000000_00000000_00000000 * (2 ** (0x044C - 0x04BE)) +-// +-// Similarly, 1e+68 is approximated by: +-// 0xED63A231_D4C4FB27_4CA7AAA8_63EE4BDD * (2 ** (0x0520 - 0x04BE)) +-// +-// This table was generated by by script/print-mpb-powers-of-10.go +-static const uint64_t wuffs_base__private_implementation__powers_of_10[596][2] = +- { +- {0xA5D3B6D479F8E056, 0x8FD0C16206306BAB}, // 1e-307 +- {0x8F48A4899877186C, 0xB3C4F1BA87BC8696}, // 1e-306 +- {0x331ACDABFE94DE87, 0xE0B62E2929ABA83C}, // 1e-305 +- {0x9FF0C08B7F1D0B14, 0x8C71DCD9BA0B4925}, // 1e-304 +- {0x07ECF0AE5EE44DD9, 0xAF8E5410288E1B6F}, // 1e-303 +- {0xC9E82CD9F69D6150, 0xDB71E91432B1A24A}, // 1e-302 +- {0xBE311C083A225CD2, 0x892731AC9FAF056E}, // 1e-301 +- {0x6DBD630A48AAF406, 0xAB70FE17C79AC6CA}, // 1e-300 +- {0x092CBBCCDAD5B108, 0xD64D3D9DB981787D}, // 1e-299 +- {0x25BBF56008C58EA5, 0x85F0468293F0EB4E}, // 1e-298 +- {0xAF2AF2B80AF6F24E, 0xA76C582338ED2621}, // 1e-297 +- {0x1AF5AF660DB4AEE1, 0xD1476E2C07286FAA}, // 1e-296 +- {0x50D98D9FC890ED4D, 0x82CCA4DB847945CA}, // 1e-295 +- {0xE50FF107BAB528A0, 0xA37FCE126597973C}, // 1e-294 +- {0x1E53ED49A96272C8, 0xCC5FC196FEFD7D0C}, // 1e-293 +- {0x25E8E89C13BB0F7A, 0xFF77B1FCBEBCDC4F}, // 1e-292 +- {0x77B191618C54E9AC, 0x9FAACF3DF73609B1}, // 1e-291 +- {0xD59DF5B9EF6A2417, 0xC795830D75038C1D}, // 1e-290 +- {0x4B0573286B44AD1D, 0xF97AE3D0D2446F25}, // 1e-289 +- {0x4EE367F9430AEC32, 0x9BECCE62836AC577}, // 1e-288 +- {0x229C41F793CDA73F, 0xC2E801FB244576D5}, // 1e-287 +- {0x6B43527578C1110F, 0xF3A20279ED56D48A}, // 1e-286 +- {0x830A13896B78AAA9, 0x9845418C345644D6}, // 1e-285 +- {0x23CC986BC656D553, 0xBE5691EF416BD60C}, // 1e-284 +- {0x2CBFBE86B7EC8AA8, 0xEDEC366B11C6CB8F}, // 1e-283 +- {0x7BF7D71432F3D6A9, 0x94B3A202EB1C3F39}, // 1e-282 +- {0xDAF5CCD93FB0CC53, 0xB9E08A83A5E34F07}, // 1e-281 +- {0xD1B3400F8F9CFF68, 0xE858AD248F5C22C9}, // 1e-280 +- {0x23100809B9C21FA1, 0x91376C36D99995BE}, // 1e-279 +- {0xABD40A0C2832A78A, 0xB58547448FFFFB2D}, // 1e-278 +- {0x16C90C8F323F516C, 0xE2E69915B3FFF9F9}, // 1e-277 +- {0xAE3DA7D97F6792E3, 0x8DD01FAD907FFC3B}, // 1e-276 +- {0x99CD11CFDF41779C, 0xB1442798F49FFB4A}, // 1e-275 +- {0x40405643D711D583, 0xDD95317F31C7FA1D}, // 1e-274 +- {0x482835EA666B2572, 0x8A7D3EEF7F1CFC52}, // 1e-273 +- {0xDA3243650005EECF, 0xAD1C8EAB5EE43B66}, // 1e-272 +- {0x90BED43E40076A82, 0xD863B256369D4A40}, // 1e-271 +- {0x5A7744A6E804A291, 0x873E4F75E2224E68}, // 1e-270 +- {0x711515D0A205CB36, 0xA90DE3535AAAE202}, // 1e-269 +- {0x0D5A5B44CA873E03, 0xD3515C2831559A83}, // 1e-268 +- {0xE858790AFE9486C2, 0x8412D9991ED58091}, // 1e-267 +- {0x626E974DBE39A872, 0xA5178FFF668AE0B6}, // 1e-266 +- {0xFB0A3D212DC8128F, 0xCE5D73FF402D98E3}, // 1e-265 +- {0x7CE66634BC9D0B99, 0x80FA687F881C7F8E}, // 1e-264 +- {0x1C1FFFC1EBC44E80, 0xA139029F6A239F72}, // 1e-263 +- {0xA327FFB266B56220, 0xC987434744AC874E}, // 1e-262 +- {0x4BF1FF9F0062BAA8, 0xFBE9141915D7A922}, // 1e-261 +- {0x6F773FC3603DB4A9, 0x9D71AC8FADA6C9B5}, // 1e-260 +- {0xCB550FB4384D21D3, 0xC4CE17B399107C22}, // 1e-259 +- {0x7E2A53A146606A48, 0xF6019DA07F549B2B}, // 1e-258 +- {0x2EDA7444CBFC426D, 0x99C102844F94E0FB}, // 1e-257 +- {0xFA911155FEFB5308, 0xC0314325637A1939}, // 1e-256 +- {0x793555AB7EBA27CA, 0xF03D93EEBC589F88}, // 1e-255 +- {0x4BC1558B2F3458DE, 0x96267C7535B763B5}, // 1e-254 +- {0x9EB1AAEDFB016F16, 0xBBB01B9283253CA2}, // 1e-253 +- {0x465E15A979C1CADC, 0xEA9C227723EE8BCB}, // 1e-252 +- {0x0BFACD89EC191EC9, 0x92A1958A7675175F}, // 1e-251 +- {0xCEF980EC671F667B, 0xB749FAED14125D36}, // 1e-250 +- {0x82B7E12780E7401A, 0xE51C79A85916F484}, // 1e-249 +- {0xD1B2ECB8B0908810, 0x8F31CC0937AE58D2}, // 1e-248 +- {0x861FA7E6DCB4AA15, 0xB2FE3F0B8599EF07}, // 1e-247 +- {0x67A791E093E1D49A, 0xDFBDCECE67006AC9}, // 1e-246 +- {0xE0C8BB2C5C6D24E0, 0x8BD6A141006042BD}, // 1e-245 +- {0x58FAE9F773886E18, 0xAECC49914078536D}, // 1e-244 +- {0xAF39A475506A899E, 0xDA7F5BF590966848}, // 1e-243 +- {0x6D8406C952429603, 0x888F99797A5E012D}, // 1e-242 +- {0xC8E5087BA6D33B83, 0xAAB37FD7D8F58178}, // 1e-241 +- {0xFB1E4A9A90880A64, 0xD5605FCDCF32E1D6}, // 1e-240 +- {0x5CF2EEA09A55067F, 0x855C3BE0A17FCD26}, // 1e-239 +- {0xF42FAA48C0EA481E, 0xA6B34AD8C9DFC06F}, // 1e-238 +- {0xF13B94DAF124DA26, 0xD0601D8EFC57B08B}, // 1e-237 +- {0x76C53D08D6B70858, 0x823C12795DB6CE57}, // 1e-236 +- {0x54768C4B0C64CA6E, 0xA2CB1717B52481ED}, // 1e-235 +- {0xA9942F5DCF7DFD09, 0xCB7DDCDDA26DA268}, // 1e-234 +- {0xD3F93B35435D7C4C, 0xFE5D54150B090B02}, // 1e-233 +- {0xC47BC5014A1A6DAF, 0x9EFA548D26E5A6E1}, // 1e-232 +- {0x359AB6419CA1091B, 0xC6B8E9B0709F109A}, // 1e-231 +- {0xC30163D203C94B62, 0xF867241C8CC6D4C0}, // 1e-230 +- {0x79E0DE63425DCF1D, 0x9B407691D7FC44F8}, // 1e-229 +- {0x985915FC12F542E4, 0xC21094364DFB5636}, // 1e-228 +- {0x3E6F5B7B17B2939D, 0xF294B943E17A2BC4}, // 1e-227 +- {0xA705992CEECF9C42, 0x979CF3CA6CEC5B5A}, // 1e-226 +- {0x50C6FF782A838353, 0xBD8430BD08277231}, // 1e-225 +- {0xA4F8BF5635246428, 0xECE53CEC4A314EBD}, // 1e-224 +- {0x871B7795E136BE99, 0x940F4613AE5ED136}, // 1e-223 +- {0x28E2557B59846E3F, 0xB913179899F68584}, // 1e-222 +- {0x331AEADA2FE589CF, 0xE757DD7EC07426E5}, // 1e-221 +- {0x3FF0D2C85DEF7621, 0x9096EA6F3848984F}, // 1e-220 +- {0x0FED077A756B53A9, 0xB4BCA50B065ABE63}, // 1e-219 +- {0xD3E8495912C62894, 0xE1EBCE4DC7F16DFB}, // 1e-218 +- {0x64712DD7ABBBD95C, 0x8D3360F09CF6E4BD}, // 1e-217 +- {0xBD8D794D96AACFB3, 0xB080392CC4349DEC}, // 1e-216 +- {0xECF0D7A0FC5583A0, 0xDCA04777F541C567}, // 1e-215 +- {0xF41686C49DB57244, 0x89E42CAAF9491B60}, // 1e-214 +- {0x311C2875C522CED5, 0xAC5D37D5B79B6239}, // 1e-213 +- {0x7D633293366B828B, 0xD77485CB25823AC7}, // 1e-212 +- {0xAE5DFF9C02033197, 0x86A8D39EF77164BC}, // 1e-211 +- {0xD9F57F830283FDFC, 0xA8530886B54DBDEB}, // 1e-210 +- {0xD072DF63C324FD7B, 0xD267CAA862A12D66}, // 1e-209 +- {0x4247CB9E59F71E6D, 0x8380DEA93DA4BC60}, // 1e-208 +- {0x52D9BE85F074E608, 0xA46116538D0DEB78}, // 1e-207 +- {0x67902E276C921F8B, 0xCD795BE870516656}, // 1e-206 +- {0x00BA1CD8A3DB53B6, 0x806BD9714632DFF6}, // 1e-205 +- {0x80E8A40ECCD228A4, 0xA086CFCD97BF97F3}, // 1e-204 +- {0x6122CD128006B2CD, 0xC8A883C0FDAF7DF0}, // 1e-203 +- {0x796B805720085F81, 0xFAD2A4B13D1B5D6C}, // 1e-202 +- {0xCBE3303674053BB0, 0x9CC3A6EEC6311A63}, // 1e-201 +- {0xBEDBFC4411068A9C, 0xC3F490AA77BD60FC}, // 1e-200 +- {0xEE92FB5515482D44, 0xF4F1B4D515ACB93B}, // 1e-199 +- {0x751BDD152D4D1C4A, 0x991711052D8BF3C5}, // 1e-198 +- {0xD262D45A78A0635D, 0xBF5CD54678EEF0B6}, // 1e-197 +- {0x86FB897116C87C34, 0xEF340A98172AACE4}, // 1e-196 +- {0xD45D35E6AE3D4DA0, 0x9580869F0E7AAC0E}, // 1e-195 +- {0x8974836059CCA109, 0xBAE0A846D2195712}, // 1e-194 +- {0x2BD1A438703FC94B, 0xE998D258869FACD7}, // 1e-193 +- {0x7B6306A34627DDCF, 0x91FF83775423CC06}, // 1e-192 +- {0x1A3BC84C17B1D542, 0xB67F6455292CBF08}, // 1e-191 +- {0x20CABA5F1D9E4A93, 0xE41F3D6A7377EECA}, // 1e-190 +- {0x547EB47B7282EE9C, 0x8E938662882AF53E}, // 1e-189 +- {0xE99E619A4F23AA43, 0xB23867FB2A35B28D}, // 1e-188 +- {0x6405FA00E2EC94D4, 0xDEC681F9F4C31F31}, // 1e-187 +- {0xDE83BC408DD3DD04, 0x8B3C113C38F9F37E}, // 1e-186 +- {0x9624AB50B148D445, 0xAE0B158B4738705E}, // 1e-185 +- {0x3BADD624DD9B0957, 0xD98DDAEE19068C76}, // 1e-184 +- {0xE54CA5D70A80E5D6, 0x87F8A8D4CFA417C9}, // 1e-183 +- {0x5E9FCF4CCD211F4C, 0xA9F6D30A038D1DBC}, // 1e-182 +- {0x7647C3200069671F, 0xD47487CC8470652B}, // 1e-181 +- {0x29ECD9F40041E073, 0x84C8D4DFD2C63F3B}, // 1e-180 +- {0xF468107100525890, 0xA5FB0A17C777CF09}, // 1e-179 +- {0x7182148D4066EEB4, 0xCF79CC9DB955C2CC}, // 1e-178 +- {0xC6F14CD848405530, 0x81AC1FE293D599BF}, // 1e-177 +- {0xB8ADA00E5A506A7C, 0xA21727DB38CB002F}, // 1e-176 +- {0xA6D90811F0E4851C, 0xCA9CF1D206FDC03B}, // 1e-175 +- {0x908F4A166D1DA663, 0xFD442E4688BD304A}, // 1e-174 +- {0x9A598E4E043287FE, 0x9E4A9CEC15763E2E}, // 1e-173 +- {0x40EFF1E1853F29FD, 0xC5DD44271AD3CDBA}, // 1e-172 +- {0xD12BEE59E68EF47C, 0xF7549530E188C128}, // 1e-171 +- {0x82BB74F8301958CE, 0x9A94DD3E8CF578B9}, // 1e-170 +- {0xE36A52363C1FAF01, 0xC13A148E3032D6E7}, // 1e-169 +- {0xDC44E6C3CB279AC1, 0xF18899B1BC3F8CA1}, // 1e-168 +- {0x29AB103A5EF8C0B9, 0x96F5600F15A7B7E5}, // 1e-167 +- {0x7415D448F6B6F0E7, 0xBCB2B812DB11A5DE}, // 1e-166 +- {0x111B495B3464AD21, 0xEBDF661791D60F56}, // 1e-165 +- {0xCAB10DD900BEEC34, 0x936B9FCEBB25C995}, // 1e-164 +- {0x3D5D514F40EEA742, 0xB84687C269EF3BFB}, // 1e-163 +- {0x0CB4A5A3112A5112, 0xE65829B3046B0AFA}, // 1e-162 +- {0x47F0E785EABA72AB, 0x8FF71A0FE2C2E6DC}, // 1e-161 +- {0x59ED216765690F56, 0xB3F4E093DB73A093}, // 1e-160 +- {0x306869C13EC3532C, 0xE0F218B8D25088B8}, // 1e-159 +- {0x1E414218C73A13FB, 0x8C974F7383725573}, // 1e-158 +- {0xE5D1929EF90898FA, 0xAFBD2350644EEACF}, // 1e-157 +- {0xDF45F746B74ABF39, 0xDBAC6C247D62A583}, // 1e-156 +- {0x6B8BBA8C328EB783, 0x894BC396CE5DA772}, // 1e-155 +- {0x066EA92F3F326564, 0xAB9EB47C81F5114F}, // 1e-154 +- {0xC80A537B0EFEFEBD, 0xD686619BA27255A2}, // 1e-153 +- {0xBD06742CE95F5F36, 0x8613FD0145877585}, // 1e-152 +- {0x2C48113823B73704, 0xA798FC4196E952E7}, // 1e-151 +- {0xF75A15862CA504C5, 0xD17F3B51FCA3A7A0}, // 1e-150 +- {0x9A984D73DBE722FB, 0x82EF85133DE648C4}, // 1e-149 +- {0xC13E60D0D2E0EBBA, 0xA3AB66580D5FDAF5}, // 1e-148 +- {0x318DF905079926A8, 0xCC963FEE10B7D1B3}, // 1e-147 +- {0xFDF17746497F7052, 0xFFBBCFE994E5C61F}, // 1e-146 +- {0xFEB6EA8BEDEFA633, 0x9FD561F1FD0F9BD3}, // 1e-145 +- {0xFE64A52EE96B8FC0, 0xC7CABA6E7C5382C8}, // 1e-144 +- {0x3DFDCE7AA3C673B0, 0xF9BD690A1B68637B}, // 1e-143 +- {0x06BEA10CA65C084E, 0x9C1661A651213E2D}, // 1e-142 +- {0x486E494FCFF30A62, 0xC31BFA0FE5698DB8}, // 1e-141 +- {0x5A89DBA3C3EFCCFA, 0xF3E2F893DEC3F126}, // 1e-140 +- {0xF89629465A75E01C, 0x986DDB5C6B3A76B7}, // 1e-139 +- {0xF6BBB397F1135823, 0xBE89523386091465}, // 1e-138 +- {0x746AA07DED582E2C, 0xEE2BA6C0678B597F}, // 1e-137 +- {0xA8C2A44EB4571CDC, 0x94DB483840B717EF}, // 1e-136 +- {0x92F34D62616CE413, 0xBA121A4650E4DDEB}, // 1e-135 +- {0x77B020BAF9C81D17, 0xE896A0D7E51E1566}, // 1e-134 +- {0x0ACE1474DC1D122E, 0x915E2486EF32CD60}, // 1e-133 +- {0x0D819992132456BA, 0xB5B5ADA8AAFF80B8}, // 1e-132 +- {0x10E1FFF697ED6C69, 0xE3231912D5BF60E6}, // 1e-131 +- {0xCA8D3FFA1EF463C1, 0x8DF5EFABC5979C8F}, // 1e-130 +- {0xBD308FF8A6B17CB2, 0xB1736B96B6FD83B3}, // 1e-129 +- {0xAC7CB3F6D05DDBDE, 0xDDD0467C64BCE4A0}, // 1e-128 +- {0x6BCDF07A423AA96B, 0x8AA22C0DBEF60EE4}, // 1e-127 +- {0x86C16C98D2C953C6, 0xAD4AB7112EB3929D}, // 1e-126 +- {0xE871C7BF077BA8B7, 0xD89D64D57A607744}, // 1e-125 +- {0x11471CD764AD4972, 0x87625F056C7C4A8B}, // 1e-124 +- {0xD598E40D3DD89BCF, 0xA93AF6C6C79B5D2D}, // 1e-123 +- {0x4AFF1D108D4EC2C3, 0xD389B47879823479}, // 1e-122 +- {0xCEDF722A585139BA, 0x843610CB4BF160CB}, // 1e-121 +- {0xC2974EB4EE658828, 0xA54394FE1EEDB8FE}, // 1e-120 +- {0x733D226229FEEA32, 0xCE947A3DA6A9273E}, // 1e-119 +- {0x0806357D5A3F525F, 0x811CCC668829B887}, // 1e-118 +- {0xCA07C2DCB0CF26F7, 0xA163FF802A3426A8}, // 1e-117 +- {0xFC89B393DD02F0B5, 0xC9BCFF6034C13052}, // 1e-116 +- {0xBBAC2078D443ACE2, 0xFC2C3F3841F17C67}, // 1e-115 +- {0xD54B944B84AA4C0D, 0x9D9BA7832936EDC0}, // 1e-114 +- {0x0A9E795E65D4DF11, 0xC5029163F384A931}, // 1e-113 +- {0x4D4617B5FF4A16D5, 0xF64335BCF065D37D}, // 1e-112 +- {0x504BCED1BF8E4E45, 0x99EA0196163FA42E}, // 1e-111 +- {0xE45EC2862F71E1D6, 0xC06481FB9BCF8D39}, // 1e-110 +- {0x5D767327BB4E5A4C, 0xF07DA27A82C37088}, // 1e-109 +- {0x3A6A07F8D510F86F, 0x964E858C91BA2655}, // 1e-108 +- {0x890489F70A55368B, 0xBBE226EFB628AFEA}, // 1e-107 +- {0x2B45AC74CCEA842E, 0xEADAB0ABA3B2DBE5}, // 1e-106 +- {0x3B0B8BC90012929D, 0x92C8AE6B464FC96F}, // 1e-105 +- {0x09CE6EBB40173744, 0xB77ADA0617E3BBCB}, // 1e-104 +- {0xCC420A6A101D0515, 0xE55990879DDCAABD}, // 1e-103 +- {0x9FA946824A12232D, 0x8F57FA54C2A9EAB6}, // 1e-102 +- {0x47939822DC96ABF9, 0xB32DF8E9F3546564}, // 1e-101 +- {0x59787E2B93BC56F7, 0xDFF9772470297EBD}, // 1e-100 +- {0x57EB4EDB3C55B65A, 0x8BFBEA76C619EF36}, // 1e-99 +- {0xEDE622920B6B23F1, 0xAEFAE51477A06B03}, // 1e-98 +- {0xE95FAB368E45ECED, 0xDAB99E59958885C4}, // 1e-97 +- {0x11DBCB0218EBB414, 0x88B402F7FD75539B}, // 1e-96 +- {0xD652BDC29F26A119, 0xAAE103B5FCD2A881}, // 1e-95 +- {0x4BE76D3346F0495F, 0xD59944A37C0752A2}, // 1e-94 +- {0x6F70A4400C562DDB, 0x857FCAE62D8493A5}, // 1e-93 +- {0xCB4CCD500F6BB952, 0xA6DFBD9FB8E5B88E}, // 1e-92 +- {0x7E2000A41346A7A7, 0xD097AD07A71F26B2}, // 1e-91 +- {0x8ED400668C0C28C8, 0x825ECC24C873782F}, // 1e-90 +- {0x728900802F0F32FA, 0xA2F67F2DFA90563B}, // 1e-89 +- {0x4F2B40A03AD2FFB9, 0xCBB41EF979346BCA}, // 1e-88 +- {0xE2F610C84987BFA8, 0xFEA126B7D78186BC}, // 1e-87 +- {0x0DD9CA7D2DF4D7C9, 0x9F24B832E6B0F436}, // 1e-86 +- {0x91503D1C79720DBB, 0xC6EDE63FA05D3143}, // 1e-85 +- {0x75A44C6397CE912A, 0xF8A95FCF88747D94}, // 1e-84 +- {0xC986AFBE3EE11ABA, 0x9B69DBE1B548CE7C}, // 1e-83 +- {0xFBE85BADCE996168, 0xC24452DA229B021B}, // 1e-82 +- {0xFAE27299423FB9C3, 0xF2D56790AB41C2A2}, // 1e-81 +- {0xDCCD879FC967D41A, 0x97C560BA6B0919A5}, // 1e-80 +- {0x5400E987BBC1C920, 0xBDB6B8E905CB600F}, // 1e-79 +- {0x290123E9AAB23B68, 0xED246723473E3813}, // 1e-78 +- {0xF9A0B6720AAF6521, 0x9436C0760C86E30B}, // 1e-77 +- {0xF808E40E8D5B3E69, 0xB94470938FA89BCE}, // 1e-76 +- {0xB60B1D1230B20E04, 0xE7958CB87392C2C2}, // 1e-75 +- {0xB1C6F22B5E6F48C2, 0x90BD77F3483BB9B9}, // 1e-74 +- {0x1E38AEB6360B1AF3, 0xB4ECD5F01A4AA828}, // 1e-73 +- {0x25C6DA63C38DE1B0, 0xE2280B6C20DD5232}, // 1e-72 +- {0x579C487E5A38AD0E, 0x8D590723948A535F}, // 1e-71 +- {0x2D835A9DF0C6D851, 0xB0AF48EC79ACE837}, // 1e-70 +- {0xF8E431456CF88E65, 0xDCDB1B2798182244}, // 1e-69 +- {0x1B8E9ECB641B58FF, 0x8A08F0F8BF0F156B}, // 1e-68 +- {0xE272467E3D222F3F, 0xAC8B2D36EED2DAC5}, // 1e-67 +- {0x5B0ED81DCC6ABB0F, 0xD7ADF884AA879177}, // 1e-66 +- {0x98E947129FC2B4E9, 0x86CCBB52EA94BAEA}, // 1e-65 +- {0x3F2398D747B36224, 0xA87FEA27A539E9A5}, // 1e-64 +- {0x8EEC7F0D19A03AAD, 0xD29FE4B18E88640E}, // 1e-63 +- {0x1953CF68300424AC, 0x83A3EEEEF9153E89}, // 1e-62 +- {0x5FA8C3423C052DD7, 0xA48CEAAAB75A8E2B}, // 1e-61 +- {0x3792F412CB06794D, 0xCDB02555653131B6}, // 1e-60 +- {0xE2BBD88BBEE40BD0, 0x808E17555F3EBF11}, // 1e-59 +- {0x5B6ACEAEAE9D0EC4, 0xA0B19D2AB70E6ED6}, // 1e-58 +- {0xF245825A5A445275, 0xC8DE047564D20A8B}, // 1e-57 +- {0xEED6E2F0F0D56712, 0xFB158592BE068D2E}, // 1e-56 +- {0x55464DD69685606B, 0x9CED737BB6C4183D}, // 1e-55 +- {0xAA97E14C3C26B886, 0xC428D05AA4751E4C}, // 1e-54 +- {0xD53DD99F4B3066A8, 0xF53304714D9265DF}, // 1e-53 +- {0xE546A8038EFE4029, 0x993FE2C6D07B7FAB}, // 1e-52 +- {0xDE98520472BDD033, 0xBF8FDB78849A5F96}, // 1e-51 +- {0x963E66858F6D4440, 0xEF73D256A5C0F77C}, // 1e-50 +- {0xDDE7001379A44AA8, 0x95A8637627989AAD}, // 1e-49 +- {0x5560C018580D5D52, 0xBB127C53B17EC159}, // 1e-48 +- {0xAAB8F01E6E10B4A6, 0xE9D71B689DDE71AF}, // 1e-47 +- {0xCAB3961304CA70E8, 0x9226712162AB070D}, // 1e-46 +- {0x3D607B97C5FD0D22, 0xB6B00D69BB55C8D1}, // 1e-45 +- {0x8CB89A7DB77C506A, 0xE45C10C42A2B3B05}, // 1e-44 +- {0x77F3608E92ADB242, 0x8EB98A7A9A5B04E3}, // 1e-43 +- {0x55F038B237591ED3, 0xB267ED1940F1C61C}, // 1e-42 +- {0x6B6C46DEC52F6688, 0xDF01E85F912E37A3}, // 1e-41 +- {0x2323AC4B3B3DA015, 0x8B61313BBABCE2C6}, // 1e-40 +- {0xABEC975E0A0D081A, 0xAE397D8AA96C1B77}, // 1e-39 +- {0x96E7BD358C904A21, 0xD9C7DCED53C72255}, // 1e-38 +- {0x7E50D64177DA2E54, 0x881CEA14545C7575}, // 1e-37 +- {0xDDE50BD1D5D0B9E9, 0xAA242499697392D2}, // 1e-36 +- {0x955E4EC64B44E864, 0xD4AD2DBFC3D07787}, // 1e-35 +- {0xBD5AF13BEF0B113E, 0x84EC3C97DA624AB4}, // 1e-34 +- {0xECB1AD8AEACDD58E, 0xA6274BBDD0FADD61}, // 1e-33 +- {0x67DE18EDA5814AF2, 0xCFB11EAD453994BA}, // 1e-32 +- {0x80EACF948770CED7, 0x81CEB32C4B43FCF4}, // 1e-31 +- {0xA1258379A94D028D, 0xA2425FF75E14FC31}, // 1e-30 +- {0x096EE45813A04330, 0xCAD2F7F5359A3B3E}, // 1e-29 +- {0x8BCA9D6E188853FC, 0xFD87B5F28300CA0D}, // 1e-28 +- {0x775EA264CF55347D, 0x9E74D1B791E07E48}, // 1e-27 +- {0x95364AFE032A819D, 0xC612062576589DDA}, // 1e-26 +- {0x3A83DDBD83F52204, 0xF79687AED3EEC551}, // 1e-25 +- {0xC4926A9672793542, 0x9ABE14CD44753B52}, // 1e-24 +- {0x75B7053C0F178293, 0xC16D9A0095928A27}, // 1e-23 +- {0x5324C68B12DD6338, 0xF1C90080BAF72CB1}, // 1e-22 +- {0xD3F6FC16EBCA5E03, 0x971DA05074DA7BEE}, // 1e-21 +- {0x88F4BB1CA6BCF584, 0xBCE5086492111AEA}, // 1e-20 +- {0x2B31E9E3D06C32E5, 0xEC1E4A7DB69561A5}, // 1e-19 +- {0x3AFF322E62439FCF, 0x9392EE8E921D5D07}, // 1e-18 +- {0x09BEFEB9FAD487C2, 0xB877AA3236A4B449}, // 1e-17 +- {0x4C2EBE687989A9B3, 0xE69594BEC44DE15B}, // 1e-16 +- {0x0F9D37014BF60A10, 0x901D7CF73AB0ACD9}, // 1e-15 +- {0x538484C19EF38C94, 0xB424DC35095CD80F}, // 1e-14 +- {0x2865A5F206B06FB9, 0xE12E13424BB40E13}, // 1e-13 +- {0xF93F87B7442E45D3, 0x8CBCCC096F5088CB}, // 1e-12 +- {0xF78F69A51539D748, 0xAFEBFF0BCB24AAFE}, // 1e-11 +- {0xB573440E5A884D1B, 0xDBE6FECEBDEDD5BE}, // 1e-10 +- {0x31680A88F8953030, 0x89705F4136B4A597}, // 1e-9 +- {0xFDC20D2B36BA7C3D, 0xABCC77118461CEFC}, // 1e-8 +- {0x3D32907604691B4C, 0xD6BF94D5E57A42BC}, // 1e-7 +- {0xA63F9A49C2C1B10F, 0x8637BD05AF6C69B5}, // 1e-6 +- {0x0FCF80DC33721D53, 0xA7C5AC471B478423}, // 1e-5 +- {0xD3C36113404EA4A8, 0xD1B71758E219652B}, // 1e-4 +- {0x645A1CAC083126E9, 0x83126E978D4FDF3B}, // 1e-3 +- {0x3D70A3D70A3D70A3, 0xA3D70A3D70A3D70A}, // 1e-2 +- {0xCCCCCCCCCCCCCCCC, 0xCCCCCCCCCCCCCCCC}, // 1e-1 +- {0x0000000000000000, 0x8000000000000000}, // 1e0 +- {0x0000000000000000, 0xA000000000000000}, // 1e1 +- {0x0000000000000000, 0xC800000000000000}, // 1e2 +- {0x0000000000000000, 0xFA00000000000000}, // 1e3 +- {0x0000000000000000, 0x9C40000000000000}, // 1e4 +- {0x0000000000000000, 0xC350000000000000}, // 1e5 +- {0x0000000000000000, 0xF424000000000000}, // 1e6 +- {0x0000000000000000, 0x9896800000000000}, // 1e7 +- {0x0000000000000000, 0xBEBC200000000000}, // 1e8 +- {0x0000000000000000, 0xEE6B280000000000}, // 1e9 +- {0x0000000000000000, 0x9502F90000000000}, // 1e10 +- {0x0000000000000000, 0xBA43B74000000000}, // 1e11 +- {0x0000000000000000, 0xE8D4A51000000000}, // 1e12 +- {0x0000000000000000, 0x9184E72A00000000}, // 1e13 +- {0x0000000000000000, 0xB5E620F480000000}, // 1e14 +- {0x0000000000000000, 0xE35FA931A0000000}, // 1e15 +- {0x0000000000000000, 0x8E1BC9BF04000000}, // 1e16 +- {0x0000000000000000, 0xB1A2BC2EC5000000}, // 1e17 +- {0x0000000000000000, 0xDE0B6B3A76400000}, // 1e18 +- {0x0000000000000000, 0x8AC7230489E80000}, // 1e19 +- {0x0000000000000000, 0xAD78EBC5AC620000}, // 1e20 +- {0x0000000000000000, 0xD8D726B7177A8000}, // 1e21 +- {0x0000000000000000, 0x878678326EAC9000}, // 1e22 +- {0x0000000000000000, 0xA968163F0A57B400}, // 1e23 +- {0x0000000000000000, 0xD3C21BCECCEDA100}, // 1e24 +- {0x0000000000000000, 0x84595161401484A0}, // 1e25 +- {0x0000000000000000, 0xA56FA5B99019A5C8}, // 1e26 +- {0x0000000000000000, 0xCECB8F27F4200F3A}, // 1e27 +- {0x4000000000000000, 0x813F3978F8940984}, // 1e28 +- {0x5000000000000000, 0xA18F07D736B90BE5}, // 1e29 +- {0xA400000000000000, 0xC9F2C9CD04674EDE}, // 1e30 +- {0x4D00000000000000, 0xFC6F7C4045812296}, // 1e31 +- {0xF020000000000000, 0x9DC5ADA82B70B59D}, // 1e32 +- {0x6C28000000000000, 0xC5371912364CE305}, // 1e33 +- {0xC732000000000000, 0xF684DF56C3E01BC6}, // 1e34 +- {0x3C7F400000000000, 0x9A130B963A6C115C}, // 1e35 +- {0x4B9F100000000000, 0xC097CE7BC90715B3}, // 1e36 +- {0x1E86D40000000000, 0xF0BDC21ABB48DB20}, // 1e37 +- {0x1314448000000000, 0x96769950B50D88F4}, // 1e38 +- {0x17D955A000000000, 0xBC143FA4E250EB31}, // 1e39 +- {0x5DCFAB0800000000, 0xEB194F8E1AE525FD}, // 1e40 +- {0x5AA1CAE500000000, 0x92EFD1B8D0CF37BE}, // 1e41 +- {0xF14A3D9E40000000, 0xB7ABC627050305AD}, // 1e42 +- {0x6D9CCD05D0000000, 0xE596B7B0C643C719}, // 1e43 +- {0xE4820023A2000000, 0x8F7E32CE7BEA5C6F}, // 1e44 +- {0xDDA2802C8A800000, 0xB35DBF821AE4F38B}, // 1e45 +- {0xD50B2037AD200000, 0xE0352F62A19E306E}, // 1e46 +- {0x4526F422CC340000, 0x8C213D9DA502DE45}, // 1e47 +- {0x9670B12B7F410000, 0xAF298D050E4395D6}, // 1e48 +- {0x3C0CDD765F114000, 0xDAF3F04651D47B4C}, // 1e49 +- {0xA5880A69FB6AC800, 0x88D8762BF324CD0F}, // 1e50 +- {0x8EEA0D047A457A00, 0xAB0E93B6EFEE0053}, // 1e51 +- {0x72A4904598D6D880, 0xD5D238A4ABE98068}, // 1e52 +- {0x47A6DA2B7F864750, 0x85A36366EB71F041}, // 1e53 +- {0x999090B65F67D924, 0xA70C3C40A64E6C51}, // 1e54 +- {0xFFF4B4E3F741CF6D, 0xD0CF4B50CFE20765}, // 1e55 +- {0xBFF8F10E7A8921A4, 0x82818F1281ED449F}, // 1e56 +- {0xAFF72D52192B6A0D, 0xA321F2D7226895C7}, // 1e57 +- {0x9BF4F8A69F764490, 0xCBEA6F8CEB02BB39}, // 1e58 +- {0x02F236D04753D5B4, 0xFEE50B7025C36A08}, // 1e59 +- {0x01D762422C946590, 0x9F4F2726179A2245}, // 1e60 +- {0x424D3AD2B7B97EF5, 0xC722F0EF9D80AAD6}, // 1e61 +- {0xD2E0898765A7DEB2, 0xF8EBAD2B84E0D58B}, // 1e62 +- {0x63CC55F49F88EB2F, 0x9B934C3B330C8577}, // 1e63 +- {0x3CBF6B71C76B25FB, 0xC2781F49FFCFA6D5}, // 1e64 +- {0x8BEF464E3945EF7A, 0xF316271C7FC3908A}, // 1e65 +- {0x97758BF0E3CBB5AC, 0x97EDD871CFDA3A56}, // 1e66 +- {0x3D52EEED1CBEA317, 0xBDE94E8E43D0C8EC}, // 1e67 +- {0x4CA7AAA863EE4BDD, 0xED63A231D4C4FB27}, // 1e68 +- {0x8FE8CAA93E74EF6A, 0x945E455F24FB1CF8}, // 1e69 +- {0xB3E2FD538E122B44, 0xB975D6B6EE39E436}, // 1e70 +- {0x60DBBCA87196B616, 0xE7D34C64A9C85D44}, // 1e71 +- {0xBC8955E946FE31CD, 0x90E40FBEEA1D3A4A}, // 1e72 +- {0x6BABAB6398BDBE41, 0xB51D13AEA4A488DD}, // 1e73 +- {0xC696963C7EED2DD1, 0xE264589A4DCDAB14}, // 1e74 +- {0xFC1E1DE5CF543CA2, 0x8D7EB76070A08AEC}, // 1e75 +- {0x3B25A55F43294BCB, 0xB0DE65388CC8ADA8}, // 1e76 +- {0x49EF0EB713F39EBE, 0xDD15FE86AFFAD912}, // 1e77 +- {0x6E3569326C784337, 0x8A2DBF142DFCC7AB}, // 1e78 +- {0x49C2C37F07965404, 0xACB92ED9397BF996}, // 1e79 +- {0xDC33745EC97BE906, 0xD7E77A8F87DAF7FB}, // 1e80 +- {0x69A028BB3DED71A3, 0x86F0AC99B4E8DAFD}, // 1e81 +- {0xC40832EA0D68CE0C, 0xA8ACD7C0222311BC}, // 1e82 +- {0xF50A3FA490C30190, 0xD2D80DB02AABD62B}, // 1e83 +- {0x792667C6DA79E0FA, 0x83C7088E1AAB65DB}, // 1e84 +- {0x577001B891185938, 0xA4B8CAB1A1563F52}, // 1e85 +- {0xED4C0226B55E6F86, 0xCDE6FD5E09ABCF26}, // 1e86 +- {0x544F8158315B05B4, 0x80B05E5AC60B6178}, // 1e87 +- {0x696361AE3DB1C721, 0xA0DC75F1778E39D6}, // 1e88 +- {0x03BC3A19CD1E38E9, 0xC913936DD571C84C}, // 1e89 +- {0x04AB48A04065C723, 0xFB5878494ACE3A5F}, // 1e90 +- {0x62EB0D64283F9C76, 0x9D174B2DCEC0E47B}, // 1e91 +- {0x3BA5D0BD324F8394, 0xC45D1DF942711D9A}, // 1e92 +- {0xCA8F44EC7EE36479, 0xF5746577930D6500}, // 1e93 +- {0x7E998B13CF4E1ECB, 0x9968BF6ABBE85F20}, // 1e94 +- {0x9E3FEDD8C321A67E, 0xBFC2EF456AE276E8}, // 1e95 +- {0xC5CFE94EF3EA101E, 0xEFB3AB16C59B14A2}, // 1e96 +- {0xBBA1F1D158724A12, 0x95D04AEE3B80ECE5}, // 1e97 +- {0x2A8A6E45AE8EDC97, 0xBB445DA9CA61281F}, // 1e98 +- {0xF52D09D71A3293BD, 0xEA1575143CF97226}, // 1e99 +- {0x593C2626705F9C56, 0x924D692CA61BE758}, // 1e100 +- {0x6F8B2FB00C77836C, 0xB6E0C377CFA2E12E}, // 1e101 +- {0x0B6DFB9C0F956447, 0xE498F455C38B997A}, // 1e102 +- {0x4724BD4189BD5EAC, 0x8EDF98B59A373FEC}, // 1e103 +- {0x58EDEC91EC2CB657, 0xB2977EE300C50FE7}, // 1e104 +- {0x2F2967B66737E3ED, 0xDF3D5E9BC0F653E1}, // 1e105 +- {0xBD79E0D20082EE74, 0x8B865B215899F46C}, // 1e106 +- {0xECD8590680A3AA11, 0xAE67F1E9AEC07187}, // 1e107 +- {0xE80E6F4820CC9495, 0xDA01EE641A708DE9}, // 1e108 +- {0x3109058D147FDCDD, 0x884134FE908658B2}, // 1e109 +- {0xBD4B46F0599FD415, 0xAA51823E34A7EEDE}, // 1e110 +- {0x6C9E18AC7007C91A, 0xD4E5E2CDC1D1EA96}, // 1e111 +- {0x03E2CF6BC604DDB0, 0x850FADC09923329E}, // 1e112 +- {0x84DB8346B786151C, 0xA6539930BF6BFF45}, // 1e113 +- {0xE612641865679A63, 0xCFE87F7CEF46FF16}, // 1e114 +- {0x4FCB7E8F3F60C07E, 0x81F14FAE158C5F6E}, // 1e115 +- {0xE3BE5E330F38F09D, 0xA26DA3999AEF7749}, // 1e116 +- {0x5CADF5BFD3072CC5, 0xCB090C8001AB551C}, // 1e117 +- {0x73D9732FC7C8F7F6, 0xFDCB4FA002162A63}, // 1e118 +- {0x2867E7FDDCDD9AFA, 0x9E9F11C4014DDA7E}, // 1e119 +- {0xB281E1FD541501B8, 0xC646D63501A1511D}, // 1e120 +- {0x1F225A7CA91A4226, 0xF7D88BC24209A565}, // 1e121 +- {0x3375788DE9B06958, 0x9AE757596946075F}, // 1e122 +- {0x0052D6B1641C83AE, 0xC1A12D2FC3978937}, // 1e123 +- {0xC0678C5DBD23A49A, 0xF209787BB47D6B84}, // 1e124 +- {0xF840B7BA963646E0, 0x9745EB4D50CE6332}, // 1e125 +- {0xB650E5A93BC3D898, 0xBD176620A501FBFF}, // 1e126 +- {0xA3E51F138AB4CEBE, 0xEC5D3FA8CE427AFF}, // 1e127 +- {0xC66F336C36B10137, 0x93BA47C980E98CDF}, // 1e128 +- {0xB80B0047445D4184, 0xB8A8D9BBE123F017}, // 1e129 +- {0xA60DC059157491E5, 0xE6D3102AD96CEC1D}, // 1e130 +- {0x87C89837AD68DB2F, 0x9043EA1AC7E41392}, // 1e131 +- {0x29BABE4598C311FB, 0xB454E4A179DD1877}, // 1e132 +- {0xF4296DD6FEF3D67A, 0xE16A1DC9D8545E94}, // 1e133 +- {0x1899E4A65F58660C, 0x8CE2529E2734BB1D}, // 1e134 +- {0x5EC05DCFF72E7F8F, 0xB01AE745B101E9E4}, // 1e135 +- {0x76707543F4FA1F73, 0xDC21A1171D42645D}, // 1e136 +- {0x6A06494A791C53A8, 0x899504AE72497EBA}, // 1e137 +- {0x0487DB9D17636892, 0xABFA45DA0EDBDE69}, // 1e138 +- {0x45A9D2845D3C42B6, 0xD6F8D7509292D603}, // 1e139 +- {0x0B8A2392BA45A9B2, 0x865B86925B9BC5C2}, // 1e140 +- {0x8E6CAC7768D7141E, 0xA7F26836F282B732}, // 1e141 +- {0x3207D795430CD926, 0xD1EF0244AF2364FF}, // 1e142 +- {0x7F44E6BD49E807B8, 0x8335616AED761F1F}, // 1e143 +- {0x5F16206C9C6209A6, 0xA402B9C5A8D3A6E7}, // 1e144 +- {0x36DBA887C37A8C0F, 0xCD036837130890A1}, // 1e145 +- {0xC2494954DA2C9789, 0x802221226BE55A64}, // 1e146 +- {0xF2DB9BAA10B7BD6C, 0xA02AA96B06DEB0FD}, // 1e147 +- {0x6F92829494E5ACC7, 0xC83553C5C8965D3D}, // 1e148 +- {0xCB772339BA1F17F9, 0xFA42A8B73ABBF48C}, // 1e149 +- {0xFF2A760414536EFB, 0x9C69A97284B578D7}, // 1e150 +- {0xFEF5138519684ABA, 0xC38413CF25E2D70D}, // 1e151 +- {0x7EB258665FC25D69, 0xF46518C2EF5B8CD1}, // 1e152 +- {0xEF2F773FFBD97A61, 0x98BF2F79D5993802}, // 1e153 +- {0xAAFB550FFACFD8FA, 0xBEEEFB584AFF8603}, // 1e154 +- {0x95BA2A53F983CF38, 0xEEAABA2E5DBF6784}, // 1e155 +- {0xDD945A747BF26183, 0x952AB45CFA97A0B2}, // 1e156 +- {0x94F971119AEEF9E4, 0xBA756174393D88DF}, // 1e157 +- {0x7A37CD5601AAB85D, 0xE912B9D1478CEB17}, // 1e158 +- {0xAC62E055C10AB33A, 0x91ABB422CCB812EE}, // 1e159 +- {0x577B986B314D6009, 0xB616A12B7FE617AA}, // 1e160 +- {0xED5A7E85FDA0B80B, 0xE39C49765FDF9D94}, // 1e161 +- {0x14588F13BE847307, 0x8E41ADE9FBEBC27D}, // 1e162 +- {0x596EB2D8AE258FC8, 0xB1D219647AE6B31C}, // 1e163 +- {0x6FCA5F8ED9AEF3BB, 0xDE469FBD99A05FE3}, // 1e164 +- {0x25DE7BB9480D5854, 0x8AEC23D680043BEE}, // 1e165 +- {0xAF561AA79A10AE6A, 0xADA72CCC20054AE9}, // 1e166 +- {0x1B2BA1518094DA04, 0xD910F7FF28069DA4}, // 1e167 +- {0x90FB44D2F05D0842, 0x87AA9AFF79042286}, // 1e168 +- {0x353A1607AC744A53, 0xA99541BF57452B28}, // 1e169 +- {0x42889B8997915CE8, 0xD3FA922F2D1675F2}, // 1e170 +- {0x69956135FEBADA11, 0x847C9B5D7C2E09B7}, // 1e171 +- {0x43FAB9837E699095, 0xA59BC234DB398C25}, // 1e172 +- {0x94F967E45E03F4BB, 0xCF02B2C21207EF2E}, // 1e173 +- {0x1D1BE0EEBAC278F5, 0x8161AFB94B44F57D}, // 1e174 +- {0x6462D92A69731732, 0xA1BA1BA79E1632DC}, // 1e175 +- {0x7D7B8F7503CFDCFE, 0xCA28A291859BBF93}, // 1e176 +- {0x5CDA735244C3D43E, 0xFCB2CB35E702AF78}, // 1e177 +- {0x3A0888136AFA64A7, 0x9DEFBF01B061ADAB}, // 1e178 +- {0x088AAA1845B8FDD0, 0xC56BAEC21C7A1916}, // 1e179 +- {0x8AAD549E57273D45, 0xF6C69A72A3989F5B}, // 1e180 +- {0x36AC54E2F678864B, 0x9A3C2087A63F6399}, // 1e181 +- {0x84576A1BB416A7DD, 0xC0CB28A98FCF3C7F}, // 1e182 +- {0x656D44A2A11C51D5, 0xF0FDF2D3F3C30B9F}, // 1e183 +- {0x9F644AE5A4B1B325, 0x969EB7C47859E743}, // 1e184 +- {0x873D5D9F0DDE1FEE, 0xBC4665B596706114}, // 1e185 +- {0xA90CB506D155A7EA, 0xEB57FF22FC0C7959}, // 1e186 +- {0x09A7F12442D588F2, 0x9316FF75DD87CBD8}, // 1e187 +- {0x0C11ED6D538AEB2F, 0xB7DCBF5354E9BECE}, // 1e188 +- {0x8F1668C8A86DA5FA, 0xE5D3EF282A242E81}, // 1e189 +- {0xF96E017D694487BC, 0x8FA475791A569D10}, // 1e190 +- {0x37C981DCC395A9AC, 0xB38D92D760EC4455}, // 1e191 +- {0x85BBE253F47B1417, 0xE070F78D3927556A}, // 1e192 +- {0x93956D7478CCEC8E, 0x8C469AB843B89562}, // 1e193 +- {0x387AC8D1970027B2, 0xAF58416654A6BABB}, // 1e194 +- {0x06997B05FCC0319E, 0xDB2E51BFE9D0696A}, // 1e195 +- {0x441FECE3BDF81F03, 0x88FCF317F22241E2}, // 1e196 +- {0xD527E81CAD7626C3, 0xAB3C2FDDEEAAD25A}, // 1e197 +- {0x8A71E223D8D3B074, 0xD60B3BD56A5586F1}, // 1e198 +- {0xF6872D5667844E49, 0x85C7056562757456}, // 1e199 +- {0xB428F8AC016561DB, 0xA738C6BEBB12D16C}, // 1e200 +- {0xE13336D701BEBA52, 0xD106F86E69D785C7}, // 1e201 +- {0xECC0024661173473, 0x82A45B450226B39C}, // 1e202 +- {0x27F002D7F95D0190, 0xA34D721642B06084}, // 1e203 +- {0x31EC038DF7B441F4, 0xCC20CE9BD35C78A5}, // 1e204 +- {0x7E67047175A15271, 0xFF290242C83396CE}, // 1e205 +- {0x0F0062C6E984D386, 0x9F79A169BD203E41}, // 1e206 +- {0x52C07B78A3E60868, 0xC75809C42C684DD1}, // 1e207 +- {0xA7709A56CCDF8A82, 0xF92E0C3537826145}, // 1e208 +- {0x88A66076400BB691, 0x9BBCC7A142B17CCB}, // 1e209 +- {0x6ACFF893D00EA435, 0xC2ABF989935DDBFE}, // 1e210 +- {0x0583F6B8C4124D43, 0xF356F7EBF83552FE}, // 1e211 +- {0xC3727A337A8B704A, 0x98165AF37B2153DE}, // 1e212 +- {0x744F18C0592E4C5C, 0xBE1BF1B059E9A8D6}, // 1e213 +- {0x1162DEF06F79DF73, 0xEDA2EE1C7064130C}, // 1e214 +- {0x8ADDCB5645AC2BA8, 0x9485D4D1C63E8BE7}, // 1e215 +- {0x6D953E2BD7173692, 0xB9A74A0637CE2EE1}, // 1e216 +- {0xC8FA8DB6CCDD0437, 0xE8111C87C5C1BA99}, // 1e217 +- {0x1D9C9892400A22A2, 0x910AB1D4DB9914A0}, // 1e218 +- {0x2503BEB6D00CAB4B, 0xB54D5E4A127F59C8}, // 1e219 +- {0x2E44AE64840FD61D, 0xE2A0B5DC971F303A}, // 1e220 +- {0x5CEAECFED289E5D2, 0x8DA471A9DE737E24}, // 1e221 +- {0x7425A83E872C5F47, 0xB10D8E1456105DAD}, // 1e222 +- {0xD12F124E28F77719, 0xDD50F1996B947518}, // 1e223 +- {0x82BD6B70D99AAA6F, 0x8A5296FFE33CC92F}, // 1e224 +- {0x636CC64D1001550B, 0xACE73CBFDC0BFB7B}, // 1e225 +- {0x3C47F7E05401AA4E, 0xD8210BEFD30EFA5A}, // 1e226 +- {0x65ACFAEC34810A71, 0x8714A775E3E95C78}, // 1e227 +- {0x7F1839A741A14D0D, 0xA8D9D1535CE3B396}, // 1e228 +- {0x1EDE48111209A050, 0xD31045A8341CA07C}, // 1e229 +- {0x934AED0AAB460432, 0x83EA2B892091E44D}, // 1e230 +- {0xF81DA84D5617853F, 0xA4E4B66B68B65D60}, // 1e231 +- {0x36251260AB9D668E, 0xCE1DE40642E3F4B9}, // 1e232 +- {0xC1D72B7C6B426019, 0x80D2AE83E9CE78F3}, // 1e233 +- {0xB24CF65B8612F81F, 0xA1075A24E4421730}, // 1e234 +- {0xDEE033F26797B627, 0xC94930AE1D529CFC}, // 1e235 +- {0x169840EF017DA3B1, 0xFB9B7CD9A4A7443C}, // 1e236 +- {0x8E1F289560EE864E, 0x9D412E0806E88AA5}, // 1e237 +- {0xF1A6F2BAB92A27E2, 0xC491798A08A2AD4E}, // 1e238 +- {0xAE10AF696774B1DB, 0xF5B5D7EC8ACB58A2}, // 1e239 +- {0xACCA6DA1E0A8EF29, 0x9991A6F3D6BF1765}, // 1e240 +- {0x17FD090A58D32AF3, 0xBFF610B0CC6EDD3F}, // 1e241 +- {0xDDFC4B4CEF07F5B0, 0xEFF394DCFF8A948E}, // 1e242 +- {0x4ABDAF101564F98E, 0x95F83D0A1FB69CD9}, // 1e243 +- {0x9D6D1AD41ABE37F1, 0xBB764C4CA7A4440F}, // 1e244 +- {0x84C86189216DC5ED, 0xEA53DF5FD18D5513}, // 1e245 +- {0x32FD3CF5B4E49BB4, 0x92746B9BE2F8552C}, // 1e246 +- {0x3FBC8C33221DC2A1, 0xB7118682DBB66A77}, // 1e247 +- {0x0FABAF3FEAA5334A, 0xE4D5E82392A40515}, // 1e248 +- {0x29CB4D87F2A7400E, 0x8F05B1163BA6832D}, // 1e249 +- {0x743E20E9EF511012, 0xB2C71D5BCA9023F8}, // 1e250 +- {0x914DA9246B255416, 0xDF78E4B2BD342CF6}, // 1e251 +- {0x1AD089B6C2F7548E, 0x8BAB8EEFB6409C1A}, // 1e252 +- {0xA184AC2473B529B1, 0xAE9672ABA3D0C320}, // 1e253 +- {0xC9E5D72D90A2741E, 0xDA3C0F568CC4F3E8}, // 1e254 +- {0x7E2FA67C7A658892, 0x8865899617FB1871}, // 1e255 +- {0xDDBB901B98FEEAB7, 0xAA7EEBFB9DF9DE8D}, // 1e256 +- {0x552A74227F3EA565, 0xD51EA6FA85785631}, // 1e257 +- {0xD53A88958F87275F, 0x8533285C936B35DE}, // 1e258 +- {0x8A892ABAF368F137, 0xA67FF273B8460356}, // 1e259 +- {0x2D2B7569B0432D85, 0xD01FEF10A657842C}, // 1e260 +- {0x9C3B29620E29FC73, 0x8213F56A67F6B29B}, // 1e261 +- {0x8349F3BA91B47B8F, 0xA298F2C501F45F42}, // 1e262 +- {0x241C70A936219A73, 0xCB3F2F7642717713}, // 1e263 +- {0xED238CD383AA0110, 0xFE0EFB53D30DD4D7}, // 1e264 +- {0xF4363804324A40AA, 0x9EC95D1463E8A506}, // 1e265 +- {0xB143C6053EDCD0D5, 0xC67BB4597CE2CE48}, // 1e266 +- {0xDD94B7868E94050A, 0xF81AA16FDC1B81DA}, // 1e267 +- {0xCA7CF2B4191C8326, 0x9B10A4E5E9913128}, // 1e268 +- {0xFD1C2F611F63A3F0, 0xC1D4CE1F63F57D72}, // 1e269 +- {0xBC633B39673C8CEC, 0xF24A01A73CF2DCCF}, // 1e270 +- {0xD5BE0503E085D813, 0x976E41088617CA01}, // 1e271 +- {0x4B2D8644D8A74E18, 0xBD49D14AA79DBC82}, // 1e272 +- {0xDDF8E7D60ED1219E, 0xEC9C459D51852BA2}, // 1e273 +- {0xCABB90E5C942B503, 0x93E1AB8252F33B45}, // 1e274 +- {0x3D6A751F3B936243, 0xB8DA1662E7B00A17}, // 1e275 +- {0x0CC512670A783AD4, 0xE7109BFBA19C0C9D}, // 1e276 +- {0x27FB2B80668B24C5, 0x906A617D450187E2}, // 1e277 +- {0xB1F9F660802DEDF6, 0xB484F9DC9641E9DA}, // 1e278 +- {0x5E7873F8A0396973, 0xE1A63853BBD26451}, // 1e279 +- {0xDB0B487B6423E1E8, 0x8D07E33455637EB2}, // 1e280 +- {0x91CE1A9A3D2CDA62, 0xB049DC016ABC5E5F}, // 1e281 +- {0x7641A140CC7810FB, 0xDC5C5301C56B75F7}, // 1e282 +- {0xA9E904C87FCB0A9D, 0x89B9B3E11B6329BA}, // 1e283 +- {0x546345FA9FBDCD44, 0xAC2820D9623BF429}, // 1e284 +- {0xA97C177947AD4095, 0xD732290FBACAF133}, // 1e285 +- {0x49ED8EABCCCC485D, 0x867F59A9D4BED6C0}, // 1e286 +- {0x5C68F256BFFF5A74, 0xA81F301449EE8C70}, // 1e287 +- {0x73832EEC6FFF3111, 0xD226FC195C6A2F8C}, // 1e288 +-}; ++// ---------------- Auxiliary - JSON + +-// wuffs_base__private_implementation__f64_powers_of_10 holds powers of 10 that +-// can be exactly represented by a float64 (what C calls a double). +-static const double wuffs_base__private_implementation__f64_powers_of_10[23] = { +- 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, +- 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, ++namespace wuffs_aux { ++ ++struct DecodeJsonResult { ++ DecodeJsonResult(std::string&& error_message0, uint64_t cursor_position0); ++ ++ std::string error_message; ++ uint64_t cursor_position; + }; + +-// ---------------- IEEE 754 Floating Point ++class DecodeJsonCallbacks { ++ public: ++ virtual ~DecodeJsonCallbacks(); + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u16 // +-wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(double f) { +- uint64_t u = 0; +- if (sizeof(uint64_t) == sizeof(double)) { +- memcpy(&u, &f, sizeof(uint64_t)); +- } +- uint16_t neg = ((uint16_t)((u >> 63) << 15)); +- u &= 0x7FFFFFFFFFFFFFFF; +- uint64_t exp = u >> 52; +- uint64_t man = u & 0x000FFFFFFFFFFFFF; ++ // AppendXxx are called for leaf nodes: literals, numbers and strings. For ++ // strings, the Callbacks implementation is responsible for tracking map keys ++ // versus other values. + +- if (exp == 0x7FF) { +- if (man == 0) { // Infinity. +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg | 0x7C00; +- ret.lossy = false; +- return ret; +- } +- // NaN. Shift the 52 mantissa bits to 10 mantissa bits, keeping the most +- // significant mantissa bit (quiet vs signaling NaNs). Also set the low 9 +- // bits of ret.value so that the 10-bit mantissa is non-zero. +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg | 0x7DFF | ((uint16_t)(man >> 42)); +- ret.lossy = false; +- return ret; ++ virtual std::string AppendNull() = 0; ++ virtual std::string AppendBool(bool val) = 0; ++ virtual std::string AppendF64(double val) = 0; ++ virtual std::string AppendI64(int64_t val) = 0; ++ virtual std::string AppendTextString(std::string&& val) = 0; + +- } else if (exp > 0x40E) { // Truncate to the largest finite f16. +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg | 0x7BFF; +- ret.lossy = true; +- return ret; ++ // Push and Pop are called for container nodes: JSON arrays (lists) and JSON ++ // objects (dictionaries). ++ // ++ // The flags bits combine exactly one of: ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT ++ // and exactly one of: ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT + +- } else if (exp <= 0x3E6) { // Truncate to zero. +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg; +- ret.lossy = (u != 0); +- return ret; ++ virtual std::string Push(uint32_t flags) = 0; ++ virtual std::string Pop(uint32_t flags) = 0; + +- } else if (exp <= 0x3F0) { // Normal f64, subnormal f16. +- // Convert from a 53-bit mantissa (after realizing the implicit bit) to a +- // 10-bit mantissa and then adjust for the exponent. +- man |= 0x0010000000000000; +- uint32_t shift = ((uint32_t)(1051 - exp)); // 1051 = 0x3F0 + 53 - 10. +- uint64_t shifted_man = man >> shift; +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg | ((uint16_t)shifted_man); +- ret.lossy = (shifted_man << shift) != man; +- return ret; +- } ++ // Done is always the last Callback method called by DecodeJson, whether or ++ // not parsing the input as JSON encountered an error. Even when successful, ++ // trailing data may remain in input and buffer. See "Unintuitive JSON ++ // Parsing" (https://nullprogram.com/blog/2019/12/28/) which discusses JSON ++ // parsing and when it stops. ++ // ++ // Do not keep a reference to buffer or buffer.data.ptr after Done returns, ++ // as DecodeJson may then de-allocate the backing array. ++ // ++ // The default Done implementation is a no-op. ++ virtual void // ++ Done(DecodeJsonResult& result, sync_io::Input& input, IOBuffer& buffer); ++}; + +- // Normal f64, normal f16. ++extern const char DecodeJson_BadJsonPointer[]; ++extern const char DecodeJson_NoMatch[]; + +- // Re-bias from 1023 to 15 and shift above f16's 10 mantissa bits. +- exp = (exp - 1008) << 10; // 1008 = 1023 - 15 = 0x3FF - 0xF. ++// The FooArgBar types add structure to Foo's optional arguments. They wrap ++// inner representations for several reasons: ++// - It provides a home for the DefaultValue static method, for Foo callers ++// that want to override some but not all optional arguments. ++// - It provides the "Bar" name at Foo call sites, which can help self- ++// document Foo calls with many arguemnts. ++// - It provides some type safety against accidentally transposing or omitting ++// adjacent fundamentally-numeric-typed optional arguments. + +- // Convert from a 52-bit mantissa (excluding the implicit bit) to a 10-bit +- // mantissa (again excluding the implicit bit). We lose some information if +- // any of the bottom 42 bits are non-zero. +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg | ((uint16_t)exp) | ((uint16_t)(man >> 42)); +- ret.lossy = (man << 22) != 0; +- return ret; +-} ++// DecodeJsonArgQuirks wraps an optional argument to DecodeJson. ++struct DecodeJsonArgQuirks { ++ explicit DecodeJsonArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0); + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u32 // +-wuffs_base__ieee_754_bit_representation__from_f64_to_u32_truncate(double f) { +- uint64_t u = 0; +- if (sizeof(uint64_t) == sizeof(double)) { +- memcpy(&u, &f, sizeof(uint64_t)); +- } +- uint32_t neg = ((uint32_t)(u >> 63)) << 31; +- u &= 0x7FFFFFFFFFFFFFFF; +- uint64_t exp = u >> 52; +- uint64_t man = u & 0x000FFFFFFFFFFFFF; ++ // DefaultValue returns an empty slice. ++ static DecodeJsonArgQuirks DefaultValue(); + +- if (exp == 0x7FF) { +- if (man == 0) { // Infinity. +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg | 0x7F800000; +- ret.lossy = false; +- return ret; +- } +- // NaN. Shift the 52 mantissa bits to 23 mantissa bits, keeping the most +- // significant mantissa bit (quiet vs signaling NaNs). Also set the low 22 +- // bits of ret.value so that the 23-bit mantissa is non-zero. +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg | 0x7FBFFFFF | ((uint32_t)(man >> 29)); +- ret.lossy = false; +- return ret; ++ const QuirkKeyValuePair* ptr; ++ const size_t len; ++}; + +- } else if (exp > 0x47E) { // Truncate to the largest finite f32. +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg | 0x7F7FFFFF; +- ret.lossy = true; +- return ret; ++// DecodeJsonArgJsonPointer wraps an optional argument to DecodeJson. ++struct DecodeJsonArgJsonPointer { ++ explicit DecodeJsonArgJsonPointer(std::string repr0); + +- } else if (exp <= 0x369) { // Truncate to zero. +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg; +- ret.lossy = (u != 0); +- return ret; ++ // DefaultValue returns an empty string. ++ static DecodeJsonArgJsonPointer DefaultValue(); + +- } else if (exp <= 0x380) { // Normal f64, subnormal f32. +- // Convert from a 53-bit mantissa (after realizing the implicit bit) to a +- // 23-bit mantissa and then adjust for the exponent. +- man |= 0x0010000000000000; +- uint32_t shift = ((uint32_t)(926 - exp)); // 926 = 0x380 + 53 - 23. +- uint64_t shifted_man = man >> shift; +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg | ((uint32_t)shifted_man); +- ret.lossy = (shifted_man << shift) != man; +- return ret; +- } ++ std::string repr; ++}; + +- // Normal f64, normal f32. ++// DecodeJson calls callbacks based on the JSON-formatted data in input. ++// ++// On success, the returned error_message is empty and cursor_position counts ++// the number of bytes consumed. On failure, error_message is non-empty and ++// cursor_position is the location of the error. That error may be a content ++// error (invalid JSON) or an input error (e.g. network failure). ++// ++// json_pointer is a query in the JSON Pointer (RFC 6901) syntax. The callbacks ++// run for the input's sub-node that matches the query. DecodeJson_NoMatch is ++// returned if no matching sub-node was found. The empty query matches the ++// input's root node, consistent with JSON Pointer semantics. ++// ++// The JSON Pointer implementation is greedy: duplicate keys are not rejected ++// but only the first match for each '/'-separated fragment is followed. ++DecodeJsonResult // ++DecodeJson(DecodeJsonCallbacks& callbacks, ++ sync_io::Input& input, ++ DecodeJsonArgQuirks quirks = DecodeJsonArgQuirks::DefaultValue(), ++ DecodeJsonArgJsonPointer json_pointer = ++ DecodeJsonArgJsonPointer::DefaultValue()); + +- // Re-bias from 1023 to 127 and shift above f32's 23 mantissa bits. +- exp = (exp - 896) << 23; // 896 = 1023 - 127 = 0x3FF - 0x7F. ++} // namespace wuffs_aux + +- // Convert from a 52-bit mantissa (excluding the implicit bit) to a 23-bit +- // mantissa (again excluding the implicit bit). We lose some information if +- // any of the bottom 29 bits are non-zero. +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg | ((uint32_t)exp) | ((uint32_t)(man >> 29)); +- ret.lossy = (man << 35) != 0; +- return ret; +-} ++#endif // defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +-// -------- ++// ‼ WUFFS C HEADER ENDS HERE. ++#ifdef WUFFS_IMPLEMENTATION + +-#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE 2047 +-#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION 800 ++#ifdef __cplusplus ++extern "C" { ++#endif + +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL is the largest N +-// such that ((10 << N) < (1 << 64)). +-#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL 60 ++// ---------------- Fundamentals + +-// wuffs_base__private_implementation__high_prec_dec (abbreviated as HPD) is a +-// fixed precision floating point decimal number, augmented with ±infinity +-// values, but it cannot represent NaN (Not a Number). ++// WUFFS_BASE__MAGIC is a magic number to check that initializers are called. ++// It's not foolproof, given C doesn't automatically zero memory before use, ++// but it should catch 99.99% of cases. + // +-// "High precision" means that the mantissa holds 800 decimal digits. 800 is +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION. ++// Its (non-zero) value is arbitrary, based on md5sum("wuffs"). ++#define WUFFS_BASE__MAGIC ((uint32_t)0x3CCB6C71) ++ ++// WUFFS_BASE__DISABLED is a magic number to indicate that a non-recoverable ++// error was previously encountered. + // +-// An HPD isn't for general purpose arithmetic, only for conversions to and +-// from IEEE 754 double-precision floating point, where the largest and +-// smallest positive, finite values are approximately 1.8e+308 and 4.9e-324. +-// HPD exponents above +2047 mean infinity, below -2047 mean zero. The ±2047 +-// bounds are further away from zero than ±(324 + 800), where 800 and 2047 is +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION and +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE. ++// Its (non-zero) value is arbitrary, based on md5sum("disabled"). ++#define WUFFS_BASE__DISABLED ((uint32_t)0x075AE3D2) ++ ++// Use switch cases for coroutine suspension points, similar to the technique ++// in https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html + // +-// digits[.. num_digits] are the number's digits in big-endian order. The +-// uint8_t values are in the range [0 ..= 9], not ['0' ..= '9'], where e.g. '7' +-// is the ASCII value 0x37. ++// The implicit fallthrough is intentional. + // +-// decimal_point is the index (within digits) of the decimal point. It may be +-// negative or be larger than num_digits, in which case the explicit digits are +-// padded with implicit zeroes. ++// We use trivial macros instead of an explicit assignment and case statement ++// so that clang-format doesn't get confused by the unusual "case"s. ++#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0 case 0:; ++#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT(n) \ ++ coro_susp_point = n; \ ++ case n:; ++ ++#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \ ++ if (!status.repr) { \ ++ goto ok; \ ++ } else if (*status.repr != '$') { \ ++ goto exit; \ ++ } \ ++ coro_susp_point = n; \ ++ goto suspend; \ ++ case n:; ++ ++// The "defined(__clang__)" isn't redundant. While vanilla clang defines ++// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. ++#if defined(__GNUC__) || defined(__clang__) ++#define WUFFS_BASE__LIKELY(expr) (__builtin_expect(!!(expr), 1)) ++#define WUFFS_BASE__UNLIKELY(expr) (__builtin_expect(!!(expr), 0)) ++#else ++#define WUFFS_BASE__LIKELY(expr) (expr) ++#define WUFFS_BASE__UNLIKELY(expr) (expr) ++#endif ++ ++// -------- ++ ++static inline wuffs_base__empty_struct // ++wuffs_private_impl__ignore_status(wuffs_base__status z) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++static inline wuffs_base__status // ++wuffs_private_impl__status__ensure_not_a_suspension(wuffs_base__status z) { ++ if (z.repr && (*z.repr == '$')) { ++ z.repr = wuffs_base__error__cannot_return_a_suspension; ++ } ++ return z; ++} ++ ++// -------- ++ ++// wuffs_private_impl__iterate_total_advance returns the exclusive ++// pointer-offset at which iteration should stop. The overall slice has length ++// total_len, each iteration's sub-slice has length iter_len and are placed ++// iter_advance apart. + // +-// For example, if num_digits is 3 and digits is "\x07\x08\x09": +-// - A decimal_point of -2 means ".00789" +-// - A decimal_point of -1 means ".0789" +-// - A decimal_point of +0 means ".789" +-// - A decimal_point of +1 means "7.89" +-// - A decimal_point of +2 means "78.9" +-// - A decimal_point of +3 means "789." +-// - A decimal_point of +4 means "7890." +-// - A decimal_point of +5 means "78900." ++// The iter_advance may not be larger than iter_len. The iter_advance may be ++// smaller than iter_len, in which case the sub-slices will overlap. + // +-// As above, a decimal_point higher than +2047 means that the overall value is +-// infinity, lower than -2047 means zero. ++// The return value r satisfies ((0 <= r) && (r <= total_len)). + // +-// negative is a sign bit. An HPD can distinguish positive and negative zero. ++// For example, if total_len = 15, iter_len = 5 and iter_advance = 3, there are ++// four iterations at offsets 0, 3, 6 and 9. This function returns 12. + // +-// truncated is whether there are more than +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION digits, and at +-// least one of those extra digits are non-zero. The existence of long-tail +-// digits can affect rounding. ++// 0123456789012345 ++// [....] ++// [....] ++// [....] ++// [....] ++// $ ++// 0123456789012345 + // +-// The "all fields are zero" value is valid, and represents the number +0. +-typedef struct wuffs_base__private_implementation__high_prec_dec__struct { +- uint32_t num_digits; +- int32_t decimal_point; +- bool negative; +- bool truncated; +- uint8_t digits[WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION]; +-} wuffs_base__private_implementation__high_prec_dec; +- +-// wuffs_base__private_implementation__high_prec_dec__trim trims trailing +-// zeroes from the h->digits[.. h->num_digits] slice. They have no benefit, +-// since we explicitly track h->decimal_point. ++// For example, if total_len = 15, iter_len = 5 and iter_advance = 5, there are ++// three iterations at offsets 0, 5 and 10. This function returns 15. + // +-// Preconditions: +-// - h is non-NULL. +-static inline void // +-wuffs_base__private_implementation__high_prec_dec__trim( +- wuffs_base__private_implementation__high_prec_dec* h) { +- while ((h->num_digits > 0) && (h->digits[h->num_digits - 1] == 0)) { +- h->num_digits--; ++// 0123456789012345 ++// [....] ++// [....] ++// [....] ++// $ ++// 0123456789012345 ++static inline size_t // ++wuffs_private_impl__iterate_total_advance(size_t total_len, ++ size_t iter_len, ++ size_t iter_advance) { ++ if (total_len >= iter_len) { ++ size_t n = total_len - iter_len; ++ return ((n / iter_advance) * iter_advance) + iter_advance; + } ++ return 0; + } + +-// wuffs_base__private_implementation__high_prec_dec__assign sets h to +-// represent the number x. +-// +-// Preconditions: +-// - h is non-NULL. +-static void // +-wuffs_base__private_implementation__high_prec_dec__assign( +- wuffs_base__private_implementation__high_prec_dec* h, +- uint64_t x, +- bool negative) { +- uint32_t n = 0; ++// ---------------- Numeric Types + +- // Set h->digits. +- if (x > 0) { +- // Calculate the digits, working right-to-left. After we determine n (how +- // many digits there are), copy from buf to h->digits. +- // +- // UINT64_MAX, 18446744073709551615, is 20 digits long. It can be faster to +- // copy a constant number of bytes than a variable number (20 instead of +- // n). Make buf large enough (and start writing to it from the middle) so +- // that can we always copy 20 bytes: the slice buf[(20-n) .. (40-n)]. +- uint8_t buf[40] = {0}; +- uint8_t* ptr = &buf[20]; +- do { +- uint64_t remaining = x / 10; +- x -= remaining * 10; +- ptr--; +- *ptr = (uint8_t)x; +- n++; +- x = remaining; +- } while (x > 0); +- memcpy(h->digits, ptr, 20); +- } ++extern const uint8_t wuffs_private_impl__low_bits_mask__u8[8]; ++extern const uint16_t wuffs_private_impl__low_bits_mask__u16[16]; ++extern const uint32_t wuffs_private_impl__low_bits_mask__u32[32]; ++extern const uint64_t wuffs_private_impl__low_bits_mask__u64[64]; + +- // Set h's other fields. +- h->num_digits = n; +- h->decimal_point = (int32_t)n; +- h->negative = negative; +- h->truncated = false; +- wuffs_base__private_implementation__high_prec_dec__trim(h); ++#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U8(n) \ ++ (wuffs_private_impl__low_bits_mask__u8[n]) ++#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U16(n) \ ++ (wuffs_private_impl__low_bits_mask__u16[n]) ++#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(n) \ ++ (wuffs_private_impl__low_bits_mask__u32[n]) ++#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(n) \ ++ (wuffs_private_impl__low_bits_mask__u64[n]) ++ ++// -------- ++ ++static inline void // ++wuffs_private_impl__u8__sat_add_indirect(uint8_t* x, uint8_t y) { ++ *x = wuffs_base__u8__sat_add(*x, y); + } + +-static wuffs_base__status // +-wuffs_base__private_implementation__high_prec_dec__parse( +- wuffs_base__private_implementation__high_prec_dec* h, +- wuffs_base__slice_u8 s, +- uint32_t options) { +- if (!h) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- h->num_digits = 0; +- h->decimal_point = 0; +- h->negative = false; +- h->truncated = false; ++static inline void // ++wuffs_private_impl__u8__sat_sub_indirect(uint8_t* x, uint8_t y) { ++ *x = wuffs_base__u8__sat_sub(*x, y); ++} + +- uint8_t* p = s.ptr; +- uint8_t* q = s.ptr + s.len; ++static inline void // ++wuffs_private_impl__u16__sat_add_indirect(uint16_t* x, uint16_t y) { ++ *x = wuffs_base__u16__sat_add(*x, y); ++} + +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (;; p++) { +- if (p >= q) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } else if (*p != '_') { +- break; +- } +- } +- } ++static inline void // ++wuffs_private_impl__u16__sat_sub_indirect(uint16_t* x, uint16_t y) { ++ *x = wuffs_base__u16__sat_sub(*x, y); ++} + +- // Parse sign. +- do { +- if (*p == '+') { +- p++; +- } else if (*p == '-') { +- h->negative = true; +- p++; +- } else { +- break; +- } +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (;; p++) { +- if (p >= q) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } else if (*p != '_') { +- break; +- } +- } +- } +- } while (0); ++static inline void // ++wuffs_private_impl__u32__sat_add_indirect(uint32_t* x, uint32_t y) { ++ *x = wuffs_base__u32__sat_add(*x, y); ++} + +- // Parse digits, up to (and including) a '.', 'E' or 'e'. Examples for each +- // limb in this if-else chain: +- // - "0.789" +- // - "1002.789" +- // - ".789" +- // - Other (invalid input). +- uint32_t nd = 0; +- int32_t dp = 0; +- bool no_digits_before_separator = false; +- if (('0' == *p) && +- !(options & +- WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES)) { +- p++; +- for (;; p++) { +- if (p >= q) { +- goto after_all; +- } else if (*p == +- ((options & +- WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.')) { +- p++; +- goto after_sep; +- } else if ((*p == 'E') || (*p == 'e')) { +- p++; +- goto after_exp; +- } else if ((*p != '_') || +- !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- } ++static inline void // ++wuffs_private_impl__u32__sat_sub_indirect(uint32_t* x, uint32_t y) { ++ *x = wuffs_base__u32__sat_sub(*x, y); ++} + +- } else if (('0' <= *p) && (*p <= '9')) { +- if (*p == '0') { +- for (; (p < q) && (*p == '0'); p++) { +- } +- } else { +- h->digits[nd++] = (uint8_t)(*p - '0'); +- dp = (int32_t)nd; +- p++; +- } ++static inline void // ++wuffs_private_impl__u64__sat_add_indirect(uint64_t* x, uint64_t y) { ++ *x = wuffs_base__u64__sat_add(*x, y); ++} + +- for (;; p++) { +- if (p >= q) { +- goto after_all; +- } else if (('0' <= *p) && (*p <= '9')) { +- if (nd < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[nd++] = (uint8_t)(*p - '0'); +- dp = (int32_t)nd; +- } else if ('0' != *p) { +- // Long-tail non-zeroes set the truncated bit. +- h->truncated = true; +- } +- } else if (*p == +- ((options & +- WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.')) { +- p++; +- goto after_sep; +- } else if ((*p == 'E') || (*p == 'e')) { +- p++; +- goto after_exp; +- } else if ((*p != '_') || +- !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- } ++static inline void // ++wuffs_private_impl__u64__sat_sub_indirect(uint64_t* x, uint64_t y) { ++ *x = wuffs_base__u64__sat_sub(*x, y); ++} + +- } else if (*p == ((options & +- WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.')) { +- p++; +- no_digits_before_separator = true; ++// ---------------- Numeric Types (Utility) + +- } else { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } ++#define wuffs_base__utility__sign_extend_convert_u8_u32(a) \ ++ ((uint32_t)(int32_t)(int8_t)(a)) + +-after_sep: +- for (;; p++) { +- if (p >= q) { +- goto after_all; +- } else if ('0' == *p) { +- if (nd == 0) { +- // Track leading zeroes implicitly. +- dp--; +- } else if (nd < +- WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[nd++] = (uint8_t)(*p - '0'); +- } +- } else if (('0' < *p) && (*p <= '9')) { +- if (nd < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[nd++] = (uint8_t)(*p - '0'); +- } else { +- // Long-tail non-zeroes set the truncated bit. +- h->truncated = true; +- } +- } else if ((*p == 'E') || (*p == 'e')) { +- p++; +- goto after_exp; +- } else if ((*p != '_') || +- !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- } ++#define wuffs_base__utility__sign_extend_convert_u16_u32(a) \ ++ ((uint32_t)(int32_t)(int16_t)(a)) + +-after_exp: +- do { +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (;; p++) { +- if (p >= q) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } else if (*p != '_') { +- break; +- } +- } +- } ++#define wuffs_base__utility__sign_extend_rshift_u32(a, n) \ ++ ((uint32_t)(((int32_t)(a)) >> (n))) + +- int32_t exp_sign = +1; +- if (*p == '+') { +- p++; +- } else if (*p == '-') { +- exp_sign = -1; +- p++; +- } ++#define wuffs_base__utility__sign_extend_rshift_u64(a, n) \ ++ ((uint64_t)(((int64_t)(a)) >> (n))) + +- int32_t exp = 0; +- const int32_t exp_large = +- WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE + +- WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION; +- bool saw_exp_digits = false; +- for (; p < q; p++) { +- if ((*p == '_') && +- (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- // No-op. +- } else if (('0' <= *p) && (*p <= '9')) { +- saw_exp_digits = true; +- if (exp < exp_large) { +- exp = (10 * exp) + ((int32_t)(*p - '0')); +- } +- } else { +- break; +- } +- } +- if (!saw_exp_digits) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- dp += exp_sign * exp; +- } while (0); ++#define wuffs_base__utility__make_bitvec256(e00, e01, e02, e03) \ ++ wuffs_base__make_bitvec256(e00, e01, e02, e03) + +-after_all: +- if (p != q) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- h->num_digits = nd; +- if (nd == 0) { +- if (no_digits_before_separator) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- h->decimal_point = 0; +- } else if (dp < +- -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { +- h->decimal_point = +- -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE - 1; +- } else if (dp > +- +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { +- h->decimal_point = +- +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE + 1; +- } else { +- h->decimal_point = dp; +- } +- wuffs_base__private_implementation__high_prec_dec__trim(h); +- return wuffs_base__make_status(NULL); +-} ++#define wuffs_base__utility__make_optional_u63(h, v) \ ++ wuffs_base__make_optional_u63(h, v) + +-// -------- ++// ---------------- Slices and Tables + +-// wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits +-// returns the number of additional decimal digits when left-shifting by shift. ++// This function basically returns (ptr + len), except that that expression is ++// Undefined Behavior in C (but not C++) when ptr is NULL, even if len is zero. + // +-// See below for preconditions. +-static uint32_t // +-wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits( +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t shift) { +- // Masking with 0x3F should be unnecessary (assuming the preconditions) but +- // it's cheap and ensures that we don't overflow the +- // wuffs_base__private_implementation__hpd_left_shift array. +- shift &= 63; ++// Precondition: (ptr != NULL) || (len == 0). ++static inline const uint8_t* // ++wuffs_private_impl__ptr_u8_plus_len(const uint8_t* ptr, size_t len) { ++ return ptr ? (ptr + len) : NULL; ++} + +- uint32_t x_a = wuffs_base__private_implementation__hpd_left_shift[shift]; +- uint32_t x_b = wuffs_base__private_implementation__hpd_left_shift[shift + 1]; +- uint32_t num_new_digits = x_a >> 11; +- uint32_t pow5_a = 0x7FF & x_a; +- uint32_t pow5_b = 0x7FF & x_b; ++// -------- + +- const uint8_t* pow5 = +- &wuffs_base__private_implementation__powers_of_5[pow5_a]; +- uint32_t i = 0; +- uint32_t n = pow5_b - pow5_a; +- for (; i < n; i++) { +- if (i >= h->num_digits) { +- return num_new_digits - 1; +- } else if (h->digits[i] == pow5[i]) { +- continue; +- } else if (h->digits[i] < pow5[i]) { +- return num_new_digits - 1; +- } else { +- return num_new_digits; +- } ++// wuffs_private_impl__slice_u8__prefix returns up to the first up_to bytes of ++// s. ++static inline wuffs_base__slice_u8 // ++wuffs_private_impl__slice_u8__prefix(wuffs_base__slice_u8 s, uint64_t up_to) { ++ if (((uint64_t)(s.len)) > up_to) { ++ s.len = ((size_t)up_to); + } +- return num_new_digits; ++ return s; + } + +-// -------- ++// wuffs_private_impl__slice_u8__suffix returns up to the last up_to bytes of ++// s. ++static inline wuffs_base__slice_u8 // ++wuffs_private_impl__slice_u8__suffix(wuffs_base__slice_u8 s, uint64_t up_to) { ++ if (((uint64_t)(s.len)) > up_to) { ++ s.ptr += ((uint64_t)(s.len)) - up_to; ++ s.len = ((size_t)up_to); ++ } ++ return s; ++} + +-// wuffs_base__private_implementation__high_prec_dec__rounded_integer returns +-// the integral (non-fractional) part of h, provided that it is 18 or fewer +-// decimal digits. For 19 or more digits, it returns UINT64_MAX. Note that: +-// - (1 << 53) is 9007199254740992, which has 16 decimal digits. +-// - (1 << 56) is 72057594037927936, which has 17 decimal digits. +-// - (1 << 59) is 576460752303423488, which has 18 decimal digits. +-// - (1 << 63) is 9223372036854775808, which has 19 decimal digits. +-// and that IEEE 754 double precision has 52 mantissa bits. ++// wuffs_private_impl__slice_u8__copy_from_slice calls memmove(dst.ptr, ++// src.ptr, len) where len is the minimum of dst.len and src.len. + // +-// That integral part is rounded-to-even: rounding 7.5 or 8.5 both give 8. +-// +-// h's negative bit is ignored: rounding -8.6 returns 9. +-// +-// See below for preconditions. +-static uint64_t // +-wuffs_base__private_implementation__high_prec_dec__rounded_integer( +- wuffs_base__private_implementation__high_prec_dec* h) { +- if ((h->num_digits == 0) || (h->decimal_point < 0)) { +- return 0; +- } else if (h->decimal_point > 18) { +- return UINT64_MAX; ++// Passing a wuffs_base__slice_u8 with all fields NULL or zero (a valid, empty ++// slice) is valid and results in a no-op. ++static inline uint64_t // ++wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src) { ++ size_t len = dst.len < src.len ? dst.len : src.len; ++ if (len > 0) { ++ memmove(dst.ptr, src.ptr, len); + } ++ return len; ++} + +- uint32_t dp = (uint32_t)(h->decimal_point); +- uint64_t n = 0; +- uint32_t i = 0; +- for (; i < dp; i++) { +- n = (10 * n) + ((i < h->num_digits) ? h->digits[i] : 0); ++static inline wuffs_base__empty_struct // ++wuffs_private_impl__bulk_load_host_endian(void* ptr, ++ size_t len, ++ wuffs_base__slice_u8 src) { ++ if (len && (len <= src.len)) { ++ memmove(ptr, src.ptr, len); + } ++ return wuffs_base__make_empty_struct(); ++} + +- bool round_up = false; +- if (dp < h->num_digits) { +- round_up = h->digits[dp] >= 5; +- if ((h->digits[dp] == 5) && (dp + 1 == h->num_digits)) { +- // We are exactly halfway. If we're truncated, round up, otherwise round +- // to even. +- round_up = h->truncated || // +- ((dp > 0) && (1 & h->digits[dp - 1])); +- } +- } +- if (round_up) { +- n++; ++static inline wuffs_base__empty_struct // ++wuffs_private_impl__bulk_memset(void* ptr, size_t len, uint8_t byte_value) { ++ if (len) { ++ memset(ptr, byte_value, len); + } ++ return wuffs_base__make_empty_struct(); ++} + +- return n; ++static inline wuffs_base__empty_struct // ++wuffs_private_impl__bulk_save_host_endian(void* ptr, ++ size_t len, ++ wuffs_base__slice_u8 dst) { ++ if (len && (len <= dst.len)) { ++ memmove(dst.ptr, ptr, len); ++ } ++ return wuffs_base__make_empty_struct(); + } + +-// wuffs_base__private_implementation__high_prec_dec__small_xshift shifts h's +-// number (where 'x' is 'l' or 'r' for left or right) by a small shift value. +-// +-// Preconditions: +-// - h is non-NULL. +-// - h->decimal_point is "not extreme". +-// - shift is non-zero. +-// - shift is "a small shift". +-// +-// "Not extreme" means within +-// ±WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE. +-// +-// "A small shift" means not more than +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL. +-// +-// wuffs_base__private_implementation__high_prec_dec__rounded_integer and +-// wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits +-// have the same preconditions. +-// +-// wuffs_base__private_implementation__high_prec_dec__lshift keeps the first +-// two preconditions but not the last two. Its shift argument is signed and +-// does not need to be "small": zero is a no-op, positive means left shift and +-// negative means right shift. ++// -------- + +-static void // +-wuffs_base__private_implementation__high_prec_dec__small_lshift( +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t shift) { +- if (h->num_digits == 0) { +- return; ++static inline wuffs_base__slice_u8 // ++wuffs_private_impl__table_u8__row_u32(wuffs_base__table_u8 t, uint32_t y) { ++ if (t.ptr && (y < t.height)) { ++ return wuffs_base__make_slice_u8(t.ptr + (t.stride * y), t.width); + } +- uint32_t num_new_digits = +- wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits( +- h, shift); +- uint32_t rx = h->num_digits - 1; // Read index. +- uint32_t wx = h->num_digits - 1 + num_new_digits; // Write index. +- uint64_t n = 0; ++ return wuffs_base__empty_slice_u8(); ++} + +- // Repeat: pick up a digit, put down a digit, right to left. +- while (((int32_t)rx) >= 0) { +- n += ((uint64_t)(h->digits[rx])) << shift; +- uint64_t quo = n / 10; +- uint64_t rem = n - (10 * quo); +- if (wx < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[wx] = (uint8_t)rem; +- } else if (rem > 0) { +- h->truncated = true; +- } +- n = quo; +- wx--; +- rx--; +- } ++// ---------------- Slices and Tables (Utility) + +- // Put down leading digits, right to left. +- while (n > 0) { +- uint64_t quo = n / 10; +- uint64_t rem = n - (10 * quo); +- if (wx < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[wx] = (uint8_t)rem; +- } else if (rem > 0) { +- h->truncated = true; +- } +- n = quo; +- wx--; +- } ++#define wuffs_base__utility__empty_slice_u8 wuffs_base__empty_slice_u8 + +- // Finish. +- h->num_digits += num_new_digits; +- if (h->num_digits > +- WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->num_digits = WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION; +- } +- h->decimal_point += (int32_t)num_new_digits; +- wuffs_base__private_implementation__high_prec_dec__trim(h); ++// ---------------- Ranges and Rects ++ ++static inline uint32_t // ++wuffs_private_impl__range_ii_u32__get_min_incl( ++ const wuffs_base__range_ii_u32* r) { ++ return r->min_incl; + } + +-static void // +-wuffs_base__private_implementation__high_prec_dec__small_rshift( +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t shift) { +- uint32_t rx = 0; // Read index. +- uint32_t wx = 0; // Write index. +- uint64_t n = 0; ++static inline uint32_t // ++wuffs_private_impl__range_ii_u32__get_max_incl( ++ const wuffs_base__range_ii_u32* r) { ++ return r->max_incl; ++} + +- // Pick up enough leading digits to cover the first shift. +- while ((n >> shift) == 0) { +- if (rx < h->num_digits) { +- // Read a digit. +- n = (10 * n) + h->digits[rx++]; +- } else if (n == 0) { +- // h's number used to be zero and remains zero. +- return; +- } else { +- // Read sufficient implicit trailing zeroes. +- while ((n >> shift) == 0) { +- n = 10 * n; +- rx++; +- } +- break; +- } +- } +- h->decimal_point -= ((int32_t)(rx - 1)); +- if (h->decimal_point < +- -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { +- // After the shift, h's number is effectively zero. +- h->num_digits = 0; +- h->decimal_point = 0; +- h->truncated = false; +- return; +- } ++static inline uint32_t // ++wuffs_private_impl__range_ie_u32__get_min_incl( ++ const wuffs_base__range_ie_u32* r) { ++ return r->min_incl; ++} + +- // Repeat: pick up a digit, put down a digit, left to right. +- uint64_t mask = (((uint64_t)(1)) << shift) - 1; +- while (rx < h->num_digits) { +- uint8_t new_digit = ((uint8_t)(n >> shift)); +- n = (10 * (n & mask)) + h->digits[rx++]; +- h->digits[wx++] = new_digit; +- } ++static inline uint32_t // ++wuffs_private_impl__range_ie_u32__get_max_excl( ++ const wuffs_base__range_ie_u32* r) { ++ return r->max_excl; ++} + +- // Put down trailing digits, left to right. +- while (n > 0) { +- uint8_t new_digit = ((uint8_t)(n >> shift)); +- n = 10 * (n & mask); +- if (wx < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[wx++] = new_digit; +- } else if (new_digit > 0) { +- h->truncated = true; +- } +- } ++static inline uint64_t // ++wuffs_private_impl__range_ii_u64__get_min_incl( ++ const wuffs_base__range_ii_u64* r) { ++ return r->min_incl; ++} + +- // Finish. +- h->num_digits = wx; +- wuffs_base__private_implementation__high_prec_dec__trim(h); ++static inline uint64_t // ++wuffs_private_impl__range_ii_u64__get_max_incl( ++ const wuffs_base__range_ii_u64* r) { ++ return r->max_incl; + } + +-static void // +-wuffs_base__private_implementation__high_prec_dec__lshift( +- wuffs_base__private_implementation__high_prec_dec* h, +- int32_t shift) { +- if (shift > 0) { +- while (shift > +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) { +- wuffs_base__private_implementation__high_prec_dec__small_lshift( +- h, WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL); +- shift -= WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; +- } +- wuffs_base__private_implementation__high_prec_dec__small_lshift( +- h, ((uint32_t)(+shift))); +- } else if (shift < 0) { +- while (shift < -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) { +- wuffs_base__private_implementation__high_prec_dec__small_rshift( +- h, WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL); +- shift += WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; +- } +- wuffs_base__private_implementation__high_prec_dec__small_rshift( +- h, ((uint32_t)(-shift))); +- } ++static inline uint64_t // ++wuffs_private_impl__range_ie_u64__get_min_incl( ++ const wuffs_base__range_ie_u64* r) { ++ return r->min_incl; + } + +-// -------- ++static inline uint64_t // ++wuffs_private_impl__range_ie_u64__get_max_excl( ++ const wuffs_base__range_ie_u64* r) { ++ return r->max_excl; ++} + +-// wuffs_base__private_implementation__high_prec_dec__round_etc rounds h's +-// number. For those functions that take an n argument, rounding produces at +-// most n digits (which is not necessarily at most n decimal places). Negative +-// n values are ignored, as well as any n greater than or equal to h's number +-// of digits. The etc__round_just_enough function implicitly chooses an n to +-// implement WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION. +-// +-// Preconditions: +-// - h is non-NULL. +-// - h->decimal_point is "not extreme". +-// +-// "Not extreme" means within +-// ±WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE. ++// ---------------- Ranges and Rects (Utility) + +-static void // +-wuffs_base__private_implementation__high_prec_dec__round_down( +- wuffs_base__private_implementation__high_prec_dec* h, +- int32_t n) { +- if ((n < 0) || (h->num_digits <= (uint32_t)n)) { +- return; ++#define wuffs_base__utility__empty_range_ii_u32 wuffs_base__empty_range_ii_u32 ++#define wuffs_base__utility__empty_range_ie_u32 wuffs_base__empty_range_ie_u32 ++#define wuffs_base__utility__empty_range_ii_u64 wuffs_base__empty_range_ii_u64 ++#define wuffs_base__utility__empty_range_ie_u64 wuffs_base__empty_range_ie_u64 ++#define wuffs_base__utility__empty_rect_ii_u32 wuffs_base__empty_rect_ii_u32 ++#define wuffs_base__utility__empty_rect_ie_u32 wuffs_base__empty_rect_ie_u32 ++#define wuffs_base__utility__make_range_ii_u32 wuffs_base__make_range_ii_u32 ++#define wuffs_base__utility__make_range_ie_u32 wuffs_base__make_range_ie_u32 ++#define wuffs_base__utility__make_range_ii_u64 wuffs_base__make_range_ii_u64 ++#define wuffs_base__utility__make_range_ie_u64 wuffs_base__make_range_ie_u64 ++#define wuffs_base__utility__make_rect_ii_u32 wuffs_base__make_rect_ii_u32 ++#define wuffs_base__utility__make_rect_ie_u32 wuffs_base__make_rect_ie_u32 ++ ++// ---------------- I/O ++ ++static inline uint64_t // ++wuffs_private_impl__io__count_since(uint64_t mark, uint64_t index) { ++ if (index >= mark) { ++ return index - mark; + } +- h->num_digits = (uint32_t)(n); +- wuffs_base__private_implementation__high_prec_dec__trim(h); ++ return 0; + } + +-static void // +-wuffs_base__private_implementation__high_prec_dec__round_up( +- wuffs_base__private_implementation__high_prec_dec* h, +- int32_t n) { +- if ((n < 0) || (h->num_digits <= (uint32_t)n)) { +- return; ++// TODO: drop the "const" in "const uint8_t* ptr". Some though required about ++// the base.io_reader.since method returning a mutable "slice base.u8". ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wcast-qual" ++#endif ++static inline wuffs_base__slice_u8 // ++wuffs_private_impl__io__since(uint64_t mark, ++ uint64_t index, ++ const uint8_t* ptr) { ++ if (index >= mark) { ++ return wuffs_base__make_slice_u8(((uint8_t*)ptr) + mark, ++ ((size_t)(index - mark))); + } ++ return wuffs_base__empty_slice_u8(); ++} ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif + +- for (n--; n >= 0; n--) { +- if (h->digits[n] < 9) { +- h->digits[n]++; +- h->num_digits = (uint32_t)(n + 1); +- return; +- } +- } ++// -------- + +- // The number is all 9s. Change to a single 1 and adjust the decimal point. +- h->digits[0] = 1; +- h->num_digits = 1; +- h->decimal_point++; ++static inline void // ++wuffs_private_impl__io_reader__limit(const uint8_t** ptr_io2_r, ++ const uint8_t* iop_r, ++ uint64_t limit) { ++ if (((uint64_t)(*ptr_io2_r - iop_r)) > limit) { ++ *ptr_io2_r = iop_r + limit; ++ } + } + +-static void // +-wuffs_base__private_implementation__high_prec_dec__round_nearest( +- wuffs_base__private_implementation__high_prec_dec* h, +- int32_t n) { +- if ((n < 0) || (h->num_digits <= (uint32_t)n)) { +- return; ++static inline uint32_t // ++wuffs_private_impl__io_reader__limited_copy_u32_to_slice( ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r, ++ uint32_t length, ++ wuffs_base__slice_u8 dst) { ++ const uint8_t* iop_r = *ptr_iop_r; ++ size_t n = dst.len; ++ if (n > length) { ++ n = length; + } +- bool up = h->digits[n] >= 5; +- if ((h->digits[n] == 5) && ((n + 1) == ((int32_t)(h->num_digits)))) { +- up = h->truncated || // +- ((n > 0) && ((h->digits[n - 1] & 1) != 0)); ++ if (n > ((size_t)(io2_r - iop_r))) { ++ n = (size_t)(io2_r - iop_r); + } +- +- if (up) { +- wuffs_base__private_implementation__high_prec_dec__round_up(h, n); +- } else { +- wuffs_base__private_implementation__high_prec_dec__round_down(h, n); ++ if (n > 0) { ++ memmove(dst.ptr, iop_r, n); ++ *ptr_iop_r += n; + } ++ return (uint32_t)(n); + } + +-static void // +-wuffs_base__private_implementation__high_prec_dec__round_just_enough( +- wuffs_base__private_implementation__high_prec_dec* h, +- int32_t exp2, +- uint64_t mantissa) { +- // The magic numbers 52 and 53 in this function are because IEEE 754 double +- // precision has 52 mantissa bits. +- // +- // Let f be the floating point number represented by exp2 and mantissa (and +- // also the number in h): the number (mantissa * (2 ** (exp2 - 52))). +- // +- // If f is zero or a small integer, we can return early. +- if ((mantissa == 0) || +- ((exp2 < 53) && (h->decimal_point >= ((int32_t)(h->num_digits))))) { +- return; ++// wuffs_private_impl__io_reader__match7 returns whether the io_reader's ++// upcoming bytes start with the given prefix (up to 7 bytes long). It is ++// peek-like, not read-like, in that there are no side-effects. ++// ++// The low 3 bits of a hold the prefix length, n. ++// ++// The high 56 bits of a hold the prefix itself, in little-endian order. The ++// first prefix byte is in bits 8..=15, the second prefix byte is in bits ++// 16..=23, etc. The high (8 * (7 - n)) bits are ignored. ++// ++// There are three possible return values: ++// - 0 means success. ++// - 1 means inconclusive, equivalent to "$short read". ++// - 2 means failure. ++static inline uint32_t // ++wuffs_private_impl__io_reader__match7(const uint8_t* iop_r, ++ const uint8_t* io2_r, ++ wuffs_base__io_buffer* r, ++ uint64_t a) { ++ uint32_t n = a & 7; ++ a >>= 8; ++ if ((io2_r - iop_r) >= 8) { ++ uint64_t x = wuffs_base__peek_u64le__no_bounds_check(iop_r); ++ uint32_t shift = 8 * (8 - n); ++ return ((a << shift) == (x << shift)) ? 0 : 2; ++ } ++ for (; n > 0; n--) { ++ if (iop_r >= io2_r) { ++ return (r && r->meta.closed) ? 2 : 1; ++ } else if (*iop_r != ((uint8_t)(a))) { ++ return 2; ++ } ++ iop_r++; ++ a >>= 8; + } ++ return 0; ++} + +- // The smallest normal f has an exp2 of -1022 and a mantissa of (1 << 52). +- // Subnormal numbers have the same exp2 but a smaller mantissa. +- static const int32_t min_incl_normal_exp2 = -1022; +- static const uint64_t min_incl_normal_mantissa = 0x0010000000000000ul; ++static inline wuffs_base__io_buffer* // ++wuffs_private_impl__io_reader__set(wuffs_base__io_buffer* b, ++ const uint8_t** ptr_iop_r, ++ const uint8_t** ptr_io0_r, ++ const uint8_t** ptr_io1_r, ++ const uint8_t** ptr_io2_r, ++ wuffs_base__slice_u8 data, ++ uint64_t history_position) { ++ b->data = data; ++ b->meta.wi = data.len; ++ b->meta.ri = 0; ++ b->meta.pos = history_position; ++ b->meta.closed = false; + +- // Compute lower and upper bounds such that any number between them (possibly +- // inclusive) will round to f. First, the lower bound. Our number f is: +- // ((mantissa + 0) * (2 ** ( exp2 - 52))) +- // +- // The next lowest floating point number is: +- // ((mantissa - 1) * (2 ** ( exp2 - 52))) +- // unless (mantissa - 1) drops the (1 << 52) bit and exp2 is not the +- // min_incl_normal_exp2. Either way, call it: +- // ((l_mantissa) * (2 ** (l_exp2 - 52))) +- // +- // The lower bound is halfway between them (noting that 52 became 53): +- // (((2 * l_mantissa) + 1) * (2 ** (l_exp2 - 53))) +- int32_t l_exp2 = exp2; +- uint64_t l_mantissa = mantissa - 1; +- if ((exp2 > min_incl_normal_exp2) && (mantissa <= min_incl_normal_mantissa)) { +- l_exp2 = exp2 - 1; +- l_mantissa = (2 * mantissa) - 1; +- } +- wuffs_base__private_implementation__high_prec_dec lower; +- wuffs_base__private_implementation__high_prec_dec__assign( +- &lower, (2 * l_mantissa) + 1, false); +- wuffs_base__private_implementation__high_prec_dec__lshift(&lower, +- l_exp2 - 53); ++ *ptr_iop_r = data.ptr; ++ *ptr_io0_r = data.ptr; ++ *ptr_io1_r = data.ptr; ++ *ptr_io2_r = data.ptr + data.len; + +- // Next, the upper bound. Our number f is: +- // ((mantissa + 0) * (2 ** (exp2 - 52))) +- // +- // The next highest floating point number is: +- // ((mantissa + 1) * (2 ** (exp2 - 52))) +- // +- // The upper bound is halfway between them (noting that 52 became 53): +- // (((2 * mantissa) + 1) * (2 ** (exp2 - 53))) +- wuffs_base__private_implementation__high_prec_dec upper; +- wuffs_base__private_implementation__high_prec_dec__assign( +- &upper, (2 * mantissa) + 1, false); +- wuffs_base__private_implementation__high_prec_dec__lshift(&upper, exp2 - 53); ++ return b; ++} + +- // The lower and upper bounds are possible outputs only if the original +- // mantissa is even, so that IEEE round-to-even would round to the original +- // mantissa and not its neighbors. +- bool inclusive = (mantissa & 1) == 0; ++// -------- + +- // As we walk the digits, we want to know whether rounding up would fall +- // within the upper bound. This is tracked by upper_delta: +- // - When -1, the digits of h and upper are the same so far. +- // - When +0, we saw a difference of 1 between h and upper on a previous +- // digit and subsequently only 9s for h and 0s for upper. Thus, rounding +- // up may fall outside of the bound if !inclusive. +- // - When +1, the difference is greater than 1 and we know that rounding up +- // falls within the bound. +- // +- // This is a state machine with three states. The numerical value for each +- // state (-1, +0 or +1) isn't important, other than their order. +- int upper_delta = -1; ++static inline uint64_t // ++wuffs_private_impl__io_writer__copy_from_slice(uint8_t** ptr_iop_w, ++ uint8_t* io2_w, ++ wuffs_base__slice_u8 src) { ++ uint8_t* iop_w = *ptr_iop_w; ++ size_t n = src.len; ++ if (n > ((size_t)(io2_w - iop_w))) { ++ n = (size_t)(io2_w - iop_w); ++ } ++ if (n > 0) { ++ memmove(iop_w, src.ptr, n); ++ *ptr_iop_w += n; ++ } ++ return (uint64_t)(n); ++} + +- // We can now figure out the shortest number of digits required. Walk the +- // digits until h has distinguished itself from lower or upper. +- // +- // The zi and zd variables are indexes and digits, for z in l (lower), h (the +- // number) and u (upper). ++static inline void // ++wuffs_private_impl__io_writer__limit(uint8_t** ptr_io2_w, ++ uint8_t* iop_w, ++ uint64_t limit) { ++ if (((uint64_t)(*ptr_io2_w - iop_w)) > limit) { ++ *ptr_io2_w = iop_w + limit; ++ } ++} ++ ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ if (!distance) { ++ return 0; ++ } ++ uint8_t* p = *ptr_iop_w; ++ if ((size_t)(p - io0_w) < (size_t)(distance)) { ++ return 0; ++ } ++ uint8_t* q = p - distance; ++ size_t n = (size_t)(io2_w - p); ++ if ((size_t)(length) > n) { ++ length = (uint32_t)(n); ++ } else { ++ n = (size_t)(length); ++ } ++ // TODO: unrolling by 3 seems best for the std/deflate benchmarks, but that ++ // is mostly because 3 is the minimum length for the deflate format. This ++ // function implementation shouldn't overfit to that one format. Perhaps the ++ // limited_copy_u32_from_history Wuffs method should also take an unroll hint ++ // argument, and the cgen can look if that argument is the constant ++ // expression '3'. + // +- // The lower, h and upper numbers may have their decimal points at different +- // places. In this case, upper is the longest, so we iterate ui starting from +- // 0 and iterate li and hi starting from either 0 or -1. +- int32_t ui = 0; +- for (;; ui++) { +- // Calculate hd, the middle number's digit. +- int32_t hi = ui - upper.decimal_point + h->decimal_point; +- if (hi >= ((int32_t)(h->num_digits))) { +- break; +- } +- uint8_t hd = (((uint32_t)hi) < h->num_digits) ? h->digits[hi] : 0; ++ // See also wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast ++ // below. ++ for (; n >= 3; n -= 3) { ++ *p++ = *q++; ++ *p++ = *q++; ++ *p++ = *q++; ++ } ++ for (; n; n--) { ++ *p++ = *q++; ++ } ++ *ptr_iop_w = p; ++ return length; ++} + +- // Calculate ld, the lower bound's digit. +- int32_t li = ui - upper.decimal_point + lower.decimal_point; +- uint8_t ld = (((uint32_t)li) < lower.num_digits) ? lower.digits[li] : 0; ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast is like ++// the wuffs_private_impl__io_writer__limited_copy_u32_from_history function ++// above, but has stronger pre-conditions. ++// ++// The caller needs to prove that: ++// - length >= 1 ++// - length <= (io2_w - *ptr_iop_w) ++// - distance >= 1 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint8_t* q = p - distance; ++ uint32_t n = length; ++ for (; n >= 3; n -= 3) { ++ *p++ = *q++; ++ *p++ = *q++; ++ *p++ = *q++; ++ } ++ for (; n; n--) { ++ *p++ = *q++; ++ } ++ *ptr_iop_w = p; ++ return length; ++} + +- // We can round down (truncate) if lower has a different digit than h or if +- // lower is inclusive and is exactly the result of rounding down (i.e. we +- // have reached the final digit of lower). +- bool can_round_down = +- (ld != hd) || // +- (inclusive && ((li + 1) == ((int32_t)(lower.num_digits)))); ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp ++// is like the ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function, ++// but also returns the cusp: a byte pair (as a u16le) being the last byte of ++// and next byte after the copied history. ++// ++// For example, if history was [10, 11, 12, 13, 14, 15, 16, 17, 18] then: ++// - copying l=3, d=8 produces [11, 12, 13] and the cusp is (13, 14). ++// - copying l=3, d=2 produces [17, 18, 17] and the cusp is (17, 18). ++// ++// The caller needs to prove that: ++// - length >= 1 ++// - length <= (io2_w - *ptr_iop_w) ++// - distance >= 1 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint8_t* q = p - distance; ++ uint32_t n = length; ++ for (; n >= 3; n -= 3) { ++ *p++ = *q++; ++ *p++ = *q++; ++ *p++ = *q++; ++ } ++ for (; n; n--) { ++ *p++ = *q++; ++ } ++ *ptr_iop_w = p; ++ return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1); ++} + +- // Calculate ud, the upper bound's digit, and update upper_delta. +- uint8_t ud = (((uint32_t)ui) < upper.num_digits) ? upper.digits[ui] : 0; +- if (upper_delta < 0) { +- if ((hd + 1) < ud) { +- // For example: +- // h = 12345??? +- // upper = 12347??? +- upper_delta = +1; +- } else if (hd != ud) { +- // For example: +- // h = 12345??? +- // upper = 12346??? +- upper_delta = +0; +- } +- } else if (upper_delta == 0) { +- if ((hd != 9) || (ud != 0)) { +- // For example: +- // h = 1234598? +- // upper = 1234600? +- upper_delta = +1; +- } ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast ++// copies the previous byte (the one immediately before *ptr_iop_w), copying 8 ++// byte chunks at a time. Each chunk contains 8 repetitions of the same byte. ++// ++// In terms of number of bytes copied, length is rounded up to a multiple of 8. ++// As a special case, a zero length rounds up to 8 (even though 0 is already a ++// multiple of 8), since there is always at least one 8 byte chunk copied. ++// ++// In terms of advancing *ptr_iop_w, length is not rounded up. ++// ++// The caller needs to prove that: ++// - length >= 1 ++// - (length + 8) <= (io2_w - *ptr_iop_w) ++// - distance == 1 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint64_t x = p[-1]; ++ x |= x << 8; ++ x |= x << 16; ++ x |= x << 32; ++ uint32_t n = length; ++ while (1) { ++ wuffs_base__poke_u64le__no_bounds_check(p, x); ++ if (n <= 8) { ++ p += n; ++ break; + } ++ p += 8; ++ n -= 8; ++ } ++ *ptr_iop_w = p; ++ return length; ++} + +- // We can round up if upper has a different digit than h and either upper +- // is inclusive or upper is bigger than the result of rounding up. +- bool can_round_up = +- (upper_delta > 0) || // +- ((upper_delta == 0) && // +- (inclusive || ((ui + 1) < ((int32_t)(upper.num_digits))))); +- +- // If we can round either way, round to nearest. If we can round only one +- // way, do it. If we can't round, continue the loop. +- if (can_round_down) { +- if (can_round_up) { +- wuffs_base__private_implementation__high_prec_dec__round_nearest( +- h, hi + 1); +- return; +- } else { +- wuffs_base__private_implementation__high_prec_dec__round_down(h, +- hi + 1); +- return; +- } +- } else { +- if (can_round_up) { +- wuffs_base__private_implementation__high_prec_dec__round_up(h, hi + 1); +- return; +- } ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast_return_cusp ++// copies the previous byte (the one immediately before *ptr_iop_w), copying 8 ++// byte chunks at a time. Each chunk contains 8 repetitions of the same byte. ++// It also returns the cusp: a byte pair (as a u16le) being the last byte of ++// and next byte after the copied history. ++// ++// In terms of number of bytes copied, length is rounded up to a multiple of 8. ++// As a special case, a zero length rounds up to 8 (even though 0 is already a ++// multiple of 8), since there is always at least one 8 byte chunk copied. ++// ++// In terms of advancing *ptr_iop_w, length is not rounded up. ++// ++// The caller needs to prove that: ++// - length >= 1 ++// - (length + 8) <= (io2_w - *ptr_iop_w) ++// - distance == 1 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast_return_cusp( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint8_t* q = p - distance; ++ uint64_t x = p[-1]; ++ x |= x << 8; ++ x |= x << 16; ++ x |= x << 32; ++ uint32_t n = length; ++ while (1) { ++ wuffs_base__poke_u64le__no_bounds_check(p, x); ++ if (n <= 8) { ++ p += n; ++ q += n; ++ break; + } ++ p += 8; ++ q += 8; ++ n -= 8; + } ++ *ptr_iop_w = p; ++ return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1); + } + +-// -------- +- +-// wuffs_base__private_implementation__parse_number_f64_eisel_lemire produces +-// the IEEE 754 double-precision value for an exact mantissa and base-10 +-// exponent. For example: +-// - when parsing "12345.678e+02", man is 12345678 and exp10 is -1. +-// - when parsing "-12", man is 12 and exp10 is 0. Processing the leading +-// minus sign is the responsibility of the caller, not this function. ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast ++// is like the ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function ++// above, but copies 8 byte chunks at a time. + // +-// On success, it returns a non-negative int64_t such that the low 63 bits hold +-// the 11-bit exponent and 52-bit mantissa. ++// In terms of number of bytes copied, length is rounded up to a multiple of 8. ++// As a special case, a zero length rounds up to 8 (even though 0 is already a ++// multiple of 8), since there is always at least one 8 byte chunk copied. + // +-// On failure, it returns a negative value. ++// In terms of advancing *ptr_iop_w, length is not rounded up. + // +-// The algorithm is based on an original idea by Michael Eisel that was refined +-// by Daniel Lemire. See +-// https://lemire.me/blog/2020/03/10/fast-float-parsing-in-practice/ +-// and +-// https://nigeltao.github.io/blog/2020/eisel-lemire.html ++// The caller needs to prove that: ++// - length >= 1 ++// - (length + 8) <= (io2_w - *ptr_iop_w) ++// - distance >= 8 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint8_t* q = p - distance; ++ uint32_t n = length; ++ while (1) { ++ memcpy(p, q, 8); ++ if (n <= 8) { ++ p += n; ++ break; ++ } ++ p += 8; ++ q += 8; ++ n -= 8; ++ } ++ *ptr_iop_w = p; ++ return length; ++} ++ ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp ++// is like the ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function ++// above, but copies 8 byte chunks at a time. It also returns the cusp: a byte ++// pair (as a u16le) being the last byte of and next byte after the copied ++// history. + // +-// Preconditions: +-// - man is non-zero. +-// - exp10 is in the range [-307 ..= 288], the same range of the +-// wuffs_base__private_implementation__powers_of_10 array. ++// In terms of number of bytes copied, length is rounded up to a multiple of 8. ++// As a special case, a zero length rounds up to 8 (even though 0 is already a ++// multiple of 8), since there is always at least one 8 byte chunk copied. + // +-// The exp10 range (and the fact that man is in the range [1 ..= UINT64_MAX], +-// approximately [1 ..= 1.85e+19]) means that (man * (10 ** exp10)) is in the +-// range [1e-307 ..= 1.85e+307]. This is entirely within the range of normal +-// (neither subnormal nor non-finite) f64 values: DBL_MIN and DBL_MAX are +-// approximately 2.23e–308 and 1.80e+308. +-static int64_t // +-wuffs_base__private_implementation__parse_number_f64_eisel_lemire( +- uint64_t man, +- int32_t exp10) { +- // Look up the (possibly truncated) base-2 representation of (10 ** exp10). +- // The look-up table was constructed so that it is already normalized: the +- // table entry's mantissa's MSB (most significant bit) is on. +- const uint64_t* po10 = +- &wuffs_base__private_implementation__powers_of_10[exp10 + 307][0]; ++// In terms of advancing *ptr_iop_w, length is not rounded up. ++// ++// The caller needs to prove that: ++// - length >= 1 ++// - (length + 8) <= (io2_w - *ptr_iop_w) ++// - distance >= 8 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint8_t* q = p - distance; ++ uint32_t n = length; ++ while (1) { ++ memcpy(p, q, 8); ++ if (n <= 8) { ++ p += n; ++ q += n; ++ break; ++ } ++ p += 8; ++ q += 8; ++ n -= 8; ++ } ++ *ptr_iop_w = p; ++ return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1); ++} + +- // Normalize the man argument. The (man != 0) precondition means that a +- // non-zero bit exists. +- uint32_t clz = wuffs_base__count_leading_zeroes_u64(man); +- man <<= clz; ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_reader( ++ uint8_t** ptr_iop_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r) { ++ uint8_t* iop_w = *ptr_iop_w; ++ size_t n = length; ++ if (n > ((size_t)(io2_w - iop_w))) { ++ n = (size_t)(io2_w - iop_w); ++ } ++ const uint8_t* iop_r = *ptr_iop_r; ++ if (n > ((size_t)(io2_r - iop_r))) { ++ n = (size_t)(io2_r - iop_r); ++ } ++ if (n > 0) { ++ memmove(iop_w, iop_r, n); ++ *ptr_iop_w += n; ++ *ptr_iop_r += n; ++ } ++ return (uint32_t)(n); ++} + +- // Calculate the return value's base-2 exponent. We might tweak it by ±1 +- // later, but its initial value comes from a linear scaling of exp10, +- // converting from power-of-10 to power-of-2, and adjusting by clz. +- // +- // The magic constants are: +- // - 1087 = 1023 + 64. The 1023 is the f64 exponent bias. The 64 is because +- // the look-up table uses 64-bit mantissas. +- // - 217706 is such that the ratio 217706 / 65536 ≈ 3.321930 is close enough +- // (over the practical range of exp10) to log(10) / log(2) ≈ 3.321928. +- // - 65536 = 1<<16 is arbitrary but a power of 2, so division is a shift. +- // +- // Equality of the linearly-scaled value and the actual power-of-2, over the +- // range of exp10 arguments that this function accepts, is confirmed by +- // script/print-mpb-powers-of-10.go +- uint64_t ret_exp2 = +- ((uint64_t)(((217706 * exp10) >> 16) + 1087)) - ((uint64_t)clz); ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ uint8_t** ptr_iop_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ wuffs_base__slice_u8 src) { ++ uint8_t* iop_w = *ptr_iop_w; ++ size_t n = src.len; ++ if (n > length) { ++ n = length; ++ } ++ if (n > ((size_t)(io2_w - iop_w))) { ++ n = (size_t)(io2_w - iop_w); ++ } ++ if (n > 0) { ++ memmove(iop_w, src.ptr, n); ++ *ptr_iop_w += n; ++ } ++ return (uint32_t)(n); ++} + +- // Multiply the two mantissas. Normalization means that both mantissas are at +- // least (1<<63), so the 128-bit product must be at least (1<<126). The high +- // 64 bits of the product, x_hi, must therefore be at least (1<<62). +- // +- // As a consequence, x_hi has either 0 or 1 leading zeroes. Shifting x_hi +- // right by either 9 or 10 bits (depending on x_hi's MSB) will therefore +- // leave the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. +- wuffs_base__multiply_u64__output x = wuffs_base__multiply_u64(man, po10[1]); +- uint64_t x_hi = x.hi; +- uint64_t x_lo = x.lo; ++static inline wuffs_base__io_buffer* // ++wuffs_private_impl__io_writer__set(wuffs_base__io_buffer* b, ++ uint8_t** ptr_iop_w, ++ uint8_t** ptr_io0_w, ++ uint8_t** ptr_io1_w, ++ uint8_t** ptr_io2_w, ++ wuffs_base__slice_u8 data, ++ uint64_t history_position) { ++ b->data = data; ++ b->meta.wi = 0; ++ b->meta.ri = 0; ++ b->meta.pos = history_position; ++ b->meta.closed = false; + +- // Before we shift right by at least 9 bits, recall that the look-up table +- // entry was possibly truncated. We have so far only calculated a lower bound +- // for the product (man * e), where e is (10 ** exp10). The upper bound would +- // add a further (man * 1) to the 128-bit product, which overflows the lower +- // 64-bit limb if ((x_lo + man) < man). +- // +- // If overflow occurs, that adds 1 to x_hi. Since we're about to shift right +- // by at least 9 bits, that carried 1 can be ignored unless the higher 64-bit +- // limb's low 9 bits are all on. +- // +- // For example, parsing "9999999999999999999" will take the if-true branch +- // here, since: +- // - x_hi = 0x4563918244F3FFFF +- // - x_lo = 0x8000000000000000 +- // - man = 0x8AC7230489E7FFFF +- if (((x_hi & 0x1FF) == 0x1FF) && ((x_lo + man) < man)) { +- // Refine our calculation of (man * e). Before, our approximation of e used +- // a "low resolution" 64-bit mantissa. Now use a "high resolution" 128-bit +- // mantissa. We've already calculated x = (man * bits_0_to_63_incl_of_e). +- // Now calculate y = (man * bits_64_to_127_incl_of_e). +- wuffs_base__multiply_u64__output y = wuffs_base__multiply_u64(man, po10[0]); +- uint64_t y_hi = y.hi; +- uint64_t y_lo = y.lo; ++ *ptr_iop_w = data.ptr; ++ *ptr_io0_w = data.ptr; ++ *ptr_io1_w = data.ptr; ++ *ptr_io2_w = data.ptr + data.len; + +- // Merge the 128-bit x and 128-bit y, which overlap by 64 bits, to +- // calculate the 192-bit product of the 64-bit man by the 128-bit e. +- // As we exit this if-block, we only care about the high 128 bits +- // (merged_hi and merged_lo) of that 192-bit product. +- // +- // For example, parsing "1.234e-45" will take the if-true branch here, +- // since: +- // - x_hi = 0x70B7E3696DB29FFF +- // - x_lo = 0xE040000000000000 +- // - y_hi = 0x33718BBEAB0E0D7A +- // - y_lo = 0xA880000000000000 +- uint64_t merged_hi = x_hi; +- uint64_t merged_lo = x_lo + y_hi; +- if (merged_lo < x_lo) { +- merged_hi++; // Carry the overflow bit. +- } ++ return b; ++} + +- // The "high resolution" approximation of e is still a lower bound. Once +- // again, see if the upper bound is large enough to produce a different +- // result. This time, if it does, give up instead of reaching for an even +- // more precise approximation to e. +- // +- // This three-part check is similar to the two-part check that guarded the +- // if block that we're now in, but it has an extra term for the middle 64 +- // bits (checking that adding 1 to merged_lo would overflow). +- // +- // For example, parsing "5.9604644775390625e-8" will take the if-true +- // branch here, since: +- // - merged_hi = 0x7FFFFFFFFFFFFFFF +- // - merged_lo = 0xFFFFFFFFFFFFFFFF +- // - y_lo = 0x4DB3FFC120988200 +- // - man = 0xD3C21BCECCEDA100 +- if (((merged_hi & 0x1FF) == 0x1FF) && ((merged_lo + 1) == 0) && +- (y_lo + man < man)) { +- return -1; +- } ++// ---------------- I/O (Utility) + +- // Replace the 128-bit x with merged. +- x_hi = merged_hi; +- x_lo = merged_lo; +- } ++#define wuffs_base__utility__empty_io_reader wuffs_base__empty_io_reader ++#define wuffs_base__utility__empty_io_writer wuffs_base__empty_io_writer + +- // As mentioned above, shifting x_hi right by either 9 or 10 bits will leave +- // the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. If the +- // MSB (before shifting) was on, adjust ret_exp2 for the larger shift. +- // +- // Having bit 53 on (and higher bits off) means that ret_mantissa is a 54-bit +- // number. +- uint64_t msb = x_hi >> 63; +- uint64_t ret_mantissa = x_hi >> (msb + 9); +- ret_exp2 -= 1 ^ msb; ++// ---------------- Tokens + +- // IEEE 754 rounds to-nearest with ties rounded to-even. Rounding to-even can +- // be tricky. If we're half-way between two exactly representable numbers +- // (x's low 73 bits are zero and the next 2 bits that matter are "01"), give +- // up instead of trying to pick the winner. +- // +- // Technically, we could tighten the condition by changing "73" to "73 or 74, +- // depending on msb", but a flat "73" is simpler. +- // +- // For example, parsing "1e+23" will take the if-true branch here, since: +- // - x_hi = 0x54B40B1F852BDA00 +- // - ret_mantissa = 0x002A5A058FC295ED +- if ((x_lo == 0) && ((x_hi & 0x1FF) == 0) && ((ret_mantissa & 3) == 1)) { +- return -1; +- } ++// ---------------- Tokens (Utility) + +- // If we're not halfway then it's rounding to-nearest. Starting with a 54-bit +- // number, carry the lowest bit (bit 0) up if it's on. Regardless of whether +- // it was on or off, shifting right by one then produces a 53-bit number. If +- // carrying up overflowed, shift again. +- ret_mantissa += ret_mantissa & 1; +- ret_mantissa >>= 1; +- // This if block is equivalent to (but benchmarks slightly faster than) the +- // following branchless form: +- // uint64_t overflow_adjustment = ret_mantissa >> 53; +- // ret_mantissa >>= overflow_adjustment; +- // ret_exp2 += overflow_adjustment; +- // +- // For example, parsing "7.2057594037927933e+16" will take the if-true +- // branch here, since: +- // - x_hi = 0x7FFFFFFFFFFFFE80 +- // - ret_mantissa = 0x0020000000000000 +- if ((ret_mantissa >> 53) > 0) { +- ret_mantissa >>= 1; +- ret_exp2++; +- } ++// ---------------- Memory Allocation + +- // Starting with a 53-bit number, IEEE 754 double-precision normal numbers +- // have an implicit mantissa bit. Mask that away and keep the low 52 bits. +- ret_mantissa &= 0x000FFFFFFFFFFFFF; ++// ---------------- Images + +- // Pack the bits and return. +- return ((int64_t)(ret_mantissa | (ret_exp2 << 52))); +-} ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( ++ const wuffs_base__pixel_swizzler* p, ++ uint32_t up_to_num_pixels, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r); + +-// -------- ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r); + +-static wuffs_base__result_f64 // +-wuffs_base__private_implementation__parse_number_f64_special( +- wuffs_base__slice_u8 s, +- uint32_t options) { +- do { +- if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) { +- goto fail; +- } ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ uint64_t num_pixels); + +- uint8_t* p = s.ptr; +- uint8_t* q = s.ptr + s.len; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status // ++wuffs_base__pixel_swizzler__swizzle_ycck( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_buffer* dst, ++ wuffs_base__slice_u8 dst_palette, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ wuffs_base__slice_u8 src0, ++ wuffs_base__slice_u8 src1, ++ wuffs_base__slice_u8 src2, ++ wuffs_base__slice_u8 src3, ++ uint32_t width0, ++ uint32_t width1, ++ uint32_t width2, ++ uint32_t width3, ++ uint32_t height0, ++ uint32_t height1, ++ uint32_t height2, ++ uint32_t height3, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t stride3, ++ uint8_t h0, ++ uint8_t h1, ++ uint8_t h2, ++ uint8_t h3, ++ uint8_t v0, ++ uint8_t v1, ++ uint8_t v2, ++ uint8_t v3, ++ bool is_rgb_or_cmyk, ++ bool triangle_filter_for_2to1, ++ wuffs_base__slice_u8 scratch_buffer_2k); + +- for (; (p < q) && (*p == '_'); p++) { +- } +- if (p >= q) { +- goto fail; +- } ++// ---------------- Images (Utility) + +- // Parse sign. +- bool negative = false; +- do { +- if (*p == '+') { +- p++; +- } else if (*p == '-') { +- negative = true; +- p++; +- } else { +- break; +- } +- for (; (p < q) && (*p == '_'); p++) { +- } +- } while (0); +- if (p >= q) { +- goto fail; +- } ++#define wuffs_base__utility__make_pixel_format wuffs_base__make_pixel_format + +- bool nan = false; +- switch (p[0]) { +- case 'I': +- case 'i': +- if (((q - p) < 3) || // +- ((p[1] != 'N') && (p[1] != 'n')) || // +- ((p[2] != 'F') && (p[2] != 'f'))) { +- goto fail; +- } +- p += 3; ++// ---------------- String Conversions + +- if ((p >= q) || (*p == '_')) { +- break; +- } else if (((q - p) < 5) || // +- ((p[0] != 'I') && (p[0] != 'i')) || // +- ((p[1] != 'N') && (p[1] != 'n')) || // +- ((p[2] != 'I') && (p[2] != 'i')) || // +- ((p[3] != 'T') && (p[3] != 't')) || // +- ((p[4] != 'Y') && (p[4] != 'y'))) { +- goto fail; +- } +- p += 5; ++// ---------------- Unicode and UTF-8 + +- if ((p >= q) || (*p == '_')) { +- break; +- } +- goto fail; ++// ---------------- + +- case 'N': +- case 'n': +- if (((q - p) < 3) || // +- ((p[1] != 'A') && (p[1] != 'a')) || // +- ((p[2] != 'N') && (p[2] != 'n'))) { +- goto fail; +- } +- p += 3; ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__CORE) + +- if ((p >= q) || (*p == '_')) { +- nan = true; +- break; +- } +- goto fail; ++const uint8_t wuffs_private_impl__low_bits_mask__u8[8] = { ++ 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, ++}; + +- default: +- goto fail; +- } ++const uint16_t wuffs_private_impl__low_bits_mask__u16[16] = { ++ 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, ++ 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, ++}; + +- // Finish. +- for (; (p < q) && (*p == '_'); p++) { +- } +- if (p != q) { +- goto fail; +- } +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( +- (nan ? 0x7FFFFFFFFFFFFFFF : 0x7FF0000000000000) | +- (negative ? 0x8000000000000000 : 0)); +- return ret; +- } while (0); ++const uint32_t wuffs_private_impl__low_bits_mask__u32[32] = { ++ 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, ++ 0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF, ++ 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 0x0001FFFF, ++ 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, ++ 0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF, ++ 0x3FFFFFFF, 0x7FFFFFFF, ++}; + +-fail: +- do { +- wuffs_base__result_f64 ret; +- ret.status.repr = wuffs_base__error__bad_argument; +- ret.value = 0; +- return ret; +- } while (0); +-} ++const uint64_t wuffs_private_impl__low_bits_mask__u64[64] = { ++ 0x0000000000000000, 0x0000000000000001, 0x0000000000000003, ++ 0x0000000000000007, 0x000000000000000F, 0x000000000000001F, ++ 0x000000000000003F, 0x000000000000007F, 0x00000000000000FF, ++ 0x00000000000001FF, 0x00000000000003FF, 0x00000000000007FF, ++ 0x0000000000000FFF, 0x0000000000001FFF, 0x0000000000003FFF, ++ 0x0000000000007FFF, 0x000000000000FFFF, 0x000000000001FFFF, ++ 0x000000000003FFFF, 0x000000000007FFFF, 0x00000000000FFFFF, ++ 0x00000000001FFFFF, 0x00000000003FFFFF, 0x00000000007FFFFF, ++ 0x0000000000FFFFFF, 0x0000000001FFFFFF, 0x0000000003FFFFFF, ++ 0x0000000007FFFFFF, 0x000000000FFFFFFF, 0x000000001FFFFFFF, ++ 0x000000003FFFFFFF, 0x000000007FFFFFFF, 0x00000000FFFFFFFF, ++ 0x00000001FFFFFFFF, 0x00000003FFFFFFFF, 0x00000007FFFFFFFF, ++ 0x0000000FFFFFFFFF, 0x0000001FFFFFFFFF, 0x0000003FFFFFFFFF, ++ 0x0000007FFFFFFFFF, 0x000000FFFFFFFFFF, 0x000001FFFFFFFFFF, ++ 0x000003FFFFFFFFFF, 0x000007FFFFFFFFFF, 0x00000FFFFFFFFFFF, ++ 0x00001FFFFFFFFFFF, 0x00003FFFFFFFFFFF, 0x00007FFFFFFFFFFF, ++ 0x0000FFFFFFFFFFFF, 0x0001FFFFFFFFFFFF, 0x0003FFFFFFFFFFFF, ++ 0x0007FFFFFFFFFFFF, 0x000FFFFFFFFFFFFF, 0x001FFFFFFFFFFFFF, ++ 0x003FFFFFFFFFFFFF, 0x007FFFFFFFFFFFFF, 0x00FFFFFFFFFFFFFF, ++ 0x01FFFFFFFFFFFFFF, 0x03FFFFFFFFFFFFFF, 0x07FFFFFFFFFFFFFF, ++ 0x0FFFFFFFFFFFFFFF, 0x1FFFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFFF, ++ 0x7FFFFFFFFFFFFFFF, ++}; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 // +-wuffs_base__private_implementation__high_prec_dec__to_f64( +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t options) { +- do { +- // powers converts decimal powers of 10 to binary powers of 2. For example, +- // (10000 >> 13) is 1. It stops before the elements exceed 60, also known +- // as WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL. +- // +- // This rounds down (1<<13 is a lower bound for 1e4). Adding 1 to the array +- // element value rounds up (1<<14 is an upper bound for 1e4) while staying +- // at or below WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL. +- // +- // When starting in the range [1e+1 .. 1e+2] (i.e. h->decimal_point == +2), +- // powers[2] == 6 and so: +- // - Right shifting by 6+0 produces the range [10/64 .. 100/64] = +- // [0.156250 .. 1.56250]. The resultant h->decimal_point is +0 or +1. +- // - Right shifting by 6+1 produces the range [10/128 .. 100/128] = +- // [0.078125 .. 0.78125]. The resultant h->decimal_point is -1 or -0. +- // +- // When starting in the range [1e-3 .. 1e-2] (i.e. h->decimal_point == -2), +- // powers[2] == 6 and so: +- // - Left shifting by 6+0 produces the range [0.001*64 .. 0.01*64] = +- // [0.064 .. 0.64]. The resultant h->decimal_point is -1 or -0. +- // - Left shifting by 6+1 produces the range [0.001*128 .. 0.01*128] = +- // [0.128 .. 1.28]. The resultant h->decimal_point is +0 or +1. +- // +- // Thus, when targeting h->decimal_point being +0 or +1, use (powers[n]+0) +- // when right shifting but (powers[n]+1) when left shifting. +- static const uint32_t num_powers = 19; +- static const uint8_t powers[19] = { +- 0, 3, 6, 9, 13, 16, 19, 23, 26, 29, // +- 33, 36, 39, 43, 46, 49, 53, 56, 59, // +- }; ++const uint32_t wuffs_private_impl__pixel_format__bits_per_channel[16] = { ++ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, ++ 0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, ++}; + +- // Handle zero and obvious extremes. The largest and smallest positive +- // finite f64 values are approximately 1.8e+308 and 4.9e-324. +- if ((h->num_digits == 0) || (h->decimal_point < -326)) { +- goto zero; +- } else if (h->decimal_point > 310) { +- goto infinity; +- } ++const char wuffs_base__note__i_o_redirect[] = "@base: I/O redirect"; ++const char wuffs_base__note__end_of_data[] = "@base: end of data"; ++const char wuffs_base__note__metadata_reported[] = "@base: metadata reported"; ++const char wuffs_base__suspension__even_more_information[] = "$base: even more information"; ++const char wuffs_base__suspension__mispositioned_read[] = "$base: mispositioned read"; ++const char wuffs_base__suspension__mispositioned_write[] = "$base: mispositioned write"; ++const char wuffs_base__suspension__short_read[] = "$base: short read"; ++const char wuffs_base__suspension__short_workbuf[] = "$base: short workbuf"; ++const char wuffs_base__suspension__short_write[] = "$base: short write"; ++const char wuffs_base__error__bad_i_o_position[] = "#base: bad I/O position"; ++const char wuffs_base__error__bad_argument_length_too_short[] = "#base: bad argument (length too short)"; ++const char wuffs_base__error__bad_argument[] = "#base: bad argument"; ++const char wuffs_base__error__bad_call_sequence[] = "#base: bad call sequence"; ++const char wuffs_base__error__bad_data[] = "#base: bad data"; ++const char wuffs_base__error__bad_receiver[] = "#base: bad receiver"; ++const char wuffs_base__error__bad_restart[] = "#base: bad restart"; ++const char wuffs_base__error__bad_sizeof_receiver[] = "#base: bad sizeof receiver"; ++const char wuffs_base__error__bad_vtable[] = "#base: bad vtable"; ++const char wuffs_base__error__bad_workbuf_length[] = "#base: bad workbuf length"; ++const char wuffs_base__error__bad_wuffs_version[] = "#base: bad wuffs version"; ++const char wuffs_base__error__cannot_return_a_suspension[] = "#base: cannot return a suspension"; ++const char wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist[] = "#base: disabled by WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST"; ++const char wuffs_base__error__disabled_by_previous_error[] = "#base: disabled by previous error"; ++const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[] = "#base: initialize falsely claimed already zeroed"; ++const char wuffs_base__error__initialize_not_called[] = "#base: initialize not called"; ++const char wuffs_base__error__insufficient_history[] = "#base: insufficient history"; ++const char wuffs_base__error__interleaved_coroutine_calls[] = "#base: interleaved coroutine calls"; ++const char wuffs_base__error__no_more_information[] = "#base: no more information"; ++const char wuffs_base__error__not_enough_data[] = "#base: not enough data"; ++const char wuffs_base__error__out_of_bounds[] = "#base: out of bounds"; ++const char wuffs_base__error__unsupported_image_dimension[] = "#base: unsupported image dimension"; ++const char wuffs_base__error__unsupported_method[] = "#base: unsupported method"; ++const char wuffs_base__error__unsupported_option[] = "#base: unsupported option"; ++const char wuffs_base__error__unsupported_pixel_swizzler_option[] = "#base: unsupported pixel swizzler option"; ++const char wuffs_base__error__too_much_data[] = "#base: too much data"; + +- // Try the fast Eisel-Lemire algorithm again. Calculating the (man, exp10) +- // pair from the high_prec_dec h is more correct but slower than the +- // approach taken in wuffs_base__parse_number_f64. The latter is optimized +- // for the common cases (e.g. assuming no underscores or a leading '+' +- // sign) rather than the full set of cases allowed by the Wuffs API. +- // +- // When we have 19 or fewer mantissa digits, run Eisel-Lemire once (trying +- // for an exact result). When we have more than 19 mantissa digits, run it +- // twice to get a lower and upper bound. We still have an exact result +- // (within f64's rounding margin) if both bounds are equal (and valid). +- uint32_t i_max = h->num_digits; +- if (i_max > 19) { +- i_max = 19; +- } +- int32_t exp10 = h->decimal_point - ((int32_t)i_max); +- if ((-307 <= exp10) && (exp10 <= 288)) { +- uint64_t man = 0; +- uint32_t i; +- for (i = 0; i < i_max; i++) { +- man = (10 * man) + h->digits[i]; +- } +- while (man != 0) { // The 'while' is just an 'if' that we can 'break'. +- int64_t r0 = +- wuffs_base__private_implementation__parse_number_f64_eisel_lemire( +- man + 0, exp10); +- if (r0 < 0) { +- break; +- } else if (h->num_digits > 19) { +- int64_t r1 = +- wuffs_base__private_implementation__parse_number_f64_eisel_lemire( +- man + 1, exp10); +- if (r1 != r0) { +- break; +- } +- } +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( +- ((uint64_t)r0) | (((uint64_t)(h->negative)) << 63)); +- return ret; +- } +- } ++const char wuffs_base__hasher_u32__vtable_name[] = "{vtable}wuffs_base__hasher_u32"; ++const char wuffs_base__hasher_u64__vtable_name[] = "{vtable}wuffs_base__hasher_u64"; ++const char wuffs_base__hasher_bitvec256__vtable_name[] = "{vtable}wuffs_base__hasher_bitvec256"; ++const char wuffs_base__image_decoder__vtable_name[] = "{vtable}wuffs_base__image_decoder"; ++const char wuffs_base__io_transformer__vtable_name[] = "{vtable}wuffs_base__io_transformer"; ++const char wuffs_base__token_decoder__vtable_name[] = "{vtable}wuffs_base__token_decoder"; + +- // When Eisel-Lemire fails, fall back to Simple Decimal Conversion. See +- // https://nigeltao.github.io/blog/2020/parse-number-f64-simple.html +- // +- // Scale by powers of 2 until we're in the range [0.1 .. 10]. Equivalently, +- // that h->decimal_point is +0 or +1. +- // +- // First we shift right while at or above 10... +- const int32_t f64_bias = -1023; +- int32_t exp2 = 0; +- while (h->decimal_point > 1) { +- uint32_t n = (uint32_t)(+h->decimal_point); +- uint32_t shift = +- (n < num_powers) +- ? powers[n] +- : WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; +- +- wuffs_base__private_implementation__high_prec_dec__small_rshift(h, shift); +- if (h->decimal_point < +- -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { +- goto zero; +- } +- exp2 += (int32_t)shift; +- } +- // ...then we shift left while below 0.1. +- while (h->decimal_point < 0) { +- uint32_t shift; +- uint32_t n = (uint32_t)(-h->decimal_point); +- shift = (n < num_powers) +- // The +1 is per "when targeting h->decimal_point being +0 or +- // +1... when left shifting" in the powers comment above. +- ? (powers[n] + 1) +- : WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__CORE) + +- wuffs_base__private_implementation__high_prec_dec__small_lshift(h, shift); +- if (h->decimal_point > +- +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { +- goto infinity; +- } +- exp2 -= (int32_t)shift; +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES) + +- // To get from "in the range [0.1 .. 10]" to "in the range [1 .. 2]" (which +- // will give us our exponent in base-2), the mantissa's first 3 digits will +- // determine the final left shift, equal to 52 (the number of explicit f64 +- // bits) plus an additional adjustment. +- int man3 = (100 * h->digits[0]) + +- ((h->num_digits > 1) ? (10 * h->digits[1]) : 0) + +- ((h->num_digits > 2) ? h->digits[2] : 0); +- int32_t additional_lshift = 0; +- if (h->decimal_point == 0) { // The value is in [0.1 .. 1]. +- if (man3 < 125) { +- additional_lshift = +4; +- } else if (man3 < 250) { +- additional_lshift = +3; +- } else if (man3 < 500) { +- additional_lshift = +2; +- } else { +- additional_lshift = +1; +- } +- } else { // The value is in [1 .. 10]. +- if (man3 < 200) { +- additional_lshift = -0; +- } else if (man3 < 400) { +- additional_lshift = -1; +- } else if (man3 < 800) { +- additional_lshift = -2; +- } else { +- additional_lshift = -3; +- } +- } +- exp2 -= additional_lshift; +- uint32_t final_lshift = (uint32_t)(52 + additional_lshift); ++// ---------------- Interface Definitions. + +- // The minimum normal exponent is (f64_bias + 1). +- while ((f64_bias + 1) > exp2) { +- uint32_t n = (uint32_t)((f64_bias + 1) - exp2); +- if (n > WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) { +- n = WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; +- } +- wuffs_base__private_implementation__high_prec_dec__small_rshift(h, n); +- exp2 += (int32_t)n; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_base__hasher_u32__checksum_u32( ++ const wuffs_base__hasher_u32* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- // Check for overflow. +- if ((exp2 - f64_bias) >= 0x07FF) { // (1 << 11) - 1. +- goto infinity; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { ++ const wuffs_base__hasher_u32__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->checksum_u32)(self); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- // Extract 53 bits for the mantissa (in base-2). +- wuffs_base__private_implementation__high_prec_dec__small_lshift( +- h, final_lshift); +- uint64_t man2 = +- wuffs_base__private_implementation__high_prec_dec__rounded_integer(h); ++ return 0; ++} + +- // Rounding might have added one bit. If so, shift and re-check overflow. +- if ((man2 >> 53) != 0) { +- man2 >>= 1; +- exp2++; +- if ((exp2 - f64_bias) >= 0x07FF) { // (1 << 11) - 1. +- goto infinity; +- } +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_u32__get_quirk( ++ const wuffs_base__hasher_u32* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- // Handle subnormal numbers. +- if ((man2 >> 52) == 0) { +- exp2 = f64_bias; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { ++ const wuffs_base__hasher_u32__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- // Pack the bits and return. +- uint64_t exp2_bits = +- (uint64_t)((exp2 - f64_bias) & 0x07FF); // (1 << 11) - 1. +- uint64_t bits = (man2 & 0x000FFFFFFFFFFFFF) | // (1 << 52) - 1. +- (exp2_bits << 52) | // +- (h->negative ? 0x8000000000000000 : 0); // (1 << 63). +- +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); +- return ret; +- } while (0); +- +-zero: +- do { +- uint64_t bits = h->negative ? 0x8000000000000000 : 0; ++ return 0; ++} + +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); +- return ret; +- } while (0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__hasher_u32__set_quirk( ++ wuffs_base__hasher_u32* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-infinity: +- do { +- if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) { +- wuffs_base__result_f64 ret; +- ret.status.repr = wuffs_base__error__bad_argument; +- ret.value = 0; +- return ret; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { ++ const wuffs_base__hasher_u32__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- uint64_t bits = h->negative ? 0xFFF0000000000000 : 0x7FF0000000000000; +- +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); +- return ret; +- } while (0); ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); + } + +-static inline bool // +-wuffs_base__private_implementation__is_decimal_digit(uint8_t c) { +- return ('0' <= c) && (c <= '9'); +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_base__hasher_u32__update( ++ wuffs_base__hasher_u32* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 // +-wuffs_base__parse_number_f64(wuffs_base__slice_u8 s, uint32_t options) { +- // In practice, almost all "dd.ddddE±xxx" numbers can be represented +- // losslessly by a uint64_t mantissa "dddddd" and an int32_t base-10 +- // exponent, adjusting "xxx" for the position (if present) of the decimal +- // separator '.' or ','. +- // +- // This (u64 man, i32 exp10) data structure is superficially similar to the +- // "Do It Yourself Floating Point" type from Loitsch (†), but the exponent +- // here is base-10, not base-2. +- // +- // If s's number fits in a (man, exp10), parse that pair with the +- // Eisel-Lemire algorithm. If not, or if Eisel-Lemire fails, parsing s with +- // the fallback algorithm is slower but comprehensive. +- // +- // † "Printing Floating-Point Numbers Quickly and Accurately with Integers" +- // (https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf). +- // Florian Loitsch is also the primary contributor to +- // https://github.com/google/double-conversion +- do { +- // Calculating that (man, exp10) pair needs to stay within s's bounds. +- // Provided that s isn't extremely long, work on a NUL-terminated copy of +- // s's contents. The NUL byte isn't a valid part of "±dd.ddddE±xxx". +- // +- // As the pointer p walks the contents, it's faster to repeatedly check "is +- // *p a valid digit" than "is p within bounds and *p a valid digit". +- if (s.len >= 256) { +- goto fallback; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { ++ const wuffs_base__hasher_u32__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; + } +- uint8_t z[256]; +- memcpy(&z[0], s.ptr, s.len); +- z[s.len] = 0; +- const uint8_t* p = &z[0]; ++ v++; ++ } + +- // Look for a leading minus sign. Technically, we could also look for an +- // optional plus sign, but the "script/process-json-numbers.c with -p" +- // benchmark is noticably slower if we do. It's optional and, in practice, +- // usually absent. Let the fallback catch it. +- bool negative = (*p == '-'); +- if (negative) { +- p++; +- } ++ return wuffs_base__make_empty_struct(); ++} + +- // After walking "dd.dddd", comparing p later with p now will produce the +- // number of "d"s and "."s. +- const uint8_t* const start_of_digits_ptr = p; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_base__hasher_u32__update_u32( ++ wuffs_base__hasher_u32* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return 0; ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return 0; ++ } + +- // Walk the "d"s before a '.', 'E', NUL byte, etc. If it starts with '0', +- // it must be a single '0'. If it starts with a non-zero decimal digit, it +- // can be a sequence of decimal digits. +- // +- // Update the man variable during the walk. It's OK if man overflows now. +- // We'll detect that later. +- uint64_t man; +- if (*p == '0') { +- man = 0; +- p++; +- if (wuffs_base__private_implementation__is_decimal_digit(*p)) { +- goto fallback; +- } +- } else if (wuffs_base__private_implementation__is_decimal_digit(*p)) { +- man = ((uint8_t)(*p - '0')); +- p++; +- for (; wuffs_base__private_implementation__is_decimal_digit(*p); p++) { +- man = (10 * man) + ((uint8_t)(*p - '0')); +- } +- } else { +- goto fallback; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { ++ const wuffs_base__hasher_u32__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update_u32)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- // Walk the "d"s after the optional decimal separator ('.' or ','), +- // updating the man and exp10 variables. +- int32_t exp10 = 0; +- if (*p == +- ((options & WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.')) { +- p++; +- const uint8_t* first_after_separator_ptr = p; +- if (!wuffs_base__private_implementation__is_decimal_digit(*p)) { +- goto fallback; +- } +- man = (10 * man) + ((uint8_t)(*p - '0')); +- p++; +- for (; wuffs_base__private_implementation__is_decimal_digit(*p); p++) { +- man = (10 * man) + ((uint8_t)(*p - '0')); +- } +- exp10 = ((int32_t)(first_after_separator_ptr - p)); +- } ++ return 0; ++} + +- // Count the number of digits: +- // - for an input of "314159", digit_count is 6. +- // - for an input of "3.14159", digit_count is 7. +- // +- // This is off-by-one if there is a decimal separator. That's OK for now. +- // We'll correct for that later. The "script/process-json-numbers.c with +- // -p" benchmark is noticably slower if we try to correct for that now. +- uint32_t digit_count = (uint32_t)(p - start_of_digits_ptr); ++// -------- + +- // Update exp10 for the optional exponent, starting with 'E' or 'e'. +- if ((*p | 0x20) == 'e') { +- p++; +- int32_t exp_sign = +1; +- if (*p == '-') { +- p++; +- exp_sign = -1; +- } else if (*p == '+') { +- p++; +- } +- if (!wuffs_base__private_implementation__is_decimal_digit(*p)) { +- goto fallback; +- } +- int32_t exp_num = ((uint8_t)(*p - '0')); +- p++; +- // The rest of the exp_num walking has a peculiar control flow but, once +- // again, the "script/process-json-numbers.c with -p" benchmark is +- // sensitive to alternative formulations. +- if (wuffs_base__private_implementation__is_decimal_digit(*p)) { +- exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); +- p++; +- } +- if (wuffs_base__private_implementation__is_decimal_digit(*p)) { +- exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); +- p++; +- } +- while (wuffs_base__private_implementation__is_decimal_digit(*p)) { +- if (exp_num > 0x1000000) { +- goto fallback; +- } +- exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); +- p++; +- } +- exp10 += exp_sign * exp_num; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_u64__checksum_u64( ++ const wuffs_base__hasher_u64* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- // The Wuffs API is that the original slice has no trailing data. It also +- // allows underscores, which we don't catch here but the fallback should. +- if (p != &z[s.len]) { +- goto fallback; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { ++ const wuffs_base__hasher_u64__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->checksum_u64)(self); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- // Check that the uint64_t typed man variable has not overflowed, based on +- // digit_count. +- // +- // For reference: +- // - (1 << 63) is 9223372036854775808, which has 19 decimal digits. +- // - (1 << 64) is 18446744073709551616, which has 20 decimal digits. +- // - 19 nines, 9999999999999999999, is 0x8AC7230489E7FFFF, which has 64 +- // bits and 16 hexadecimal digits. +- // - 20 nines, 99999999999999999999, is 0x56BC75E2D630FFFFF, which has 67 +- // bits and 17 hexadecimal digits. +- if (digit_count > 19) { +- // Even if we have more than 19 pseudo-digits, it's not yet definitely an +- // overflow. Recall that digit_count might be off-by-one (too large) if +- // there's a decimal separator. It will also over-report the number of +- // meaningful digits if the input looks something like "0.000dddExxx". +- // +- // We adjust by the number of leading '0's and '.'s and re-compare to 19. +- // Once again, technically, we could skip ','s too, but that perturbs the +- // "script/process-json-numbers.c with -p" benchmark. +- const uint8_t* q = start_of_digits_ptr; +- for (; (*q == '0') || (*q == '.'); q++) { +- } +- digit_count -= (uint32_t)(q - start_of_digits_ptr); +- if (digit_count > 19) { +- goto fallback; +- } +- } ++ return 0; ++} + +- // The wuffs_base__private_implementation__parse_number_f64_eisel_lemire +- // preconditions include that exp10 is in the range [-307 ..= 288]. +- if ((exp10 < -307) || (288 < exp10)) { +- goto fallback; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_u64__get_quirk( ++ const wuffs_base__hasher_u64* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- // If both man and (10 ** exp10) are exactly representable by a double, we +- // don't need to run the Eisel-Lemire algorithm. +- if ((-22 <= exp10) && (exp10 <= 22) && ((man >> 53) == 0)) { +- double d = (double)man; +- if (exp10 >= 0) { +- d *= wuffs_base__private_implementation__f64_powers_of_10[+exp10]; +- } else { +- d /= wuffs_base__private_implementation__f64_powers_of_10[-exp10]; +- } +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = negative ? -d : +d; +- return ret; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { ++ const wuffs_base__hasher_u64__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- // The wuffs_base__private_implementation__parse_number_f64_eisel_lemire +- // preconditions include that man is non-zero. Parsing "0" should be caught +- // by the "If both man and (10 ** exp10)" above, but "0e99" might not. +- if (man == 0) { +- goto fallback; +- } ++ return 0; ++} + +- // Our man and exp10 are in range. Run the Eisel-Lemire algorithm. +- int64_t r = +- wuffs_base__private_implementation__parse_number_f64_eisel_lemire( +- man, exp10); +- if (r < 0) { +- goto fallback; +- } +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( +- ((uint64_t)r) | (((uint64_t)negative) << 63)); +- return ret; +- } while (0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__hasher_u64__set_quirk( ++ wuffs_base__hasher_u64* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-fallback: +- do { +- wuffs_base__private_implementation__high_prec_dec h; +- wuffs_base__status status = +- wuffs_base__private_implementation__high_prec_dec__parse(&h, s, +- options); +- if (status.repr) { +- return wuffs_base__private_implementation__parse_number_f64_special( +- s, options); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { ++ const wuffs_base__hasher_u64__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; + } +- return wuffs_base__private_implementation__high_prec_dec__to_f64(&h, +- options); +- } while (0); +-} ++ v++; ++ } + +-// -------- ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +-static inline size_t // +-wuffs_base__private_implementation__render_inf(wuffs_base__slice_u8 dst, +- bool neg, +- uint32_t options) { +- if (neg) { +- if (dst.len < 4) { +- return 0; +- } +- wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492D); // '-Inf'le. +- return 4; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_base__hasher_u64__update( ++ wuffs_base__hasher_u64* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); + } + +- if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { +- if (dst.len < 4) { +- return 0; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { ++ const wuffs_base__hasher_u64__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; + } +- wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492B); // '+Inf'le. +- return 4; ++ v++; + } + +- if (dst.len < 3) { +- return 0; +- } +- wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x666E49); // 'Inf'le. +- return 3; ++ return wuffs_base__make_empty_struct(); + } + +-static inline size_t // +-wuffs_base__private_implementation__render_nan(wuffs_base__slice_u8 dst) { +- if (dst.len < 3) { ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_u64__update_u64( ++ wuffs_base__hasher_u64* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { + return 0; + } +- wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x4E614E); // 'NaN'le. +- return 3; +-} +- +-static size_t // +-wuffs_base__private_implementation__high_prec_dec__render_exponent_absent( +- wuffs_base__slice_u8 dst, +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t precision, +- uint32_t options) { +- size_t n = (h->negative || +- (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN)) +- ? 1 +- : 0; +- if (h->decimal_point <= 0) { +- n += 1; +- } else { +- n += (size_t)(h->decimal_point); +- } +- if (precision > 0) { +- n += precision + 1; // +1 for the '.'. ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return 0; + } + +- // Don't modify dst if the formatted number won't fit. +- if (n > dst.len) { +- return 0; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { ++ const wuffs_base__hasher_u64__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update_u64)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- // Align-left or align-right. +- uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) +- ? &dst.ptr[dst.len - n] +- : &dst.ptr[0]; ++ return 0; ++} + +- // Leading "±". +- if (h->negative) { +- *ptr++ = '-'; +- } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { +- *ptr++ = '+'; +- } ++// -------- + +- // Integral digits. +- if (h->decimal_point <= 0) { +- *ptr++ = '0'; +- } else { +- uint32_t m = +- wuffs_base__u32__min(h->num_digits, (uint32_t)(h->decimal_point)); +- uint32_t i = 0; +- for (; i < m; i++) { +- *ptr++ = (uint8_t)('0' | h->digits[i]); +- } +- for (; i < (uint32_t)(h->decimal_point); i++) { +- *ptr++ = '0'; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_base__hasher_bitvec256__checksum_bitvec256( ++ const wuffs_base__hasher_bitvec256* self) { ++ if (!self) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); + } + +- // Separator and then fractional digits. +- if (precision > 0) { +- *ptr++ = +- (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.'; +- uint32_t i = 0; +- for (; i < precision; i++) { +- uint32_t j = ((uint32_t)(h->decimal_point)) + i; +- *ptr++ = (uint8_t)('0' | ((j < h->num_digits) ? h->digits[j] : 0)); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) { ++ const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->checksum_bitvec256)(self); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; + } + +- return n; ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); + } + +-static size_t // +-wuffs_base__private_implementation__high_prec_dec__render_exponent_present( +- wuffs_base__slice_u8 dst, +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t precision, +- uint32_t options) { +- int32_t exp = 0; +- if (h->num_digits > 0) { +- exp = h->decimal_point - 1; +- } +- bool negative_exp = exp < 0; +- if (negative_exp) { +- exp = -exp; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_bitvec256__get_quirk( ++ const wuffs_base__hasher_bitvec256* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; + } +- +- size_t n = (h->negative || +- (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN)) +- ? 4 +- : 3; // Mininum 3 bytes: first digit and then "e±". +- if (precision > 0) { +- n += precision + 1; // +1 for the '.'. ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } +- n += (exp < 100) ? 2 : 3; + +- // Don't modify dst if the formatted number won't fit. +- if (n > dst.len) { +- return 0; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) { ++ const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- // Align-left or align-right. +- uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) +- ? &dst.ptr[dst.len - n] +- : &dst.ptr[0]; ++ return 0; ++} + +- // Leading "±". +- if (h->negative) { +- *ptr++ = '-'; +- } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { +- *ptr++ = '+'; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__hasher_bitvec256__set_quirk( ++ wuffs_base__hasher_bitvec256* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- +- // Integral digit. +- if (h->num_digits > 0) { +- *ptr++ = (uint8_t)('0' | h->digits[0]); +- } else { +- *ptr++ = '0'; ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- // Separator and then fractional digits. +- if (precision > 0) { +- *ptr++ = +- (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.'; +- uint32_t i = 1; +- uint32_t j = wuffs_base__u32__min(h->num_digits, precision + 1); +- for (; i < j; i++) { +- *ptr++ = (uint8_t)('0' | h->digits[i]); +- } +- for (; i <= precision; i++) { +- *ptr++ = '0'; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) { ++ const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; + } + +- // Exponent: "e±" and then 2 or 3 digits. +- *ptr++ = 'e'; +- *ptr++ = negative_exp ? '-' : '+'; +- if (exp < 10) { +- *ptr++ = '0'; +- *ptr++ = (uint8_t)('0' | exp); +- } else if (exp < 100) { +- *ptr++ = (uint8_t)('0' | (exp / 10)); +- *ptr++ = (uint8_t)('0' | (exp % 10)); +- } else { +- int32_t e = exp / 100; +- exp -= e * 100; +- *ptr++ = (uint8_t)('0' | e); +- *ptr++ = (uint8_t)('0' | (exp / 10)); +- *ptr++ = (uint8_t)('0' | (exp % 10)); +- } +- +- return n; ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); + } + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__render_number_f64(wuffs_base__slice_u8 dst, +- double x, +- uint32_t precision, +- uint32_t options) { +- // Decompose x (64 bits) into negativity (1 bit), base-2 exponent (11 bits +- // with a -1023 bias) and mantissa (52 bits). +- uint64_t bits = wuffs_base__ieee_754_bit_representation__from_f64_to_u64(x); +- bool neg = (bits >> 63) != 0; +- int32_t exp2 = ((int32_t)(bits >> 52)) & 0x7FF; +- uint64_t man = bits & 0x000FFFFFFFFFFFFFul; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_base__hasher_bitvec256__update( ++ wuffs_base__hasher_bitvec256* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } + +- // Apply the exponent bias and set the implicit top bit of the mantissa, +- // unless x is subnormal. Also take care of Inf and NaN. +- if (exp2 == 0x7FF) { +- if (man != 0) { +- return wuffs_base__private_implementation__render_nan(dst); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) { ++ const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; + } +- return wuffs_base__private_implementation__render_inf(dst, neg, options); +- } else if (exp2 == 0) { +- exp2 = -1022; +- } else { +- exp2 -= 1023; +- man |= 0x0010000000000000ul; ++ v++; + } + +- // Ensure that precision isn't too large. +- if (precision > 4095) { +- precision = 4095; ++ return wuffs_base__make_empty_struct(); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_base__hasher_bitvec256__update_bitvec256( ++ wuffs_base__hasher_bitvec256* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); + } + +- // Convert from the (neg, exp2, man) tuple to an HPD. +- wuffs_base__private_implementation__high_prec_dec h; +- wuffs_base__private_implementation__high_prec_dec__assign(&h, man, neg); +- if (h.num_digits > 0) { +- wuffs_base__private_implementation__high_prec_dec__lshift( +- &h, exp2 - 52); // 52 mantissa bits. ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) { ++ const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update_bitvec256)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- // Handle the "%e" and "%f" formats. +- switch (options & (WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT | +- WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT)) { +- case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT: // The "%"f" format. +- if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { +- wuffs_base__private_implementation__high_prec_dec__round_just_enough( +- &h, exp2, man); +- int32_t p = ((int32_t)(h.num_digits)) - h.decimal_point; +- precision = ((uint32_t)(wuffs_base__i32__max(0, p))); +- } else { +- wuffs_base__private_implementation__high_prec_dec__round_nearest( +- &h, ((int32_t)precision) + h.decimal_point); +- } +- return wuffs_base__private_implementation__high_prec_dec__render_exponent_absent( +- dst, &h, precision, options); ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); ++} + +- case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT: // The "%e" format. +- if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { +- wuffs_base__private_implementation__high_prec_dec__round_just_enough( +- &h, exp2, man); +- precision = (h.num_digits > 0) ? (h.num_digits - 1) : 0; +- } else { +- wuffs_base__private_implementation__high_prec_dec__round_nearest( +- &h, ((int32_t)precision) + 1); +- } +- return wuffs_base__private_implementation__high_prec_dec__render_exponent_present( +- dst, &h, precision, options); ++// -------- ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__decode_frame( ++ wuffs_base__image_decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- // We have the "%g" format and so precision means the number of significant +- // digits, not the number of digits after the decimal separator. Perform +- // rounding and determine whether to use "%e" or "%f". +- int32_t e_threshold = 0; +- if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { +- wuffs_base__private_implementation__high_prec_dec__round_just_enough( +- &h, exp2, man); +- precision = h.num_digits; +- e_threshold = 6; +- } else { +- if (precision == 0) { +- precision = 1; +- } +- wuffs_base__private_implementation__high_prec_dec__round_nearest( +- &h, ((int32_t)precision)); +- e_threshold = ((int32_t)precision); +- int32_t nd = ((int32_t)(h.num_digits)); +- if ((e_threshold > nd) && (nd >= h.decimal_point)) { +- e_threshold = nd; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->decode_frame)(self, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; + } + +- // Use the "%e" format if the exponent is large. +- int32_t e = h.decimal_point - 1; +- if ((e < -4) || (e_threshold <= e)) { +- uint32_t p = wuffs_base__u32__min(precision, h.num_digits); +- return wuffs_base__private_implementation__high_prec_dec__render_exponent_present( +- dst, &h, (p > 0) ? (p - 1) : 0, options); ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__decode_frame_config( ++ wuffs_base__image_decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- // Use the "%f" format otherwise. +- int32_t p = ((int32_t)precision); +- if (p > h.decimal_point) { +- p = ((int32_t)(h.num_digits)); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->decode_frame_config)(self, a_dst, a_src); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } +- precision = ((uint32_t)(wuffs_base__i32__max(0, p - h.decimal_point))); +- return wuffs_base__private_implementation__high_prec_dec__render_exponent_absent( +- dst, &h, precision, options); ++ ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV) ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__decode_image_config( ++ wuffs_base__image_decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__INTCONV) ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->decode_image_config)(self, a_dst, a_src); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +-// ---------------- Integer ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +-// wuffs_base__parse_number__foo_digits entries are 0x00 for invalid digits, +-// and (0x80 | v) for valid digits, where v is the 4 bit value. ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_base__image_decoder__frame_dirty_rect( ++ const wuffs_base__image_decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } + +-static const uint8_t wuffs_base__parse_number__decimal_digits[256] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. +- 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'. +- 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'. ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->frame_dirty_rect)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. ++ return wuffs_base__utility__empty_rect_ie_u32(); ++} + +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF. ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__image_decoder__get_quirk( ++ const wuffs_base__image_decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF. +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +-}; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +-static const uint8_t wuffs_base__parse_number__hexadecimal_digits[256] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. +- 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'. +- 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'. ++ return 0; ++} + +- 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x40 ..= 0x47. 'A'-'F'. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. +- 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x60 ..= 0x67. 'a'-'f'. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_base__image_decoder__num_animation_loops( ++ const wuffs_base__image_decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF. ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->num_animation_loops)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF. +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +-}; ++ return 0; ++} + +-static const uint8_t wuffs_base__private_implementation__encode_base16[16] = { +- 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // 0x00 ..= 0x07. +- 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, // 0x08 ..= 0x0F. +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__image_decoder__num_decoded_frame_configs( ++ const wuffs_base__image_decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-// -------- ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->num_decoded_frame_configs)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64 // +-wuffs_base__parse_number_i64(wuffs_base__slice_u8 s, uint32_t options) { +- uint8_t* p = s.ptr; +- uint8_t* q = s.ptr + s.len; ++ return 0; ++} + +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (; (p < q) && (*p == '_'); p++) { +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__image_decoder__num_decoded_frames( ++ const wuffs_base__image_decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- bool negative = false; +- if (p >= q) { +- goto fail_bad_argument; +- } else if (*p == '-') { +- p++; +- negative = true; +- } else if (*p == '+') { +- p++; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->num_decoded_frames)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- do { +- wuffs_base__result_u64 r = wuffs_base__parse_number_u64( +- wuffs_base__make_slice_u8(p, (size_t)(q - p)), options); +- if (r.status.repr != NULL) { +- wuffs_base__result_i64 ret; +- ret.status.repr = r.status.repr; +- ret.value = 0; +- return ret; +- } else if (negative) { +- if (r.value < 0x8000000000000000) { +- wuffs_base__result_i64 ret; +- ret.status.repr = NULL; +- ret.value = -(int64_t)(r.value); +- return ret; +- } else if (r.value == 0x8000000000000000) { +- wuffs_base__result_i64 ret; +- ret.status.repr = NULL; +- ret.value = INT64_MIN; +- return ret; +- } +- goto fail_out_of_bounds; +- } else if (r.value > 0x7FFFFFFFFFFFFFFF) { +- goto fail_out_of_bounds; +- } else { +- wuffs_base__result_i64 ret; +- ret.status.repr = NULL; +- ret.value = +(int64_t)(r.value); +- return ret; +- } +- } while (0); +- +-fail_bad_argument: +- do { +- wuffs_base__result_i64 ret; +- ret.status.repr = wuffs_base__error__bad_argument; +- ret.value = 0; +- return ret; +- } while (0); +- +-fail_out_of_bounds: +- do { +- wuffs_base__result_i64 ret; +- ret.status.repr = wuffs_base__error__out_of_bounds; +- ret.value = 0; +- return ret; +- } while (0); ++ return 0; + } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64 // +-wuffs_base__parse_number_u64(wuffs_base__slice_u8 s, uint32_t options) { +- uint8_t* p = s.ptr; +- uint8_t* q = s.ptr + s.len; +- +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (; (p < q) && (*p == '_'); p++) { +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__restart_frame( ++ wuffs_base__image_decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- if (p >= q) { +- goto fail_bad_argument; +- +- } else if (*p == '0') { +- p++; +- if (p >= q) { +- goto ok_zero; +- } +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- if (*p == '_') { +- p++; +- for (; p < q; p++) { +- if (*p != '_') { +- if (options & +- WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) { +- goto decimal; +- } +- goto fail_bad_argument; +- } +- } +- goto ok_zero; +- } ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->restart_frame)(self, a_index, a_io_position); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- if ((*p == 'x') || (*p == 'X')) { +- p++; +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (; (p < q) && (*p == '_'); p++) { +- } +- } +- if (p < q) { +- goto hexadecimal; +- } ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +- } else if ((*p == 'd') || (*p == 'D')) { +- p++; +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (; (p < q) && (*p == '_'); p++) { +- } +- } +- if (p < q) { +- goto decimal; +- } +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__set_quirk( ++ wuffs_base__image_decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) { +- goto decimal; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; + } +- goto fail_bad_argument; ++ v++; + } + +-decimal: +- do { +- uint64_t v = wuffs_base__parse_number__decimal_digits[*p++]; +- if (v == 0) { +- goto fail_bad_argument; +- } +- v &= 0x0F; ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +- // UINT64_MAX is 18446744073709551615, which is ((10 * max10) + max1). +- const uint64_t max10 = 1844674407370955161u; +- const uint8_t max1 = 5; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_base__image_decoder__set_report_metadata( ++ wuffs_base__image_decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } + +- for (; p < q; p++) { +- if ((*p == '_') && +- (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- continue; +- } +- uint8_t digit = wuffs_base__parse_number__decimal_digits[*p]; +- if (digit == 0) { +- goto fail_bad_argument; +- } +- digit &= 0x0F; +- if ((v > max10) || ((v == max10) && (digit > max1))) { +- goto fail_out_of_bounds; +- } +- v = (10 * v) + ((uint64_t)(digit)); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_report_metadata)(self, a_fourcc, a_report); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- wuffs_base__result_u64 ret; +- ret.status.repr = NULL; +- ret.value = v; +- return ret; +- } while (0); ++ return wuffs_base__make_empty_struct(); ++} + +-hexadecimal: +- do { +- uint64_t v = wuffs_base__parse_number__hexadecimal_digits[*p++]; +- if (v == 0) { +- goto fail_bad_argument; +- } +- v &= 0x0F; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__tell_me_more( ++ wuffs_base__image_decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +- for (; p < q; p++) { +- if ((*p == '_') && +- (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- continue; +- } +- uint8_t digit = wuffs_base__parse_number__hexadecimal_digits[*p]; +- if (digit == 0) { +- goto fail_bad_argument; +- } +- digit &= 0x0F; +- if ((v >> 60) != 0) { +- goto fail_out_of_bounds; +- } +- v = (v << 4) | ((uint64_t)(digit)); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->tell_me_more)(self, a_dst, a_minfo, a_src); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- wuffs_base__result_u64 ret; +- ret.status.repr = NULL; +- ret.value = v; +- return ret; +- } while (0); ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +-ok_zero: +- do { +- wuffs_base__result_u64 ret; +- ret.status.repr = NULL; +- ret.value = 0; +- return ret; +- } while (0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_base__image_decoder__workbuf_len( ++ const wuffs_base__image_decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } + +-fail_bad_argument: +- do { +- wuffs_base__result_u64 ret; +- ret.status.repr = wuffs_base__error__bad_argument; +- ret.value = 0; +- return ret; +- } while (0); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->workbuf_len)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +-fail_out_of_bounds: +- do { +- wuffs_base__result_u64 ret; +- ret.status.repr = wuffs_base__error__out_of_bounds; +- ret.value = 0; +- return ret; +- } while (0); ++ return wuffs_base__utility__empty_range_ii_u64(); + } + + // -------- + +-// wuffs_base__render_number__first_hundred contains the decimal encodings of +-// the first one hundred numbers [0 ..= 99]. +-static const uint8_t wuffs_base__render_number__first_hundred[200] = { +- '0', '0', '0', '1', '0', '2', '0', '3', '0', '4', // +- '0', '5', '0', '6', '0', '7', '0', '8', '0', '9', // +- '1', '0', '1', '1', '1', '2', '1', '3', '1', '4', // +- '1', '5', '1', '6', '1', '7', '1', '8', '1', '9', // +- '2', '0', '2', '1', '2', '2', '2', '3', '2', '4', // +- '2', '5', '2', '6', '2', '7', '2', '8', '2', '9', // +- '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', // +- '3', '5', '3', '6', '3', '7', '3', '8', '3', '9', // +- '4', '0', '4', '1', '4', '2', '4', '3', '4', '4', // +- '4', '5', '4', '6', '4', '7', '4', '8', '4', '9', // +- '5', '0', '5', '1', '5', '2', '5', '3', '5', '4', // +- '5', '5', '5', '6', '5', '7', '5', '8', '5', '9', // +- '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', // +- '6', '5', '6', '6', '6', '7', '6', '8', '6', '9', // +- '7', '0', '7', '1', '7', '2', '7', '3', '7', '4', // +- '7', '5', '7', '6', '7', '7', '7', '8', '7', '9', // +- '8', '0', '8', '1', '8', '2', '8', '3', '8', '4', // +- '8', '5', '8', '6', '8', '7', '8', '8', '8', '9', // +- '9', '0', '9', '1', '9', '2', '9', '3', '9', '4', // +- '9', '5', '9', '6', '9', '7', '9', '8', '9', '9', // +-}; +- +-static size_t // +-wuffs_base__private_implementation__render_number_u64(wuffs_base__slice_u8 dst, +- uint64_t x, +- uint32_t options, +- bool neg) { +- uint8_t buf[WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL]; +- uint8_t* ptr = &buf[0] + sizeof(buf); +- +- while (x >= 100) { +- size_t index = ((size_t)((x % 100) * 2)); +- x /= 100; +- uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0]; +- uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1]; +- ptr -= 2; +- ptr[0] = s0; +- ptr[1] = s1; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_base__io_transformer__dst_history_retain_length( ++ const wuffs_base__io_transformer* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); + } +- +- if (x < 10) { +- ptr -= 1; +- ptr[0] = (uint8_t)('0' + x); +- } else { +- size_t index = ((size_t)(x * 2)); +- uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0]; +- uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1]; +- ptr -= 2; +- ptr[0] = s0; +- ptr[1] = s1; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); + } + +- if (neg) { +- ptr -= 1; +- ptr[0] = '-'; +- } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { +- ptr -= 1; +- ptr[0] = '+'; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { ++ const wuffs_base__io_transformer__func_ptrs* func_ptrs = ++ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->dst_history_retain_length)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- size_t n = sizeof(buf) - ((size_t)(ptr - &buf[0])); +- if (n > dst.len) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__io_transformer__get_quirk( ++ const wuffs_base__io_transformer* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } +- memcpy(dst.ptr + ((options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) +- ? (dst.len - n) +- : 0), +- ptr, n); +- return n; +-} + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__render_number_i64(wuffs_base__slice_u8 dst, +- int64_t x, +- uint32_t options) { +- uint64_t u = (uint64_t)x; +- bool neg = x < 0; +- if (neg) { +- u = 1 + ~u; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { ++ const wuffs_base__io_transformer__func_ptrs* func_ptrs = ++ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } +- return wuffs_base__private_implementation__render_number_u64(dst, u, options, +- neg); +-} + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__render_number_u64(wuffs_base__slice_u8 dst, +- uint64_t x, +- uint32_t options) { +- return wuffs_base__private_implementation__render_number_u64(dst, x, options, +- false); ++ return 0; + } + +-// ---------------- Base-16 ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__io_transformer__set_quirk( ++ wuffs_base__io_transformer* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_16__decode2(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- wuffs_base__transform__output o; +- size_t src_len2 = src.len / 2; +- size_t len; +- if (dst.len < src_len2) { +- len = dst.len; +- o.status.repr = wuffs_base__suspension__short_write; +- } else { +- len = src_len2; +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- } else if (src.len & 1) { +- o.status.repr = wuffs_base__error__bad_data; +- } else { +- o.status.repr = NULL; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { ++ const wuffs_base__io_transformer__func_ptrs* func_ptrs = ++ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; + } + +- uint8_t* d = dst.ptr; +- uint8_t* s = src.ptr; +- size_t n = len; ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +- while (n--) { +- *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[0]] << 4) | +- (wuffs_base__parse_number__hexadecimal_digits[s[1]] & 0x0F)); +- d += 1; +- s += 2; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__io_transformer__transform_io( ++ wuffs_base__io_transformer* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- o.num_dst = len; +- o.num_src = len * 2; +- return o; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { ++ const wuffs_base__io_transformer__func_ptrs* func_ptrs = ++ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->transform_io)(self, a_dst, a_src, a_workbuf); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); + } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_16__decode4(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- wuffs_base__transform__output o; +- size_t src_len4 = src.len / 4; +- size_t len = dst.len < src_len4 ? dst.len : src_len4; +- if (dst.len < src_len4) { +- len = dst.len; +- o.status.repr = wuffs_base__suspension__short_write; +- } else { +- len = src_len4; +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- } else if (src.len & 1) { +- o.status.repr = wuffs_base__error__bad_data; +- } else { +- o.status.repr = NULL; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_base__io_transformer__workbuf_len( ++ const wuffs_base__io_transformer* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } + +- uint8_t* d = dst.ptr; +- uint8_t* s = src.ptr; +- size_t n = len; +- +- while (n--) { +- *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[2]] << 4) | +- (wuffs_base__parse_number__hexadecimal_digits[s[3]] & 0x0F)); +- d += 1; +- s += 4; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { ++ const wuffs_base__io_transformer__func_ptrs* func_ptrs = ++ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->workbuf_len)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- o.num_dst = len; +- o.num_src = len * 4; +- return o; ++ return wuffs_base__utility__empty_range_ii_u64(); + } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- wuffs_base__transform__output o; +- size_t dst_len2 = dst.len / 2; +- size_t len; +- if (dst_len2 < src.len) { +- len = dst_len2; +- o.status.repr = wuffs_base__suspension__short_write; +- } else { +- len = src.len; +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- } else { +- o.status.repr = NULL; +- } +- } ++// -------- + +- uint8_t* d = dst.ptr; +- uint8_t* s = src.ptr; +- size_t n = len; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__token_decoder__decode_tokens( ++ wuffs_base__token_decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +- while (n--) { +- uint8_t c = *s; +- d[0] = wuffs_base__private_implementation__encode_base16[c >> 4]; +- d[1] = wuffs_base__private_implementation__encode_base16[c & 0x0F]; +- d += 2; +- s += 1; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { ++ const wuffs_base__token_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->decode_tokens)(self, a_dst, a_src, a_workbuf); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- o.num_dst = len * 2; +- o.num_src = len; +- return o; ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); + } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_16__encode4(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- wuffs_base__transform__output o; +- size_t dst_len4 = dst.len / 4; +- size_t len; +- if (dst_len4 < src.len) { +- len = dst_len4; +- o.status.repr = wuffs_base__suspension__short_write; +- } else { +- len = src.len; +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- } else { +- o.status.repr = NULL; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__token_decoder__get_quirk( ++ const wuffs_base__token_decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- uint8_t* d = dst.ptr; +- uint8_t* s = src.ptr; +- size_t n = len; +- +- while (n--) { +- uint8_t c = *s; +- d[0] = '\\'; +- d[1] = 'x'; +- d[2] = wuffs_base__private_implementation__encode_base16[c >> 4]; +- d[3] = wuffs_base__private_implementation__encode_base16[c & 0x0F]; +- d += 4; +- s += 1; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { ++ const wuffs_base__token_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- o.num_dst = len * 4; +- o.num_src = len; +- return o; ++ return 0; + } + +-// ---------------- Base-64 ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__token_decoder__set_quirk( ++ wuffs_base__token_decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-// The two base-64 alphabets, std and url, differ only in the last two codes. +-// - std: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +-// - url: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { ++ const wuffs_base__token_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +-static const uint8_t wuffs_base__base_64__decode_std[256] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x00 ..= 0x07. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x08 ..= 0x0F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x10 ..= 0x17. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x18 ..= 0x1F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x20 ..= 0x27. +- 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x80, 0x3F, // 0x28 ..= 0x2F. +- 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 0x30 ..= 0x37. +- 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x38 ..= 0x3F. ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +- 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 0x40 ..= 0x47. +- 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 0x48 ..= 0x4F. +- 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 0x50 ..= 0x57. +- 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x58 ..= 0x5F. +- 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 0x60 ..= 0x67. +- 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 0x68 ..= 0x6F. +- 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 0x70 ..= 0x77. +- 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x78 ..= 0x7F. ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_base__token_decoder__workbuf_len( ++ const wuffs_base__token_decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } + +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x80 ..= 0x87. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x88 ..= 0x8F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x90 ..= 0x97. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x98 ..= 0x9F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA0 ..= 0xA7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA8 ..= 0xAF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB0 ..= 0xB7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB8 ..= 0xBF. ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { ++ const wuffs_base__token_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->workbuf_len)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC0 ..= 0xC7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC8 ..= 0xCF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD0 ..= 0xD7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD8 ..= 0xDF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE0 ..= 0xE7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE8 ..= 0xEF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +-}; ++ return wuffs_base__utility__empty_range_ii_u64(); ++} + +-static const uint8_t wuffs_base__base_64__decode_url[256] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x00 ..= 0x07. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x08 ..= 0x0F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x10 ..= 0x17. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x18 ..= 0x1F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x20 ..= 0x27. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, // 0x28 ..= 0x2F. +- 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 0x30 ..= 0x37. +- 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x38 ..= 0x3F. ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES) + +- 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 0x40 ..= 0x47. +- 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 0x48 ..= 0x4F. +- 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 0x50 ..= 0x57. +- 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x3F, // 0x58 ..= 0x5F. +- 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 0x60 ..= 0x67. +- 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 0x68 ..= 0x6F. +- 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 0x70 ..= 0x77. +- 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x78 ..= 0x7F. ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV) + +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x80 ..= 0x87. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x88 ..= 0x8F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x90 ..= 0x97. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x98 ..= 0x9F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA0 ..= 0xA7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA8 ..= 0xAF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB0 ..= 0xB7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB8 ..= 0xBF. ++// ---------------- IEEE 754 Floating Point + +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC0 ..= 0xC7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC8 ..= 0xCF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD0 ..= 0xD7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD8 ..= 0xDF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE0 ..= 0xE7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE8 ..= 0xEF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F ++// The etc__hpd_left_shift and etc__powers_of_5 tables were printed by ++// script/print-hpd-left-shift.go. That script has an optional -comments flag, ++// whose output is not copied here, which prints further detail. ++// ++// These tables are used in ++// wuffs_private_impl__high_prec_dec__lshift_num_new_digits. ++ ++// wuffs_private_impl__hpd_left_shift[i] encodes the number of new digits ++// created after multiplying a positive integer by (1 << i): the additional ++// length in the decimal representation. For example, shifting "234" by 3 ++// (equivalent to multiplying by 8) will produce "1872". Going from a 3-length ++// string to a 4-length string means that 1 new digit was added (and existing ++// digits may have changed). ++// ++// Shifting by i can add either N or N-1 new digits, depending on whether the ++// original positive integer compares >= or < to the i'th power of 5 (as 10 ++// equals 2 * 5). Comparison is lexicographic, not numerical. ++// ++// For example, shifting by 4 (i.e. multiplying by 16) can add 1 or 2 new ++// digits, depending on a lexicographic comparison to (5 ** 4), i.e. "625": ++// - ("1" << 4) is "16", which adds 1 new digit. ++// - ("5678" << 4) is "90848", which adds 1 new digit. ++// - ("624" << 4) is "9984", which adds 1 new digit. ++// - ("62498" << 4) is "999968", which adds 1 new digit. ++// - ("625" << 4) is "10000", which adds 2 new digits. ++// - ("625001" << 4) is "10000016", which adds 2 new digits. ++// - ("7008" << 4) is "112128", which adds 2 new digits. ++// - ("99" << 4) is "1584", which adds 2 new digits. ++// ++// Thus, when i is 4, N is 2 and (5 ** i) is "625". This etc__hpd_left_shift ++// array encodes this as: ++// - etc__hpd_left_shift[4] is 0x1006 = (2 << 11) | 0x0006. ++// - etc__hpd_left_shift[5] is 0x1009 = (? << 11) | 0x0009. ++// where the ? isn't relevant for i == 4. ++// ++// The high 5 bits of etc__hpd_left_shift[i] is N, the higher of the two ++// possible number of new digits. The low 11 bits are an offset into the ++// etc__powers_of_5 array (of length 0x051C, so offsets fit in 11 bits). When i ++// is 4, its offset and the next one is 6 and 9, and etc__powers_of_5[6 .. 9] ++// is the string "\x06\x02\x05", so the relevant power of 5 is "625". ++// ++// Thanks to Ken Thompson for the original idea. ++static const uint16_t wuffs_private_impl__hpd_left_shift[65] = { ++ 0x0000, 0x0800, 0x0801, 0x0803, 0x1006, 0x1009, 0x100D, 0x1812, 0x1817, ++ 0x181D, 0x2024, 0x202B, 0x2033, 0x203C, 0x2846, 0x2850, 0x285B, 0x3067, ++ 0x3073, 0x3080, 0x388E, 0x389C, 0x38AB, 0x38BB, 0x40CC, 0x40DD, 0x40EF, ++ 0x4902, 0x4915, 0x4929, 0x513E, 0x5153, 0x5169, 0x5180, 0x5998, 0x59B0, ++ 0x59C9, 0x61E3, 0x61FD, 0x6218, 0x6A34, 0x6A50, 0x6A6D, 0x6A8B, 0x72AA, ++ 0x72C9, 0x72E9, 0x7B0A, 0x7B2B, 0x7B4D, 0x8370, 0x8393, 0x83B7, 0x83DC, ++ 0x8C02, 0x8C28, 0x8C4F, 0x9477, 0x949F, 0x94C8, 0x9CF2, 0x051C, 0x051C, ++ 0x051C, 0x051C, + }; + +-static const uint8_t wuffs_base__base_64__encode_std[64] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // 0x00 ..= 0x07. +- 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0x08 ..= 0x0F. +- 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0x10 ..= 0x17. +- 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 0x18 ..= 0x1F. +- 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, // 0x20 ..= 0x27. +- 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, // 0x28 ..= 0x2F. +- 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, // 0x30 ..= 0x37. +- 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F, // 0x38 ..= 0x3F. ++// wuffs_private_impl__powers_of_5 contains the powers of 5, concatenated ++// together: "5", "25", "125", "625", "3125", etc. ++static const uint8_t wuffs_private_impl__powers_of_5[0x051C] = { ++ 5, 2, 5, 1, 2, 5, 6, 2, 5, 3, 1, 2, 5, 1, 5, 6, 2, 5, 7, 8, 1, 2, 5, 3, 9, ++ 0, 6, 2, 5, 1, 9, 5, 3, 1, 2, 5, 9, 7, 6, 5, 6, 2, 5, 4, 8, 8, 2, 8, 1, 2, ++ 5, 2, 4, 4, 1, 4, 0, 6, 2, 5, 1, 2, 2, 0, 7, 0, 3, 1, 2, 5, 6, 1, 0, 3, 5, ++ 1, 5, 6, 2, 5, 3, 0, 5, 1, 7, 5, 7, 8, 1, 2, 5, 1, 5, 2, 5, 8, 7, 8, 9, 0, ++ 6, 2, 5, 7, 6, 2, 9, 3, 9, 4, 5, 3, 1, 2, 5, 3, 8, 1, 4, 6, 9, 7, 2, 6, 5, ++ 6, 2, 5, 1, 9, 0, 7, 3, 4, 8, 6, 3, 2, 8, 1, 2, 5, 9, 5, 3, 6, 7, 4, 3, 1, ++ 6, 4, 0, 6, 2, 5, 4, 7, 6, 8, 3, 7, 1, 5, 8, 2, 0, 3, 1, 2, 5, 2, 3, 8, 4, ++ 1, 8, 5, 7, 9, 1, 0, 1, 5, 6, 2, 5, 1, 1, 9, 2, 0, 9, 2, 8, 9, 5, 5, 0, 7, ++ 8, 1, 2, 5, 5, 9, 6, 0, 4, 6, 4, 4, 7, 7, 5, 3, 9, 0, 6, 2, 5, 2, 9, 8, 0, ++ 2, 3, 2, 2, 3, 8, 7, 6, 9, 5, 3, 1, 2, 5, 1, 4, 9, 0, 1, 1, 6, 1, 1, 9, 3, ++ 8, 4, 7, 6, 5, 6, 2, 5, 7, 4, 5, 0, 5, 8, 0, 5, 9, 6, 9, 2, 3, 8, 2, 8, 1, ++ 2, 5, 3, 7, 2, 5, 2, 9, 0, 2, 9, 8, 4, 6, 1, 9, 1, 4, 0, 6, 2, 5, 1, 8, 6, ++ 2, 6, 4, 5, 1, 4, 9, 2, 3, 0, 9, 5, 7, 0, 3, 1, 2, 5, 9, 3, 1, 3, 2, 2, 5, ++ 7, 4, 6, 1, 5, 4, 7, 8, 5, 1, 5, 6, 2, 5, 4, 6, 5, 6, 6, 1, 2, 8, 7, 3, 0, ++ 7, 7, 3, 9, 2, 5, 7, 8, 1, 2, 5, 2, 3, 2, 8, 3, 0, 6, 4, 3, 6, 5, 3, 8, 6, ++ 9, 6, 2, 8, 9, 0, 6, 2, 5, 1, 1, 6, 4, 1, 5, 3, 2, 1, 8, 2, 6, 9, 3, 4, 8, ++ 1, 4, 4, 5, 3, 1, 2, 5, 5, 8, 2, 0, 7, 6, 6, 0, 9, 1, 3, 4, 6, 7, 4, 0, 7, ++ 2, 2, 6, 5, 6, 2, 5, 2, 9, 1, 0, 3, 8, 3, 0, 4, 5, 6, 7, 3, 3, 7, 0, 3, 6, ++ 1, 3, 2, 8, 1, 2, 5, 1, 4, 5, 5, 1, 9, 1, 5, 2, 2, 8, 3, 6, 6, 8, 5, 1, 8, ++ 0, 6, 6, 4, 0, 6, 2, 5, 7, 2, 7, 5, 9, 5, 7, 6, 1, 4, 1, 8, 3, 4, 2, 5, 9, ++ 0, 3, 3, 2, 0, 3, 1, 2, 5, 3, 6, 3, 7, 9, 7, 8, 8, 0, 7, 0, 9, 1, 7, 1, 2, ++ 9, 5, 1, 6, 6, 0, 1, 5, 6, 2, 5, 1, 8, 1, 8, 9, 8, 9, 4, 0, 3, 5, 4, 5, 8, ++ 5, 6, 4, 7, 5, 8, 3, 0, 0, 7, 8, 1, 2, 5, 9, 0, 9, 4, 9, 4, 7, 0, 1, 7, 7, ++ 2, 9, 2, 8, 2, 3, 7, 9, 1, 5, 0, 3, 9, 0, 6, 2, 5, 4, 5, 4, 7, 4, 7, 3, 5, ++ 0, 8, 8, 6, 4, 6, 4, 1, 1, 8, 9, 5, 7, 5, 1, 9, 5, 3, 1, 2, 5, 2, 2, 7, 3, ++ 7, 3, 6, 7, 5, 4, 4, 3, 2, 3, 2, 0, 5, 9, 4, 7, 8, 7, 5, 9, 7, 6, 5, 6, 2, ++ 5, 1, 1, 3, 6, 8, 6, 8, 3, 7, 7, 2, 1, 6, 1, 6, 0, 2, 9, 7, 3, 9, 3, 7, 9, ++ 8, 8, 2, 8, 1, 2, 5, 5, 6, 8, 4, 3, 4, 1, 8, 8, 6, 0, 8, 0, 8, 0, 1, 4, 8, ++ 6, 9, 6, 8, 9, 9, 4, 1, 4, 0, 6, 2, 5, 2, 8, 4, 2, 1, 7, 0, 9, 4, 3, 0, 4, ++ 0, 4, 0, 0, 7, 4, 3, 4, 8, 4, 4, 9, 7, 0, 7, 0, 3, 1, 2, 5, 1, 4, 2, 1, 0, ++ 8, 5, 4, 7, 1, 5, 2, 0, 2, 0, 0, 3, 7, 1, 7, 4, 2, 2, 4, 8, 5, 3, 5, 1, 5, ++ 6, 2, 5, 7, 1, 0, 5, 4, 2, 7, 3, 5, 7, 6, 0, 1, 0, 0, 1, 8, 5, 8, 7, 1, 1, ++ 2, 4, 2, 6, 7, 5, 7, 8, 1, 2, 5, 3, 5, 5, 2, 7, 1, 3, 6, 7, 8, 8, 0, 0, 5, ++ 0, 0, 9, 2, 9, 3, 5, 5, 6, 2, 1, 3, 3, 7, 8, 9, 0, 6, 2, 5, 1, 7, 7, 6, 3, ++ 5, 6, 8, 3, 9, 4, 0, 0, 2, 5, 0, 4, 6, 4, 6, 7, 7, 8, 1, 0, 6, 6, 8, 9, 4, ++ 5, 3, 1, 2, 5, 8, 8, 8, 1, 7, 8, 4, 1, 9, 7, 0, 0, 1, 2, 5, 2, 3, 2, 3, 3, ++ 8, 9, 0, 5, 3, 3, 4, 4, 7, 2, 6, 5, 6, 2, 5, 4, 4, 4, 0, 8, 9, 2, 0, 9, 8, ++ 5, 0, 0, 6, 2, 6, 1, 6, 1, 6, 9, 4, 5, 2, 6, 6, 7, 2, 3, 6, 3, 2, 8, 1, 2, ++ 5, 2, 2, 2, 0, 4, 4, 6, 0, 4, 9, 2, 5, 0, 3, 1, 3, 0, 8, 0, 8, 4, 7, 2, 6, ++ 3, 3, 3, 6, 1, 8, 1, 6, 4, 0, 6, 2, 5, 1, 1, 1, 0, 2, 2, 3, 0, 2, 4, 6, 2, ++ 5, 1, 5, 6, 5, 4, 0, 4, 2, 3, 6, 3, 1, 6, 6, 8, 0, 9, 0, 8, 2, 0, 3, 1, 2, ++ 5, 5, 5, 5, 1, 1, 1, 5, 1, 2, 3, 1, 2, 5, 7, 8, 2, 7, 0, 2, 1, 1, 8, 1, 5, ++ 8, 3, 4, 0, 4, 5, 4, 1, 0, 1, 5, 6, 2, 5, 2, 7, 7, 5, 5, 5, 7, 5, 6, 1, 5, ++ 6, 2, 8, 9, 1, 3, 5, 1, 0, 5, 9, 0, 7, 9, 1, 7, 0, 2, 2, 7, 0, 5, 0, 7, 8, ++ 1, 2, 5, 1, 3, 8, 7, 7, 7, 8, 7, 8, 0, 7, 8, 1, 4, 4, 5, 6, 7, 5, 5, 2, 9, ++ 5, 3, 9, 5, 8, 5, 1, 1, 3, 5, 2, 5, 3, 9, 0, 6, 2, 5, 6, 9, 3, 8, 8, 9, 3, ++ 9, 0, 3, 9, 0, 7, 2, 2, 8, 3, 7, 7, 6, 4, 7, 6, 9, 7, 9, 2, 5, 5, 6, 7, 6, ++ 2, 6, 9, 5, 3, 1, 2, 5, 3, 4, 6, 9, 4, 4, 6, 9, 5, 1, 9, 5, 3, 6, 1, 4, 1, ++ 8, 8, 8, 2, 3, 8, 4, 8, 9, 6, 2, 7, 8, 3, 8, 1, 3, 4, 7, 6, 5, 6, 2, 5, 1, ++ 7, 3, 4, 7, 2, 3, 4, 7, 5, 9, 7, 6, 8, 0, 7, 0, 9, 4, 4, 1, 1, 9, 2, 4, 4, ++ 8, 1, 3, 9, 1, 9, 0, 6, 7, 3, 8, 2, 8, 1, 2, 5, 8, 6, 7, 3, 6, 1, 7, 3, 7, ++ 9, 8, 8, 4, 0, 3, 5, 4, 7, 2, 0, 5, 9, 6, 2, 2, 4, 0, 6, 9, 5, 9, 5, 3, 3, ++ 6, 9, 1, 4, 0, 6, 2, 5, + }; + +-static const uint8_t wuffs_base__base_64__encode_url[64] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // 0x00 ..= 0x07. +- 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0x08 ..= 0x0F. +- 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0x10 ..= 0x17. +- 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 0x18 ..= 0x1F. +- 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, // 0x20 ..= 0x27. +- 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, // 0x28 ..= 0x2F. +- 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, // 0x30 ..= 0x37. +- 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2D, 0x5F, // 0x38 ..= 0x3F. ++// -------- ++ ++// wuffs_private_impl__powers_of_10 contains truncated approximations to the ++// powers of 10, ranging from 1e-307 to 1e+288 inclusive, as 596 pairs of ++// uint64_t values (a 128-bit mantissa). ++// ++// There's also an implicit third column (implied by a linear formula involving ++// the base-10 exponent) that is the base-2 exponent, biased by a magic ++// constant. That constant (1214 or 0x04BE) equals 1023 + 191. 1023 is the bias ++// for IEEE 754 double-precision floating point. 191 is ((3 * 64) - 1) and ++// wuffs_private_impl__parse_number_f64_eisel_lemire works with ++// multiples-of-64-bit mantissas. ++// ++// For example, the third row holds the approximation to 1e-305: ++// 0xE0B62E29_29ABA83C_331ACDAB_FE94DE87 * (2 ** (0x0049 - 0x04BE)) ++// ++// Similarly, 1e+4 is approximated by: ++// 0x9C400000_00000000_00000000_00000000 * (2 ** (0x044C - 0x04BE)) ++// ++// Similarly, 1e+68 is approximated by: ++// 0xED63A231_D4C4FB27_4CA7AAA8_63EE4BDD * (2 ** (0x0520 - 0x04BE)) ++// ++// This table was generated by by script/print-mpb-powers-of-10.go ++static const uint64_t wuffs_private_impl__powers_of_10[596][2] = { ++ {0xA5D3B6D479F8E056, 0x8FD0C16206306BAB}, // 1e-307 ++ {0x8F48A4899877186C, 0xB3C4F1BA87BC8696}, // 1e-306 ++ {0x331ACDABFE94DE87, 0xE0B62E2929ABA83C}, // 1e-305 ++ {0x9FF0C08B7F1D0B14, 0x8C71DCD9BA0B4925}, // 1e-304 ++ {0x07ECF0AE5EE44DD9, 0xAF8E5410288E1B6F}, // 1e-303 ++ {0xC9E82CD9F69D6150, 0xDB71E91432B1A24A}, // 1e-302 ++ {0xBE311C083A225CD2, 0x892731AC9FAF056E}, // 1e-301 ++ {0x6DBD630A48AAF406, 0xAB70FE17C79AC6CA}, // 1e-300 ++ {0x092CBBCCDAD5B108, 0xD64D3D9DB981787D}, // 1e-299 ++ {0x25BBF56008C58EA5, 0x85F0468293F0EB4E}, // 1e-298 ++ {0xAF2AF2B80AF6F24E, 0xA76C582338ED2621}, // 1e-297 ++ {0x1AF5AF660DB4AEE1, 0xD1476E2C07286FAA}, // 1e-296 ++ {0x50D98D9FC890ED4D, 0x82CCA4DB847945CA}, // 1e-295 ++ {0xE50FF107BAB528A0, 0xA37FCE126597973C}, // 1e-294 ++ {0x1E53ED49A96272C8, 0xCC5FC196FEFD7D0C}, // 1e-293 ++ {0x25E8E89C13BB0F7A, 0xFF77B1FCBEBCDC4F}, // 1e-292 ++ {0x77B191618C54E9AC, 0x9FAACF3DF73609B1}, // 1e-291 ++ {0xD59DF5B9EF6A2417, 0xC795830D75038C1D}, // 1e-290 ++ {0x4B0573286B44AD1D, 0xF97AE3D0D2446F25}, // 1e-289 ++ {0x4EE367F9430AEC32, 0x9BECCE62836AC577}, // 1e-288 ++ {0x229C41F793CDA73F, 0xC2E801FB244576D5}, // 1e-287 ++ {0x6B43527578C1110F, 0xF3A20279ED56D48A}, // 1e-286 ++ {0x830A13896B78AAA9, 0x9845418C345644D6}, // 1e-285 ++ {0x23CC986BC656D553, 0xBE5691EF416BD60C}, // 1e-284 ++ {0x2CBFBE86B7EC8AA8, 0xEDEC366B11C6CB8F}, // 1e-283 ++ {0x7BF7D71432F3D6A9, 0x94B3A202EB1C3F39}, // 1e-282 ++ {0xDAF5CCD93FB0CC53, 0xB9E08A83A5E34F07}, // 1e-281 ++ {0xD1B3400F8F9CFF68, 0xE858AD248F5C22C9}, // 1e-280 ++ {0x23100809B9C21FA1, 0x91376C36D99995BE}, // 1e-279 ++ {0xABD40A0C2832A78A, 0xB58547448FFFFB2D}, // 1e-278 ++ {0x16C90C8F323F516C, 0xE2E69915B3FFF9F9}, // 1e-277 ++ {0xAE3DA7D97F6792E3, 0x8DD01FAD907FFC3B}, // 1e-276 ++ {0x99CD11CFDF41779C, 0xB1442798F49FFB4A}, // 1e-275 ++ {0x40405643D711D583, 0xDD95317F31C7FA1D}, // 1e-274 ++ {0x482835EA666B2572, 0x8A7D3EEF7F1CFC52}, // 1e-273 ++ {0xDA3243650005EECF, 0xAD1C8EAB5EE43B66}, // 1e-272 ++ {0x90BED43E40076A82, 0xD863B256369D4A40}, // 1e-271 ++ {0x5A7744A6E804A291, 0x873E4F75E2224E68}, // 1e-270 ++ {0x711515D0A205CB36, 0xA90DE3535AAAE202}, // 1e-269 ++ {0x0D5A5B44CA873E03, 0xD3515C2831559A83}, // 1e-268 ++ {0xE858790AFE9486C2, 0x8412D9991ED58091}, // 1e-267 ++ {0x626E974DBE39A872, 0xA5178FFF668AE0B6}, // 1e-266 ++ {0xFB0A3D212DC8128F, 0xCE5D73FF402D98E3}, // 1e-265 ++ {0x7CE66634BC9D0B99, 0x80FA687F881C7F8E}, // 1e-264 ++ {0x1C1FFFC1EBC44E80, 0xA139029F6A239F72}, // 1e-263 ++ {0xA327FFB266B56220, 0xC987434744AC874E}, // 1e-262 ++ {0x4BF1FF9F0062BAA8, 0xFBE9141915D7A922}, // 1e-261 ++ {0x6F773FC3603DB4A9, 0x9D71AC8FADA6C9B5}, // 1e-260 ++ {0xCB550FB4384D21D3, 0xC4CE17B399107C22}, // 1e-259 ++ {0x7E2A53A146606A48, 0xF6019DA07F549B2B}, // 1e-258 ++ {0x2EDA7444CBFC426D, 0x99C102844F94E0FB}, // 1e-257 ++ {0xFA911155FEFB5308, 0xC0314325637A1939}, // 1e-256 ++ {0x793555AB7EBA27CA, 0xF03D93EEBC589F88}, // 1e-255 ++ {0x4BC1558B2F3458DE, 0x96267C7535B763B5}, // 1e-254 ++ {0x9EB1AAEDFB016F16, 0xBBB01B9283253CA2}, // 1e-253 ++ {0x465E15A979C1CADC, 0xEA9C227723EE8BCB}, // 1e-252 ++ {0x0BFACD89EC191EC9, 0x92A1958A7675175F}, // 1e-251 ++ {0xCEF980EC671F667B, 0xB749FAED14125D36}, // 1e-250 ++ {0x82B7E12780E7401A, 0xE51C79A85916F484}, // 1e-249 ++ {0xD1B2ECB8B0908810, 0x8F31CC0937AE58D2}, // 1e-248 ++ {0x861FA7E6DCB4AA15, 0xB2FE3F0B8599EF07}, // 1e-247 ++ {0x67A791E093E1D49A, 0xDFBDCECE67006AC9}, // 1e-246 ++ {0xE0C8BB2C5C6D24E0, 0x8BD6A141006042BD}, // 1e-245 ++ {0x58FAE9F773886E18, 0xAECC49914078536D}, // 1e-244 ++ {0xAF39A475506A899E, 0xDA7F5BF590966848}, // 1e-243 ++ {0x6D8406C952429603, 0x888F99797A5E012D}, // 1e-242 ++ {0xC8E5087BA6D33B83, 0xAAB37FD7D8F58178}, // 1e-241 ++ {0xFB1E4A9A90880A64, 0xD5605FCDCF32E1D6}, // 1e-240 ++ {0x5CF2EEA09A55067F, 0x855C3BE0A17FCD26}, // 1e-239 ++ {0xF42FAA48C0EA481E, 0xA6B34AD8C9DFC06F}, // 1e-238 ++ {0xF13B94DAF124DA26, 0xD0601D8EFC57B08B}, // 1e-237 ++ {0x76C53D08D6B70858, 0x823C12795DB6CE57}, // 1e-236 ++ {0x54768C4B0C64CA6E, 0xA2CB1717B52481ED}, // 1e-235 ++ {0xA9942F5DCF7DFD09, 0xCB7DDCDDA26DA268}, // 1e-234 ++ {0xD3F93B35435D7C4C, 0xFE5D54150B090B02}, // 1e-233 ++ {0xC47BC5014A1A6DAF, 0x9EFA548D26E5A6E1}, // 1e-232 ++ {0x359AB6419CA1091B, 0xC6B8E9B0709F109A}, // 1e-231 ++ {0xC30163D203C94B62, 0xF867241C8CC6D4C0}, // 1e-230 ++ {0x79E0DE63425DCF1D, 0x9B407691D7FC44F8}, // 1e-229 ++ {0x985915FC12F542E4, 0xC21094364DFB5636}, // 1e-228 ++ {0x3E6F5B7B17B2939D, 0xF294B943E17A2BC4}, // 1e-227 ++ {0xA705992CEECF9C42, 0x979CF3CA6CEC5B5A}, // 1e-226 ++ {0x50C6FF782A838353, 0xBD8430BD08277231}, // 1e-225 ++ {0xA4F8BF5635246428, 0xECE53CEC4A314EBD}, // 1e-224 ++ {0x871B7795E136BE99, 0x940F4613AE5ED136}, // 1e-223 ++ {0x28E2557B59846E3F, 0xB913179899F68584}, // 1e-222 ++ {0x331AEADA2FE589CF, 0xE757DD7EC07426E5}, // 1e-221 ++ {0x3FF0D2C85DEF7621, 0x9096EA6F3848984F}, // 1e-220 ++ {0x0FED077A756B53A9, 0xB4BCA50B065ABE63}, // 1e-219 ++ {0xD3E8495912C62894, 0xE1EBCE4DC7F16DFB}, // 1e-218 ++ {0x64712DD7ABBBD95C, 0x8D3360F09CF6E4BD}, // 1e-217 ++ {0xBD8D794D96AACFB3, 0xB080392CC4349DEC}, // 1e-216 ++ {0xECF0D7A0FC5583A0, 0xDCA04777F541C567}, // 1e-215 ++ {0xF41686C49DB57244, 0x89E42CAAF9491B60}, // 1e-214 ++ {0x311C2875C522CED5, 0xAC5D37D5B79B6239}, // 1e-213 ++ {0x7D633293366B828B, 0xD77485CB25823AC7}, // 1e-212 ++ {0xAE5DFF9C02033197, 0x86A8D39EF77164BC}, // 1e-211 ++ {0xD9F57F830283FDFC, 0xA8530886B54DBDEB}, // 1e-210 ++ {0xD072DF63C324FD7B, 0xD267CAA862A12D66}, // 1e-209 ++ {0x4247CB9E59F71E6D, 0x8380DEA93DA4BC60}, // 1e-208 ++ {0x52D9BE85F074E608, 0xA46116538D0DEB78}, // 1e-207 ++ {0x67902E276C921F8B, 0xCD795BE870516656}, // 1e-206 ++ {0x00BA1CD8A3DB53B6, 0x806BD9714632DFF6}, // 1e-205 ++ {0x80E8A40ECCD228A4, 0xA086CFCD97BF97F3}, // 1e-204 ++ {0x6122CD128006B2CD, 0xC8A883C0FDAF7DF0}, // 1e-203 ++ {0x796B805720085F81, 0xFAD2A4B13D1B5D6C}, // 1e-202 ++ {0xCBE3303674053BB0, 0x9CC3A6EEC6311A63}, // 1e-201 ++ {0xBEDBFC4411068A9C, 0xC3F490AA77BD60FC}, // 1e-200 ++ {0xEE92FB5515482D44, 0xF4F1B4D515ACB93B}, // 1e-199 ++ {0x751BDD152D4D1C4A, 0x991711052D8BF3C5}, // 1e-198 ++ {0xD262D45A78A0635D, 0xBF5CD54678EEF0B6}, // 1e-197 ++ {0x86FB897116C87C34, 0xEF340A98172AACE4}, // 1e-196 ++ {0xD45D35E6AE3D4DA0, 0x9580869F0E7AAC0E}, // 1e-195 ++ {0x8974836059CCA109, 0xBAE0A846D2195712}, // 1e-194 ++ {0x2BD1A438703FC94B, 0xE998D258869FACD7}, // 1e-193 ++ {0x7B6306A34627DDCF, 0x91FF83775423CC06}, // 1e-192 ++ {0x1A3BC84C17B1D542, 0xB67F6455292CBF08}, // 1e-191 ++ {0x20CABA5F1D9E4A93, 0xE41F3D6A7377EECA}, // 1e-190 ++ {0x547EB47B7282EE9C, 0x8E938662882AF53E}, // 1e-189 ++ {0xE99E619A4F23AA43, 0xB23867FB2A35B28D}, // 1e-188 ++ {0x6405FA00E2EC94D4, 0xDEC681F9F4C31F31}, // 1e-187 ++ {0xDE83BC408DD3DD04, 0x8B3C113C38F9F37E}, // 1e-186 ++ {0x9624AB50B148D445, 0xAE0B158B4738705E}, // 1e-185 ++ {0x3BADD624DD9B0957, 0xD98DDAEE19068C76}, // 1e-184 ++ {0xE54CA5D70A80E5D6, 0x87F8A8D4CFA417C9}, // 1e-183 ++ {0x5E9FCF4CCD211F4C, 0xA9F6D30A038D1DBC}, // 1e-182 ++ {0x7647C3200069671F, 0xD47487CC8470652B}, // 1e-181 ++ {0x29ECD9F40041E073, 0x84C8D4DFD2C63F3B}, // 1e-180 ++ {0xF468107100525890, 0xA5FB0A17C777CF09}, // 1e-179 ++ {0x7182148D4066EEB4, 0xCF79CC9DB955C2CC}, // 1e-178 ++ {0xC6F14CD848405530, 0x81AC1FE293D599BF}, // 1e-177 ++ {0xB8ADA00E5A506A7C, 0xA21727DB38CB002F}, // 1e-176 ++ {0xA6D90811F0E4851C, 0xCA9CF1D206FDC03B}, // 1e-175 ++ {0x908F4A166D1DA663, 0xFD442E4688BD304A}, // 1e-174 ++ {0x9A598E4E043287FE, 0x9E4A9CEC15763E2E}, // 1e-173 ++ {0x40EFF1E1853F29FD, 0xC5DD44271AD3CDBA}, // 1e-172 ++ {0xD12BEE59E68EF47C, 0xF7549530E188C128}, // 1e-171 ++ {0x82BB74F8301958CE, 0x9A94DD3E8CF578B9}, // 1e-170 ++ {0xE36A52363C1FAF01, 0xC13A148E3032D6E7}, // 1e-169 ++ {0xDC44E6C3CB279AC1, 0xF18899B1BC3F8CA1}, // 1e-168 ++ {0x29AB103A5EF8C0B9, 0x96F5600F15A7B7E5}, // 1e-167 ++ {0x7415D448F6B6F0E7, 0xBCB2B812DB11A5DE}, // 1e-166 ++ {0x111B495B3464AD21, 0xEBDF661791D60F56}, // 1e-165 ++ {0xCAB10DD900BEEC34, 0x936B9FCEBB25C995}, // 1e-164 ++ {0x3D5D514F40EEA742, 0xB84687C269EF3BFB}, // 1e-163 ++ {0x0CB4A5A3112A5112, 0xE65829B3046B0AFA}, // 1e-162 ++ {0x47F0E785EABA72AB, 0x8FF71A0FE2C2E6DC}, // 1e-161 ++ {0x59ED216765690F56, 0xB3F4E093DB73A093}, // 1e-160 ++ {0x306869C13EC3532C, 0xE0F218B8D25088B8}, // 1e-159 ++ {0x1E414218C73A13FB, 0x8C974F7383725573}, // 1e-158 ++ {0xE5D1929EF90898FA, 0xAFBD2350644EEACF}, // 1e-157 ++ {0xDF45F746B74ABF39, 0xDBAC6C247D62A583}, // 1e-156 ++ {0x6B8BBA8C328EB783, 0x894BC396CE5DA772}, // 1e-155 ++ {0x066EA92F3F326564, 0xAB9EB47C81F5114F}, // 1e-154 ++ {0xC80A537B0EFEFEBD, 0xD686619BA27255A2}, // 1e-153 ++ {0xBD06742CE95F5F36, 0x8613FD0145877585}, // 1e-152 ++ {0x2C48113823B73704, 0xA798FC4196E952E7}, // 1e-151 ++ {0xF75A15862CA504C5, 0xD17F3B51FCA3A7A0}, // 1e-150 ++ {0x9A984D73DBE722FB, 0x82EF85133DE648C4}, // 1e-149 ++ {0xC13E60D0D2E0EBBA, 0xA3AB66580D5FDAF5}, // 1e-148 ++ {0x318DF905079926A8, 0xCC963FEE10B7D1B3}, // 1e-147 ++ {0xFDF17746497F7052, 0xFFBBCFE994E5C61F}, // 1e-146 ++ {0xFEB6EA8BEDEFA633, 0x9FD561F1FD0F9BD3}, // 1e-145 ++ {0xFE64A52EE96B8FC0, 0xC7CABA6E7C5382C8}, // 1e-144 ++ {0x3DFDCE7AA3C673B0, 0xF9BD690A1B68637B}, // 1e-143 ++ {0x06BEA10CA65C084E, 0x9C1661A651213E2D}, // 1e-142 ++ {0x486E494FCFF30A62, 0xC31BFA0FE5698DB8}, // 1e-141 ++ {0x5A89DBA3C3EFCCFA, 0xF3E2F893DEC3F126}, // 1e-140 ++ {0xF89629465A75E01C, 0x986DDB5C6B3A76B7}, // 1e-139 ++ {0xF6BBB397F1135823, 0xBE89523386091465}, // 1e-138 ++ {0x746AA07DED582E2C, 0xEE2BA6C0678B597F}, // 1e-137 ++ {0xA8C2A44EB4571CDC, 0x94DB483840B717EF}, // 1e-136 ++ {0x92F34D62616CE413, 0xBA121A4650E4DDEB}, // 1e-135 ++ {0x77B020BAF9C81D17, 0xE896A0D7E51E1566}, // 1e-134 ++ {0x0ACE1474DC1D122E, 0x915E2486EF32CD60}, // 1e-133 ++ {0x0D819992132456BA, 0xB5B5ADA8AAFF80B8}, // 1e-132 ++ {0x10E1FFF697ED6C69, 0xE3231912D5BF60E6}, // 1e-131 ++ {0xCA8D3FFA1EF463C1, 0x8DF5EFABC5979C8F}, // 1e-130 ++ {0xBD308FF8A6B17CB2, 0xB1736B96B6FD83B3}, // 1e-129 ++ {0xAC7CB3F6D05DDBDE, 0xDDD0467C64BCE4A0}, // 1e-128 ++ {0x6BCDF07A423AA96B, 0x8AA22C0DBEF60EE4}, // 1e-127 ++ {0x86C16C98D2C953C6, 0xAD4AB7112EB3929D}, // 1e-126 ++ {0xE871C7BF077BA8B7, 0xD89D64D57A607744}, // 1e-125 ++ {0x11471CD764AD4972, 0x87625F056C7C4A8B}, // 1e-124 ++ {0xD598E40D3DD89BCF, 0xA93AF6C6C79B5D2D}, // 1e-123 ++ {0x4AFF1D108D4EC2C3, 0xD389B47879823479}, // 1e-122 ++ {0xCEDF722A585139BA, 0x843610CB4BF160CB}, // 1e-121 ++ {0xC2974EB4EE658828, 0xA54394FE1EEDB8FE}, // 1e-120 ++ {0x733D226229FEEA32, 0xCE947A3DA6A9273E}, // 1e-119 ++ {0x0806357D5A3F525F, 0x811CCC668829B887}, // 1e-118 ++ {0xCA07C2DCB0CF26F7, 0xA163FF802A3426A8}, // 1e-117 ++ {0xFC89B393DD02F0B5, 0xC9BCFF6034C13052}, // 1e-116 ++ {0xBBAC2078D443ACE2, 0xFC2C3F3841F17C67}, // 1e-115 ++ {0xD54B944B84AA4C0D, 0x9D9BA7832936EDC0}, // 1e-114 ++ {0x0A9E795E65D4DF11, 0xC5029163F384A931}, // 1e-113 ++ {0x4D4617B5FF4A16D5, 0xF64335BCF065D37D}, // 1e-112 ++ {0x504BCED1BF8E4E45, 0x99EA0196163FA42E}, // 1e-111 ++ {0xE45EC2862F71E1D6, 0xC06481FB9BCF8D39}, // 1e-110 ++ {0x5D767327BB4E5A4C, 0xF07DA27A82C37088}, // 1e-109 ++ {0x3A6A07F8D510F86F, 0x964E858C91BA2655}, // 1e-108 ++ {0x890489F70A55368B, 0xBBE226EFB628AFEA}, // 1e-107 ++ {0x2B45AC74CCEA842E, 0xEADAB0ABA3B2DBE5}, // 1e-106 ++ {0x3B0B8BC90012929D, 0x92C8AE6B464FC96F}, // 1e-105 ++ {0x09CE6EBB40173744, 0xB77ADA0617E3BBCB}, // 1e-104 ++ {0xCC420A6A101D0515, 0xE55990879DDCAABD}, // 1e-103 ++ {0x9FA946824A12232D, 0x8F57FA54C2A9EAB6}, // 1e-102 ++ {0x47939822DC96ABF9, 0xB32DF8E9F3546564}, // 1e-101 ++ {0x59787E2B93BC56F7, 0xDFF9772470297EBD}, // 1e-100 ++ {0x57EB4EDB3C55B65A, 0x8BFBEA76C619EF36}, // 1e-99 ++ {0xEDE622920B6B23F1, 0xAEFAE51477A06B03}, // 1e-98 ++ {0xE95FAB368E45ECED, 0xDAB99E59958885C4}, // 1e-97 ++ {0x11DBCB0218EBB414, 0x88B402F7FD75539B}, // 1e-96 ++ {0xD652BDC29F26A119, 0xAAE103B5FCD2A881}, // 1e-95 ++ {0x4BE76D3346F0495F, 0xD59944A37C0752A2}, // 1e-94 ++ {0x6F70A4400C562DDB, 0x857FCAE62D8493A5}, // 1e-93 ++ {0xCB4CCD500F6BB952, 0xA6DFBD9FB8E5B88E}, // 1e-92 ++ {0x7E2000A41346A7A7, 0xD097AD07A71F26B2}, // 1e-91 ++ {0x8ED400668C0C28C8, 0x825ECC24C873782F}, // 1e-90 ++ {0x728900802F0F32FA, 0xA2F67F2DFA90563B}, // 1e-89 ++ {0x4F2B40A03AD2FFB9, 0xCBB41EF979346BCA}, // 1e-88 ++ {0xE2F610C84987BFA8, 0xFEA126B7D78186BC}, // 1e-87 ++ {0x0DD9CA7D2DF4D7C9, 0x9F24B832E6B0F436}, // 1e-86 ++ {0x91503D1C79720DBB, 0xC6EDE63FA05D3143}, // 1e-85 ++ {0x75A44C6397CE912A, 0xF8A95FCF88747D94}, // 1e-84 ++ {0xC986AFBE3EE11ABA, 0x9B69DBE1B548CE7C}, // 1e-83 ++ {0xFBE85BADCE996168, 0xC24452DA229B021B}, // 1e-82 ++ {0xFAE27299423FB9C3, 0xF2D56790AB41C2A2}, // 1e-81 ++ {0xDCCD879FC967D41A, 0x97C560BA6B0919A5}, // 1e-80 ++ {0x5400E987BBC1C920, 0xBDB6B8E905CB600F}, // 1e-79 ++ {0x290123E9AAB23B68, 0xED246723473E3813}, // 1e-78 ++ {0xF9A0B6720AAF6521, 0x9436C0760C86E30B}, // 1e-77 ++ {0xF808E40E8D5B3E69, 0xB94470938FA89BCE}, // 1e-76 ++ {0xB60B1D1230B20E04, 0xE7958CB87392C2C2}, // 1e-75 ++ {0xB1C6F22B5E6F48C2, 0x90BD77F3483BB9B9}, // 1e-74 ++ {0x1E38AEB6360B1AF3, 0xB4ECD5F01A4AA828}, // 1e-73 ++ {0x25C6DA63C38DE1B0, 0xE2280B6C20DD5232}, // 1e-72 ++ {0x579C487E5A38AD0E, 0x8D590723948A535F}, // 1e-71 ++ {0x2D835A9DF0C6D851, 0xB0AF48EC79ACE837}, // 1e-70 ++ {0xF8E431456CF88E65, 0xDCDB1B2798182244}, // 1e-69 ++ {0x1B8E9ECB641B58FF, 0x8A08F0F8BF0F156B}, // 1e-68 ++ {0xE272467E3D222F3F, 0xAC8B2D36EED2DAC5}, // 1e-67 ++ {0x5B0ED81DCC6ABB0F, 0xD7ADF884AA879177}, // 1e-66 ++ {0x98E947129FC2B4E9, 0x86CCBB52EA94BAEA}, // 1e-65 ++ {0x3F2398D747B36224, 0xA87FEA27A539E9A5}, // 1e-64 ++ {0x8EEC7F0D19A03AAD, 0xD29FE4B18E88640E}, // 1e-63 ++ {0x1953CF68300424AC, 0x83A3EEEEF9153E89}, // 1e-62 ++ {0x5FA8C3423C052DD7, 0xA48CEAAAB75A8E2B}, // 1e-61 ++ {0x3792F412CB06794D, 0xCDB02555653131B6}, // 1e-60 ++ {0xE2BBD88BBEE40BD0, 0x808E17555F3EBF11}, // 1e-59 ++ {0x5B6ACEAEAE9D0EC4, 0xA0B19D2AB70E6ED6}, // 1e-58 ++ {0xF245825A5A445275, 0xC8DE047564D20A8B}, // 1e-57 ++ {0xEED6E2F0F0D56712, 0xFB158592BE068D2E}, // 1e-56 ++ {0x55464DD69685606B, 0x9CED737BB6C4183D}, // 1e-55 ++ {0xAA97E14C3C26B886, 0xC428D05AA4751E4C}, // 1e-54 ++ {0xD53DD99F4B3066A8, 0xF53304714D9265DF}, // 1e-53 ++ {0xE546A8038EFE4029, 0x993FE2C6D07B7FAB}, // 1e-52 ++ {0xDE98520472BDD033, 0xBF8FDB78849A5F96}, // 1e-51 ++ {0x963E66858F6D4440, 0xEF73D256A5C0F77C}, // 1e-50 ++ {0xDDE7001379A44AA8, 0x95A8637627989AAD}, // 1e-49 ++ {0x5560C018580D5D52, 0xBB127C53B17EC159}, // 1e-48 ++ {0xAAB8F01E6E10B4A6, 0xE9D71B689DDE71AF}, // 1e-47 ++ {0xCAB3961304CA70E8, 0x9226712162AB070D}, // 1e-46 ++ {0x3D607B97C5FD0D22, 0xB6B00D69BB55C8D1}, // 1e-45 ++ {0x8CB89A7DB77C506A, 0xE45C10C42A2B3B05}, // 1e-44 ++ {0x77F3608E92ADB242, 0x8EB98A7A9A5B04E3}, // 1e-43 ++ {0x55F038B237591ED3, 0xB267ED1940F1C61C}, // 1e-42 ++ {0x6B6C46DEC52F6688, 0xDF01E85F912E37A3}, // 1e-41 ++ {0x2323AC4B3B3DA015, 0x8B61313BBABCE2C6}, // 1e-40 ++ {0xABEC975E0A0D081A, 0xAE397D8AA96C1B77}, // 1e-39 ++ {0x96E7BD358C904A21, 0xD9C7DCED53C72255}, // 1e-38 ++ {0x7E50D64177DA2E54, 0x881CEA14545C7575}, // 1e-37 ++ {0xDDE50BD1D5D0B9E9, 0xAA242499697392D2}, // 1e-36 ++ {0x955E4EC64B44E864, 0xD4AD2DBFC3D07787}, // 1e-35 ++ {0xBD5AF13BEF0B113E, 0x84EC3C97DA624AB4}, // 1e-34 ++ {0xECB1AD8AEACDD58E, 0xA6274BBDD0FADD61}, // 1e-33 ++ {0x67DE18EDA5814AF2, 0xCFB11EAD453994BA}, // 1e-32 ++ {0x80EACF948770CED7, 0x81CEB32C4B43FCF4}, // 1e-31 ++ {0xA1258379A94D028D, 0xA2425FF75E14FC31}, // 1e-30 ++ {0x096EE45813A04330, 0xCAD2F7F5359A3B3E}, // 1e-29 ++ {0x8BCA9D6E188853FC, 0xFD87B5F28300CA0D}, // 1e-28 ++ {0x775EA264CF55347D, 0x9E74D1B791E07E48}, // 1e-27 ++ {0x95364AFE032A819D, 0xC612062576589DDA}, // 1e-26 ++ {0x3A83DDBD83F52204, 0xF79687AED3EEC551}, // 1e-25 ++ {0xC4926A9672793542, 0x9ABE14CD44753B52}, // 1e-24 ++ {0x75B7053C0F178293, 0xC16D9A0095928A27}, // 1e-23 ++ {0x5324C68B12DD6338, 0xF1C90080BAF72CB1}, // 1e-22 ++ {0xD3F6FC16EBCA5E03, 0x971DA05074DA7BEE}, // 1e-21 ++ {0x88F4BB1CA6BCF584, 0xBCE5086492111AEA}, // 1e-20 ++ {0x2B31E9E3D06C32E5, 0xEC1E4A7DB69561A5}, // 1e-19 ++ {0x3AFF322E62439FCF, 0x9392EE8E921D5D07}, // 1e-18 ++ {0x09BEFEB9FAD487C2, 0xB877AA3236A4B449}, // 1e-17 ++ {0x4C2EBE687989A9B3, 0xE69594BEC44DE15B}, // 1e-16 ++ {0x0F9D37014BF60A10, 0x901D7CF73AB0ACD9}, // 1e-15 ++ {0x538484C19EF38C94, 0xB424DC35095CD80F}, // 1e-14 ++ {0x2865A5F206B06FB9, 0xE12E13424BB40E13}, // 1e-13 ++ {0xF93F87B7442E45D3, 0x8CBCCC096F5088CB}, // 1e-12 ++ {0xF78F69A51539D748, 0xAFEBFF0BCB24AAFE}, // 1e-11 ++ {0xB573440E5A884D1B, 0xDBE6FECEBDEDD5BE}, // 1e-10 ++ {0x31680A88F8953030, 0x89705F4136B4A597}, // 1e-9 ++ {0xFDC20D2B36BA7C3D, 0xABCC77118461CEFC}, // 1e-8 ++ {0x3D32907604691B4C, 0xD6BF94D5E57A42BC}, // 1e-7 ++ {0xA63F9A49C2C1B10F, 0x8637BD05AF6C69B5}, // 1e-6 ++ {0x0FCF80DC33721D53, 0xA7C5AC471B478423}, // 1e-5 ++ {0xD3C36113404EA4A8, 0xD1B71758E219652B}, // 1e-4 ++ {0x645A1CAC083126E9, 0x83126E978D4FDF3B}, // 1e-3 ++ {0x3D70A3D70A3D70A3, 0xA3D70A3D70A3D70A}, // 1e-2 ++ {0xCCCCCCCCCCCCCCCC, 0xCCCCCCCCCCCCCCCC}, // 1e-1 ++ {0x0000000000000000, 0x8000000000000000}, // 1e0 ++ {0x0000000000000000, 0xA000000000000000}, // 1e1 ++ {0x0000000000000000, 0xC800000000000000}, // 1e2 ++ {0x0000000000000000, 0xFA00000000000000}, // 1e3 ++ {0x0000000000000000, 0x9C40000000000000}, // 1e4 ++ {0x0000000000000000, 0xC350000000000000}, // 1e5 ++ {0x0000000000000000, 0xF424000000000000}, // 1e6 ++ {0x0000000000000000, 0x9896800000000000}, // 1e7 ++ {0x0000000000000000, 0xBEBC200000000000}, // 1e8 ++ {0x0000000000000000, 0xEE6B280000000000}, // 1e9 ++ {0x0000000000000000, 0x9502F90000000000}, // 1e10 ++ {0x0000000000000000, 0xBA43B74000000000}, // 1e11 ++ {0x0000000000000000, 0xE8D4A51000000000}, // 1e12 ++ {0x0000000000000000, 0x9184E72A00000000}, // 1e13 ++ {0x0000000000000000, 0xB5E620F480000000}, // 1e14 ++ {0x0000000000000000, 0xE35FA931A0000000}, // 1e15 ++ {0x0000000000000000, 0x8E1BC9BF04000000}, // 1e16 ++ {0x0000000000000000, 0xB1A2BC2EC5000000}, // 1e17 ++ {0x0000000000000000, 0xDE0B6B3A76400000}, // 1e18 ++ {0x0000000000000000, 0x8AC7230489E80000}, // 1e19 ++ {0x0000000000000000, 0xAD78EBC5AC620000}, // 1e20 ++ {0x0000000000000000, 0xD8D726B7177A8000}, // 1e21 ++ {0x0000000000000000, 0x878678326EAC9000}, // 1e22 ++ {0x0000000000000000, 0xA968163F0A57B400}, // 1e23 ++ {0x0000000000000000, 0xD3C21BCECCEDA100}, // 1e24 ++ {0x0000000000000000, 0x84595161401484A0}, // 1e25 ++ {0x0000000000000000, 0xA56FA5B99019A5C8}, // 1e26 ++ {0x0000000000000000, 0xCECB8F27F4200F3A}, // 1e27 ++ {0x4000000000000000, 0x813F3978F8940984}, // 1e28 ++ {0x5000000000000000, 0xA18F07D736B90BE5}, // 1e29 ++ {0xA400000000000000, 0xC9F2C9CD04674EDE}, // 1e30 ++ {0x4D00000000000000, 0xFC6F7C4045812296}, // 1e31 ++ {0xF020000000000000, 0x9DC5ADA82B70B59D}, // 1e32 ++ {0x6C28000000000000, 0xC5371912364CE305}, // 1e33 ++ {0xC732000000000000, 0xF684DF56C3E01BC6}, // 1e34 ++ {0x3C7F400000000000, 0x9A130B963A6C115C}, // 1e35 ++ {0x4B9F100000000000, 0xC097CE7BC90715B3}, // 1e36 ++ {0x1E86D40000000000, 0xF0BDC21ABB48DB20}, // 1e37 ++ {0x1314448000000000, 0x96769950B50D88F4}, // 1e38 ++ {0x17D955A000000000, 0xBC143FA4E250EB31}, // 1e39 ++ {0x5DCFAB0800000000, 0xEB194F8E1AE525FD}, // 1e40 ++ {0x5AA1CAE500000000, 0x92EFD1B8D0CF37BE}, // 1e41 ++ {0xF14A3D9E40000000, 0xB7ABC627050305AD}, // 1e42 ++ {0x6D9CCD05D0000000, 0xE596B7B0C643C719}, // 1e43 ++ {0xE4820023A2000000, 0x8F7E32CE7BEA5C6F}, // 1e44 ++ {0xDDA2802C8A800000, 0xB35DBF821AE4F38B}, // 1e45 ++ {0xD50B2037AD200000, 0xE0352F62A19E306E}, // 1e46 ++ {0x4526F422CC340000, 0x8C213D9DA502DE45}, // 1e47 ++ {0x9670B12B7F410000, 0xAF298D050E4395D6}, // 1e48 ++ {0x3C0CDD765F114000, 0xDAF3F04651D47B4C}, // 1e49 ++ {0xA5880A69FB6AC800, 0x88D8762BF324CD0F}, // 1e50 ++ {0x8EEA0D047A457A00, 0xAB0E93B6EFEE0053}, // 1e51 ++ {0x72A4904598D6D880, 0xD5D238A4ABE98068}, // 1e52 ++ {0x47A6DA2B7F864750, 0x85A36366EB71F041}, // 1e53 ++ {0x999090B65F67D924, 0xA70C3C40A64E6C51}, // 1e54 ++ {0xFFF4B4E3F741CF6D, 0xD0CF4B50CFE20765}, // 1e55 ++ {0xBFF8F10E7A8921A4, 0x82818F1281ED449F}, // 1e56 ++ {0xAFF72D52192B6A0D, 0xA321F2D7226895C7}, // 1e57 ++ {0x9BF4F8A69F764490, 0xCBEA6F8CEB02BB39}, // 1e58 ++ {0x02F236D04753D5B4, 0xFEE50B7025C36A08}, // 1e59 ++ {0x01D762422C946590, 0x9F4F2726179A2245}, // 1e60 ++ {0x424D3AD2B7B97EF5, 0xC722F0EF9D80AAD6}, // 1e61 ++ {0xD2E0898765A7DEB2, 0xF8EBAD2B84E0D58B}, // 1e62 ++ {0x63CC55F49F88EB2F, 0x9B934C3B330C8577}, // 1e63 ++ {0x3CBF6B71C76B25FB, 0xC2781F49FFCFA6D5}, // 1e64 ++ {0x8BEF464E3945EF7A, 0xF316271C7FC3908A}, // 1e65 ++ {0x97758BF0E3CBB5AC, 0x97EDD871CFDA3A56}, // 1e66 ++ {0x3D52EEED1CBEA317, 0xBDE94E8E43D0C8EC}, // 1e67 ++ {0x4CA7AAA863EE4BDD, 0xED63A231D4C4FB27}, // 1e68 ++ {0x8FE8CAA93E74EF6A, 0x945E455F24FB1CF8}, // 1e69 ++ {0xB3E2FD538E122B44, 0xB975D6B6EE39E436}, // 1e70 ++ {0x60DBBCA87196B616, 0xE7D34C64A9C85D44}, // 1e71 ++ {0xBC8955E946FE31CD, 0x90E40FBEEA1D3A4A}, // 1e72 ++ {0x6BABAB6398BDBE41, 0xB51D13AEA4A488DD}, // 1e73 ++ {0xC696963C7EED2DD1, 0xE264589A4DCDAB14}, // 1e74 ++ {0xFC1E1DE5CF543CA2, 0x8D7EB76070A08AEC}, // 1e75 ++ {0x3B25A55F43294BCB, 0xB0DE65388CC8ADA8}, // 1e76 ++ {0x49EF0EB713F39EBE, 0xDD15FE86AFFAD912}, // 1e77 ++ {0x6E3569326C784337, 0x8A2DBF142DFCC7AB}, // 1e78 ++ {0x49C2C37F07965404, 0xACB92ED9397BF996}, // 1e79 ++ {0xDC33745EC97BE906, 0xD7E77A8F87DAF7FB}, // 1e80 ++ {0x69A028BB3DED71A3, 0x86F0AC99B4E8DAFD}, // 1e81 ++ {0xC40832EA0D68CE0C, 0xA8ACD7C0222311BC}, // 1e82 ++ {0xF50A3FA490C30190, 0xD2D80DB02AABD62B}, // 1e83 ++ {0x792667C6DA79E0FA, 0x83C7088E1AAB65DB}, // 1e84 ++ {0x577001B891185938, 0xA4B8CAB1A1563F52}, // 1e85 ++ {0xED4C0226B55E6F86, 0xCDE6FD5E09ABCF26}, // 1e86 ++ {0x544F8158315B05B4, 0x80B05E5AC60B6178}, // 1e87 ++ {0x696361AE3DB1C721, 0xA0DC75F1778E39D6}, // 1e88 ++ {0x03BC3A19CD1E38E9, 0xC913936DD571C84C}, // 1e89 ++ {0x04AB48A04065C723, 0xFB5878494ACE3A5F}, // 1e90 ++ {0x62EB0D64283F9C76, 0x9D174B2DCEC0E47B}, // 1e91 ++ {0x3BA5D0BD324F8394, 0xC45D1DF942711D9A}, // 1e92 ++ {0xCA8F44EC7EE36479, 0xF5746577930D6500}, // 1e93 ++ {0x7E998B13CF4E1ECB, 0x9968BF6ABBE85F20}, // 1e94 ++ {0x9E3FEDD8C321A67E, 0xBFC2EF456AE276E8}, // 1e95 ++ {0xC5CFE94EF3EA101E, 0xEFB3AB16C59B14A2}, // 1e96 ++ {0xBBA1F1D158724A12, 0x95D04AEE3B80ECE5}, // 1e97 ++ {0x2A8A6E45AE8EDC97, 0xBB445DA9CA61281F}, // 1e98 ++ {0xF52D09D71A3293BD, 0xEA1575143CF97226}, // 1e99 ++ {0x593C2626705F9C56, 0x924D692CA61BE758}, // 1e100 ++ {0x6F8B2FB00C77836C, 0xB6E0C377CFA2E12E}, // 1e101 ++ {0x0B6DFB9C0F956447, 0xE498F455C38B997A}, // 1e102 ++ {0x4724BD4189BD5EAC, 0x8EDF98B59A373FEC}, // 1e103 ++ {0x58EDEC91EC2CB657, 0xB2977EE300C50FE7}, // 1e104 ++ {0x2F2967B66737E3ED, 0xDF3D5E9BC0F653E1}, // 1e105 ++ {0xBD79E0D20082EE74, 0x8B865B215899F46C}, // 1e106 ++ {0xECD8590680A3AA11, 0xAE67F1E9AEC07187}, // 1e107 ++ {0xE80E6F4820CC9495, 0xDA01EE641A708DE9}, // 1e108 ++ {0x3109058D147FDCDD, 0x884134FE908658B2}, // 1e109 ++ {0xBD4B46F0599FD415, 0xAA51823E34A7EEDE}, // 1e110 ++ {0x6C9E18AC7007C91A, 0xD4E5E2CDC1D1EA96}, // 1e111 ++ {0x03E2CF6BC604DDB0, 0x850FADC09923329E}, // 1e112 ++ {0x84DB8346B786151C, 0xA6539930BF6BFF45}, // 1e113 ++ {0xE612641865679A63, 0xCFE87F7CEF46FF16}, // 1e114 ++ {0x4FCB7E8F3F60C07E, 0x81F14FAE158C5F6E}, // 1e115 ++ {0xE3BE5E330F38F09D, 0xA26DA3999AEF7749}, // 1e116 ++ {0x5CADF5BFD3072CC5, 0xCB090C8001AB551C}, // 1e117 ++ {0x73D9732FC7C8F7F6, 0xFDCB4FA002162A63}, // 1e118 ++ {0x2867E7FDDCDD9AFA, 0x9E9F11C4014DDA7E}, // 1e119 ++ {0xB281E1FD541501B8, 0xC646D63501A1511D}, // 1e120 ++ {0x1F225A7CA91A4226, 0xF7D88BC24209A565}, // 1e121 ++ {0x3375788DE9B06958, 0x9AE757596946075F}, // 1e122 ++ {0x0052D6B1641C83AE, 0xC1A12D2FC3978937}, // 1e123 ++ {0xC0678C5DBD23A49A, 0xF209787BB47D6B84}, // 1e124 ++ {0xF840B7BA963646E0, 0x9745EB4D50CE6332}, // 1e125 ++ {0xB650E5A93BC3D898, 0xBD176620A501FBFF}, // 1e126 ++ {0xA3E51F138AB4CEBE, 0xEC5D3FA8CE427AFF}, // 1e127 ++ {0xC66F336C36B10137, 0x93BA47C980E98CDF}, // 1e128 ++ {0xB80B0047445D4184, 0xB8A8D9BBE123F017}, // 1e129 ++ {0xA60DC059157491E5, 0xE6D3102AD96CEC1D}, // 1e130 ++ {0x87C89837AD68DB2F, 0x9043EA1AC7E41392}, // 1e131 ++ {0x29BABE4598C311FB, 0xB454E4A179DD1877}, // 1e132 ++ {0xF4296DD6FEF3D67A, 0xE16A1DC9D8545E94}, // 1e133 ++ {0x1899E4A65F58660C, 0x8CE2529E2734BB1D}, // 1e134 ++ {0x5EC05DCFF72E7F8F, 0xB01AE745B101E9E4}, // 1e135 ++ {0x76707543F4FA1F73, 0xDC21A1171D42645D}, // 1e136 ++ {0x6A06494A791C53A8, 0x899504AE72497EBA}, // 1e137 ++ {0x0487DB9D17636892, 0xABFA45DA0EDBDE69}, // 1e138 ++ {0x45A9D2845D3C42B6, 0xD6F8D7509292D603}, // 1e139 ++ {0x0B8A2392BA45A9B2, 0x865B86925B9BC5C2}, // 1e140 ++ {0x8E6CAC7768D7141E, 0xA7F26836F282B732}, // 1e141 ++ {0x3207D795430CD926, 0xD1EF0244AF2364FF}, // 1e142 ++ {0x7F44E6BD49E807B8, 0x8335616AED761F1F}, // 1e143 ++ {0x5F16206C9C6209A6, 0xA402B9C5A8D3A6E7}, // 1e144 ++ {0x36DBA887C37A8C0F, 0xCD036837130890A1}, // 1e145 ++ {0xC2494954DA2C9789, 0x802221226BE55A64}, // 1e146 ++ {0xF2DB9BAA10B7BD6C, 0xA02AA96B06DEB0FD}, // 1e147 ++ {0x6F92829494E5ACC7, 0xC83553C5C8965D3D}, // 1e148 ++ {0xCB772339BA1F17F9, 0xFA42A8B73ABBF48C}, // 1e149 ++ {0xFF2A760414536EFB, 0x9C69A97284B578D7}, // 1e150 ++ {0xFEF5138519684ABA, 0xC38413CF25E2D70D}, // 1e151 ++ {0x7EB258665FC25D69, 0xF46518C2EF5B8CD1}, // 1e152 ++ {0xEF2F773FFBD97A61, 0x98BF2F79D5993802}, // 1e153 ++ {0xAAFB550FFACFD8FA, 0xBEEEFB584AFF8603}, // 1e154 ++ {0x95BA2A53F983CF38, 0xEEAABA2E5DBF6784}, // 1e155 ++ {0xDD945A747BF26183, 0x952AB45CFA97A0B2}, // 1e156 ++ {0x94F971119AEEF9E4, 0xBA756174393D88DF}, // 1e157 ++ {0x7A37CD5601AAB85D, 0xE912B9D1478CEB17}, // 1e158 ++ {0xAC62E055C10AB33A, 0x91ABB422CCB812EE}, // 1e159 ++ {0x577B986B314D6009, 0xB616A12B7FE617AA}, // 1e160 ++ {0xED5A7E85FDA0B80B, 0xE39C49765FDF9D94}, // 1e161 ++ {0x14588F13BE847307, 0x8E41ADE9FBEBC27D}, // 1e162 ++ {0x596EB2D8AE258FC8, 0xB1D219647AE6B31C}, // 1e163 ++ {0x6FCA5F8ED9AEF3BB, 0xDE469FBD99A05FE3}, // 1e164 ++ {0x25DE7BB9480D5854, 0x8AEC23D680043BEE}, // 1e165 ++ {0xAF561AA79A10AE6A, 0xADA72CCC20054AE9}, // 1e166 ++ {0x1B2BA1518094DA04, 0xD910F7FF28069DA4}, // 1e167 ++ {0x90FB44D2F05D0842, 0x87AA9AFF79042286}, // 1e168 ++ {0x353A1607AC744A53, 0xA99541BF57452B28}, // 1e169 ++ {0x42889B8997915CE8, 0xD3FA922F2D1675F2}, // 1e170 ++ {0x69956135FEBADA11, 0x847C9B5D7C2E09B7}, // 1e171 ++ {0x43FAB9837E699095, 0xA59BC234DB398C25}, // 1e172 ++ {0x94F967E45E03F4BB, 0xCF02B2C21207EF2E}, // 1e173 ++ {0x1D1BE0EEBAC278F5, 0x8161AFB94B44F57D}, // 1e174 ++ {0x6462D92A69731732, 0xA1BA1BA79E1632DC}, // 1e175 ++ {0x7D7B8F7503CFDCFE, 0xCA28A291859BBF93}, // 1e176 ++ {0x5CDA735244C3D43E, 0xFCB2CB35E702AF78}, // 1e177 ++ {0x3A0888136AFA64A7, 0x9DEFBF01B061ADAB}, // 1e178 ++ {0x088AAA1845B8FDD0, 0xC56BAEC21C7A1916}, // 1e179 ++ {0x8AAD549E57273D45, 0xF6C69A72A3989F5B}, // 1e180 ++ {0x36AC54E2F678864B, 0x9A3C2087A63F6399}, // 1e181 ++ {0x84576A1BB416A7DD, 0xC0CB28A98FCF3C7F}, // 1e182 ++ {0x656D44A2A11C51D5, 0xF0FDF2D3F3C30B9F}, // 1e183 ++ {0x9F644AE5A4B1B325, 0x969EB7C47859E743}, // 1e184 ++ {0x873D5D9F0DDE1FEE, 0xBC4665B596706114}, // 1e185 ++ {0xA90CB506D155A7EA, 0xEB57FF22FC0C7959}, // 1e186 ++ {0x09A7F12442D588F2, 0x9316FF75DD87CBD8}, // 1e187 ++ {0x0C11ED6D538AEB2F, 0xB7DCBF5354E9BECE}, // 1e188 ++ {0x8F1668C8A86DA5FA, 0xE5D3EF282A242E81}, // 1e189 ++ {0xF96E017D694487BC, 0x8FA475791A569D10}, // 1e190 ++ {0x37C981DCC395A9AC, 0xB38D92D760EC4455}, // 1e191 ++ {0x85BBE253F47B1417, 0xE070F78D3927556A}, // 1e192 ++ {0x93956D7478CCEC8E, 0x8C469AB843B89562}, // 1e193 ++ {0x387AC8D1970027B2, 0xAF58416654A6BABB}, // 1e194 ++ {0x06997B05FCC0319E, 0xDB2E51BFE9D0696A}, // 1e195 ++ {0x441FECE3BDF81F03, 0x88FCF317F22241E2}, // 1e196 ++ {0xD527E81CAD7626C3, 0xAB3C2FDDEEAAD25A}, // 1e197 ++ {0x8A71E223D8D3B074, 0xD60B3BD56A5586F1}, // 1e198 ++ {0xF6872D5667844E49, 0x85C7056562757456}, // 1e199 ++ {0xB428F8AC016561DB, 0xA738C6BEBB12D16C}, // 1e200 ++ {0xE13336D701BEBA52, 0xD106F86E69D785C7}, // 1e201 ++ {0xECC0024661173473, 0x82A45B450226B39C}, // 1e202 ++ {0x27F002D7F95D0190, 0xA34D721642B06084}, // 1e203 ++ {0x31EC038DF7B441F4, 0xCC20CE9BD35C78A5}, // 1e204 ++ {0x7E67047175A15271, 0xFF290242C83396CE}, // 1e205 ++ {0x0F0062C6E984D386, 0x9F79A169BD203E41}, // 1e206 ++ {0x52C07B78A3E60868, 0xC75809C42C684DD1}, // 1e207 ++ {0xA7709A56CCDF8A82, 0xF92E0C3537826145}, // 1e208 ++ {0x88A66076400BB691, 0x9BBCC7A142B17CCB}, // 1e209 ++ {0x6ACFF893D00EA435, 0xC2ABF989935DDBFE}, // 1e210 ++ {0x0583F6B8C4124D43, 0xF356F7EBF83552FE}, // 1e211 ++ {0xC3727A337A8B704A, 0x98165AF37B2153DE}, // 1e212 ++ {0x744F18C0592E4C5C, 0xBE1BF1B059E9A8D6}, // 1e213 ++ {0x1162DEF06F79DF73, 0xEDA2EE1C7064130C}, // 1e214 ++ {0x8ADDCB5645AC2BA8, 0x9485D4D1C63E8BE7}, // 1e215 ++ {0x6D953E2BD7173692, 0xB9A74A0637CE2EE1}, // 1e216 ++ {0xC8FA8DB6CCDD0437, 0xE8111C87C5C1BA99}, // 1e217 ++ {0x1D9C9892400A22A2, 0x910AB1D4DB9914A0}, // 1e218 ++ {0x2503BEB6D00CAB4B, 0xB54D5E4A127F59C8}, // 1e219 ++ {0x2E44AE64840FD61D, 0xE2A0B5DC971F303A}, // 1e220 ++ {0x5CEAECFED289E5D2, 0x8DA471A9DE737E24}, // 1e221 ++ {0x7425A83E872C5F47, 0xB10D8E1456105DAD}, // 1e222 ++ {0xD12F124E28F77719, 0xDD50F1996B947518}, // 1e223 ++ {0x82BD6B70D99AAA6F, 0x8A5296FFE33CC92F}, // 1e224 ++ {0x636CC64D1001550B, 0xACE73CBFDC0BFB7B}, // 1e225 ++ {0x3C47F7E05401AA4E, 0xD8210BEFD30EFA5A}, // 1e226 ++ {0x65ACFAEC34810A71, 0x8714A775E3E95C78}, // 1e227 ++ {0x7F1839A741A14D0D, 0xA8D9D1535CE3B396}, // 1e228 ++ {0x1EDE48111209A050, 0xD31045A8341CA07C}, // 1e229 ++ {0x934AED0AAB460432, 0x83EA2B892091E44D}, // 1e230 ++ {0xF81DA84D5617853F, 0xA4E4B66B68B65D60}, // 1e231 ++ {0x36251260AB9D668E, 0xCE1DE40642E3F4B9}, // 1e232 ++ {0xC1D72B7C6B426019, 0x80D2AE83E9CE78F3}, // 1e233 ++ {0xB24CF65B8612F81F, 0xA1075A24E4421730}, // 1e234 ++ {0xDEE033F26797B627, 0xC94930AE1D529CFC}, // 1e235 ++ {0x169840EF017DA3B1, 0xFB9B7CD9A4A7443C}, // 1e236 ++ {0x8E1F289560EE864E, 0x9D412E0806E88AA5}, // 1e237 ++ {0xF1A6F2BAB92A27E2, 0xC491798A08A2AD4E}, // 1e238 ++ {0xAE10AF696774B1DB, 0xF5B5D7EC8ACB58A2}, // 1e239 ++ {0xACCA6DA1E0A8EF29, 0x9991A6F3D6BF1765}, // 1e240 ++ {0x17FD090A58D32AF3, 0xBFF610B0CC6EDD3F}, // 1e241 ++ {0xDDFC4B4CEF07F5B0, 0xEFF394DCFF8A948E}, // 1e242 ++ {0x4ABDAF101564F98E, 0x95F83D0A1FB69CD9}, // 1e243 ++ {0x9D6D1AD41ABE37F1, 0xBB764C4CA7A4440F}, // 1e244 ++ {0x84C86189216DC5ED, 0xEA53DF5FD18D5513}, // 1e245 ++ {0x32FD3CF5B4E49BB4, 0x92746B9BE2F8552C}, // 1e246 ++ {0x3FBC8C33221DC2A1, 0xB7118682DBB66A77}, // 1e247 ++ {0x0FABAF3FEAA5334A, 0xE4D5E82392A40515}, // 1e248 ++ {0x29CB4D87F2A7400E, 0x8F05B1163BA6832D}, // 1e249 ++ {0x743E20E9EF511012, 0xB2C71D5BCA9023F8}, // 1e250 ++ {0x914DA9246B255416, 0xDF78E4B2BD342CF6}, // 1e251 ++ {0x1AD089B6C2F7548E, 0x8BAB8EEFB6409C1A}, // 1e252 ++ {0xA184AC2473B529B1, 0xAE9672ABA3D0C320}, // 1e253 ++ {0xC9E5D72D90A2741E, 0xDA3C0F568CC4F3E8}, // 1e254 ++ {0x7E2FA67C7A658892, 0x8865899617FB1871}, // 1e255 ++ {0xDDBB901B98FEEAB7, 0xAA7EEBFB9DF9DE8D}, // 1e256 ++ {0x552A74227F3EA565, 0xD51EA6FA85785631}, // 1e257 ++ {0xD53A88958F87275F, 0x8533285C936B35DE}, // 1e258 ++ {0x8A892ABAF368F137, 0xA67FF273B8460356}, // 1e259 ++ {0x2D2B7569B0432D85, 0xD01FEF10A657842C}, // 1e260 ++ {0x9C3B29620E29FC73, 0x8213F56A67F6B29B}, // 1e261 ++ {0x8349F3BA91B47B8F, 0xA298F2C501F45F42}, // 1e262 ++ {0x241C70A936219A73, 0xCB3F2F7642717713}, // 1e263 ++ {0xED238CD383AA0110, 0xFE0EFB53D30DD4D7}, // 1e264 ++ {0xF4363804324A40AA, 0x9EC95D1463E8A506}, // 1e265 ++ {0xB143C6053EDCD0D5, 0xC67BB4597CE2CE48}, // 1e266 ++ {0xDD94B7868E94050A, 0xF81AA16FDC1B81DA}, // 1e267 ++ {0xCA7CF2B4191C8326, 0x9B10A4E5E9913128}, // 1e268 ++ {0xFD1C2F611F63A3F0, 0xC1D4CE1F63F57D72}, // 1e269 ++ {0xBC633B39673C8CEC, 0xF24A01A73CF2DCCF}, // 1e270 ++ {0xD5BE0503E085D813, 0x976E41088617CA01}, // 1e271 ++ {0x4B2D8644D8A74E18, 0xBD49D14AA79DBC82}, // 1e272 ++ {0xDDF8E7D60ED1219E, 0xEC9C459D51852BA2}, // 1e273 ++ {0xCABB90E5C942B503, 0x93E1AB8252F33B45}, // 1e274 ++ {0x3D6A751F3B936243, 0xB8DA1662E7B00A17}, // 1e275 ++ {0x0CC512670A783AD4, 0xE7109BFBA19C0C9D}, // 1e276 ++ {0x27FB2B80668B24C5, 0x906A617D450187E2}, // 1e277 ++ {0xB1F9F660802DEDF6, 0xB484F9DC9641E9DA}, // 1e278 ++ {0x5E7873F8A0396973, 0xE1A63853BBD26451}, // 1e279 ++ {0xDB0B487B6423E1E8, 0x8D07E33455637EB2}, // 1e280 ++ {0x91CE1A9A3D2CDA62, 0xB049DC016ABC5E5F}, // 1e281 ++ {0x7641A140CC7810FB, 0xDC5C5301C56B75F7}, // 1e282 ++ {0xA9E904C87FCB0A9D, 0x89B9B3E11B6329BA}, // 1e283 ++ {0x546345FA9FBDCD44, 0xAC2820D9623BF429}, // 1e284 ++ {0xA97C177947AD4095, 0xD732290FBACAF133}, // 1e285 ++ {0x49ED8EABCCCC485D, 0x867F59A9D4BED6C0}, // 1e286 ++ {0x5C68F256BFFF5A74, 0xA81F301449EE8C70}, // 1e287 ++ {0x73832EEC6FFF3111, 0xD226FC195C6A2F8C}, // 1e288 + }; + +-// -------- ++// wuffs_private_impl__f64_powers_of_10 holds powers of 10 that can be exactly ++// represented by a float64 (what C calls a double). ++static const double wuffs_private_impl__f64_powers_of_10[23] = { ++ 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, ++ 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, ++}; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_64__decode(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET) +- ? wuffs_base__base_64__decode_url +- : wuffs_base__base_64__decode_std; +- wuffs_base__transform__output o; +- uint8_t* d_ptr = dst.ptr; +- size_t d_len = dst.len; +- const uint8_t* s_ptr = src.ptr; +- size_t s_len = src.len; +- bool pad = false; ++// ---------------- IEEE 754 Floating Point + +- while (s_len >= 4) { +- uint32_t s = wuffs_base__peek_u32le__no_bounds_check(s_ptr); +- uint32_t s0 = alphabet[0xFF & (s >> 0)]; +- uint32_t s1 = alphabet[0xFF & (s >> 8)]; +- uint32_t s2 = alphabet[0xFF & (s >> 16)]; +- uint32_t s3 = alphabet[0xFF & (s >> 24)]; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u16 // ++wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(double f) { ++ uint64_t u = 0; ++ if (sizeof(uint64_t) == sizeof(double)) { ++ memcpy(&u, &f, sizeof(uint64_t)); ++ } ++ uint16_t neg = ((uint16_t)((u >> 63) << 15)); ++ u &= 0x7FFFFFFFFFFFFFFF; ++ uint64_t exp = u >> 52; ++ uint64_t man = u & 0x000FFFFFFFFFFFFF; + +- if (((s0 | s1 | s2 | s3) & 0xC0) != 0) { +- if (s_len > 4) { +- o.status.repr = wuffs_base__error__bad_data; +- goto done; +- } else if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- goto done; +- } else if ((options & WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING) && +- (s_ptr[3] == '=')) { +- pad = true; +- if (s_ptr[2] == '=') { +- goto src2; +- } +- goto src3; +- } +- o.status.repr = wuffs_base__error__bad_data; +- goto done; ++ if (exp == 0x7FF) { ++ if (man == 0) { // Infinity. ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg | 0x7C00; ++ ret.lossy = false; ++ return ret; + } ++ // NaN. Shift the 52 mantissa bits to 10 mantissa bits, keeping the most ++ // significant mantissa bit (quiet vs signaling NaNs). Also set the low 9 ++ // bits of ret.value so that the 10-bit mantissa is non-zero. ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg | 0x7DFF | ((uint16_t)(man >> 42)); ++ ret.lossy = false; ++ return ret; + +- if (d_len < 3) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } ++ } else if (exp > 0x40E) { // Truncate to the largest finite f16. ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg | 0x7BFF; ++ ret.lossy = true; ++ return ret; + +- s_ptr += 4; +- s_len -= 4; +- s = (s0 << 18) | (s1 << 12) | (s2 << 6) | (s3 << 0); +- *d_ptr++ = (uint8_t)(s >> 16); +- *d_ptr++ = (uint8_t)(s >> 8); +- *d_ptr++ = (uint8_t)(s >> 0); +- d_len -= 3; +- } +- +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- goto done; +- } ++ } else if (exp <= 0x3E6) { // Truncate to zero. ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg; ++ ret.lossy = (u != 0); ++ return ret; + +- if (s_len == 0) { +- o.status.repr = NULL; +- goto done; +- } else if (s_len == 1) { +- o.status.repr = wuffs_base__error__bad_data; +- goto done; +- } else if (s_len == 2) { +- goto src2; ++ } else if (exp <= 0x3F0) { // Normal f64, subnormal f16. ++ // Convert from a 53-bit mantissa (after realizing the implicit bit) to a ++ // 10-bit mantissa and then adjust for the exponent. ++ man |= 0x0010000000000000; ++ uint32_t shift = ((uint32_t)(1051 - exp)); // 1051 = 0x3F0 + 53 - 10. ++ uint64_t shifted_man = man >> shift; ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg | ((uint16_t)shifted_man); ++ ret.lossy = (shifted_man << shift) != man; ++ return ret; + } + +-src3: +- do { +- uint32_t s = wuffs_base__peek_u24le__no_bounds_check(s_ptr); +- uint32_t s0 = alphabet[0xFF & (s >> 0)]; +- uint32_t s1 = alphabet[0xFF & (s >> 8)]; +- uint32_t s2 = alphabet[0xFF & (s >> 16)]; +- if ((s0 & 0xC0) || (s1 & 0xC0) || (s2 & 0xC3)) { +- o.status.repr = wuffs_base__error__bad_data; +- goto done; +- } +- if (d_len < 2) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } +- s_ptr += pad ? 4 : 3; +- s = (s0 << 18) | (s1 << 12) | (s2 << 6); +- *d_ptr++ = (uint8_t)(s >> 16); +- *d_ptr++ = (uint8_t)(s >> 8); +- o.status.repr = NULL; +- goto done; +- } while (0); ++ // Normal f64, normal f16. + +-src2: +- do { +- uint32_t s = wuffs_base__peek_u16le__no_bounds_check(s_ptr); +- uint32_t s0 = alphabet[0xFF & (s >> 0)]; +- uint32_t s1 = alphabet[0xFF & (s >> 8)]; +- if ((s0 & 0xC0) || (s1 & 0xCF)) { +- o.status.repr = wuffs_base__error__bad_data; +- goto done; +- } +- if (d_len < 1) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } +- s_ptr += pad ? 4 : 2; +- s = (s0 << 18) | (s1 << 12); +- *d_ptr++ = (uint8_t)(s >> 16); +- o.status.repr = NULL; +- goto done; +- } while (0); ++ // Re-bias from 1023 to 15 and shift above f16's 10 mantissa bits. ++ exp = (exp - 1008) << 10; // 1008 = 1023 - 15 = 0x3FF - 0xF. + +-done: +- o.num_dst = (size_t)(d_ptr - dst.ptr); +- o.num_src = (size_t)(s_ptr - src.ptr); +- return o; ++ // Convert from a 52-bit mantissa (excluding the implicit bit) to a 10-bit ++ // mantissa (again excluding the implicit bit). We lose some information if ++ // any of the bottom 42 bits are non-zero. ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg | ((uint16_t)exp) | ((uint16_t)(man >> 42)); ++ ret.lossy = (man << 22) != 0; ++ return ret; + } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_64__encode(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET) +- ? wuffs_base__base_64__encode_url +- : wuffs_base__base_64__encode_std; +- wuffs_base__transform__output o; +- uint8_t* d_ptr = dst.ptr; +- size_t d_len = dst.len; +- const uint8_t* s_ptr = src.ptr; +- size_t s_len = src.len; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u32 // ++wuffs_base__ieee_754_bit_representation__from_f64_to_u32_truncate(double f) { ++ uint64_t u = 0; ++ if (sizeof(uint64_t) == sizeof(double)) { ++ memcpy(&u, &f, sizeof(uint64_t)); ++ } ++ uint32_t neg = ((uint32_t)(u >> 63)) << 31; ++ u &= 0x7FFFFFFFFFFFFFFF; ++ uint64_t exp = u >> 52; ++ uint64_t man = u & 0x000FFFFFFFFFFFFF; + +- do { +- while (s_len >= 3) { +- if (d_len < 4) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } +- uint32_t s = wuffs_base__peek_u24be__no_bounds_check(s_ptr); +- s_ptr += 3; +- s_len -= 3; +- *d_ptr++ = alphabet[0x3F & (s >> 18)]; +- *d_ptr++ = alphabet[0x3F & (s >> 12)]; +- *d_ptr++ = alphabet[0x3F & (s >> 6)]; +- *d_ptr++ = alphabet[0x3F & (s >> 0)]; +- d_len -= 4; ++ if (exp == 0x7FF) { ++ if (man == 0) { // Infinity. ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg | 0x7F800000; ++ ret.lossy = false; ++ return ret; + } ++ // NaN. Shift the 52 mantissa bits to 23 mantissa bits, keeping the most ++ // significant mantissa bit (quiet vs signaling NaNs). Also set the low 22 ++ // bits of ret.value so that the 23-bit mantissa is non-zero. ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg | 0x7FBFFFFF | ((uint32_t)(man >> 29)); ++ ret.lossy = false; ++ return ret; + +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- goto done; +- } ++ } else if (exp > 0x47E) { // Truncate to the largest finite f32. ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg | 0x7F7FFFFF; ++ ret.lossy = true; ++ return ret; + +- if (s_len == 2) { +- if (d_len < +- ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 3)) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } +- uint32_t s = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(s_ptr))) +- << 8; +- s_ptr += 2; +- *d_ptr++ = alphabet[0x3F & (s >> 18)]; +- *d_ptr++ = alphabet[0x3F & (s >> 12)]; +- *d_ptr++ = alphabet[0x3F & (s >> 6)]; +- if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) { +- *d_ptr++ = '='; +- } +- o.status.repr = NULL; +- goto done; ++ } else if (exp <= 0x369) { // Truncate to zero. ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg; ++ ret.lossy = (u != 0); ++ return ret; + +- } else if (s_len == 1) { +- if (d_len < +- ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 2)) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } +- uint32_t s = ((uint32_t)(wuffs_base__peek_u8__no_bounds_check(s_ptr))) +- << 16; +- s_ptr += 1; +- *d_ptr++ = alphabet[0x3F & (s >> 18)]; +- *d_ptr++ = alphabet[0x3F & (s >> 12)]; +- if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) { +- *d_ptr++ = '='; +- *d_ptr++ = '='; +- } +- o.status.repr = NULL; +- goto done; ++ } else if (exp <= 0x380) { // Normal f64, subnormal f32. ++ // Convert from a 53-bit mantissa (after realizing the implicit bit) to a ++ // 23-bit mantissa and then adjust for the exponent. ++ man |= 0x0010000000000000; ++ uint32_t shift = ((uint32_t)(926 - exp)); // 926 = 0x380 + 53 - 23. ++ uint64_t shifted_man = man >> shift; ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg | ((uint32_t)shifted_man); ++ ret.lossy = (shifted_man << shift) != man; ++ return ret; ++ } + +- } else { +- o.status.repr = NULL; +- goto done; +- } +- } while (0); ++ // Normal f64, normal f32. + +-done: +- o.num_dst = (size_t)(d_ptr - dst.ptr); +- o.num_src = (size_t)(s_ptr - src.ptr); +- return o; ++ // Re-bias from 1023 to 127 and shift above f32's 23 mantissa bits. ++ exp = (exp - 896) << 23; // 896 = 1023 - 127 = 0x3FF - 0x7F. ++ ++ // Convert from a 52-bit mantissa (excluding the implicit bit) to a 23-bit ++ // mantissa (again excluding the implicit bit). We lose some information if ++ // any of the bottom 29 bits are non-zero. ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg | ((uint32_t)exp) | ((uint32_t)(man >> 29)); ++ ret.lossy = (man << 35) != 0; ++ return ret; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__INTCONV) ++// -------- + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__MAGIC) ++#define WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE 2047 ++#define WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION 800 + +-// ---------------- Magic Numbers ++// WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL is the largest N such that ++// ((10 << N) < (1 << 64)). ++#define WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL 60 + +-// ICO doesn't start with a magic identifier. Instead, see if the opening bytes +-// are plausibly ICO. ++// wuffs_private_impl__high_prec_dec (abbreviated as HPD) is a fixed precision ++// floating point decimal number, augmented with ±infinity values, but it ++// cannot represent NaN (Not a Number). + // +-// Callers should have already verified that (prefix_data.len >= 2) and the +-// first two bytes are 0x00. ++// "High precision" means that the mantissa holds 800 decimal digits. 800 is ++// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION. + // +-// See: +-// - https://docs.fileformat.com/image/ico/ +-static int32_t // +-wuffs_base__magic_number_guess_fourcc__maybe_ico( +- wuffs_base__slice_u8 prefix_data, +- bool prefix_closed) { +- // Allow-list for the Image Type field. +- if (prefix_data.len < 4) { +- return prefix_closed ? 0 : -1; +- } else if (prefix_data.ptr[3] != 0) { +- return 0; +- } +- switch (prefix_data.ptr[2]) { +- case 0x01: // ICO +- case 0x02: // CUR +- break; +- default: +- return 0; +- } +- +- // The Number Of Images should be positive. +- if (prefix_data.len < 6) { +- return prefix_closed ? 0 : -1; +- } else if ((prefix_data.ptr[4] == 0) && (prefix_data.ptr[5] == 0)) { +- return 0; +- } ++// An HPD isn't for general purpose arithmetic, only for conversions to and ++// from IEEE 754 double-precision floating point, where the largest and ++// smallest positive, finite values are approximately 1.8e+308 and 4.9e-324. ++// HPD exponents above +2047 mean infinity, below -2047 mean zero. The ±2047 ++// bounds are further away from zero than ±(324 + 800), where 800 and 2047 is ++// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION and ++// WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE. ++// ++// digits[.. num_digits] are the number's digits in big-endian order. The ++// uint8_t values are in the range [0 ..= 9], not ['0' ..= '9'], where e.g. '7' ++// is the ASCII value 0x37. ++// ++// decimal_point is the index (within digits) of the decimal point. It may be ++// negative or be larger than num_digits, in which case the explicit digits are ++// padded with implicit zeroes. ++// ++// For example, if num_digits is 3 and digits is "\x07\x08\x09": ++// - A decimal_point of -2 means ".00789" ++// - A decimal_point of -1 means ".0789" ++// - A decimal_point of +0 means ".789" ++// - A decimal_point of +1 means "7.89" ++// - A decimal_point of +2 means "78.9" ++// - A decimal_point of +3 means "789." ++// - A decimal_point of +4 means "7890." ++// - A decimal_point of +5 means "78900." ++// ++// As above, a decimal_point higher than +2047 means that the overall value is ++// infinity, lower than -2047 means zero. ++// ++// negative is a sign bit. An HPD can distinguish positive and negative zero. ++// ++// truncated is whether there are more than ++// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION digits, and at least one of those ++// extra digits are non-zero. The existence of long-tail digits can affect ++// rounding. ++// ++// The "all fields are zero" value is valid, and represents the number +0. ++typedef struct wuffs_private_impl__high_prec_dec__struct { ++ uint32_t num_digits; ++ int32_t decimal_point; ++ bool negative; ++ bool truncated; ++ uint8_t digits[WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION]; ++} wuffs_private_impl__high_prec_dec; + +- // The first ICONDIRENTRY's fourth byte should be zero. +- if (prefix_data.len < 10) { +- return prefix_closed ? 0 : -1; +- } else if (prefix_data.ptr[9] != 0) { +- return 0; ++// wuffs_private_impl__high_prec_dec__trim trims trailing zeroes from the ++// h->digits[.. h->num_digits] slice. They have no benefit, since we explicitly ++// track h->decimal_point. ++// ++// Preconditions: ++// - h is non-NULL. ++static inline void // ++wuffs_private_impl__high_prec_dec__trim(wuffs_private_impl__high_prec_dec* h) { ++ while ((h->num_digits > 0) && (h->digits[h->num_digits - 1] == 0)) { ++ h->num_digits--; + } +- +- // TODO: have a separate FourCC for CUR? +- return 0x49434F20; // 'ICO 'be + } + +-// TGA doesn't start with a magic identifier. Instead, see if the opening bytes +-// are plausibly TGA. ++// wuffs_private_impl__high_prec_dec__assign sets h to represent the number x. + // +-// Callers should have already verified that (prefix_data.len >= 2) and the +-// second byte (prefix_data.ptr[1], the Color Map Type byte), is either 0x00 or +-// 0x01. +-// +-// See: +-// - https://docs.fileformat.com/image/tga/ +-// - https://www.dca.fee.unicamp.br/~martino/disciplinas/ea978/tgaffs.pdf +-static int32_t // +-wuffs_base__magic_number_guess_fourcc__maybe_tga( +- wuffs_base__slice_u8 prefix_data, +- bool prefix_closed) { +- // Allow-list for the Image Type field. +- if (prefix_data.len < 3) { +- return prefix_closed ? 0 : -1; +- } +- switch (prefix_data.ptr[2]) { +- case 0x01: +- case 0x02: +- case 0x03: +- case 0x09: +- case 0x0A: +- case 0x0B: +- break; +- default: +- // TODO: 0x20 and 0x21 are invalid, according to the spec, but are +- // apparently unofficial extensions. +- return 0; +- } +- +- // Allow-list for the Color Map Entry Size field (if the Color Map Type field +- // is non-zero) or else all the Color Map fields should be zero. +- if (prefix_data.len < 8) { +- return prefix_closed ? 0 : -1; +- } else if (prefix_data.ptr[1] != 0x00) { +- switch (prefix_data.ptr[7]) { +- case 0x0F: +- case 0x10: +- case 0x18: +- case 0x20: +- break; +- default: +- return 0; +- } +- } else if ((prefix_data.ptr[3] | prefix_data.ptr[4] | prefix_data.ptr[5] | +- prefix_data.ptr[6] | prefix_data.ptr[7]) != 0x00) { +- return 0; +- } ++// Preconditions: ++// - h is non-NULL. ++static void // ++wuffs_private_impl__high_prec_dec__assign(wuffs_private_impl__high_prec_dec* h, ++ uint64_t x, ++ bool negative) { ++ uint32_t n = 0; + +- // Allow-list for the Pixel Depth field. +- if (prefix_data.len < 17) { +- return prefix_closed ? 0 : -1; +- } +- switch (prefix_data.ptr[16]) { +- case 0x01: +- case 0x08: +- case 0x0F: +- case 0x10: +- case 0x18: +- case 0x20: +- break; +- default: +- return 0; ++ // Set h->digits. ++ if (x > 0) { ++ // Calculate the digits, working right-to-left. After we determine n (how ++ // many digits there are), copy from buf to h->digits. ++ // ++ // UINT64_MAX, 18446744073709551615, is 20 digits long. It can be faster to ++ // copy a constant number of bytes than a variable number (20 instead of ++ // n). Make buf large enough (and start writing to it from the middle) so ++ // that can we always copy 20 bytes: the slice buf[(20-n) .. (40-n)]. ++ uint8_t buf[40] = {0}; ++ uint8_t* ptr = &buf[20]; ++ do { ++ uint64_t remaining = x / 10; ++ x -= remaining * 10; ++ ptr--; ++ *ptr = (uint8_t)x; ++ n++; ++ x = remaining; ++ } while (x > 0); ++ memcpy(h->digits, ptr, 20); + } + +- return 0x54474120; // 'TGA 'be ++ // Set h's other fields. ++ h->num_digits = n; ++ h->decimal_point = (int32_t)n; ++ h->negative = negative; ++ h->truncated = false; ++ wuffs_private_impl__high_prec_dec__trim(h); + } + +-WUFFS_BASE__MAYBE_STATIC int32_t // +-wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data, +- bool prefix_closed) { +- // This is similar to (but different from): +- // - the magic/Magdir tables under https://github.com/file/file +- // - the MIME Sniffing algorithm at https://mimesniff.spec.whatwg.org/ +- +- // table holds the 'magic numbers' (which are actually variable length +- // strings). The strings may contain NUL bytes, so the "const char* magic" +- // value starts with the length-minus-1 of the 'magic number'. +- // +- // Keep it sorted by magic[1], then magic[0] descending (prioritizing longer +- // matches) and finally by magic[2:]. When multiple entries match, the +- // longest one wins. +- // +- // The fourcc field might be negated, in which case there's further +- // specialization (see § below). +- static struct { +- int32_t fourcc; +- const char* magic; +- } table[] = { +- {-0x30302020, "\x01\x00\x00"}, // '00 'be +- {+0x475A2020, "\x02\x1F\x8B\x08"}, // GZ +- {+0x5A535444, "\x03\x28\xB5\x2F\xFD"}, // ZSTD +- {+0x425A3220, "\x02\x42\x5A\x68"}, // BZ2 +- {+0x424D5020, "\x01\x42\x4D"}, // BMP +- {+0x47494620, "\x03\x47\x49\x46\x38"}, // GIF +- {+0x54494646, "\x03\x49\x49\x2A\x00"}, // TIFF (little-endian) +- {+0x54494646, "\x03\x4D\x4D\x00\x2A"}, // TIFF (big-endian) +- {+0x4E50424D, "\x02\x50\x35\x0A"}, // NPBM (P5; *.pgm) +- {+0x4E50424D, "\x02\x50\x36\x0A"}, // NPBM (P6; *.ppm) +- {-0x52494646, "\x03\x52\x49\x46\x46"}, // RIFF +- {+0x4C5A4D41, "\x04\x5D\x00\x10\x00\x00"}, // LZMA +- {+0x4C5A4D41, "\x02\x5D\x00\x00"}, // LZMA +- {+0x4E494520, "\x02\x6E\xC3\xAF"}, // NIE +- {+0x514F4920, "\x03\x71\x6F\x69\x66"}, // QOI +- {+0x5A4C4942, "\x01\x78\x9C"}, // ZLIB +- {+0x504E4720, "\x03\x89\x50\x4E\x47"}, // PNG +- {+0x585A2020, "\x04\xFD\x37\x7A\x58\x5A"}, // XZ +- {+0x4A504547, "\x01\xFF\xD8"}, // JPEG +- }; +- static const size_t table_len = sizeof(table) / sizeof(table[0]); +- +- if (prefix_data.len == 0) { +- return prefix_closed ? 0 : -1; ++static wuffs_base__status // ++wuffs_private_impl__high_prec_dec__parse(wuffs_private_impl__high_prec_dec* h, ++ wuffs_base__slice_u8 s, ++ uint32_t options) { ++ if (!h) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- uint8_t pre_first_byte = prefix_data.ptr[0]; ++ h->num_digits = 0; ++ h->decimal_point = 0; ++ h->negative = false; ++ h->truncated = false; + +- int32_t fourcc = 0; +- size_t i; +- for (i = 0; i < table_len; i++) { +- uint8_t mag_first_byte = ((uint8_t)(table[i].magic[1])); +- if (pre_first_byte < mag_first_byte) { +- break; +- } else if (pre_first_byte > mag_first_byte) { +- continue; +- } +- fourcc = table[i].fourcc; ++ uint8_t* p = s.ptr; ++ uint8_t* q = s.ptr + s.len; + +- uint8_t mag_remaining_len = ((uint8_t)(table[i].magic[0])); +- if (mag_remaining_len == 0) { +- goto match; ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (;; p++) { ++ if (p >= q) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } else if (*p != '_') { ++ break; ++ } + } ++ } + +- const char* mag_remaining_ptr = table[i].magic + 2; +- uint8_t* pre_remaining_ptr = prefix_data.ptr + 1; +- size_t pre_remaining_len = prefix_data.len - 1; +- if (pre_remaining_len < mag_remaining_len) { +- if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, pre_remaining_len)) { +- return prefix_closed ? 0 : -1; +- } ++ // Parse sign. ++ do { ++ if (*p == '+') { ++ p++; ++ } else if (*p == '-') { ++ h->negative = true; ++ p++; + } else { +- if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, mag_remaining_len)) { +- goto match; ++ break; ++ } ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (;; p++) { ++ if (p >= q) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } else if (*p != '_') { ++ break; ++ } + } + } +- } +- +- if (prefix_data.len < 2) { +- return prefix_closed ? 0 : -1; +- } else if ((prefix_data.ptr[1] == 0x00) || (prefix_data.ptr[1] == 0x01)) { +- return wuffs_base__magic_number_guess_fourcc__maybe_tga(prefix_data, +- prefix_closed); +- } +- +- return 0; +- +-match: +- // Negative FourCC values (see § above) are further specialized. +- if (fourcc < 0) { +- fourcc = -fourcc; ++ } while (0); + +- if (fourcc == 0x52494646) { // 'RIFF'be +- if (prefix_data.len < 12) { +- return prefix_closed ? 0 : -1; ++ // Parse digits, up to (and including) a '.', 'E' or 'e'. Examples for each ++ // limb in this if-else chain: ++ // - "0.789" ++ // - "1002.789" ++ // - ".789" ++ // - Other (invalid input). ++ uint32_t nd = 0; ++ int32_t dp = 0; ++ bool no_digits_before_separator = false; ++ if (('0' == *p) && ++ !(options & ++ WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES)) { ++ p++; ++ for (;; p++) { ++ if (p >= q) { ++ goto after_all; ++ } else if (*p == ++ ((options & ++ WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.')) { ++ p++; ++ goto after_sep; ++ } else if ((*p == 'E') || (*p == 'e')) { ++ p++; ++ goto after_exp; ++ } else if ((*p != '_') || ++ !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } +- uint32_t x = wuffs_base__peek_u32be__no_bounds_check(prefix_data.ptr + 8); +- if (x == 0x57454250) { // 'WEBP'be +- return 0x57454250; // 'WEBP'be ++ } ++ ++ } else if (('0' <= *p) && (*p <= '9')) { ++ if (*p == '0') { ++ for (; (p < q) && (*p == '0'); p++) { + } ++ } else { ++ h->digits[nd++] = (uint8_t)(*p - '0'); ++ dp = (int32_t)nd; ++ p++; ++ } + +- } else if (fourcc == 0x30302020) { // '00 'be +- // Binary data starting with multiple 0x00 NUL bytes is quite common. +- // Unfortunately, some file formats also don't start with a magic +- // identifier, so we have to use heuristics (where the order matters, the +- // same as /usr/bin/file's magic/Magdir tables) as best we can. Maybe +- // it's TGA, ICO/CUR, etc. Maybe it's something else. +- int32_t tga = wuffs_base__magic_number_guess_fourcc__maybe_tga( +- prefix_data, prefix_closed); +- if (tga != 0) { +- return tga; ++ for (;; p++) { ++ if (p >= q) { ++ goto after_all; ++ } else if (('0' <= *p) && (*p <= '9')) { ++ if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[nd++] = (uint8_t)(*p - '0'); ++ dp = (int32_t)nd; ++ } else if ('0' != *p) { ++ // Long-tail non-zeroes set the truncated bit. ++ h->truncated = true; ++ } ++ } else if (*p == ++ ((options & ++ WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.')) { ++ p++; ++ goto after_sep; ++ } else if ((*p == 'E') || (*p == 'e')) { ++ p++; ++ goto after_exp; ++ } else if ((*p != '_') || ++ !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } +- int32_t ico = wuffs_base__magic_number_guess_fourcc__maybe_ico( +- prefix_data, prefix_closed); +- if (ico != 0) { +- return ico; ++ } ++ ++ } else if (*p == ((options & ++ WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.')) { ++ p++; ++ no_digits_before_separator = true; ++ ++ } else { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ ++after_sep: ++ for (;; p++) { ++ if (p >= q) { ++ goto after_all; ++ } else if ('0' == *p) { ++ if (nd == 0) { ++ // Track leading zeroes implicitly. ++ dp--; ++ } else if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[nd++] = (uint8_t)(*p - '0'); + } +- if (prefix_data.len < 4) { +- return prefix_closed ? 0 : -1; +- } else if ((prefix_data.ptr[2] != 0x00) && +- ((prefix_data.ptr[2] >= 0x80) || +- (prefix_data.ptr[3] != 0x00))) { +- // Roughly speaking, this could be a non-degenerate (non-0-width and +- // non-0-height) WBMP image. +- return 0x57424D50; // 'WBMP'be ++ } else if (('0' < *p) && (*p <= '9')) { ++ if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[nd++] = (uint8_t)(*p - '0'); ++ } else { ++ // Long-tail non-zeroes set the truncated bit. ++ h->truncated = true; + } +- return 0; ++ } else if ((*p == 'E') || (*p == 'e')) { ++ p++; ++ goto after_exp; ++ } else if ((*p != '_') || ++ !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + } +- return fourcc; +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__MAGIC) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV) + +-// ---------------- Pixel Swizzler ++after_exp: ++ do { ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (;; p++) { ++ if (p >= q) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } else if (*p != '_') { ++ break; ++ } ++ } ++ } + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__rgb__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len); ++ int32_t exp_sign = +1; ++ if (*p == '+') { ++ p++; ++ } else if (*p == '-') { ++ exp_sign = -1; ++ p++; ++ } + +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-static uint64_t // +-wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len); ++ int32_t exp = 0; ++ const int32_t exp_large = WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE + ++ WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION; ++ bool saw_exp_digits = false; ++ for (; p < q; p++) { ++ if ((*p == '_') && ++ (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ // No-op. ++ } else if (('0' <= *p) && (*p <= '9')) { ++ saw_exp_digits = true; ++ if (exp < exp_large) { ++ exp = (10 * exp) + ((int32_t)(*p - '0')); ++ } ++ } else { ++ break; ++ } ++ } ++ if (!saw_exp_digits) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ dp += exp_sign * exp; ++ } while (0); + +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__y__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++after_all: ++ if (p != q) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ h->num_digits = nd; ++ if (nd == 0) { ++ if (no_digits_before_separator) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ h->decimal_point = 0; ++ } else if (dp < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) { ++ h->decimal_point = -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE - 1; ++ } else if (dp > +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) { ++ h->decimal_point = +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE + 1; ++ } else { ++ h->decimal_point = dp; ++ } ++ wuffs_private_impl__high_prec_dec__trim(h); ++ return wuffs_base__make_status(NULL); ++} + + // -------- + +-static inline uint32_t // +-wuffs_base__swap_u32_argb_abgr(uint32_t u) { +- uint32_t o = u & 0xFF00FF00ul; +- uint32_t r = u & 0x00FF0000ul; +- uint32_t b = u & 0x000000FFul; +- return o | (r >> 16) | (b << 16); +-} ++// wuffs_private_impl__high_prec_dec__lshift_num_new_digits returns the number ++// of additional decimal digits when left-shifting by shift. ++// ++// See below for preconditions. ++static uint32_t // ++wuffs_private_impl__high_prec_dec__lshift_num_new_digits( ++ wuffs_private_impl__high_prec_dec* h, ++ uint32_t shift) { ++ // Masking with 0x3F should be unnecessary (assuming the preconditions) but ++ // it's cheap and ensures that we don't overflow the ++ // wuffs_private_impl__hpd_left_shift array. ++ shift &= 63; + +-static inline uint64_t // +-wuffs_base__swap_u64_argb_abgr(uint64_t u) { +- uint64_t o = u & 0xFFFF0000FFFF0000ull; +- uint64_t r = u & 0x0000FFFF00000000ull; +- uint64_t b = u & 0x000000000000FFFFull; +- return o | (r >> 32) | (b << 32); +-} ++ uint32_t x_a = wuffs_private_impl__hpd_left_shift[shift]; ++ uint32_t x_b = wuffs_private_impl__hpd_left_shift[shift + 1]; ++ uint32_t num_new_digits = x_a >> 11; ++ uint32_t pow5_a = 0x7FF & x_a; ++ uint32_t pow5_b = 0x7FF & x_b; + +-static inline uint32_t // +-wuffs_base__color_u64__as__color_u32__swap_u32_argb_abgr(uint64_t c) { +- uint32_t a = ((uint32_t)(0xFF & (c >> 56))); +- uint32_t r = ((uint32_t)(0xFF & (c >> 40))); +- uint32_t g = ((uint32_t)(0xFF & (c >> 24))); +- uint32_t b = ((uint32_t)(0xFF & (c >> 8))); +- return (a << 24) | (b << 16) | (g << 8) | (r << 0); ++ const uint8_t* pow5 = &wuffs_private_impl__powers_of_5[pow5_a]; ++ uint32_t i = 0; ++ uint32_t n = pow5_b - pow5_a; ++ for (; i < n; i++) { ++ if (i >= h->num_digits) { ++ return num_new_digits - 1; ++ } else if (h->digits[i] == pow5[i]) { ++ continue; ++ } else if (h->digits[i] < pow5[i]) { ++ return num_new_digits - 1; ++ } else { ++ return num_new_digits; ++ } ++ } ++ return num_new_digits; + } + + // -------- + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__color_u32_argb_premul // +-wuffs_base__pixel_buffer__color_u32_at(const wuffs_base__pixel_buffer* pb, +- uint32_t x, +- uint32_t y) { +- if (!pb || (x >= pb->pixcfg.private_impl.width) || +- (y >= pb->pixcfg.private_impl.height)) { ++// wuffs_private_impl__high_prec_dec__rounded_integer returns the integral ++// (non-fractional) part of h, provided that it is 18 or fewer decimal digits. ++// For 19 or more digits, it returns UINT64_MAX. Note that: ++// - (1 << 53) is 9007199254740992, which has 16 decimal digits. ++// - (1 << 56) is 72057594037927936, which has 17 decimal digits. ++// - (1 << 59) is 576460752303423488, which has 18 decimal digits. ++// - (1 << 63) is 9223372036854775808, which has 19 decimal digits. ++// and that IEEE 754 double precision has 52 mantissa bits. ++// ++// That integral part is rounded-to-even: rounding 7.5 or 8.5 both give 8. ++// ++// h's negative bit is ignored: rounding -8.6 returns 9. ++// ++// See below for preconditions. ++static uint64_t // ++wuffs_private_impl__high_prec_dec__rounded_integer( ++ wuffs_private_impl__high_prec_dec* h) { ++ if ((h->num_digits == 0) || (h->decimal_point < 0)) { + return 0; ++ } else if (h->decimal_point > 18) { ++ return UINT64_MAX; + } + +- if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { +- // TODO: support planar formats. +- return 0; ++ uint32_t dp = (uint32_t)(h->decimal_point); ++ uint64_t n = 0; ++ uint32_t i = 0; ++ for (; i < dp; i++) { ++ n = (10 * n) + ((i < h->num_digits) ? h->digits[i] : 0); + } + +- size_t stride = pb->private_impl.planes[0].stride; +- const uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)); ++ bool round_up = false; ++ if (dp < h->num_digits) { ++ round_up = h->digits[dp] >= 5; ++ if ((h->digits[dp] == 5) && (dp + 1 == h->num_digits)) { ++ // We are exactly halfway. If we're truncated, round up, otherwise round ++ // to even. ++ round_up = h->truncated || // ++ ((dp > 0) && (1 & h->digits[dp - 1])); ++ } ++ } ++ if (round_up) { ++ n++; ++ } + +- switch (pb->pixcfg.private_impl.pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- return wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))); ++ return n; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: { +- uint8_t* palette = pb->private_impl.planes[3].ptr; +- return wuffs_base__peek_u32le__no_bounds_check(palette + +- (4 * ((size_t)row[x]))); +- } ++// wuffs_private_impl__high_prec_dec__small_xshift shifts h's number (where 'x' ++// is 'l' or 'r' for left or right) by a small shift value. ++// ++// Preconditions: ++// - h is non-NULL. ++// - h->decimal_point is "not extreme". ++// - shift is non-zero. ++// - shift is "a small shift". ++// ++// "Not extreme" means within ±WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE. ++// ++// "A small shift" means not more than ++// WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL. ++// ++// wuffs_private_impl__high_prec_dec__rounded_integer and ++// wuffs_private_impl__high_prec_dec__lshift_num_new_digits have the same ++// preconditions. ++// ++// wuffs_private_impl__high_prec_dec__lshift keeps the first two preconditions ++// but not the last two. Its shift argument is signed and does not need to be ++// "small": zero is a no-op, positive means left shift and negative means right ++// shift. + +- // Common formats above. Rarer formats below. ++static void // ++wuffs_private_impl__high_prec_dec__small_lshift( ++ wuffs_private_impl__high_prec_dec* h, ++ uint32_t shift) { ++ if (h->num_digits == 0) { ++ return; ++ } ++ uint32_t num_new_digits = ++ wuffs_private_impl__high_prec_dec__lshift_num_new_digits(h, shift); ++ uint32_t rx = h->num_digits - 1; // Read index. ++ uint32_t wx = h->num_digits - 1 + num_new_digits; // Write index. ++ uint64_t n = 0; + +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- return 0xFF000000 | (0x00010101 * ((uint32_t)(row[x]))); +- case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: +- return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 1]))); +- case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: +- return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 0]))); ++ // Repeat: pick up a digit, put down a digit, right to left. ++ while (((int32_t)rx) >= 0) { ++ n += ((uint64_t)(h->digits[rx])) << shift; ++ uint64_t quo = n / 10; ++ uint64_t rem = n - (10 * quo); ++ if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[wx] = (uint8_t)rem; ++ } else if (rem > 0) { ++ h->truncated = true; ++ } ++ n = quo; ++ wx--; ++ rx--; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: { +- uint8_t* palette = pb->private_impl.planes[3].ptr; +- return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(palette + +- (4 * ((size_t)row[x])))); ++ // Put down leading digits, right to left. ++ while (n > 0) { ++ uint64_t quo = n / 10; ++ uint64_t rem = n - (10 * quo); ++ if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[wx] = (uint8_t)rem; ++ } else if (rem > 0) { ++ h->truncated = true; + } ++ n = quo; ++ wx--; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(row + (2 * ((size_t)x)))); +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- return 0xFF000000 | +- wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x))); +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- return wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u64le__no_bounds_check(row + (8 * ((size_t)x)))); +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- return 0xFF000000 | +- wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))); ++ // Finish. ++ h->num_digits += num_new_digits; ++ if (h->num_digits > WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->num_digits = WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION; ++ } ++ h->decimal_point += (int32_t)num_new_digits; ++ wuffs_private_impl__high_prec_dec__trim(h); ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__swap_u32_argb_abgr( +- 0xFF000000 | +- wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x)))); +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- return wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(row + +- (4 * ((size_t)x))))); +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- return wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- return wuffs_base__swap_u32_argb_abgr( +- 0xFF000000 | +- wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); ++static void // ++wuffs_private_impl__high_prec_dec__small_rshift( ++ wuffs_private_impl__high_prec_dec* h, ++ uint32_t shift) { ++ uint32_t rx = 0; // Read index. ++ uint32_t wx = 0; // Write index. ++ uint64_t n = 0; + +- default: +- // TODO: support more formats. ++ // Pick up enough leading digits to cover the first shift. ++ while ((n >> shift) == 0) { ++ if (rx < h->num_digits) { ++ // Read a digit. ++ n = (10 * n) + h->digits[rx++]; ++ } else if (n == 0) { ++ // h's number used to be zero and remains zero. ++ return; ++ } else { ++ // Read sufficient implicit trailing zeroes. ++ while ((n >> shift) == 0) { ++ n = 10 * n; ++ rx++; ++ } + break; ++ } ++ } ++ h->decimal_point -= ((int32_t)(rx - 1)); ++ if (h->decimal_point < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) { ++ // After the shift, h's number is effectively zero. ++ h->num_digits = 0; ++ h->decimal_point = 0; ++ h->truncated = false; ++ return; + } + +- return 0; ++ // Repeat: pick up a digit, put down a digit, left to right. ++ uint64_t mask = (((uint64_t)(1)) << shift) - 1; ++ while (rx < h->num_digits) { ++ uint8_t new_digit = ((uint8_t)(n >> shift)); ++ n = (10 * (n & mask)) + h->digits[rx++]; ++ h->digits[wx++] = new_digit; ++ } ++ ++ // Put down trailing digits, left to right. ++ while (n > 0) { ++ uint8_t new_digit = ((uint8_t)(n >> shift)); ++ n = 10 * (n & mask); ++ if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[wx++] = new_digit; ++ } else if (new_digit > 0) { ++ h->truncated = true; ++ } ++ } ++ ++ // Finish. ++ h->num_digits = wx; ++ wuffs_private_impl__high_prec_dec__trim(h); ++} ++ ++static void // ++wuffs_private_impl__high_prec_dec__lshift(wuffs_private_impl__high_prec_dec* h, ++ int32_t shift) { ++ if (shift > 0) { ++ while (shift > +WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) { ++ wuffs_private_impl__high_prec_dec__small_lshift( ++ h, WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL); ++ shift -= WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL; ++ } ++ wuffs_private_impl__high_prec_dec__small_lshift(h, ((uint32_t)(+shift))); ++ } else if (shift < 0) { ++ while (shift < -WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) { ++ wuffs_private_impl__high_prec_dec__small_rshift( ++ h, WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL); ++ shift += WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL; ++ } ++ wuffs_private_impl__high_prec_dec__small_rshift(h, ((uint32_t)(-shift))); ++ } + } + + // -------- + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +-wuffs_base__pixel_buffer__set_color_u32_at( +- wuffs_base__pixel_buffer* pb, +- uint32_t x, +- uint32_t y, +- wuffs_base__color_u32_argb_premul color) { +- if (!pb) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++// wuffs_private_impl__high_prec_dec__round_etc rounds h's number. For those ++// functions that take an n argument, rounding produces at most n digits (which ++// is not necessarily at most n decimal places). Negative n values are ignored, ++// as well as any n greater than or equal to h's number of digits. The ++// etc__round_just_enough function implicitly chooses an n to implement ++// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION. ++// ++// Preconditions: ++// - h is non-NULL. ++// - h->decimal_point is "not extreme". ++// ++// "Not extreme" means within ±WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE. ++ ++static void // ++wuffs_private_impl__high_prec_dec__round_down( ++ wuffs_private_impl__high_prec_dec* h, ++ int32_t n) { ++ if ((n < 0) || (h->num_digits <= (uint32_t)n)) { ++ return; + } +- if ((x >= pb->pixcfg.private_impl.width) || +- (y >= pb->pixcfg.private_impl.height)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ h->num_digits = (uint32_t)(n); ++ wuffs_private_impl__high_prec_dec__trim(h); ++} ++ ++static void // ++wuffs_private_impl__high_prec_dec__round_up( ++ wuffs_private_impl__high_prec_dec* h, ++ int32_t n) { ++ if ((n < 0) || (h->num_digits <= (uint32_t)n)) { ++ return; + } + +- if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { +- // TODO: support planar formats. +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ for (n--; n >= 0; n--) { ++ if (h->digits[n] < 9) { ++ h->digits[n]++; ++ h->num_digits = (uint32_t)(n + 1); ++ return; ++ } + } + +- size_t stride = pb->private_impl.planes[0].stride; +- uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)); ++ // The number is all 9s. Change to a single 1 and adjust the decimal point. ++ h->digits[0] = 1; ++ h->num_digits = 1; ++ h->decimal_point++; ++} + +- switch (pb->pixcfg.private_impl.pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- wuffs_base__poke_u32le__no_bounds_check(row + (4 * ((size_t)x)), color); +- break; ++static void // ++wuffs_private_impl__high_prec_dec__round_nearest( ++ wuffs_private_impl__high_prec_dec* h, ++ int32_t n) { ++ if ((n < 0) || (h->num_digits <= (uint32_t)n)) { ++ return; ++ } ++ bool up = h->digits[n] >= 5; ++ if ((h->digits[n] == 5) && ((n + 1) == ((int32_t)(h->num_digits)))) { ++ up = h->truncated || // ++ ((n > 0) && ((h->digits[n - 1] & 1) != 0)); ++ } + +- // Common formats above. Rarer formats below. +- +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- wuffs_base__poke_u8__no_bounds_check( +- row + ((size_t)x), +- wuffs_base__color_u32_argb_premul__as__color_u8_gray(color)); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: +- wuffs_base__poke_u16le__no_bounds_check( +- row + (2 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u16_gray(color)); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: +- wuffs_base__poke_u16be__no_bounds_check( +- row + (2 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u16_gray(color)); +- break; +- +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: +- wuffs_base__poke_u8__no_bounds_check( +- row + ((size_t)x), wuffs_base__pixel_palette__closest_element( +- wuffs_base__pixel_buffer__palette(pb), +- pb->pixcfg.private_impl.pixfmt, color)); +- break; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- wuffs_base__poke_u16le__no_bounds_check( +- row + (2 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color)); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- wuffs_base__poke_u24le__no_bounds_check(row + (3 * ((size_t)x)), color); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- wuffs_base__poke_u32le__no_bounds_check( +- row + (4 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- color)); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- wuffs_base__poke_u64le__no_bounds_check( +- row + (8 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul( +- color)); +- break; +- +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- wuffs_base__poke_u24le__no_bounds_check( +- row + (3 * ((size_t)x)), wuffs_base__swap_u32_argb_abgr(color)); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- wuffs_base__poke_u32le__no_bounds_check( +- row + (4 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- wuffs_base__swap_u32_argb_abgr(color))); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- wuffs_base__poke_u32le__no_bounds_check( +- row + (4 * ((size_t)x)), wuffs_base__swap_u32_argb_abgr(color)); +- break; +- +- default: +- // TODO: support more formats. +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ if (up) { ++ wuffs_private_impl__high_prec_dec__round_up(h, n); ++ } else { ++ wuffs_private_impl__high_prec_dec__round_down(h, n); + } +- +- return wuffs_base__make_status(NULL); + } + +-// -------- +- +-static inline void // +-wuffs_base__pixel_buffer__set_color_u32_fill_rect__xx( +- wuffs_base__pixel_buffer* pb, +- wuffs_base__rect_ie_u32 rect, +- uint16_t color) { +- size_t stride = pb->private_impl.planes[0].stride; +- uint32_t width = wuffs_base__rect_ie_u32__width(&rect); +- if ((stride == (2 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { +- uint8_t* ptr = +- pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); +- uint32_t height = wuffs_base__rect_ie_u32__height(&rect); +- size_t n; +- for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { +- wuffs_base__poke_u16le__no_bounds_check(ptr, color); +- ptr += 2; +- } ++static void // ++wuffs_private_impl__high_prec_dec__round_just_enough( ++ wuffs_private_impl__high_prec_dec* h, ++ int32_t exp2, ++ uint64_t mantissa) { ++ // The magic numbers 52 and 53 in this function are because IEEE 754 double ++ // precision has 52 mantissa bits. ++ // ++ // Let f be the floating point number represented by exp2 and mantissa (and ++ // also the number in h): the number (mantissa * (2 ** (exp2 - 52))). ++ // ++ // If f is zero or a small integer, we can return early. ++ if ((mantissa == 0) || ++ ((exp2 < 53) && (h->decimal_point >= ((int32_t)(h->num_digits))))) { + return; + } + +- uint32_t y; +- for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { +- uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + +- (2 * ((size_t)rect.min_incl_x)); +- uint32_t n; +- for (n = width; n > 0; n--) { +- wuffs_base__poke_u16le__no_bounds_check(ptr, color); +- ptr += 2; +- } +- } +-} ++ // The smallest normal f has an exp2 of -1022 and a mantissa of (1 << 52). ++ // Subnormal numbers have the same exp2 but a smaller mantissa. ++ static const int32_t min_incl_normal_exp2 = -1022; ++ static const uint64_t min_incl_normal_mantissa = 0x0010000000000000ul; + +-static inline void // +-wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxx( +- wuffs_base__pixel_buffer* pb, +- wuffs_base__rect_ie_u32 rect, +- uint32_t color) { +- size_t stride = pb->private_impl.planes[0].stride; +- uint32_t width = wuffs_base__rect_ie_u32__width(&rect); +- if ((stride == (3 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { +- uint8_t* ptr = +- pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); +- uint32_t height = wuffs_base__rect_ie_u32__height(&rect); +- size_t n; +- for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { +- wuffs_base__poke_u24le__no_bounds_check(ptr, color); +- ptr += 3; +- } +- return; ++ // Compute lower and upper bounds such that any number between them (possibly ++ // inclusive) will round to f. First, the lower bound. Our number f is: ++ // ((mantissa + 0) * (2 ** ( exp2 - 52))) ++ // ++ // The next lowest floating point number is: ++ // ((mantissa - 1) * (2 ** ( exp2 - 52))) ++ // unless (mantissa - 1) drops the (1 << 52) bit and exp2 is not the ++ // min_incl_normal_exp2. Either way, call it: ++ // ((l_mantissa) * (2 ** (l_exp2 - 52))) ++ // ++ // The lower bound is halfway between them (noting that 52 became 53): ++ // (((2 * l_mantissa) + 1) * (2 ** (l_exp2 - 53))) ++ int32_t l_exp2 = exp2; ++ uint64_t l_mantissa = mantissa - 1; ++ if ((exp2 > min_incl_normal_exp2) && (mantissa <= min_incl_normal_mantissa)) { ++ l_exp2 = exp2 - 1; ++ l_mantissa = (2 * mantissa) - 1; + } ++ wuffs_private_impl__high_prec_dec lower; ++ wuffs_private_impl__high_prec_dec__assign(&lower, (2 * l_mantissa) + 1, ++ false); ++ wuffs_private_impl__high_prec_dec__lshift(&lower, l_exp2 - 53); + +- uint32_t y; +- for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { +- uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + +- (3 * ((size_t)rect.min_incl_x)); +- uint32_t n; +- for (n = width; n > 0; n--) { +- wuffs_base__poke_u24le__no_bounds_check(ptr, color); +- ptr += 3; +- } +- } +-} ++ // Next, the upper bound. Our number f is: ++ // ((mantissa + 0) * (2 ** (exp2 - 52))) ++ // ++ // The next highest floating point number is: ++ // ((mantissa + 1) * (2 ** (exp2 - 52))) ++ // ++ // The upper bound is halfway between them (noting that 52 became 53): ++ // (((2 * mantissa) + 1) * (2 ** (exp2 - 53))) ++ wuffs_private_impl__high_prec_dec upper; ++ wuffs_private_impl__high_prec_dec__assign(&upper, (2 * mantissa) + 1, false); ++ wuffs_private_impl__high_prec_dec__lshift(&upper, exp2 - 53); + +-static inline void // +-wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx( +- wuffs_base__pixel_buffer* pb, +- wuffs_base__rect_ie_u32 rect, +- uint32_t color) { +- size_t stride = pb->private_impl.planes[0].stride; +- uint32_t width = wuffs_base__rect_ie_u32__width(&rect); +- if ((stride == (4 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { +- uint8_t* ptr = +- pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); +- uint32_t height = wuffs_base__rect_ie_u32__height(&rect); +- size_t n; +- for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { +- wuffs_base__poke_u32le__no_bounds_check(ptr, color); +- ptr += 4; +- } +- return; +- } ++ // The lower and upper bounds are possible outputs only if the original ++ // mantissa is even, so that IEEE round-to-even would round to the original ++ // mantissa and not its neighbors. ++ bool inclusive = (mantissa & 1) == 0; + +- uint32_t y; +- for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { +- uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + +- (4 * ((size_t)rect.min_incl_x)); +- uint32_t n; +- for (n = width; n > 0; n--) { +- wuffs_base__poke_u32le__no_bounds_check(ptr, color); +- ptr += 4; +- } +- } +-} ++ // As we walk the digits, we want to know whether rounding up would fall ++ // within the upper bound. This is tracked by upper_delta: ++ // - When -1, the digits of h and upper are the same so far. ++ // - When +0, we saw a difference of 1 between h and upper on a previous ++ // digit and subsequently only 9s for h and 0s for upper. Thus, rounding ++ // up may fall outside of the bound if !inclusive. ++ // - When +1, the difference is greater than 1 and we know that rounding up ++ // falls within the bound. ++ // ++ // This is a state machine with three states. The numerical value for each ++ // state (-1, +0 or +1) isn't important, other than their order. ++ int upper_delta = -1; + +-static inline void // +-wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx( +- wuffs_base__pixel_buffer* pb, +- wuffs_base__rect_ie_u32 rect, +- uint64_t color) { +- size_t stride = pb->private_impl.planes[0].stride; +- uint32_t width = wuffs_base__rect_ie_u32__width(&rect); +- if ((stride == (8 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { +- uint8_t* ptr = +- pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); +- uint32_t height = wuffs_base__rect_ie_u32__height(&rect); +- size_t n; +- for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { +- wuffs_base__poke_u64le__no_bounds_check(ptr, color); +- ptr += 8; ++ // We can now figure out the shortest number of digits required. Walk the ++ // digits until h has distinguished itself from lower or upper. ++ // ++ // The zi and zd variables are indexes and digits, for z in l (lower), h (the ++ // number) and u (upper). ++ // ++ // The lower, h and upper numbers may have their decimal points at different ++ // places. In this case, upper is the longest, so we iterate ui starting from ++ // 0 and iterate li and hi starting from either 0 or -1. ++ int32_t ui = 0; ++ for (;; ui++) { ++ // Calculate hd, the middle number's digit. ++ int32_t hi = ui - upper.decimal_point + h->decimal_point; ++ if (hi >= ((int32_t)(h->num_digits))) { ++ break; + } +- return; +- } ++ uint8_t hd = (((uint32_t)hi) < h->num_digits) ? h->digits[hi] : 0; + +- uint32_t y; +- for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { +- uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + +- (8 * ((size_t)rect.min_incl_x)); +- uint32_t n; +- for (n = width; n > 0; n--) { +- wuffs_base__poke_u64le__no_bounds_check(ptr, color); +- ptr += 8; ++ // Calculate ld, the lower bound's digit. ++ int32_t li = ui - upper.decimal_point + lower.decimal_point; ++ uint8_t ld = (((uint32_t)li) < lower.num_digits) ? lower.digits[li] : 0; ++ ++ // We can round down (truncate) if lower has a different digit than h or if ++ // lower is inclusive and is exactly the result of rounding down (i.e. we ++ // have reached the final digit of lower). ++ bool can_round_down = ++ (ld != hd) || // ++ (inclusive && ((li + 1) == ((int32_t)(lower.num_digits)))); ++ ++ // Calculate ud, the upper bound's digit, and update upper_delta. ++ uint8_t ud = (((uint32_t)ui) < upper.num_digits) ? upper.digits[ui] : 0; ++ if (upper_delta < 0) { ++ if ((hd + 1) < ud) { ++ // For example: ++ // h = 12345??? ++ // upper = 12347??? ++ upper_delta = +1; ++ } else if (hd != ud) { ++ // For example: ++ // h = 12345??? ++ // upper = 12346??? ++ upper_delta = +0; ++ } ++ } else if (upper_delta == 0) { ++ if ((hd != 9) || (ud != 0)) { ++ // For example: ++ // h = 1234598? ++ // upper = 1234600? ++ upper_delta = +1; ++ } + } +- } +-} + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +-wuffs_base__pixel_buffer__set_color_u32_fill_rect( +- wuffs_base__pixel_buffer* pb, +- wuffs_base__rect_ie_u32 rect, +- wuffs_base__color_u32_argb_premul color) { +- if (!pb) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } else if (wuffs_base__rect_ie_u32__is_empty(&rect)) { +- return wuffs_base__make_status(NULL); +- } +- wuffs_base__rect_ie_u32 bounds = +- wuffs_base__pixel_config__bounds(&pb->pixcfg); +- if (!wuffs_base__rect_ie_u32__contains_rect(&bounds, rect)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } ++ // We can round up if upper has a different digit than h and either upper ++ // is inclusive or upper is bigger than the result of rounding up. ++ bool can_round_up = ++ (upper_delta > 0) || // ++ ((upper_delta == 0) && // ++ (inclusive || ((ui + 1) < ((int32_t)(upper.num_digits))))); + +- if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { +- // TODO: support planar formats. +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ // If we can round either way, round to nearest. If we can round only one ++ // way, do it. If we can't round, continue the loop. ++ if (can_round_down) { ++ if (can_round_up) { ++ wuffs_private_impl__high_prec_dec__round_nearest(h, hi + 1); ++ return; ++ } else { ++ wuffs_private_impl__high_prec_dec__round_down(h, hi + 1); ++ return; ++ } ++ } else { ++ if (can_round_up) { ++ wuffs_private_impl__high_prec_dec__round_up(h, hi + 1); ++ return; ++ } ++ } + } ++} + +- switch (pb->pixcfg.private_impl.pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx(pb, rect, color); +- return wuffs_base__make_status(NULL); +- +- // Common formats above. Rarer formats below. ++// -------- + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xx( +- pb, rect, +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color)); +- return wuffs_base__make_status(NULL); ++// wuffs_private_impl__parse_number_f64_eisel_lemire produces the IEEE 754 ++// double-precision value for an exact mantissa and base-10 exponent. For ++// example: ++// - when parsing "12345.678e+02", man is 12345678 and exp10 is -1. ++// - when parsing "-12", man is 12 and exp10 is 0. Processing the leading ++// minus sign is the responsibility of the caller, not this function. ++// ++// On success, it returns a non-negative int64_t such that the low 63 bits hold ++// the 11-bit exponent and 52-bit mantissa. ++// ++// On failure, it returns a negative value. ++// ++// The algorithm is based on an original idea by Michael Eisel that was refined ++// by Daniel Lemire. See ++// https://lemire.me/blog/2020/03/10/fast-float-parsing-in-practice/ ++// and ++// https://nigeltao.github.io/blog/2020/eisel-lemire.html ++// ++// Preconditions: ++// - man is non-zero. ++// - exp10 is in the range [-307 ..= 288], the same range of the ++// wuffs_private_impl__powers_of_10 array. ++// ++// The exp10 range (and the fact that man is in the range [1 ..= UINT64_MAX], ++// approximately [1 ..= 1.85e+19]) means that (man * (10 ** exp10)) is in the ++// range [1e-307 ..= 1.85e+307]. This is entirely within the range of normal ++// (neither subnormal nor non-finite) f64 values: DBL_MIN and DBL_MAX are ++// approximately 2.23e–308 and 1.80e+308. ++static int64_t // ++wuffs_private_impl__parse_number_f64_eisel_lemire(uint64_t man, int32_t exp10) { ++ // Look up the (possibly truncated) base-2 representation of (10 ** exp10). ++ // The look-up table was constructed so that it is already normalized: the ++ // table entry's mantissa's MSB (most significant bit) is on. ++ const uint64_t* po10 = &wuffs_private_impl__powers_of_10[exp10 + 307][0]; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxx(pb, rect, color); +- return wuffs_base__make_status(NULL); ++ // Normalize the man argument. The (man != 0) precondition means that a ++ // non-zero bit exists. ++ uint32_t clz = wuffs_base__count_leading_zeroes_u64(man); ++ man <<= clz; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx( +- pb, rect, +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- color)); +- return wuffs_base__make_status(NULL); ++ // Calculate the return value's base-2 exponent. We might tweak it by ±1 ++ // later, but its initial value comes from a linear scaling of exp10, ++ // converting from power-of-10 to power-of-2, and adjusting by clz. ++ // ++ // The magic constants are: ++ // - 1087 = 1023 + 64. The 1023 is the f64 exponent bias. The 64 is because ++ // the look-up table uses 64-bit mantissas. ++ // - 217706 is such that the ratio 217706 / 65536 ≈ 3.321930 is close enough ++ // (over the practical range of exp10) to log(10) / log(2) ≈ 3.321928. ++ // - 65536 = 1<<16 is arbitrary but a power of 2, so division is a shift. ++ // ++ // Equality of the linearly-scaled value and the actual power-of-2, over the ++ // range of exp10 arguments that this function accepts, is confirmed by ++ // script/print-mpb-powers-of-10.go ++ uint64_t ret_exp2 = ++ ((uint64_t)(((217706 * exp10) >> 16) + 1087)) - ((uint64_t)clz); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx( +- pb, rect, +- wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul( +- color)); +- return wuffs_base__make_status(NULL); ++ // Multiply the two mantissas. Normalization means that both mantissas are at ++ // least (1<<63), so the 128-bit product must be at least (1<<126). The high ++ // 64 bits of the product, x_hi, must therefore be at least (1<<62). ++ // ++ // As a consequence, x_hi has either 0 or 1 leading zeroes. Shifting x_hi ++ // right by either 9 or 10 bits (depending on x_hi's MSB) will therefore ++ // leave the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. ++ wuffs_base__multiply_u64__output x = wuffs_base__multiply_u64(man, po10[1]); ++ uint64_t x_hi = x.hi; ++ uint64_t x_lo = x.lo; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx( +- pb, rect, +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- wuffs_base__swap_u32_argb_abgr(color))); +- return wuffs_base__make_status(NULL); ++ // Before we shift right by at least 9 bits, recall that the look-up table ++ // entry was possibly truncated. We have so far only calculated a lower bound ++ // for the product (man * e), where e is (10 ** exp10). The upper bound would ++ // add a further (man * 1) to the 128-bit product, which overflows the lower ++ // 64-bit limb if ((x_lo + man) < man). ++ // ++ // If overflow occurs, that adds 1 to x_hi. Since we're about to shift right ++ // by at least 9 bits, that carried 1 can be ignored unless the higher 64-bit ++ // limb's low 9 bits are all on. ++ // ++ // For example, parsing "9999999999999999999" will take the if-true branch ++ // here, since: ++ // - x_hi = 0x4563918244F3FFFF ++ // - x_lo = 0x8000000000000000 ++ // - man = 0x8AC7230489E7FFFF ++ if (((x_hi & 0x1FF) == 0x1FF) && ((x_lo + man) < man)) { ++ // Refine our calculation of (man * e). Before, our approximation of e used ++ // a "low resolution" 64-bit mantissa. Now use a "high resolution" 128-bit ++ // mantissa. We've already calculated x = (man * bits_0_to_63_incl_of_e). ++ // Now calculate y = (man * bits_64_to_127_incl_of_e). ++ wuffs_base__multiply_u64__output y = wuffs_base__multiply_u64(man, po10[0]); ++ uint64_t y_hi = y.hi; ++ uint64_t y_lo = y.lo; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx( +- pb, rect, wuffs_base__swap_u32_argb_abgr(color)); +- return wuffs_base__make_status(NULL); +- } ++ // Merge the 128-bit x and 128-bit y, which overlap by 64 bits, to ++ // calculate the 192-bit product of the 64-bit man by the 128-bit e. ++ // As we exit this if-block, we only care about the high 128 bits ++ // (merged_hi and merged_lo) of that 192-bit product. ++ // ++ // For example, parsing "1.234e-45" will take the if-true branch here, ++ // since: ++ // - x_hi = 0x70B7E3696DB29FFF ++ // - x_lo = 0xE040000000000000 ++ // - y_hi = 0x33718BBEAB0E0D7A ++ // - y_lo = 0xA880000000000000 ++ uint64_t merged_hi = x_hi; ++ uint64_t merged_lo = x_lo + y_hi; ++ if (merged_lo < x_lo) { ++ merged_hi++; // Carry the overflow bit. ++ } + +- uint32_t y; +- for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { +- uint32_t x; +- for (x = rect.min_incl_x; x < rect.max_excl_x; x++) { +- wuffs_base__pixel_buffer__set_color_u32_at(pb, x, y, color); ++ // The "high resolution" approximation of e is still a lower bound. Once ++ // again, see if the upper bound is large enough to produce a different ++ // result. This time, if it does, give up instead of reaching for an even ++ // more precise approximation to e. ++ // ++ // This three-part check is similar to the two-part check that guarded the ++ // if block that we're now in, but it has an extra term for the middle 64 ++ // bits (checking that adding 1 to merged_lo would overflow). ++ // ++ // For example, parsing "5.9604644775390625e-8" will take the if-true ++ // branch here, since: ++ // - merged_hi = 0x7FFFFFFFFFFFFFFF ++ // - merged_lo = 0xFFFFFFFFFFFFFFFF ++ // - y_lo = 0x4DB3FFC120988200 ++ // - man = 0xD3C21BCECCEDA100 ++ if (((merged_hi & 0x1FF) == 0x1FF) && ((merged_lo + 1) == 0) && ++ (y_lo + man < man)) { ++ return -1; + } ++ ++ // Replace the 128-bit x with merged. ++ x_hi = merged_hi; ++ x_lo = merged_lo; + } +- return wuffs_base__make_status(NULL); +-} + +-// -------- ++ // As mentioned above, shifting x_hi right by either 9 or 10 bits will leave ++ // the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. If the ++ // MSB (before shifting) was on, adjust ret_exp2 for the larger shift. ++ // ++ // Having bit 53 on (and higher bits off) means that ret_mantissa is a 54-bit ++ // number. ++ uint64_t msb = x_hi >> 63; ++ uint64_t ret_mantissa = x_hi >> (msb + 9); ++ ret_exp2 -= 1 ^ msb; + +-WUFFS_BASE__MAYBE_STATIC uint8_t // +-wuffs_base__pixel_palette__closest_element( +- wuffs_base__slice_u8 palette_slice, +- wuffs_base__pixel_format palette_format, +- wuffs_base__color_u32_argb_premul c) { +- size_t n = palette_slice.len / 4; +- if (n > (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- n = (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4); ++ // IEEE 754 rounds to-nearest with ties rounded to-even. Rounding to-even can ++ // be tricky. If we're half-way between two exactly representable numbers ++ // (x's low 73 bits are zero and the next 2 bits that matter are "01"), give ++ // up instead of trying to pick the winner. ++ // ++ // Technically, we could tighten the condition by changing "73" to "73 or 74, ++ // depending on msb", but a flat "73" is simpler. ++ // ++ // For example, parsing "1e+23" will take the if-true branch here, since: ++ // - x_hi = 0x54B40B1F852BDA00 ++ // - ret_mantissa = 0x002A5A058FC295ED ++ if ((x_lo == 0) && ((x_hi & 0x1FF) == 0) && ((ret_mantissa & 3) == 1)) { ++ return -1; + } +- size_t best_index = 0; +- uint64_t best_score = 0xFFFFFFFFFFFFFFFF; + +- // Work in 16-bit color. +- uint32_t ca = 0x101 * (0xFF & (c >> 24)); +- uint32_t cr = 0x101 * (0xFF & (c >> 16)); +- uint32_t cg = 0x101 * (0xFF & (c >> 8)); +- uint32_t cb = 0x101 * (0xFF & (c >> 0)); +- +- switch (palette_format.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: { +- bool nonpremul = palette_format.repr == +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL; +- +- size_t i; +- for (i = 0; i < n; i++) { +- // Work in 16-bit color. +- uint32_t pb = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 0])); +- uint32_t pg = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 1])); +- uint32_t pr = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 2])); +- uint32_t pa = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 3])); +- +- // Convert to premultiplied alpha. +- if (nonpremul && (pa != 0xFFFF)) { +- pb = (pb * pa) / 0xFFFF; +- pg = (pg * pa) / 0xFFFF; +- pr = (pr * pa) / 0xFFFF; +- } +- +- // These deltas are conceptually int32_t (signed) but after squaring, +- // it's equivalent to work in uint32_t (unsigned). +- pb -= cb; +- pg -= cg; +- pr -= cr; +- pa -= ca; +- uint64_t score = ((uint64_t)(pb * pb)) + ((uint64_t)(pg * pg)) + +- ((uint64_t)(pr * pr)) + ((uint64_t)(pa * pa)); +- if (best_score > score) { +- best_score = score; +- best_index = i; +- } +- } +- break; +- } ++ // If we're not halfway then it's rounding to-nearest. Starting with a 54-bit ++ // number, carry the lowest bit (bit 0) up if it's on. Regardless of whether ++ // it was on or off, shifting right by one then produces a 53-bit number. If ++ // carrying up overflowed, shift again. ++ ret_mantissa += ret_mantissa & 1; ++ ret_mantissa >>= 1; ++ // This if block is equivalent to (but benchmarks slightly faster than) the ++ // following branchless form: ++ // uint64_t overflow_adjustment = ret_mantissa >> 53; ++ // ret_mantissa >>= overflow_adjustment; ++ // ret_exp2 += overflow_adjustment; ++ // ++ // For example, parsing "7.2057594037927933e+16" will take the if-true ++ // branch here, since: ++ // - x_hi = 0x7FFFFFFFFFFFFE80 ++ // - ret_mantissa = 0x0020000000000000 ++ if ((ret_mantissa >> 53) > 0) { ++ ret_mantissa >>= 1; ++ ret_exp2++; + } + +- return (uint8_t)best_index; ++ // Starting with a 53-bit number, IEEE 754 double-precision normal numbers ++ // have an implicit mantissa bit. Mask that away and keep the low 52 bits. ++ ret_mantissa &= 0x000FFFFFFFFFFFFF; ++ ++ // Pack the bits and return. ++ return ((int64_t)(ret_mantissa | (ret_exp2 << 52))); + } + + // -------- + +-static inline uint32_t // +-wuffs_base__composite_nonpremul_nonpremul_u32_axxx(uint32_t dst_nonpremul, +- uint32_t src_nonpremul) { +- // Extract 16-bit color components. +- // +- // If the destination is transparent then SRC_OVER is equivalent to SRC: just +- // return src_nonpremul. This isn't just an optimization (skipping the rest +- // of the function's computation). It also preserves the nonpremul +- // distinction between e.g. transparent red and transparent blue that would +- // otherwise be lost by converting from nonpremul to premul and back. +- uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24)); +- if (da == 0) { +- return src_nonpremul; +- } +- uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16)); +- uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8)); +- uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0)); +- uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24)); +- uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16)); +- uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8)); +- uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0)); +- +- // Convert dst from nonpremul to premul. +- dr = (dr * da) / 0xFFFF; +- dg = (dg * da) / 0xFFFF; +- db = (db * da) / 0xFFFF; ++static wuffs_base__result_f64 // ++wuffs_private_impl__parse_number_f64_special(wuffs_base__slice_u8 s, ++ uint32_t options) { ++ do { ++ if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) { ++ goto fail; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ uint8_t* p = s.ptr; ++ uint8_t* q = s.ptr + s.len; + +- // Composite src (nonpremul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ if (p >= q) { ++ goto fail; ++ } + +- // Convert dst from premul to nonpremul. +- if (da != 0) { +- dr = (dr * 0xFFFF) / da; +- dg = (dg * 0xFFFF) / da; +- db = (db * 0xFFFF) / da; +- } ++ // Parse sign. ++ bool negative = false; ++ do { ++ if (*p == '+') { ++ p++; ++ } else if (*p == '-') { ++ negative = true; ++ p++; ++ } else { ++ break; ++ } ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ } while (0); ++ if (p >= q) { ++ goto fail; ++ } + +- // Convert from 16-bit color to 8-bit color. +- da >>= 8; +- dr >>= 8; +- dg >>= 8; +- db >>= 8; ++ bool nan = false; ++ switch (p[0]) { ++ case 'I': ++ case 'i': ++ if (((q - p) < 3) || // ++ ((p[1] != 'N') && (p[1] != 'n')) || // ++ ((p[2] != 'F') && (p[2] != 'f'))) { ++ goto fail; ++ } ++ p += 3; + +- // Combine components. +- return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); +-} ++ if ((p >= q) || (*p == '_')) { ++ break; ++ } else if (((q - p) < 5) || // ++ ((p[0] != 'I') && (p[0] != 'i')) || // ++ ((p[1] != 'N') && (p[1] != 'n')) || // ++ ((p[2] != 'I') && (p[2] != 'i')) || // ++ ((p[3] != 'T') && (p[3] != 't')) || // ++ ((p[4] != 'Y') && (p[4] != 'y'))) { ++ goto fail; ++ } ++ p += 5; + +-static inline uint64_t // +-wuffs_base__composite_nonpremul_nonpremul_u64_axxx(uint64_t dst_nonpremul, +- uint64_t src_nonpremul) { +- // Extract components. +- // +- // If the destination is transparent then SRC_OVER is equivalent to SRC: just +- // return src_nonpremul. This isn't just an optimization (skipping the rest +- // of the function's computation). It also preserves the nonpremul +- // distinction between e.g. transparent red and transparent blue that would +- // otherwise be lost by converting from nonpremul to premul and back. +- uint64_t da = 0xFFFF & (dst_nonpremul >> 48); +- if (da == 0) { +- return src_nonpremul; +- } +- uint64_t dr = 0xFFFF & (dst_nonpremul >> 32); +- uint64_t dg = 0xFFFF & (dst_nonpremul >> 16); +- uint64_t db = 0xFFFF & (dst_nonpremul >> 0); +- uint64_t sa = 0xFFFF & (src_nonpremul >> 48); +- uint64_t sr = 0xFFFF & (src_nonpremul >> 32); +- uint64_t sg = 0xFFFF & (src_nonpremul >> 16); +- uint64_t sb = 0xFFFF & (src_nonpremul >> 0); ++ if ((p >= q) || (*p == '_')) { ++ break; ++ } ++ goto fail; + +- // Convert dst from nonpremul to premul. +- dr = (dr * da) / 0xFFFF; +- dg = (dg * da) / 0xFFFF; +- db = (db * da) / 0xFFFF; ++ case 'N': ++ case 'n': ++ if (((q - p) < 3) || // ++ ((p[1] != 'A') && (p[1] != 'a')) || // ++ ((p[2] != 'N') && (p[2] != 'n'))) { ++ goto fail; ++ } ++ p += 3; + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint64_t ia = 0xFFFF - sa; ++ if ((p >= q) || (*p == '_')) { ++ nan = true; ++ break; ++ } ++ goto fail; + +- // Composite src (nonpremul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ default: ++ goto fail; ++ } + +- // Convert dst from premul to nonpremul. +- if (da != 0) { +- dr = (dr * 0xFFFF) / da; +- dg = (dg * 0xFFFF) / da; +- db = (db * 0xFFFF) / da; +- } ++ // Finish. ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ if (p != q) { ++ goto fail; ++ } ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( ++ (nan ? 0x7FFFFFFFFFFFFFFF : 0x7FF0000000000000) | ++ (negative ? 0x8000000000000000 : 0)); ++ return ret; ++ } while (0); + +- // Combine components. +- return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); ++fail: ++ do { ++ wuffs_base__result_f64 ret; ++ ret.status.repr = wuffs_base__error__bad_argument; ++ ret.value = 0; ++ return ret; ++ } while (0); + } + +-static inline uint32_t // +-wuffs_base__composite_nonpremul_premul_u32_axxx(uint32_t dst_nonpremul, +- uint32_t src_premul) { +- // Extract 16-bit color components. +- uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24)); +- uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16)); +- uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8)); +- uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0)); +- uint32_t sa = 0x101 * (0xFF & (src_premul >> 24)); +- uint32_t sr = 0x101 * (0xFF & (src_premul >> 16)); +- uint32_t sg = 0x101 * (0xFF & (src_premul >> 8)); +- uint32_t sb = 0x101 * (0xFF & (src_premul >> 0)); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 // ++wuffs_private_impl__high_prec_dec__to_f64(wuffs_private_impl__high_prec_dec* h, ++ uint32_t options) { ++ do { ++ // powers converts decimal powers of 10 to binary powers of 2. For example, ++ // (10000 >> 13) is 1. It stops before the elements exceed 60, also known ++ // as WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL. ++ // ++ // This rounds down (1<<13 is a lower bound for 1e4). Adding 1 to the array ++ // element value rounds up (1<<14 is an upper bound for 1e4) while staying ++ // at or below WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL. ++ // ++ // When starting in the range [1e+1 .. 1e+2] (i.e. h->decimal_point == +2), ++ // powers[2] == 6 and so: ++ // - Right shifting by 6+0 produces the range [10/64 .. 100/64] = ++ // [0.156250 .. 1.56250]. The resultant h->decimal_point is +0 or +1. ++ // - Right shifting by 6+1 produces the range [10/128 .. 100/128] = ++ // [0.078125 .. 0.78125]. The resultant h->decimal_point is -1 or -0. ++ // ++ // When starting in the range [1e-3 .. 1e-2] (i.e. h->decimal_point == -2), ++ // powers[2] == 6 and so: ++ // - Left shifting by 6+0 produces the range [0.001*64 .. 0.01*64] = ++ // [0.064 .. 0.64]. The resultant h->decimal_point is -1 or -0. ++ // - Left shifting by 6+1 produces the range [0.001*128 .. 0.01*128] = ++ // [0.128 .. 1.28]. The resultant h->decimal_point is +0 or +1. ++ // ++ // Thus, when targeting h->decimal_point being +0 or +1, use (powers[n]+0) ++ // when right shifting but (powers[n]+1) when left shifting. ++ static const uint32_t num_powers = 19; ++ static const uint8_t powers[19] = { ++ 0, 3, 6, 9, 13, 16, 19, 23, 26, 29, // ++ 33, 36, 39, 43, 46, 49, 53, 56, 59, // ++ }; + +- // Convert dst from nonpremul to premul. +- dr = (dr * da) / 0xFFFF; +- dg = (dg * da) / 0xFFFF; +- db = (db * da) / 0xFFFF; ++ // Handle zero and obvious extremes. The largest and smallest positive ++ // finite f64 values are approximately 1.8e+308 and 4.9e-324. ++ if ((h->num_digits == 0) || (h->decimal_point < -326)) { ++ goto zero; ++ } else if (h->decimal_point > 310) { ++ goto infinity; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ // Try the fast Eisel-Lemire algorithm again. Calculating the (man, exp10) ++ // pair from the high_prec_dec h is more correct but slower than the ++ // approach taken in wuffs_base__parse_number_f64. The latter is optimized ++ // for the common cases (e.g. assuming no underscores or a leading '+' ++ // sign) rather than the full set of cases allowed by the Wuffs API. ++ // ++ // When we have 19 or fewer mantissa digits, run Eisel-Lemire once (trying ++ // for an exact result). When we have more than 19 mantissa digits, run it ++ // twice to get a lower and upper bound. We still have an exact result ++ // (within f64's rounding margin) if both bounds are equal (and valid). ++ uint32_t i_max = h->num_digits; ++ if (i_max > 19) { ++ i_max = 19; ++ } ++ int32_t exp10 = h->decimal_point - ((int32_t)i_max); ++ if ((-307 <= exp10) && (exp10 <= 288)) { ++ uint64_t man = 0; ++ uint32_t i; ++ for (i = 0; i < i_max; i++) { ++ man = (10 * man) + h->digits[i]; ++ } ++ while (man != 0) { // The 'while' is just an 'if' that we can 'break'. ++ int64_t r0 = ++ wuffs_private_impl__parse_number_f64_eisel_lemire(man + 0, exp10); ++ if (r0 < 0) { ++ break; ++ } else if (h->num_digits > 19) { ++ int64_t r1 = ++ wuffs_private_impl__parse_number_f64_eisel_lemire(man + 1, exp10); ++ if (r1 != r0) { ++ break; ++ } ++ } ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( ++ ((uint64_t)r0) | (((uint64_t)(h->negative)) << 63)); ++ return ret; ++ } ++ } + +- // Composite src (premul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); ++ // When Eisel-Lemire fails, fall back to Simple Decimal Conversion. See ++ // https://nigeltao.github.io/blog/2020/parse-number-f64-simple.html ++ // ++ // Scale by powers of 2 until we're in the range [0.1 .. 10]. Equivalently, ++ // that h->decimal_point is +0 or +1. ++ // ++ // First we shift right while at or above 10... ++ const int32_t f64_bias = -1023; ++ int32_t exp2 = 0; ++ while (h->decimal_point > 1) { ++ uint32_t n = (uint32_t)(+h->decimal_point); ++ uint32_t shift = (n < num_powers) ++ ? powers[n] ++ : WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL; + +- // Convert dst from premul to nonpremul. +- if (da != 0) { +- dr = (dr * 0xFFFF) / da; +- dg = (dg * 0xFFFF) / da; +- db = (db * 0xFFFF) / da; +- } ++ wuffs_private_impl__high_prec_dec__small_rshift(h, shift); ++ if (h->decimal_point < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) { ++ goto zero; ++ } ++ exp2 += (int32_t)shift; ++ } ++ // ...then we shift left while below 0.1. ++ while (h->decimal_point < 0) { ++ uint32_t shift; ++ uint32_t n = (uint32_t)(-h->decimal_point); ++ shift = (n < num_powers) ++ // The +1 is per "when targeting h->decimal_point being +0 or ++ // +1... when left shifting" in the powers comment above. ++ ? (powers[n] + 1u) ++ : WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL; + +- // Convert from 16-bit color to 8-bit color. +- da >>= 8; +- dr >>= 8; +- dg >>= 8; +- db >>= 8; ++ wuffs_private_impl__high_prec_dec__small_lshift(h, shift); ++ if (h->decimal_point > +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) { ++ goto infinity; ++ } ++ exp2 -= (int32_t)shift; ++ } + +- // Combine components. +- return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); +-} ++ // To get from "in the range [0.1 .. 10]" to "in the range [1 .. 2]" (which ++ // will give us our exponent in base-2), the mantissa's first 3 digits will ++ // determine the final left shift, equal to 52 (the number of explicit f64 ++ // bits) plus an additional adjustment. ++ int man3 = (100 * h->digits[0]) + ++ ((h->num_digits > 1) ? (10 * h->digits[1]) : 0) + ++ ((h->num_digits > 2) ? h->digits[2] : 0); ++ int32_t additional_lshift = 0; ++ if (h->decimal_point == 0) { // The value is in [0.1 .. 1]. ++ if (man3 < 125) { ++ additional_lshift = +4; ++ } else if (man3 < 250) { ++ additional_lshift = +3; ++ } else if (man3 < 500) { ++ additional_lshift = +2; ++ } else { ++ additional_lshift = +1; ++ } ++ } else { // The value is in [1 .. 10]. ++ if (man3 < 200) { ++ additional_lshift = -0; ++ } else if (man3 < 400) { ++ additional_lshift = -1; ++ } else if (man3 < 800) { ++ additional_lshift = -2; ++ } else { ++ additional_lshift = -3; ++ } ++ } ++ exp2 -= additional_lshift; ++ uint32_t final_lshift = (uint32_t)(52 + additional_lshift); + +-static inline uint64_t // +-wuffs_base__composite_nonpremul_premul_u64_axxx(uint64_t dst_nonpremul, +- uint64_t src_premul) { +- // Extract components. +- uint64_t da = 0xFFFF & (dst_nonpremul >> 48); +- uint64_t dr = 0xFFFF & (dst_nonpremul >> 32); +- uint64_t dg = 0xFFFF & (dst_nonpremul >> 16); +- uint64_t db = 0xFFFF & (dst_nonpremul >> 0); +- uint64_t sa = 0xFFFF & (src_premul >> 48); +- uint64_t sr = 0xFFFF & (src_premul >> 32); +- uint64_t sg = 0xFFFF & (src_premul >> 16); +- uint64_t sb = 0xFFFF & (src_premul >> 0); ++ // The minimum normal exponent is (f64_bias + 1). ++ while ((f64_bias + 1) > exp2) { ++ uint32_t n = (uint32_t)((f64_bias + 1) - exp2); ++ if (n > WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) { ++ n = WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL; ++ } ++ wuffs_private_impl__high_prec_dec__small_rshift(h, n); ++ exp2 += (int32_t)n; ++ } + +- // Convert dst from nonpremul to premul. +- dr = (dr * da) / 0xFFFF; +- dg = (dg * da) / 0xFFFF; +- db = (db * da) / 0xFFFF; ++ // Check for overflow. ++ if ((exp2 - f64_bias) >= 0x07FF) { // (1 << 11) - 1. ++ goto infinity; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint64_t ia = 0xFFFF - sa; ++ // Extract 53 bits for the mantissa (in base-2). ++ wuffs_private_impl__high_prec_dec__small_lshift(h, final_lshift); ++ uint64_t man2 = wuffs_private_impl__high_prec_dec__rounded_integer(h); + +- // Composite src (premul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); ++ // Rounding might have added one bit. If so, shift and re-check overflow. ++ if ((man2 >> 53) != 0) { ++ man2 >>= 1; ++ exp2++; ++ if ((exp2 - f64_bias) >= 0x07FF) { // (1 << 11) - 1. ++ goto infinity; ++ } ++ } + +- // Convert dst from premul to nonpremul. +- if (da != 0) { +- dr = (dr * 0xFFFF) / da; +- dg = (dg * 0xFFFF) / da; +- db = (db * 0xFFFF) / da; +- } ++ // Handle subnormal numbers. ++ if ((man2 >> 52) == 0) { ++ exp2 = f64_bias; ++ } + +- // Combine components. +- return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); +-} ++ // Pack the bits and return. ++ uint64_t exp2_bits = ++ (uint64_t)((exp2 - f64_bias) & 0x07FF); // (1 << 11) - 1. ++ uint64_t bits = (man2 & 0x000FFFFFFFFFFFFF) | // (1 << 52) - 1. ++ (exp2_bits << 52) | // ++ (h->negative ? 0x8000000000000000 : 0); // (1 << 63). + +-static inline uint32_t // +-wuffs_base__composite_premul_nonpremul_u32_axxx(uint32_t dst_premul, +- uint32_t src_nonpremul) { +- // Extract 16-bit color components. +- uint32_t da = 0x101 * (0xFF & (dst_premul >> 24)); +- uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16)); +- uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8)); +- uint32_t db = 0x101 * (0xFF & (dst_premul >> 0)); +- uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24)); +- uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16)); +- uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8)); +- uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0)); ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); ++ return ret; ++ } while (0); + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++zero: ++ do { ++ uint64_t bits = h->negative ? 0x8000000000000000 : 0; + +- // Composite src (nonpremul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); ++ return ret; ++ } while (0); + +- // Convert from 16-bit color to 8-bit color. +- da >>= 8; +- dr >>= 8; +- dg >>= 8; +- db >>= 8; ++infinity: ++ do { ++ if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) { ++ wuffs_base__result_f64 ret; ++ ret.status.repr = wuffs_base__error__bad_argument; ++ ret.value = 0; ++ return ret; ++ } + +- // Combine components. +- return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); +-} ++ uint64_t bits = h->negative ? 0xFFF0000000000000 : 0x7FF0000000000000; + +-static inline uint64_t // +-wuffs_base__composite_premul_nonpremul_u64_axxx(uint64_t dst_premul, +- uint64_t src_nonpremul) { +- // Extract components. +- uint64_t da = 0xFFFF & (dst_premul >> 48); +- uint64_t dr = 0xFFFF & (dst_premul >> 32); +- uint64_t dg = 0xFFFF & (dst_premul >> 16); +- uint64_t db = 0xFFFF & (dst_premul >> 0); +- uint64_t sa = 0xFFFF & (src_nonpremul >> 48); +- uint64_t sr = 0xFFFF & (src_nonpremul >> 32); +- uint64_t sg = 0xFFFF & (src_nonpremul >> 16); +- uint64_t sb = 0xFFFF & (src_nonpremul >> 0); +- +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint64_t ia = 0xFFFF - sa; +- +- // Composite src (nonpremul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; +- +- // Combine components. +- return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); ++ return ret; ++ } while (0); + } + +-static inline uint32_t // +-wuffs_base__composite_premul_premul_u32_axxx(uint32_t dst_premul, +- uint32_t src_premul) { +- // Extract 16-bit color components. +- uint32_t da = 0x101 * (0xFF & (dst_premul >> 24)); +- uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16)); +- uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8)); +- uint32_t db = 0x101 * (0xFF & (dst_premul >> 0)); +- uint32_t sa = 0x101 * (0xFF & (src_premul >> 24)); +- uint32_t sr = 0x101 * (0xFF & (src_premul >> 16)); +- uint32_t sg = 0x101 * (0xFF & (src_premul >> 8)); +- uint32_t sb = 0x101 * (0xFF & (src_premul >> 0)); +- +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; +- +- // Composite src (premul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); +- +- // Convert from 16-bit color to 8-bit color. +- da >>= 8; +- dr >>= 8; +- dg >>= 8; +- db >>= 8; +- +- // Combine components. +- return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); ++static inline bool // ++wuffs_private_impl__is_decimal_digit(uint8_t c) { ++ return ('0' <= c) && (c <= '9'); + } + +-// -------- ++WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 // ++wuffs_base__parse_number_f64(wuffs_base__slice_u8 s, uint32_t options) { ++ // In practice, almost all "dd.ddddE±xxx" numbers can be represented ++ // losslessly by a uint64_t mantissa "dddddd" and an int32_t base-10 ++ // exponent, adjusting "xxx" for the position (if present) of the decimal ++ // separator '.' or ','. ++ // ++ // This (u64 man, i32 exp10) data structure is superficially similar to the ++ // "Do It Yourself Floating Point" type from Loitsch (†), but the exponent ++ // here is base-10, not base-2. ++ // ++ // If s's number fits in a (man, exp10), parse that pair with the ++ // Eisel-Lemire algorithm. If not, or if Eisel-Lemire fails, parsing s with ++ // the fallback algorithm is slower but comprehensive. ++ // ++ // † "Printing Floating-Point Numbers Quickly and Accurately with Integers" ++ // (https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf). ++ // Florian Loitsch is also the primary contributor to ++ // https://github.com/google/double-conversion ++ do { ++ // Calculating that (man, exp10) pair needs to stay within s's bounds. ++ // Provided that s isn't extremely long, work on a NUL-terminated copy of ++ // s's contents. The NUL byte isn't a valid part of "±dd.ddddE±xxx". ++ // ++ // As the pointer p walks the contents, it's faster to repeatedly check "is ++ // *p a valid digit" than "is p within bounds and *p a valid digit". ++ if (s.len >= 256) { ++ goto fallback; ++ } ++ uint8_t z[256]; ++ memcpy(&z[0], s.ptr, s.len); ++ z[s.len] = 0; ++ const uint8_t* p = &z[0]; + +-static uint64_t // +-wuffs_base__pixel_swizzler__squash_align4_bgr_565_8888(uint8_t* dst_ptr, +- size_t dst_len, +- const uint8_t* src_ptr, +- size_t src_len, +- bool nonpremul) { +- size_t len = (dst_len < src_len ? dst_len : src_len) / 4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; ++ // Look for a leading minus sign. Technically, we could also look for an ++ // optional plus sign, but the "script/process-json-numbers.c with -p" ++ // benchmark is noticably slower if we do. It's optional and, in practice, ++ // usually absent. Let the fallback catch it. ++ bool negative = (*p == '-'); ++ if (negative) { ++ p++; ++ } + +- size_t n = len; +- while (n--) { +- uint32_t argb = wuffs_base__peek_u32le__no_bounds_check(s); +- if (nonpremul) { +- argb = +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(argb); ++ // After walking "dd.dddd", comparing p later with p now will produce the ++ // number of "d"s and "."s. ++ const uint8_t* const start_of_digits_ptr = p; ++ ++ // Walk the "d"s before a '.', 'E', NUL byte, etc. If it starts with '0', ++ // it must be a single '0'. If it starts with a non-zero decimal digit, it ++ // can be a sequence of decimal digits. ++ // ++ // Update the man variable during the walk. It's OK if man overflows now. ++ // We'll detect that later. ++ uint64_t man; ++ if (*p == '0') { ++ man = 0; ++ p++; ++ if (wuffs_private_impl__is_decimal_digit(*p)) { ++ goto fallback; ++ } ++ } else if (wuffs_private_impl__is_decimal_digit(*p)) { ++ man = ((uint8_t)(*p - '0')); ++ p++; ++ for (; wuffs_private_impl__is_decimal_digit(*p); p++) { ++ man = (10 * man) + ((uint8_t)(*p - '0')); ++ } ++ } else { ++ goto fallback; + } +- uint32_t b5 = 0x1F & (argb >> (8 - 5)); +- uint32_t g6 = 0x3F & (argb >> (16 - 6)); +- uint32_t r5 = 0x1F & (argb >> (24 - 5)); +- uint32_t alpha = argb & 0xFF000000; +- wuffs_base__poke_u32le__no_bounds_check( +- d, alpha | (r5 << 11) | (g6 << 5) | (b5 << 0)); +- s += 4; +- d += 4; +- } +- return len; +-} + +-// -------- ++ // Walk the "d"s after the optional decimal separator ('.' or ','), ++ // updating the man and exp10 variables. ++ int32_t exp10 = 0; ++ if (*p == ++ ((options & WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.')) { ++ p++; ++ const uint8_t* first_after_separator_ptr = p; ++ if (!wuffs_private_impl__is_decimal_digit(*p)) { ++ goto fallback; ++ } ++ man = (10 * man) + ((uint8_t)(*p - '0')); ++ p++; ++ for (; wuffs_private_impl__is_decimal_digit(*p); p++) { ++ man = (10 * man) + ((uint8_t)(*p - '0')); ++ } ++ exp10 = ((int32_t)(first_after_separator_ptr - p)); ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__swap_rgb_bgr(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t len = (dst_len < src_len ? dst_len : src_len) / 3; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; ++ // Count the number of digits: ++ // - for an input of "314159", digit_count is 6. ++ // - for an input of "3.14159", digit_count is 7. ++ // ++ // This is off-by-one if there is a decimal separator. That's OK for now. ++ // We'll correct for that later. The "script/process-json-numbers.c with ++ // -p" benchmark is noticably slower if we try to correct for that now. ++ uint32_t digit_count = (uint32_t)(p - start_of_digits_ptr); + +- size_t n = len; +- while (n--) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s2; +- d[1] = s1; +- d[2] = s0; +- s += 3; +- d += 3; +- } +- return len; +-} ++ // Update exp10 for the optional exponent, starting with 'E' or 'e'. ++ if ((*p | 0x20) == 'e') { ++ p++; ++ int32_t exp_sign = +1; ++ if (*p == '-') { ++ p++; ++ exp_sign = -1; ++ } else if (*p == '+') { ++ p++; ++ } ++ if (!wuffs_private_impl__is_decimal_digit(*p)) { ++ goto fallback; ++ } ++ int32_t exp_num = ((uint8_t)(*p - '0')); ++ p++; ++ // The rest of the exp_num walking has a peculiar control flow but, once ++ // again, the "script/process-json-numbers.c with -p" benchmark is ++ // sensitive to alternative formulations. ++ if (wuffs_private_impl__is_decimal_digit(*p)) { ++ exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); ++ p++; ++ } ++ if (wuffs_private_impl__is_decimal_digit(*p)) { ++ exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); ++ p++; ++ } ++ while (wuffs_private_impl__is_decimal_digit(*p)) { ++ if (exp_num > 0x1000000) { ++ goto fallback; ++ } ++ exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); ++ p++; ++ } ++ exp10 += exp_sign * exp_num; ++ } + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-static uint64_t // +-wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t len = (dst_len < src_len ? dst_len : src_len) / 4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // The Wuffs API is that the original slice has no trailing data. It also ++ // allows underscores, which we don't catch here but the fallback should. ++ if (p != &z[s.len]) { ++ goto fallback; ++ } + +- __m128i shuffle = _mm_set_epi8(+0x0F, +0x0C, +0x0D, +0x0E, // +- +0x0B, +0x08, +0x09, +0x0A, // +- +0x07, +0x04, +0x05, +0x06, // +- +0x03, +0x00, +0x01, +0x02); ++ // Check that the uint64_t typed man variable has not overflowed, based on ++ // digit_count. ++ // ++ // For reference: ++ // - (1 << 63) is 9223372036854775808, which has 19 decimal digits. ++ // - (1 << 64) is 18446744073709551616, which has 20 decimal digits. ++ // - 19 nines, 9999999999999999999, is 0x8AC7230489E7FFFF, which has 64 ++ // bits and 16 hexadecimal digits. ++ // - 20 nines, 99999999999999999999, is 0x56BC75E2D630FFFFF, which has 67 ++ // bits and 17 hexadecimal digits. ++ if (digit_count > 19) { ++ // Even if we have more than 19 pseudo-digits, it's not yet definitely an ++ // overflow. Recall that digit_count might be off-by-one (too large) if ++ // there's a decimal separator. It will also over-report the number of ++ // meaningful digits if the input looks something like "0.000dddExxx". ++ // ++ // We adjust by the number of leading '0's and '.'s and re-compare to 19. ++ // Once again, technically, we could skip ','s too, but that perturbs the ++ // "script/process-json-numbers.c with -p" benchmark. ++ const uint8_t* q = start_of_digits_ptr; ++ for (; (*q == '0') || (*q == '.'); q++) { ++ } ++ digit_count -= (uint32_t)(q - start_of_digits_ptr); ++ if (digit_count > 19) { ++ goto fallback; ++ } ++ } + +- while (n >= 4) { +- __m128i x; +- x = _mm_lddqu_si128((const __m128i*)(const void*)s); +- x = _mm_shuffle_epi8(x, shuffle); +- _mm_storeu_si128((__m128i*)(void*)d, x); ++ // The wuffs_private_impl__parse_number_f64_eisel_lemire preconditions ++ // include that exp10 is in the range [-307 ..= 288]. ++ if ((exp10 < -307) || (288 < exp10)) { ++ goto fallback; ++ } + +- s += 4 * 4; +- d += 4 * 4; +- n -= 4; +- } ++ // If both man and (10 ** exp10) are exactly representable by a double, we ++ // don't need to run the Eisel-Lemire algorithm. ++ if ((-22 <= exp10) && (exp10 <= 22) && ((man >> 53) == 0)) { ++ double d = (double)man; ++ if (exp10 >= 0) { ++ d *= wuffs_private_impl__f64_powers_of_10[+exp10]; ++ } else { ++ d /= wuffs_private_impl__f64_powers_of_10[-exp10]; ++ } ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = negative ? -d : +d; ++ return ret; ++ } + +- while (n--) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- uint8_t s3 = s[3]; +- d[0] = s2; +- d[1] = s1; +- d[2] = s0; +- d[3] = s3; +- s += 4; +- d += 4; +- } +- return len; +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 ++ // The wuffs_private_impl__parse_number_f64_eisel_lemire preconditions ++ // include that man is non-zero. Parsing "0" should be caught by the "If ++ // both man and (10 ** exp10)" above, but "0e99" might not. ++ if (man == 0) { ++ goto fallback; ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__swap_rgbx_bgrx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t len = (dst_len < src_len ? dst_len : src_len) / 4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; ++ // Our man and exp10 are in range. Run the Eisel-Lemire algorithm. ++ int64_t r = wuffs_private_impl__parse_number_f64_eisel_lemire(man, exp10); ++ if (r < 0) { ++ goto fallback; ++ } ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( ++ ((uint64_t)r) | (((uint64_t)negative) << 63)); ++ return ret; ++ } while (0); + +- size_t n = len; +- while (n--) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- uint8_t s3 = s[3]; +- d[0] = s2; +- d[1] = s1; +- d[2] = s0; +- d[3] = s3; +- s += 4; +- d += 4; +- } +- return len; ++fallback: ++ do { ++ wuffs_private_impl__high_prec_dec h; ++ wuffs_base__status status = ++ wuffs_private_impl__high_prec_dec__parse(&h, s, options); ++ if (status.repr) { ++ return wuffs_private_impl__parse_number_f64_special(s, options); ++ } ++ return wuffs_private_impl__high_prec_dec__to_f64(&h, options); ++ } while (0); + } + + // -------- + +-static uint64_t // +-wuffs_base__pixel_swizzler__copy_1_1(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t len = (dst_len < src_len) ? dst_len : src_len; +- if (len > 0) { +- memmove(dst_ptr, src_ptr, len); ++static inline size_t // ++wuffs_private_impl__render_inf(wuffs_base__slice_u8 dst, ++ bool neg, ++ uint32_t options) { ++ if (neg) { ++ if (dst.len < 4) { ++ return 0; ++ } ++ wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492D); // '-Inf'le. ++ return 4; + } +- return len; +-} + +-static uint64_t // +-wuffs_base__pixel_swizzler__copy_2_2(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; +- if (len > 0) { +- memmove(dst_ptr, src_ptr, len * 2); ++ if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { ++ if (dst.len < 4) { ++ return 0; ++ } ++ wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492B); // '+Inf'le. ++ return 4; + } +- return len; +-} + +-static uint64_t // +-wuffs_base__pixel_swizzler__copy_3_3(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len3 < src_len3) ? dst_len3 : src_len3; +- if (len > 0) { +- memmove(dst_ptr, src_ptr, len * 3); ++ if (dst.len < 3) { ++ return 0; + } +- return len; ++ wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x666E49); // 'Inf'le. ++ return 3; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__copy_4_4(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- if (len > 0) { +- memmove(dst_ptr, src_ptr, len * 4); ++static inline size_t // ++wuffs_private_impl__render_nan(wuffs_base__slice_u8 dst) { ++ if (dst.len < 3) { ++ return 0; + } +- return len; ++ wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x4E614E); // 'NaN'le. ++ return 3; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__copy_8_8(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8; +- if (len > 0) { +- memmove(dst_ptr, src_ptr, len * 8); ++static size_t // ++wuffs_private_impl__high_prec_dec__render_exponent_absent( ++ wuffs_base__slice_u8 dst, ++ wuffs_private_impl__high_prec_dec* h, ++ uint32_t precision, ++ uint32_t options) { ++ size_t n = (h->negative || ++ (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN)) ++ ? 1 ++ : 0; ++ if (h->decimal_point <= 0) { ++ n += 1; ++ } else { ++ n += (size_t)(h->decimal_point); ++ } ++ if (precision > 0) { ++ n += precision + 1; // +1 for the '.'. + } +- return len; +-} + +-// -------- ++ // Don't modify dst if the formatted number won't fit. ++ if (n > dst.len) { ++ return 0; ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgr(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // Align-left or align-right. ++ uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) ++ ? &dst.ptr[dst.len - n] ++ : &dst.ptr[0]; + +- // TODO: unroll. ++ // Leading "±". ++ if (h->negative) { ++ *ptr++ = '-'; ++ } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { ++ *ptr++ = '+'; ++ } + +- while (n >= 1) { +- uint32_t b5 = s[0] >> 3; +- uint32_t g6 = s[1] >> 2; +- uint32_t r5 = s[2] >> 3; +- uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); ++ // Integral digits. ++ if (h->decimal_point <= 0) { ++ *ptr++ = '0'; ++ } else { ++ uint32_t m = ++ wuffs_base__u32__min(h->num_digits, (uint32_t)(h->decimal_point)); ++ uint32_t i = 0; ++ for (; i < m; i++) { ++ *ptr++ = (uint8_t)('0' | h->digits[i]); ++ } ++ for (; i < (uint32_t)(h->decimal_point); i++) { ++ *ptr++ = '0'; ++ } ++ } + +- s += 1 * 3; +- d += 1 * 2; +- n -= 1; ++ // Separator and then fractional digits. ++ if (precision > 0) { ++ *ptr++ = ++ (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.'; ++ uint32_t i = 0; ++ for (; i < precision; i++) { ++ uint32_t j = ((uint32_t)(h->decimal_point)) + i; ++ *ptr++ = (uint8_t)('0' | ((j < h->num_digits) ? h->digits[j] : 0)); ++ } + } + +- return len; ++ return n; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgrx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- // TODO: unroll. ++static size_t // ++wuffs_private_impl__high_prec_dec__render_exponent_present( ++ wuffs_base__slice_u8 dst, ++ wuffs_private_impl__high_prec_dec* h, ++ uint32_t precision, ++ uint32_t options) { ++ int32_t exp = 0; ++ if (h->num_digits > 0) { ++ exp = h->decimal_point - 1; ++ } ++ bool negative_exp = exp < 0; ++ if (negative_exp) { ++ exp = -exp; ++ } + +- while (n >= 1) { +- uint32_t b5 = s[0] >> 3; +- uint32_t g6 = s[1] >> 2; +- uint32_t r5 = s[2] >> 3; +- uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); ++ size_t n = (h->negative || ++ (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN)) ++ ? 4 ++ : 3; // Mininum 3 bytes: first digit and then "e±". ++ if (precision > 0) { ++ n += precision + 1; // +1 for the '.'. ++ } ++ n += (exp < 100) ? 2 : 3; + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ // Don't modify dst if the formatted number won't fit. ++ if (n > dst.len) { ++ return 0; + } + +- return len; +-} ++ // Align-left or align-right. ++ uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) ++ ? &dst.ptr[dst.len - n] ++ : &dst.ptr[0]; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // Leading "±". ++ if (h->negative) { ++ *ptr++ = '-'; ++ } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { ++ *ptr++ = '+'; ++ } + +- // TODO: unroll. ++ // Integral digit. ++ if (h->num_digits > 0) { ++ *ptr++ = (uint8_t)('0' | h->digits[0]); ++ } else { ++ *ptr++ = '0'; ++ } + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); ++ // Separator and then fractional digits. ++ if (precision > 0) { ++ *ptr++ = ++ (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.'; ++ uint32_t i = 1; ++ uint32_t j = wuffs_base__u32__min(h->num_digits, precision + 1); ++ for (; i < j; i++) { ++ *ptr++ = (uint8_t)('0' | h->digits[i]); ++ } ++ for (; i <= precision; i++) { ++ *ptr++ = '0'; ++ } ++ } + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ // Exponent: "e±" and then 2 or 3 digits. ++ *ptr++ = 'e'; ++ *ptr++ = negative_exp ? '-' : '+'; ++ if (exp < 10) { ++ *ptr++ = '0'; ++ *ptr++ = (uint8_t)('0' | exp); ++ } else if (exp < 100) { ++ *ptr++ = (uint8_t)('0' | (exp / 10)); ++ *ptr++ = (uint8_t)('0' | (exp % 10)); ++ } else { ++ int32_t e = exp / 100; ++ exp -= e * 100; ++ *ptr++ = (uint8_t)('0' | e); ++ *ptr++ = (uint8_t)('0' | (exp / 10)); ++ *ptr++ = (uint8_t)('0' | (exp % 10)); + } + +- return len; ++ return n; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__render_number_f64(wuffs_base__slice_u8 dst, ++ double x, ++ uint32_t precision, ++ uint32_t options) { ++ // Decompose x (64 bits) into negativity (1 bit), base-2 exponent (11 bits ++ // with a -1023 bias) and mantissa (52 bits). ++ uint64_t bits = wuffs_base__ieee_754_bit_representation__from_f64_to_u64(x); ++ bool neg = (bits >> 63) != 0; ++ int32_t exp2 = ((int32_t)(bits >> 52)) & 0x7FF; ++ uint64_t man = bits & 0x000FFFFFFFFFFFFFul; + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))))); ++ // Apply the exponent bias and set the implicit top bit of the mantissa, ++ // unless x is subnormal. Also take care of Inf and NaN. ++ if (exp2 == 0x7FF) { ++ if (man != 0) { ++ return wuffs_private_impl__render_nan(dst); ++ } ++ return wuffs_private_impl__render_inf(dst, neg, options); ++ } else if (exp2 == 0) { ++ exp2 = -1022; ++ } else { ++ exp2 -= 1023; ++ man |= 0x0010000000000000ul; ++ } + +- s += 1 * 8; +- d += 1 * 2; +- n -= 1; ++ // Ensure that precision isn't too large. ++ if (precision > 4095) { ++ precision = 4095; + } + +- return len; +-} ++ // Convert from the (neg, exp2, man) tuple to an HPD. ++ wuffs_private_impl__high_prec_dec h; ++ wuffs_private_impl__high_prec_dec__assign(&h, man, neg); ++ if (h.num_digits > 0) { ++ wuffs_private_impl__high_prec_dec__lshift(&h, ++ exp2 - 52); // 52 mantissa bits. ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // Handle the "%e" and "%f" formats. ++ switch (options & (WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT | ++ WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT)) { ++ case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT: // The "%"f" format. ++ if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { ++ wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man); ++ int32_t p = ((int32_t)(h.num_digits)) - h.decimal_point; ++ precision = ((uint32_t)(wuffs_base__i32__max(0, p))); ++ } else { ++ wuffs_private_impl__high_prec_dec__round_nearest( ++ &h, ((int32_t)precision) + h.decimal_point); ++ } ++ return wuffs_private_impl__high_prec_dec__render_exponent_absent( ++ dst, &h, precision, options); + +- // TODO: unroll. ++ case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT: // The "%e" format. ++ if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { ++ wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man); ++ precision = (h.num_digits > 0) ? (h.num_digits - 1) : 0; ++ } else { ++ wuffs_private_impl__high_prec_dec__round_nearest( ++ &h, ((int32_t)precision) + 1); ++ } ++ return wuffs_private_impl__high_prec_dec__render_exponent_present( ++ dst, &h, precision, options); ++ } + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sr = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sb = 0x101 * ((uint32_t)s[0]); ++ // We have the "%g" format and so precision means the number of significant ++ // digits, not the number of digits after the decimal separator. Perform ++ // rounding and determine whether to use "%e" or "%f". ++ int32_t e_threshold = 0; ++ if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { ++ wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man); ++ precision = h.num_digits; ++ e_threshold = 6; ++ } else { ++ if (precision == 0) { ++ precision = 1; ++ } ++ wuffs_private_impl__high_prec_dec__round_nearest(&h, ((int32_t)precision)); ++ e_threshold = ((int32_t)precision); ++ int32_t nd = ((int32_t)(h.num_digits)); ++ if ((e_threshold > nd) && (nd >= h.decimal_point)) { ++ e_threshold = nd; ++ } ++ } + +- // Convert from 565 color to 16-bit color. +- uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); +- uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); +- uint32_t dr = (0x8421 * old_r5) >> 4; +- uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); +- uint32_t dg = (0x1041 * old_g6) >> 2; +- uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); +- uint32_t db = (0x8421 * old_b5) >> 4; ++ // Use the "%e" format if the exponent is large. ++ int32_t e = h.decimal_point - 1; ++ if ((e < -4) || (e_threshold <= e)) { ++ uint32_t p = wuffs_base__u32__min(precision, h.num_digits); ++ return wuffs_private_impl__high_prec_dec__render_exponent_present( ++ dst, &h, (p > 0) ? (p - 1) : 0, options); ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ // Use the "%f" format otherwise. ++ int32_t p = ((int32_t)precision); ++ if (p > h.decimal_point) { ++ p = ((int32_t)(h.num_digits)); ++ } ++ precision = ((uint32_t)(wuffs_base__i32__max(0, p - h.decimal_point))); ++ return wuffs_private_impl__high_prec_dec__render_exponent_absent( ++ dst, &h, precision, options); ++} + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV) + +- // Convert from 16-bit color to 565 color and combine the components. +- uint32_t new_r5 = 0x1F & (dr >> 11); +- uint32_t new_g6 = 0x3F & (dg >> 10); +- uint32_t new_b5 = 0x1F & (db >> 11); +- uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__INTCONV) + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; +- } ++// ---------------- Integer + +- return len; +-} ++// wuffs_base__parse_number__foo_digits entries are 0x00 for invalid digits, ++// and (0x80 | v) for valid digits, where v is the 4 bit value. + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static const uint8_t wuffs_base__parse_number__decimal_digits[256] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. ++ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'. ++ 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'. + +- // TODO: unroll. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); +- uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); +- uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); +- uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF. + +- // Convert from 565 color to 16-bit color. +- uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); +- uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); +- uint32_t dr = (0x8421 * old_r5) >> 4; +- uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); +- uint32_t dg = (0x1041 * old_g6) >> 2; +- uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); +- uint32_t db = (0x8421 * old_b5) >> 4; ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF. ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++}; + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++static const uint8_t wuffs_base__parse_number__hexadecimal_digits[256] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. ++ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'. ++ 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'. + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x40 ..= 0x47. 'A'-'F'. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. ++ 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x60 ..= 0x67. 'a'-'f'. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. + +- // Convert from 16-bit color to 565 color and combine the components. +- uint32_t new_r5 = 0x1F & (dr >> 11); +- uint32_t new_g6 = 0x3F & (dg >> 10); +- uint32_t new_b5 = 0x1F & (db >> 11); +- uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF. + +- s += 1 * 8; +- d += 1 * 2; +- n -= 1; +- } ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF. ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++}; + +- return len; +-} ++static const uint8_t wuffs_private_impl__encode_base16[16] = { ++ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // 0x00 ..= 0x07. ++ 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, // 0x08 ..= 0x0F. ++}; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// -------- + +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64 // ++wuffs_base__parse_number_i64(wuffs_base__slice_u8 s, uint32_t options) { ++ uint8_t* p = s.ptr; ++ uint8_t* q = s.ptr + s.len; + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ } + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ bool negative = false; ++ if (p >= q) { ++ goto fail_bad_argument; ++ } else if (*p == '-') { ++ p++; ++ negative = true; ++ } else if (*p == '+') { ++ p++; + } + +- return len; +-} ++ do { ++ wuffs_base__result_u64 r = wuffs_base__parse_number_u64( ++ wuffs_base__make_slice_u8(p, (size_t)(q - p)), options); ++ if (r.status.repr != NULL) { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = r.status.repr; ++ ret.value = 0; ++ return ret; ++ } else if (negative) { ++ if (r.value < 0x8000000000000000) { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = NULL; ++ ret.value = -(int64_t)(r.value); ++ return ret; ++ } else if (r.value == 0x8000000000000000) { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = NULL; ++ ret.value = INT64_MIN; ++ return ret; ++ } ++ goto fail_out_of_bounds; ++ } else if (r.value > 0x7FFFFFFFFFFFFFFF) { ++ goto fail_out_of_bounds; ++ } else { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = NULL; ++ ret.value = +(int64_t)(r.value); ++ return ret; ++ } ++ } while (0); + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++fail_bad_argument: ++ do { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = wuffs_base__error__bad_argument; ++ ret.value = 0; ++ return ret; ++ } while (0); + +- // TODO: unroll. ++fail_out_of_bounds: ++ do { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = wuffs_base__error__out_of_bounds; ++ ret.value = 0; ++ return ret; ++ } while (0); ++} + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sr = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sb = 0x101 * ((uint32_t)s[0]); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64 // ++wuffs_base__parse_number_u64(wuffs_base__slice_u8 s, uint32_t options) { ++ uint8_t* p = s.ptr; ++ uint8_t* q = s.ptr + s.len; + +- // Convert from 565 color to 16-bit color. +- uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); +- uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); +- uint32_t dr = (0x8421 * old_r5) >> 4; +- uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); +- uint32_t dg = (0x1041 * old_g6) >> 2; +- uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); +- uint32_t db = (0x8421 * old_b5) >> 4; +- +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; +- +- // Composite src (premul) over dst (premul). +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); +- +- // Convert from 16-bit color to 565 color and combine the components. +- uint32_t new_r5 = 0x1F & (dr >> 11); +- uint32_t new_g6 = 0x3F & (dg >> 10); +- uint32_t new_b5 = 0x1F & (db >> 11); +- uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); +- +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (; (p < q) && (*p == '_'); p++) { ++ } + } + +- return len; +-} ++ if (p >= q) { ++ goto fail_bad_argument; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__rgb(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ } else if (*p == '0') { ++ p++; ++ if (p >= q) { ++ goto ok_zero; ++ } ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ if (*p == '_') { ++ p++; ++ for (; p < q; p++) { ++ if (*p != '_') { ++ if (options & ++ WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) { ++ goto decimal; ++ } ++ goto fail_bad_argument; ++ } ++ } ++ goto ok_zero; ++ } ++ } + +- // TODO: unroll. ++ if ((*p == 'x') || (*p == 'X')) { ++ p++; ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ } ++ if (p < q) { ++ goto hexadecimal; ++ } + +- while (n >= 1) { +- uint32_t r5 = s[0] >> 3; +- uint32_t g6 = s[1] >> 2; +- uint32_t b5 = s[2] >> 3; +- uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); ++ } else if ((*p == 'd') || (*p == 'D')) { ++ p++; ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ } ++ if (p < q) { ++ goto decimal; ++ } ++ } + +- s += 1 * 3; +- d += 1 * 2; +- n -= 1; ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) { ++ goto decimal; ++ } ++ goto fail_bad_argument; + } + +- return len; +-} ++decimal: ++ do { ++ uint64_t v = wuffs_base__parse_number__decimal_digits[*p++]; ++ if (v == 0) { ++ goto fail_bad_argument; ++ } ++ v &= 0x0F; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // UINT64_MAX is 18446744073709551615, which is ((10 * max10) + max1). ++ const uint64_t max10 = 1844674407370955161u; ++ const uint8_t max1 = 5; + +- // TODO: unroll. ++ for (; p < q; p++) { ++ if ((*p == '_') && ++ (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ continue; ++ } ++ uint8_t digit = wuffs_base__parse_number__decimal_digits[*p]; ++ if (digit == 0) { ++ goto fail_bad_argument; ++ } ++ digit &= 0x0F; ++ if ((v > max10) || ((v == max10) && (digit > max1))) { ++ goto fail_out_of_bounds; ++ } ++ v = (10 * v) + ((uint64_t)(digit)); ++ } + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))))); ++ wuffs_base__result_u64 ret; ++ ret.status.repr = NULL; ++ ret.value = v; ++ return ret; ++ } while (0); + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; +- } ++hexadecimal: ++ do { ++ uint64_t v = wuffs_base__parse_number__hexadecimal_digits[*p++]; ++ if (v == 0) { ++ goto fail_bad_argument; ++ } ++ v &= 0x0F; + +- return len; +-} ++ for (; p < q; p++) { ++ if ((*p == '_') && ++ (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ continue; ++ } ++ uint8_t digit = wuffs_base__parse_number__hexadecimal_digits[*p]; ++ if (digit == 0) { ++ goto fail_bad_argument; ++ } ++ digit &= 0x0F; ++ if ((v >> 60) != 0) { ++ goto fail_out_of_bounds; ++ } ++ v = (v << 4) | ((uint64_t)(digit)); ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ wuffs_base__result_u64 ret; ++ ret.status.repr = NULL; ++ ret.value = v; ++ return ret; ++ } while (0); + +- // TODO: unroll. ++ok_zero: ++ do { ++ wuffs_base__result_u64 ret; ++ ret.status.repr = NULL; ++ ret.value = 0; ++ return ret; ++ } while (0); + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sb = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sr = 0x101 * ((uint32_t)s[0]); ++fail_bad_argument: ++ do { ++ wuffs_base__result_u64 ret; ++ ret.status.repr = wuffs_base__error__bad_argument; ++ ret.value = 0; ++ return ret; ++ } while (0); + +- // Convert from 565 color to 16-bit color. +- uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); +- uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); +- uint32_t dr = (0x8421 * old_r5) >> 4; +- uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); +- uint32_t dg = (0x1041 * old_g6) >> 2; +- uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); +- uint32_t db = (0x8421 * old_b5) >> 4; ++fail_out_of_bounds: ++ do { ++ wuffs_base__result_u64 ret; ++ ret.status.repr = wuffs_base__error__out_of_bounds; ++ ret.value = 0; ++ return ret; ++ } while (0); ++} + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++// -------- + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++// wuffs_base__render_number__first_hundred contains the decimal encodings of ++// the first one hundred numbers [0 ..= 99]. ++static const uint8_t wuffs_base__render_number__first_hundred[200] = { ++ '0', '0', '0', '1', '0', '2', '0', '3', '0', '4', // ++ '0', '5', '0', '6', '0', '7', '0', '8', '0', '9', // ++ '1', '0', '1', '1', '1', '2', '1', '3', '1', '4', // ++ '1', '5', '1', '6', '1', '7', '1', '8', '1', '9', // ++ '2', '0', '2', '1', '2', '2', '2', '3', '2', '4', // ++ '2', '5', '2', '6', '2', '7', '2', '8', '2', '9', // ++ '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', // ++ '3', '5', '3', '6', '3', '7', '3', '8', '3', '9', // ++ '4', '0', '4', '1', '4', '2', '4', '3', '4', '4', // ++ '4', '5', '4', '6', '4', '7', '4', '8', '4', '9', // ++ '5', '0', '5', '1', '5', '2', '5', '3', '5', '4', // ++ '5', '5', '5', '6', '5', '7', '5', '8', '5', '9', // ++ '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', // ++ '6', '5', '6', '6', '6', '7', '6', '8', '6', '9', // ++ '7', '0', '7', '1', '7', '2', '7', '3', '7', '4', // ++ '7', '5', '7', '6', '7', '7', '7', '8', '7', '9', // ++ '8', '0', '8', '1', '8', '2', '8', '3', '8', '4', // ++ '8', '5', '8', '6', '8', '7', '8', '8', '8', '9', // ++ '9', '0', '9', '1', '9', '2', '9', '3', '9', '4', // ++ '9', '5', '9', '6', '9', '7', '9', '8', '9', '9', // ++}; + +- // Convert from 16-bit color to 565 color and combine the components. +- uint32_t new_r5 = 0x1F & (dr >> 11); +- uint32_t new_g6 = 0x3F & (dg >> 10); +- uint32_t new_b5 = 0x1F & (db >> 11); +- uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++static size_t // ++wuffs_private_impl__render_number_u64(wuffs_base__slice_u8 dst, ++ uint64_t x, ++ uint32_t options, ++ bool neg) { ++ uint8_t buf[WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL]; ++ uint8_t* ptr = &buf[0] + sizeof(buf); + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ while (x >= 100) { ++ size_t index = ((size_t)((x % 100) * 2)); ++ x /= 100; ++ uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0]; ++ uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1]; ++ ptr -= 2; ++ ptr[0] = s0; ++ ptr[1] = s1; + } + +- return len; +-} +- +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ if (x < 10) { ++ ptr -= 1; ++ ptr[0] = (uint8_t)('0' + x); ++ } else { ++ size_t index = ((size_t)(x * 2)); ++ uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0]; ++ uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1]; ++ ptr -= 2; ++ ptr[0] = s0; ++ ptr[1] = s1; ++ } + +- // TODO: unroll. ++ if (neg) { ++ ptr -= 1; ++ ptr[0] = '-'; ++ } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { ++ ptr -= 1; ++ ptr[0] = '+'; ++ } + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); ++ size_t n = sizeof(buf) - ((size_t)(ptr - &buf[0])); ++ if (n > dst.len) { ++ return 0; ++ } ++ memcpy(dst.ptr + ((options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) ++ ? (dst.len - n) ++ : 0), ++ ptr, n); ++ return n; ++} + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__render_number_i64(wuffs_base__slice_u8 dst, ++ int64_t x, ++ uint32_t options) { ++ uint64_t u = (uint64_t)x; ++ bool neg = x < 0; ++ if (neg) { ++ u = 1 + ~u; + } ++ return wuffs_private_impl__render_number_u64(dst, u, options, neg); ++} + +- return len; ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__render_number_u64(wuffs_base__slice_u8 dst, ++ uint64_t x, ++ uint32_t options) { ++ return wuffs_private_impl__render_number_u64(dst, x, options, false); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// ---------------- Base-16 + +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_16__decode2(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ wuffs_base__transform__output o; ++ size_t src_len2 = src.len / 2; ++ size_t len; ++ if (dst.len < src_len2) { ++ len = dst.len; ++ o.status.repr = wuffs_base__suspension__short_write; ++ } else { ++ len = src_len2; ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ } else if (src.len & 1) { ++ o.status.repr = wuffs_base__error__bad_data; ++ } else { ++ o.status.repr = NULL; ++ } ++ } + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sb = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sr = 0x101 * ((uint32_t)s[0]); ++ uint8_t* d = dst.ptr; ++ uint8_t* s = src.ptr; ++ size_t n = len; + +- // Convert from 565 color to 16-bit color. +- uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); +- uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); +- uint32_t dr = (0x8421 * old_r5) >> 4; +- uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); +- uint32_t dg = (0x1041 * old_g6) >> 2; +- uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); +- uint32_t db = (0x8421 * old_b5) >> 4; ++ while (n--) { ++ *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[0]] << 4) | ++ (wuffs_base__parse_number__hexadecimal_digits[s[1]] & 0x0F)); ++ d += 1; ++ s += 2; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ o.num_dst = len; ++ o.num_src = len * 2; ++ return o; ++} + +- // Composite src (premul) over dst (premul). +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_16__decode4(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ wuffs_base__transform__output o; ++ size_t src_len4 = src.len / 4; ++ size_t len = dst.len < src_len4 ? dst.len : src_len4; ++ if (dst.len < src_len4) { ++ len = dst.len; ++ o.status.repr = wuffs_base__suspension__short_write; ++ } else { ++ len = src_len4; ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ } else if (src.len & 1) { ++ o.status.repr = wuffs_base__error__bad_data; ++ } else { ++ o.status.repr = NULL; ++ } ++ } + +- // Convert from 16-bit color to 565 color and combine the components. +- uint32_t new_r5 = 0x1F & (dr >> 11); +- uint32_t new_g6 = 0x3F & (dg >> 10); +- uint32_t new_b5 = 0x1F & (db >> 11); +- uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++ uint8_t* d = dst.ptr; ++ uint8_t* s = src.ptr; ++ size_t n = len; + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ while (n--) { ++ *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[2]] << 4) | ++ (wuffs_base__parse_number__hexadecimal_digits[s[3]] & 0x0F)); ++ d += 1; ++ s += 4; + } + +- return len; ++ o.num_dst = len; ++ o.num_src = len * 4; ++ return o; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__y(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ wuffs_base__transform__output o; ++ size_t dst_len2 = dst.len / 2; ++ size_t len; ++ if (dst_len2 < src.len) { ++ len = dst_len2; ++ o.status.repr = wuffs_base__suspension__short_write; ++ } else { ++ len = src.len; ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ } else { ++ o.status.repr = NULL; ++ } ++ } + +- while (n >= 1) { +- uint32_t y5 = s[0] >> 3; +- uint32_t y6 = s[0] >> 2; +- uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); ++ uint8_t* d = dst.ptr; ++ uint8_t* s = src.ptr; ++ size_t n = len; + +- s += 1 * 1; +- d += 1 * 2; +- n -= 1; ++ while (n--) { ++ uint8_t c = *s; ++ d[0] = wuffs_private_impl__encode_base16[c >> 4]; ++ d[1] = wuffs_private_impl__encode_base16[c & 0x0F]; ++ d += 2; ++ s += 1; + } + +- return len; ++ o.num_dst = len * 2; ++ o.num_src = len; ++ return o; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_16__encode4(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ wuffs_base__transform__output o; ++ size_t dst_len4 = dst.len / 4; ++ size_t len; ++ if (dst_len4 < src.len) { ++ len = dst_len4; ++ o.status.repr = wuffs_base__suspension__short_write; ++ } else { ++ len = src.len; ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ } else { ++ o.status.repr = NULL; ++ } ++ } + +- while (n >= 1) { +- uint32_t y5 = s[0] >> 3; +- uint32_t y6 = s[0] >> 2; +- uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); ++ uint8_t* d = dst.ptr; ++ uint8_t* s = src.ptr; ++ size_t n = len; + +- s += 1 * 2; +- d += 1 * 2; +- n -= 1; ++ while (n--) { ++ uint8_t c = *s; ++ d[0] = '\\'; ++ d[1] = 'x'; ++ d[2] = wuffs_private_impl__encode_base16[c >> 4]; ++ d[3] = wuffs_private_impl__encode_base16[c & 0x0F]; ++ d += 4; ++ s += 1; + } + +- return len; ++ o.num_dst = len * 4; ++ o.num_src = len; ++ return o; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__index__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len2 = dst_len / 2; +- size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// ---------------- Base-64 + +- const size_t loop_unroll_count = 4; ++// The two base-64 alphabets, std and url, differ only in the last two codes. ++// - std: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ++// - url: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" + +- while (n >= loop_unroll_count) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4))); +- wuffs_base__poke_u16le__no_bounds_check( +- d + (1 * 2), wuffs_base__peek_u16le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[1] * 4))); +- wuffs_base__poke_u16le__no_bounds_check( +- d + (2 * 2), wuffs_base__peek_u16le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[2] * 4))); +- wuffs_base__poke_u16le__no_bounds_check( +- d + (3 * 2), wuffs_base__peek_u16le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[3] * 4))); ++static const uint8_t wuffs_base__base_64__decode_std[256] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x00 ..= 0x07. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x08 ..= 0x0F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x10 ..= 0x17. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x18 ..= 0x1F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x20 ..= 0x27. ++ 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x80, 0x3F, // 0x28 ..= 0x2F. ++ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 0x30 ..= 0x37. ++ 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x38 ..= 0x3F. + +- s += loop_unroll_count * 1; +- d += loop_unroll_count * 2; +- n -= loop_unroll_count; +- } ++ 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 0x40 ..= 0x47. ++ 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 0x48 ..= 0x4F. ++ 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 0x50 ..= 0x57. ++ 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x58 ..= 0x5F. ++ 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 0x60 ..= 0x67. ++ 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 0x68 ..= 0x6F. ++ 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 0x70 ..= 0x77. ++ 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x78 ..= 0x7F. + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4))); ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x80 ..= 0x87. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x88 ..= 0x8F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x90 ..= 0x97. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x98 ..= 0x9F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA0 ..= 0xA7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA8 ..= 0xAF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB0 ..= 0xB7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB8 ..= 0xBF. + +- s += 1 * 1; +- d += 1 * 2; +- n -= 1; +- } ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC0 ..= 0xC7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC8 ..= 0xCF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD0 ..= 0xD7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD8 ..= 0xDF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE0 ..= 0xE7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE8 ..= 0xEF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++}; + +- return len; +-} ++static const uint8_t wuffs_base__base_64__decode_url[256] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x00 ..= 0x07. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x08 ..= 0x0F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x10 ..= 0x17. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x18 ..= 0x1F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x20 ..= 0x27. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, // 0x28 ..= 0x2F. ++ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 0x30 ..= 0x37. ++ 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x38 ..= 0x3F. + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__index_bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len2 = dst_len / 2; +- size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 0x40 ..= 0x47. ++ 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 0x48 ..= 0x4F. ++ 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 0x50 ..= 0x57. ++ 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x3F, // 0x58 ..= 0x5F. ++ 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 0x60 ..= 0x67. ++ 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 0x68 ..= 0x6F. ++ 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 0x70 ..= 0x77. ++ 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x78 ..= 0x7F. + +- // TODO: unroll. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x80 ..= 0x87. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x88 ..= 0x8F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x90 ..= 0x97. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x98 ..= 0x9F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA0 ..= 0xA7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA8 ..= 0xAF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB0 ..= 0xB7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB8 ..= 0xBF. + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2))); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0))); ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC0 ..= 0xC7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC8 ..= 0xCF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD0 ..= 0xD7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD8 ..= 0xDF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE0 ..= 0xE7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE8 ..= 0xEF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++}; + +- s += 1 * 1; +- d += 1 * 2; +- n -= 1; +- } ++static const uint8_t wuffs_base__base_64__encode_std[64] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // 0x00 ..= 0x07. ++ 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0x08 ..= 0x0F. ++ 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0x10 ..= 0x17. ++ 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 0x18 ..= 0x1F. ++ 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, // 0x20 ..= 0x27. ++ 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, // 0x28 ..= 0x2F. ++ 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, // 0x30 ..= 0x37. ++ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F, // 0x38 ..= 0x3F. ++}; + +- return len; +-} ++static const uint8_t wuffs_base__base_64__encode_url[64] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // 0x00 ..= 0x07. ++ 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0x08 ..= 0x0F. ++ 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0x10 ..= 0x17. ++ 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 0x18 ..= 0x1F. ++ 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, // 0x20 ..= 0x27. ++ 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, // 0x28 ..= 0x2F. ++ 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, // 0x30 ..= 0x37. ++ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2D, 0x5F, // 0x38 ..= 0x3F. ++}; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__index_binary_alpha__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len2 = dst_len / 2; +- size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// -------- + +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_64__decode(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET) ++ ? wuffs_base__base_64__decode_url ++ : wuffs_base__base_64__decode_std; ++ wuffs_base__transform__output o; ++ uint8_t* d_ptr = dst.ptr; ++ size_t d_len = dst.len; ++ const uint8_t* s_ptr = src.ptr; ++ size_t s_len = src.len; ++ bool pad = false; + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)s0); +- } ++ while (s_len >= 4) { ++ uint32_t s = wuffs_base__peek_u32le__no_bounds_check(s_ptr); ++ uint32_t s0 = alphabet[0xFF & (s >> 0)]; ++ uint32_t s1 = alphabet[0xFF & (s >> 8)]; ++ uint32_t s2 = alphabet[0xFF & (s >> 16)]; ++ uint32_t s3 = alphabet[0xFF & (s >> 24)]; + +- s += 1 * 1; +- d += 1 * 2; +- n -= 1; +- } ++ if (((s0 | s1 | s2 | s3) & 0xC0) != 0) { ++ if (s_len > 4) { ++ o.status.repr = wuffs_base__error__bad_data; ++ goto done; ++ } else if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ goto done; ++ } else if ((options & WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING) && ++ (s_ptr[3] == '=')) { ++ pad = true; ++ if (s_ptr[2] == '=') { ++ goto src2; ++ } ++ goto src3; ++ } ++ o.status.repr = wuffs_base__error__bad_data; ++ goto done; ++ } + +- return len; +-} ++ if (d_len < 3) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } + +-// -------- ++ s_ptr += 4; ++ s_len -= 4; ++ s = (s0 << 18) | (s1 << 12) | (s2 << 6) | (s3 << 0); ++ *d_ptr++ = (uint8_t)(s >> 16); ++ *d_ptr++ = (uint8_t)(s >> 8); ++ *d_ptr++ = (uint8_t)(s >> 0); ++ d_len -= 3; ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgr_565(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ goto done; ++ } + +- // TODO: unroll. ++ if (s_len == 0) { ++ o.status.repr = NULL; ++ goto done; ++ } else if (s_len == 1) { ++ o.status.repr = wuffs_base__error__bad_data; ++ goto done; ++ } else if (s_len == 2) { ++ goto src2; ++ } + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))); +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++src3: ++ do { ++ uint32_t s = wuffs_base__peek_u24le__no_bounds_check(s_ptr); ++ uint32_t s0 = alphabet[0xFF & (s >> 0)]; ++ uint32_t s1 = alphabet[0xFF & (s >> 8)]; ++ uint32_t s2 = alphabet[0xFF & (s >> 16)]; ++ if ((s0 & 0xC0) || (s1 & 0xC0) || (s2 & 0xC3)) { ++ o.status.repr = wuffs_base__error__bad_data; ++ goto done; ++ } ++ if (d_len < 2) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } ++ s_ptr += pad ? 4 : 3; ++ s = (s0 << 18) | (s1 << 12) | (s2 << 6); ++ *d_ptr++ = (uint8_t)(s >> 16); ++ *d_ptr++ = (uint8_t)(s >> 8); ++ o.status.repr = NULL; ++ goto done; ++ } while (0); + +- s += 1 * 2; +- d += 1 * 3; +- n -= 1; +- } ++src2: ++ do { ++ uint32_t s = wuffs_base__peek_u16le__no_bounds_check(s_ptr); ++ uint32_t s0 = alphabet[0xFF & (s >> 0)]; ++ uint32_t s1 = alphabet[0xFF & (s >> 8)]; ++ if ((s0 & 0xC0) || (s1 & 0xCF)) { ++ o.status.repr = wuffs_base__error__bad_data; ++ goto done; ++ } ++ if (d_len < 1) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } ++ s_ptr += pad ? 4 : 2; ++ s = (s0 << 18) | (s1 << 12); ++ *d_ptr++ = (uint8_t)(s >> 16); ++ o.status.repr = NULL; ++ goto done; ++ } while (0); + +- return len; ++done: ++ o.num_dst = (size_t)(d_ptr - dst.ptr); ++ o.num_src = (size_t)(s_ptr - src.ptr); ++ return o; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_64__encode(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET) ++ ? wuffs_base__base_64__encode_url ++ : wuffs_base__base_64__encode_std; ++ wuffs_base__transform__output o; ++ uint8_t* d_ptr = dst.ptr; ++ size_t d_len = dst.len; ++ const uint8_t* s_ptr = src.ptr; ++ size_t s_len = src.len; + +- // TODO: unroll. ++ do { ++ while (s_len >= 3) { ++ if (d_len < 4) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } ++ uint32_t s = wuffs_base__peek_u24be__no_bounds_check(s_ptr); ++ s_ptr += 3; ++ s_len -= 3; ++ *d_ptr++ = alphabet[0x3F & (s >> 18)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 12)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 6)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 0)]; ++ d_len -= 4; ++ } + +- while (n >= 1) { +- uint32_t s0 = +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ goto done; ++ } + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; +- } ++ if (s_len == 2) { ++ if (d_len < ++ ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 3)) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } ++ uint32_t s = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(s_ptr))) ++ << 8; ++ s_ptr += 2; ++ *d_ptr++ = alphabet[0x3F & (s >> 18)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 12)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 6)]; ++ if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) { ++ *d_ptr++ = '='; ++ } ++ o.status.repr = NULL; ++ goto done; + +- return len; +-} ++ } else if (s_len == 1) { ++ if (d_len < ++ ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 2)) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } ++ uint32_t s = ((uint32_t)(wuffs_base__peek_u8__no_bounds_check(s_ptr))) ++ << 16; ++ s_ptr += 1; ++ *d_ptr++ = alphabet[0x3F & (s >> 18)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 12)]; ++ if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) { ++ *d_ptr++ = '='; ++ *d_ptr++ = '='; ++ } ++ o.status.repr = NULL; ++ goto done; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ } else { ++ o.status.repr = NULL; ++ goto done; ++ } ++ } while (0); + +- // TODO: unroll. ++done: ++ o.num_dst = (size_t)(d_ptr - dst.ptr); ++ o.num_src = (size_t)(s_ptr - src.ptr); ++ return o; ++} + +- while (n >= 1) { +- uint32_t s0 = +- wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__INTCONV) + +- s += 1 * 8; +- d += 1 * 3; +- n -= 1; +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__MAGIC) + +- return len; +-} ++// ---------------- Magic Numbers + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// ICO doesn't start with a magic identifier. Instead, see if the opening bytes ++// are plausibly ICO. ++// ++// Callers should have already verified that (prefix_data.len >= 2) and the ++// first two bytes are 0x00. ++// ++// See: ++// - https://docs.fileformat.com/image/ico/ ++static int32_t // ++wuffs_base__magic_number_guess_fourcc__maybe_ico( ++ wuffs_base__slice_u8 prefix_data, ++ bool prefix_closed) { ++ // Allow-list for the Image Type field. ++ if (prefix_data.len < 4) { ++ return prefix_closed ? 0 : -1; ++ } else if (prefix_data.ptr[3] != 0) { ++ return 0; ++ } ++ switch (prefix_data.ptr[2]) { ++ case 0x01: // ICO ++ case 0x02: // CUR ++ break; ++ default: ++ return 0; ++ } + +- // TODO: unroll. ++ // The Number Of Images should be positive. ++ if (prefix_data.len < 6) { ++ return prefix_closed ? 0 : -1; ++ } else if ((prefix_data.ptr[4] == 0) && (prefix_data.ptr[5] == 0)) { ++ return 0; ++ } + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sr = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sb = 0x101 * ((uint32_t)s[0]); ++ // The first ICONDIRENTRY's fourth byte should be zero. ++ if (prefix_data.len < 10) { ++ return prefix_closed ? 0 : -1; ++ } else if (prefix_data.ptr[9] != 0) { ++ return 0; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ // TODO: have a separate FourCC for CUR? ++ return 0x49434F20; // 'ICO 'be ++} + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++// TGA doesn't start with a magic identifier. Instead, see if the opening bytes ++// are plausibly TGA. ++// ++// Callers should have already verified that (prefix_data.len >= 2) and the ++// second byte (prefix_data.ptr[1], the Color Map Type byte), is either 0x00 or ++// 0x01. ++// ++// See: ++// - https://docs.fileformat.com/image/tga/ ++// - https://www.dca.fee.unicamp.br/~martino/disciplinas/ea978/tgaffs.pdf ++static int32_t // ++wuffs_base__magic_number_guess_fourcc__maybe_tga( ++ wuffs_base__slice_u8 prefix_data, ++ bool prefix_closed) { ++ // Allow-list for the Image Type field. ++ if (prefix_data.len < 3) { ++ return prefix_closed ? 0 : -1; ++ } ++ switch (prefix_data.ptr[2]) { ++ case 0x01: ++ case 0x02: ++ case 0x03: ++ case 0x09: ++ case 0x0A: ++ case 0x0B: ++ break; ++ default: ++ // TODO: 0x20 and 0x21 are invalid, according to the spec, but are ++ // apparently unofficial extensions. ++ return 0; ++ } + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++ // Allow-list for the Color Map Entry Size field (if the Color Map Type field ++ // is non-zero) or else all the Color Map fields should be zero. ++ if (prefix_data.len < 8) { ++ return prefix_closed ? 0 : -1; ++ } else if (prefix_data.ptr[1] != 0x00) { ++ switch (prefix_data.ptr[7]) { ++ case 0x0F: ++ case 0x10: ++ case 0x18: ++ case 0x20: ++ break; ++ default: ++ return 0; ++ } ++ } else if ((prefix_data.ptr[3] | prefix_data.ptr[4] | prefix_data.ptr[5] | ++ prefix_data.ptr[6] | prefix_data.ptr[7]) != 0x00) { ++ return 0; ++ } + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++ // Allow-list for the Pixel Depth field. ++ if (prefix_data.len < 17) { ++ return prefix_closed ? 0 : -1; ++ } ++ switch (prefix_data.ptr[16]) { ++ case 0x01: ++ case 0x08: ++ case 0x0F: ++ case 0x10: ++ case 0x18: ++ case 0x20: ++ break; ++ default: ++ return 0; + } + +- return len; ++ return 0x54474120; // 'TGA 'be + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++WUFFS_BASE__MAYBE_STATIC int32_t // ++wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data, ++ bool prefix_closed) { ++ // This is similar to (but different from): ++ // - the magic/Magdir tables under https://github.com/file/file ++ // - the MIME Sniffing algorithm at https://mimesniff.spec.whatwg.org/ + +- // TODO: unroll. ++ // table holds the 'magic numbers' (which are actually variable length ++ // strings). The strings may contain NUL bytes, so the "const char* magic" ++ // value starts with the length-minus-1 of the 'magic number'. ++ // ++ // Keep it sorted by magic[1], then magic[0] descending (prioritizing longer ++ // matches) and finally by magic[2:]. When multiple entries match, the ++ // longest one wins. ++ // ++ // The fourcc field might be negated, in which case there's further ++ // specialization (see § below). ++ static struct { ++ int32_t fourcc; ++ const char* magic; ++ } table[] = { ++ {-0x30302020, "\x01\x00\x00"}, // '00 'be ++ {+0x475A2020, "\x02\x1F\x8B\x08"}, // GZ ++ {+0x5A535444, "\x03\x28\xB5\x2F\xFD"}, // ZSTD ++ {+0x425A3220, "\x02\x42\x5A\x68"}, // BZ2 ++ {+0x424D5020, "\x01\x42\x4D"}, // BMP ++ {+0x47494620, "\x03\x47\x49\x46\x38"}, // GIF ++ {+0x54494646, "\x03\x49\x49\x2A\x00"}, // TIFF (little-endian) ++ {+0x4C5A4950, "\x04\x4C\x5A\x49\x50\x01"}, // LZIP ++ {+0x54494646, "\x03\x4D\x4D\x00\x2A"}, // TIFF (big-endian) ++ {+0x4E50424D, "\x02\x50\x35\x0A"}, // NPBM (P5; *.pgm) ++ {+0x4E50424D, "\x02\x50\x36\x0A"}, // NPBM (P6; *.ppm) ++ {-0x52494646, "\x03\x52\x49\x46\x46"}, // RIFF ++ {+0x4C5A4D41, "\x04\x5D\x00\x10\x00\x00"}, // LZMA ++ {+0x4C5A4D41, "\x02\x5D\x00\x00"}, // LZMA ++ {+0x4E494520, "\x02\x6E\xC3\xAF"}, // NIE ++ {+0x514F4920, "\x03\x71\x6F\x69\x66"}, // QOI ++ {+0x5A4C4942, "\x01\x78\x9C"}, // ZLIB ++ {+0x504E4720, "\x03\x89\x50\x4E\x47"}, // PNG ++ {+0x585A2020, "\x04\xFD\x37\x7A\x58\x5A"}, // XZ ++ {+0x4A504547, "\x01\xFF\xD8"}, // JPEG ++ }; ++ static const size_t table_len = sizeof(table) / sizeof(table[0]); + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); +- uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); +- uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); +- uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); ++ if (prefix_data.len == 0) { ++ return prefix_closed ? 0 : -1; ++ } ++ uint8_t pre_first_byte = prefix_data.ptr[0]; + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ int32_t fourcc = 0; ++ size_t i; ++ for (i = 0; i < table_len; i++) { ++ uint8_t mag_first_byte = ((uint8_t)(table[i].magic[1])); ++ if (pre_first_byte < mag_first_byte) { ++ break; ++ } else if (pre_first_byte > mag_first_byte) { ++ continue; ++ } ++ fourcc = table[i].fourcc; + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ uint8_t mag_remaining_len = ((uint8_t)(table[i].magic[0])); ++ if (mag_remaining_len == 0) { ++ goto match; ++ } + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++ const char* mag_remaining_ptr = table[i].magic + 2; ++ uint8_t* pre_remaining_ptr = prefix_data.ptr + 1; ++ size_t pre_remaining_len = prefix_data.len - 1; ++ if (pre_remaining_len < mag_remaining_len) { ++ if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, pre_remaining_len)) { ++ return prefix_closed ? 0 : -1; ++ } ++ } else { ++ if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, mag_remaining_len)) { ++ goto match; ++ } ++ } ++ } + +- s += 1 * 8; +- d += 1 * 3; +- n -= 1; ++ if (prefix_data.len < 2) { ++ return prefix_closed ? 0 : -1; ++ } else if ((prefix_data.ptr[1] == 0x00) || (prefix_data.ptr[1] == 0x01)) { ++ return wuffs_base__magic_number_guess_fourcc__maybe_tga(prefix_data, ++ prefix_closed); + } + +- return len; +-} ++ return 0; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_premul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++match: ++ // Negative FourCC values (see § above) are further specialized. ++ if (fourcc < 0) { ++ fourcc = -fourcc; + +- while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s0; +- d[1] = s1; +- d[2] = s2; ++ if (fourcc == 0x52494646) { // 'RIFF'be ++ if (prefix_data.len < 12) { ++ return prefix_closed ? 0 : -1; ++ } ++ uint32_t x = wuffs_base__peek_u32be__no_bounds_check(prefix_data.ptr + 8); ++ if (x == 0x57454250) { // 'WEBP'be ++ return 0x57454250; // 'WEBP'be ++ } + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++ } else if (fourcc == 0x30302020) { // '00 'be ++ // Binary data starting with multiple 0x00 NUL bytes is quite common. ++ // Unfortunately, some file formats also don't start with a magic ++ // identifier, so we have to use heuristics (where the order matters, the ++ // same as /usr/bin/file's magic/Magdir tables) as best we can. Maybe ++ // it's TGA, ICO/CUR, etc. Maybe it's something else. ++ int32_t tga = wuffs_base__magic_number_guess_fourcc__maybe_tga( ++ prefix_data, prefix_closed); ++ if (tga != 0) { ++ return tga; ++ } ++ int32_t ico = wuffs_base__magic_number_guess_fourcc__maybe_ico( ++ prefix_data, prefix_closed); ++ if (ico != 0) { ++ return ico; ++ } ++ if (prefix_data.len < 4) { ++ return prefix_closed ? 0 : -1; ++ } else if ((prefix_data.ptr[2] != 0x00) && ++ ((prefix_data.ptr[2] >= 0x80) || ++ (prefix_data.ptr[3] != 0x00))) { ++ // Roughly speaking, this could be a non-degenerate (non-0-width and ++ // non-0-height) WBMP image. ++ return 0x57424D50; // 'WBMP'be ++ } ++ return 0; ++ } + } +- +- return len; ++ return fourcc; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_premul__src_over(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sr = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sb = 0x101 * ((uint32_t)s[0]); +- +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__MAGIC) + +- // Composite src (premul) over dst (premul). +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV) + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++// ---------------- Pixel Swizzler + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; +- } ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len); + +- return len; +-} ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len); + ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len); + +- // TODO: unroll. ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++static uint64_t // ++wuffs_private_impl__swizzle_xxxx__y__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++// -------- + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; +- } ++static inline uint32_t // ++wuffs_private_impl__swap_u32_argb_abgr(uint32_t u) { ++ uint32_t o = u & 0xFF00FF00ul; ++ uint32_t r = u & 0x00FF0000ul; ++ uint32_t b = u & 0x000000FFul; ++ return o | (r >> 16) | (b << 16); ++} + +- return len; ++static inline uint64_t // ++wuffs_private_impl__swap_u64_argb_abgr(uint64_t u) { ++ uint64_t o = u & 0xFFFF0000FFFF0000ull; ++ uint64_t r = u & 0x0000FFFF00000000ull; ++ uint64_t b = u & 0x000000000000FFFFull; ++ return o | (r >> 32) | (b << 32); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_nonpremul_4x16le__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static inline uint32_t // ++wuffs_private_impl__color_u64__as__color_u32__swap_u32_argb_abgr(uint64_t c) { ++ uint32_t a = ((uint32_t)(0xFF & (c >> 56))); ++ uint32_t r = ((uint32_t)(0xFF & (c >> 40))); ++ uint32_t g = ((uint32_t)(0xFF & (c >> 24))); ++ uint32_t b = ((uint32_t)(0xFF & (c >> 8))); ++ return (a << 24) | (b << 16) | (g << 8) | (r << 0); ++} + +- // TODO: unroll. ++// -------- + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__color_u32_argb_premul // ++wuffs_base__pixel_buffer__color_u32_at(const wuffs_base__pixel_buffer* pb, ++ uint32_t x, ++ uint32_t y) { ++ if (!pb || (x >= pb->pixcfg.private_impl.width) || ++ (y >= pb->pixcfg.private_impl.height)) { ++ return 0; ++ } + +- s += 1 * 8; +- d += 1 * 3; +- n -= 1; ++ if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { ++ // TODO: support planar formats. ++ return 0; + } + +- return len; +-} ++ size_t stride = pb->private_impl.planes[0].stride; ++ const uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)); + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ switch (pb->pixcfg.private_impl.pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ return wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))); + +- // TODO: unroll. ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: { ++ uint8_t* palette = pb->private_impl.planes[3].ptr; ++ return wuffs_base__peek_u32le__no_bounds_check(palette + ++ (4 * ((size_t)row[x]))); ++ } + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sb = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sr = 0x101 * ((uint32_t)s[0]); ++ // Common formats above. Rarer formats below. + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ return 0xFF000000 | (0x00010101 * ((uint32_t)(row[x]))); ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: ++ return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 1]))); ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: ++ return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 0]))); ++ case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: ++ return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ (((uint32_t)(row[(2 * x) + 1])) << 24) | ++ (((uint32_t)(row[(2 * x) + 0])) * 0x00010101)); + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: { ++ uint8_t* palette = pb->private_impl.planes[3].ptr; ++ return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(palette + ++ (4 * ((size_t)row[x])))); ++ } + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(row + (2 * ((size_t)x)))); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ return 0xFF000000 | ++ wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x))); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ return wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u64le__no_bounds_check(row + (8 * ((size_t)x)))); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ return 0xFF000000 | ++ wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))); + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swap_u32_argb_abgr( ++ 0xFF000000 | ++ wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x)))); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ return wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(row + ++ (4 * ((size_t)x))))); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ return wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ return wuffs_private_impl__swap_u32_argb_abgr( ++ 0xFF000000 | ++ wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); ++ ++ default: ++ // TODO: support more formats. ++ break; + } + +- return len; ++ return 0; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// -------- + +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status // ++wuffs_base__pixel_buffer__set_color_u32_at( ++ wuffs_base__pixel_buffer* pb, ++ uint32_t x, ++ uint32_t y, ++ wuffs_base__color_u32_argb_premul color) { ++ if (!pb) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if ((x >= pb->pixcfg.private_impl.width) || ++ (y >= pb->pixcfg.private_impl.height)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); +- uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); +- uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); +- uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); ++ if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { ++ // TODO: support planar formats. ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ size_t stride = pb->private_impl.planes[0].stride; ++ uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)); + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ switch (pb->pixcfg.private_impl.pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ wuffs_base__poke_u32le__no_bounds_check(row + (4 * ((size_t)x)), color); ++ break; + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++ // Common formats above. Rarer formats below. + +- s += 1 * 8; +- d += 1 * 3; +- n -= 1; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ wuffs_base__poke_u8__no_bounds_check( ++ row + ((size_t)x), ++ wuffs_base__color_u32_argb_premul__as__color_u8_gray(color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: ++ wuffs_base__poke_u16le__no_bounds_check( ++ row + (2 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u16_gray(color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: ++ wuffs_base__poke_u16be__no_bounds_check( ++ row + (2 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u16_gray(color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: ++ wuffs_base__poke_u16le__no_bounds_check( ++ row + (2 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u16_alpha_gray_nonpremul( ++ color)); ++ break; + +- return len; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: ++ wuffs_base__poke_u8__no_bounds_check( ++ row + ((size_t)x), wuffs_base__pixel_palette__closest_element( ++ wuffs_base__pixel_buffer__palette(pb), ++ pb->pixcfg.private_impl.pixfmt, color)); ++ break; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_premul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ wuffs_base__poke_u16le__no_bounds_check( ++ row + (2 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ wuffs_base__poke_u24le__no_bounds_check(row + (3 * ((size_t)x)), color); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ wuffs_base__poke_u32le__no_bounds_check( ++ row + (4 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ wuffs_base__poke_u64le__no_bounds_check( ++ row + (8 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul( ++ color)); ++ break; + +- while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s2; +- d[1] = s1; +- d[2] = s0; ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ wuffs_base__poke_u24le__no_bounds_check( ++ row + (3 * ((size_t)x)), ++ wuffs_private_impl__swap_u32_argb_abgr(color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ wuffs_base__poke_u32le__no_bounds_check( ++ row + (4 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ wuffs_private_impl__swap_u32_argb_abgr(color))); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ wuffs_base__poke_u32le__no_bounds_check( ++ row + (4 * ((size_t)x)), ++ wuffs_private_impl__swap_u32_argb_abgr(color)); ++ break; + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++ default: ++ // TODO: support more formats. ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +- return len; ++ return wuffs_base__make_status(NULL); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_premul__src_over(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// -------- + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sb = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sr = 0x101 * ((uint32_t)s[0]); ++static inline void // ++wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xx( ++ wuffs_base__pixel_buffer* pb, ++ wuffs_base__rect_ie_u32 rect, ++ uint16_t color) { ++ size_t stride = pb->private_impl.planes[0].stride; ++ uint32_t width = wuffs_base__rect_ie_u32__width(&rect); ++ if ((stride == (2 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { ++ uint8_t* ptr = ++ pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); ++ uint32_t height = wuffs_base__rect_ie_u32__height(&rect); ++ size_t n; ++ for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { ++ wuffs_base__poke_u16le__no_bounds_check(ptr, color); ++ ptr += 2; ++ } ++ return; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ uint32_t y; ++ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { ++ uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + ++ (2 * ((size_t)rect.min_incl_x)); ++ uint32_t n; ++ for (n = width; n > 0; n--) { ++ wuffs_base__poke_u16le__no_bounds_check(ptr, color); ++ ptr += 2; ++ } ++ } ++} + +- // Composite src (premul) over dst (premul). +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); ++static inline void // ++wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxx( ++ wuffs_base__pixel_buffer* pb, ++ wuffs_base__rect_ie_u32 rect, ++ uint32_t color) { ++ size_t stride = pb->private_impl.planes[0].stride; ++ uint32_t width = wuffs_base__rect_ie_u32__width(&rect); ++ if ((stride == (3 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { ++ uint8_t* ptr = ++ pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); ++ uint32_t height = wuffs_base__rect_ie_u32__height(&rect); ++ size_t n; ++ for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { ++ wuffs_base__poke_u24le__no_bounds_check(ptr, color); ++ ptr += 3; ++ } ++ return; ++ } + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++ uint32_t y; ++ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { ++ uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + ++ (3 * ((size_t)rect.min_incl_x)); ++ uint32_t n; ++ for (n = width; n > 0; n--) { ++ wuffs_base__poke_u24le__no_bounds_check(ptr, color); ++ ptr += 3; ++ } ++ } ++} + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++static inline void // ++wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx( ++ wuffs_base__pixel_buffer* pb, ++ wuffs_base__rect_ie_u32 rect, ++ uint32_t color) { ++ size_t stride = pb->private_impl.planes[0].stride; ++ uint32_t width = wuffs_base__rect_ie_u32__width(&rect); ++ if ((stride == (4 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { ++ uint8_t* ptr = ++ pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); ++ uint32_t height = wuffs_base__rect_ie_u32__height(&rect); ++ size_t n; ++ for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { ++ wuffs_base__poke_u32le__no_bounds_check(ptr, color); ++ ptr += 4; ++ } ++ return; + } + +- return len; ++ uint32_t y; ++ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { ++ uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + ++ (4 * ((size_t)rect.min_incl_x)); ++ uint32_t n; ++ for (n = width; n > 0; n--) { ++ wuffs_base__poke_u32le__no_bounds_check(ptr, color); ++ ptr += 4; ++ } ++ } + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgbx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static inline void // ++wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx( ++ wuffs_base__pixel_buffer* pb, ++ wuffs_base__rect_ie_u32 rect, ++ uint64_t color) { ++ size_t stride = pb->private_impl.planes[0].stride; ++ uint32_t width = wuffs_base__rect_ie_u32__width(&rect); ++ if ((stride == (8 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { ++ uint8_t* ptr = ++ pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); ++ uint32_t height = wuffs_base__rect_ie_u32__height(&rect); ++ size_t n; ++ for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { ++ wuffs_base__poke_u64le__no_bounds_check(ptr, color); ++ ptr += 8; ++ } ++ return; ++ } + +- // TODO: unroll. ++ uint32_t y; ++ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { ++ uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + ++ (8 * ((size_t)rect.min_incl_x)); ++ uint32_t n; ++ for (n = width; n > 0; n--) { ++ wuffs_base__poke_u64le__no_bounds_check(ptr, color); ++ ptr += 8; ++ } ++ } ++} + +- while (n >= 1) { +- uint8_t b0 = s[0]; +- uint8_t b1 = s[1]; +- uint8_t b2 = s[2]; +- d[0] = b2; +- d[1] = b1; +- d[2] = b0; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status // ++wuffs_base__pixel_buffer__set_color_u32_fill_rect( ++ wuffs_base__pixel_buffer* pb, ++ wuffs_base__rect_ie_u32 rect, ++ wuffs_base__color_u32_argb_premul color) { ++ if (!pb) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } else if (wuffs_base__rect_ie_u32__is_empty(&rect)) { ++ return wuffs_base__make_status(NULL); ++ } ++ wuffs_base__rect_ie_u32 bounds = ++ wuffs_base__pixel_config__bounds(&pb->pixcfg); ++ if (!wuffs_base__rect_ie_u32__contains_rect(&bounds, rect)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++ if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { ++ // TODO: support planar formats. ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +- return len; +-} ++ switch (pb->pixcfg.private_impl.pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(pb, rect, ++ color); ++ return wuffs_base__make_status(NULL); + +-// -------- ++ // Common formats above. Rarer formats below. + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xx( ++ pb, rect, ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color)); ++ return wuffs_base__make_status(NULL); + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxx(pb, rect, ++ color); ++ return wuffs_base__make_status(NULL); + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx( ++ pb, rect, ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ color)); ++ return wuffs_base__make_status(NULL); + +- return len; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx( ++ pb, rect, ++ wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul( ++ color)); ++ return wuffs_base__make_status(NULL); + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx( ++ pb, rect, ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ wuffs_private_impl__swap_u32_argb_abgr(color))); ++ return wuffs_base__make_status(NULL); + +- size_t n = len; +- while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__color_u64__as__color_u32( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx( ++ pb, rect, wuffs_private_impl__swap_u32_argb_abgr(color)); ++ return wuffs_base__make_status(NULL); ++ } + +- s += 1 * 8; +- d += 1 * 4; +- n -= 1; ++ uint32_t y; ++ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { ++ uint32_t x; ++ for (x = rect.min_incl_x; x < rect.max_excl_x; x++) { ++ wuffs_base__pixel_buffer__set_color_u32_at(pb, x, y, color); ++ } + } +- return len; ++ return wuffs_base__make_status(NULL); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- while (n >= 1) { +- uint64_t d0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); +- uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u64__as__color_u32( +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0))); ++// -------- + +- s += 1 * 8; +- d += 1 * 4; +- n -= 1; ++WUFFS_BASE__MAYBE_STATIC uint8_t // ++wuffs_base__pixel_palette__closest_element( ++ wuffs_base__slice_u8 palette_slice, ++ wuffs_base__pixel_format palette_format, ++ wuffs_base__color_u32_argb_premul c) { ++ size_t n = palette_slice.len / 4; ++ if (n > (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ n = (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4); + } ++ size_t best_index = 0; ++ uint64_t best_score = 0xFFFFFFFFFFFFFFFF; + +- return len; +-} +- +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // Work in 16-bit color. ++ uint32_t ca = 0x101 * (0xFF & (c >> 24)); ++ uint32_t cr = 0x101 * (0xFF & (c >> 16)); ++ uint32_t cg = 0x101 * (0xFF & (c >> 8)); ++ uint32_t cb = 0x101 * (0xFF & (c >> 0)); + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0)); ++ switch (palette_format.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: { ++ bool nonpremul = palette_format.repr == ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL; + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; ++ size_t i; ++ for (i = 0; i < n; i++) { ++ // Work in 16-bit color. ++ uint32_t pb = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 0])); ++ uint32_t pg = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 1])); ++ uint32_t pr = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 2])); ++ uint32_t pa = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 3])); ++ ++ // Convert to premultiplied alpha. ++ if (nonpremul && (pa != 0xFFFF)) { ++ pb = (pb * pa) / 0xFFFF; ++ pg = (pg * pa) / 0xFFFF; ++ pr = (pr * pa) / 0xFFFF; ++ } ++ ++ // These deltas are conceptually int32_t (signed) but after squaring, ++ // it's equivalent to work in uint32_t (unsigned). ++ pb -= cb; ++ pg -= cg; ++ pr -= cr; ++ pa -= ca; ++ uint64_t score = ((uint64_t)(pb * pb)) + ((uint64_t)(pg * pg)) + ++ ((uint64_t)(pr * pr)) + ((uint64_t)(pa * pa)); ++ if (best_score > score) { ++ best_score = score; ++ best_index = i; ++ } ++ } ++ break; ++ } + } + +- return len; ++ return (uint8_t)best_index; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// -------- + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_nonpremul_premul_u32_axxx(d0, s0)); ++static inline uint32_t // ++wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx( ++ uint32_t dst_nonpremul, ++ uint32_t src_nonpremul) { ++ // Extract 16-bit color components. ++ // ++ // If the destination is transparent then SRC_OVER is equivalent to SRC: just ++ // return src_nonpremul. This isn't just an optimization (skipping the rest ++ // of the function's computation). It also preserves the nonpremul ++ // distinction between e.g. transparent red and transparent blue that would ++ // otherwise be lost by converting from nonpremul to premul and back. ++ uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24)); ++ if (da == 0) { ++ return src_nonpremul; ++ } ++ uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16)); ++ uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8)); ++ uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0)); ++ uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24)); ++ uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16)); ++ uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8)); ++ uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0)); + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; ++ // Convert dst from nonpremul to premul. ++ dr = (dr * da) / 0xFFFF; ++ dg = (dg * da) / 0xFFFF; ++ db = (db * da) / 0xFFFF; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert dst from premul to nonpremul. ++ if (da != 0) { ++ dr = (dr * 0xFFFF) / da; ++ dg = (dg * 0xFFFF) / da; ++ db = (db * 0xFFFF) / da; + } + +- return len; ++ // Convert from 16-bit color to 8-bit color. ++ da >>= 8; ++ dr >>= 8; ++ dg >>= 8; ++ db >>= 8; ++ ++ // Combine components. ++ return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__index_bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; ++static inline uint64_t // ++wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx( ++ uint64_t dst_nonpremul, ++ uint64_t src_nonpremul) { ++ // Extract components. ++ // ++ // If the destination is transparent then SRC_OVER is equivalent to SRC: just ++ // return src_nonpremul. This isn't just an optimization (skipping the rest ++ // of the function's computation). It also preserves the nonpremul ++ // distinction between e.g. transparent red and transparent blue that would ++ // otherwise be lost by converting from nonpremul to premul and back. ++ uint64_t da = 0xFFFF & (dst_nonpremul >> 48); ++ if (da == 0) { ++ return src_nonpremul; + } +- size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ uint64_t dr = 0xFFFF & (dst_nonpremul >> 32); ++ uint64_t dg = 0xFFFF & (dst_nonpremul >> 16); ++ uint64_t db = 0xFFFF & (dst_nonpremul >> 0); ++ uint64_t sa = 0xFFFF & (src_nonpremul >> 48); ++ uint64_t sr = 0xFFFF & (src_nonpremul >> 32); ++ uint64_t sg = 0xFFFF & (src_nonpremul >> 16); ++ uint64_t sb = 0xFFFF & (src_nonpremul >> 0); + +- // TODO: unroll. ++ // Convert dst from nonpremul to premul. ++ dr = (dr * da) / 0xFFFF; ++ dg = (dg * da) / 0xFFFF; ++ db = (db * da) / 0xFFFF; + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint64_t ia = 0xFFFF - sa; + +- s += 1 * 1; +- d += 1 * 4; +- n -= 1; ++ // Composite src (nonpremul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert dst from premul to nonpremul. ++ if (da != 0) { ++ dr = (dr * 0xFFFF) / da; ++ dg = (dg * 0xFFFF) / da; ++ db = (db * 0xFFFF) / da; + } + +- return len; ++ // Combine components. ++ return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static inline uint32_t // ++wuffs_private_impl__composite_nonpremul_premul_u32_axxx(uint32_t dst_nonpremul, ++ uint32_t src_premul) { ++ // Extract 16-bit color components. ++ uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24)); ++ uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16)); ++ uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8)); ++ uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0)); ++ uint32_t sa = 0x101 * (0xFF & (src_premul >> 24)); ++ uint32_t sr = 0x101 * (0xFF & (src_premul >> 16)); ++ uint32_t sg = 0x101 * (0xFF & (src_premul >> 8)); ++ uint32_t sb = 0x101 * (0xFF & (src_premul >> 0)); + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); ++ // Convert dst from nonpremul to premul. ++ dr = (dr * da) / 0xFFFF; ++ dg = (dg * da) / 0xFFFF; ++ db = (db * da) / 0xFFFF; + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert dst from premul to nonpremul. ++ if (da != 0) { ++ dr = (dr * 0xFFFF) / da; ++ dg = (dg * 0xFFFF) / da; ++ db = (db * 0xFFFF) / da; + } + +- return len; ++ // Convert from 16-bit color to 8-bit color. ++ da >>= 8; ++ dr >>= 8; ++ dg >>= 8; ++ db >>= 8; ++ ++ // Combine components. ++ return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static inline uint64_t // ++wuffs_private_impl__composite_nonpremul_premul_u64_axxx(uint64_t dst_nonpremul, ++ uint64_t src_premul) { ++ // Extract components. ++ uint64_t da = 0xFFFF & (dst_nonpremul >> 48); ++ uint64_t dr = 0xFFFF & (dst_nonpremul >> 32); ++ uint64_t dg = 0xFFFF & (dst_nonpremul >> 16); ++ uint64_t db = 0xFFFF & (dst_nonpremul >> 0); ++ uint64_t sa = 0xFFFF & (src_premul >> 48); ++ uint64_t sr = 0xFFFF & (src_premul >> 32); ++ uint64_t sg = 0xFFFF & (src_premul >> 16); ++ uint64_t sb = 0xFFFF & (src_premul >> 0); + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0)); ++ // Convert dst from nonpremul to premul. ++ dr = (dr * da) / 0xFFFF; ++ dg = (dg * da) / 0xFFFF; ++ db = (db * da) / 0xFFFF; + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint64_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert dst from premul to nonpremul. ++ if (da != 0) { ++ dr = (dr * 0xFFFF) / da; ++ dg = (dg * 0xFFFF) / da; ++ db = (db * 0xFFFF) / da; + } + +- return len; ++ // Combine components. ++ return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static inline uint32_t // ++wuffs_private_impl__composite_premul_nonpremul_u32_axxx( ++ uint32_t dst_premul, ++ uint32_t src_nonpremul) { ++ // Extract 16-bit color components. ++ uint32_t da = 0x101 * (0xFF & (dst_premul >> 24)); ++ uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16)); ++ uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8)); ++ uint32_t db = 0x101 * (0xFF & (dst_premul >> 0)); ++ uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24)); ++ uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16)); ++ uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8)); ++ uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0)); + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_nonpremul_premul_u32_axxx(d0, s0)); ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; +- } ++ // Composite src (nonpremul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; + +- return len; ++ // Convert from 16-bit color to 8-bit color. ++ da >>= 8; ++ dr >>= 8; ++ dg >>= 8; ++ db >>= 8; ++ ++ // Combine components. ++ return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); ++} ++ ++static inline uint64_t // ++wuffs_private_impl__composite_premul_nonpremul_u64_axxx( ++ uint64_t dst_premul, ++ uint64_t src_nonpremul) { ++ // Extract components. ++ uint64_t da = 0xFFFF & (dst_premul >> 48); ++ uint64_t dr = 0xFFFF & (dst_premul >> 32); ++ uint64_t dg = 0xFFFF & (dst_premul >> 16); ++ uint64_t db = 0xFFFF & (dst_premul >> 0); ++ uint64_t sa = 0xFFFF & (src_nonpremul >> 48); ++ uint64_t sr = 0xFFFF & (src_nonpremul >> 32); ++ uint64_t sg = 0xFFFF & (src_nonpremul >> 16); ++ uint64_t sb = 0xFFFF & (src_nonpremul >> 0); ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint64_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Combine components. ++ return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); ++} ++ ++static inline uint32_t // ++wuffs_private_impl__composite_premul_premul_u32_axxx(uint32_t dst_premul, ++ uint32_t src_premul) { ++ // Extract 16-bit color components. ++ uint32_t da = 0x101 * (0xFF & (dst_premul >> 24)); ++ uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16)); ++ uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8)); ++ uint32_t db = 0x101 * (0xFF & (dst_premul >> 0)); ++ uint32_t sa = 0x101 * (0xFF & (src_premul >> 24)); ++ uint32_t sr = 0x101 * (0xFF & (src_premul >> 16)); ++ uint32_t sg = 0x101 * (0xFF & (src_premul >> 8)); ++ uint32_t sb = 0x101 * (0xFF & (src_premul >> 0)); ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert from 16-bit color to 8-bit color. ++ da >>= 8; ++ dr >>= 8; ++ dg >>= 8; ++ db >>= 8; ++ ++ // Combine components. ++ return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); + } + + // -------- + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++wuffs_private_impl__swizzle_squash_align4_bgr_565_8888(uint8_t* dst_ptr, ++ size_t dst_len, ++ const uint8_t* src_ptr, ++ size_t src_len, ++ bool nonpremul) { ++ size_t len = (dst_len < src_len ? dst_len : src_len) / 4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; +- while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- uint8_t s3 = s[3]; +- d[0] = s0; +- d[1] = s0; +- d[2] = s1; +- d[3] = s1; +- d[4] = s2; +- d[5] = s2; +- d[6] = s3; +- d[7] = s3; +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++ while (n--) { ++ uint32_t argb = wuffs_base__peek_u32le__no_bounds_check(s); ++ if (nonpremul) { ++ argb = ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(argb); ++ } ++ uint32_t b5 = 0x1F & (argb >> (8 - 5)); ++ uint32_t g6 = 0x3F & (argb >> (16 - 6)); ++ uint32_t r5 = 0x1F & (argb >> (24 - 5)); ++ uint32_t alpha = argb & 0xFF000000; ++ wuffs_base__poke_u32le__no_bounds_check( ++ d, alpha | (r5 << 11) | (g6 << 5) | (b5 << 0)); ++ s += 4; ++ d += 4; + } + return len; + } + ++// -------- ++ + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++wuffs_private_impl__swizzle_swap_rgb_bgr(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t len = (dst_len < src_len ? dst_len : src_len) / 3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; +- while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++ while (n--) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s2; ++ d[1] = s1; ++ d[2] = s0; ++ s += 3; ++ d += 3; + } + return len; + } + ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8; ++wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t len = (dst_len < src_len ? dst_len : src_len) / 4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; +- + size_t n = len; +- while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + +- s += 1 * 8; +- d += 1 * 8; +- n -= 1; ++ __m128i shuffle = _mm_set_epi8(+0x0F, +0x0C, +0x0D, +0x0E, // ++ +0x0B, +0x08, +0x09, +0x0A, // ++ +0x07, +0x04, +0x05, +0x06, // ++ +0x03, +0x00, +0x01, +0x02); ++ ++ while (n >= 4) { ++ __m128i x; ++ x = _mm_lddqu_si128((const __m128i*)(const void*)s); ++ x = _mm_shuffle_epi8(x, shuffle); ++ _mm_storeu_si128((__m128i*)(void*)d, x); ++ ++ s += 4 * 4; ++ d += 4 * 4; ++ n -= 4; ++ } ++ ++ while (n--) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ uint8_t s3 = s[3]; ++ d[0] = s2; ++ d[1] = s1; ++ d[2] = s0; ++ d[3] = s3; ++ s += 4; ++ d += 4; + } + return len; + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++wuffs_private_impl__swizzle_swap_rgbx_bgrx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t len = (dst_len < src_len ? dst_len : src_len) / 4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; +- while (n >= 1) { +- uint64_t s0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); +- wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++ while (n--) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ uint8_t s3 = s[3]; ++ d[0] = s2; ++ d[1] = s1; ++ d[2] = s0; ++ d[3] = s3; ++ s += 4; ++ d += 4; + } + return len; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- +- size_t n = len; +- while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), wuffs_base__composite_nonpremul_premul_u64_axxx(d0, s0)); ++// -------- + +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++static uint64_t // ++wuffs_private_impl__swizzle_copy_1_1(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t len = (dst_len < src_len) ? dst_len : src_len; ++ if (len > 0) { ++ memmove(dst_ptr, src_ptr, len); + } + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; ++wuffs_private_impl__swizzle_copy_2_2(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; ++ if (len > 0) { ++ memmove(dst_ptr, src_ptr, len * 2); + } +- size_t dst_len8 = dst_len / 8; +- size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); ++ return len; ++} + +- s += 1 * 1; +- d += 1 * 8; +- n -= 1; ++static uint64_t // ++wuffs_private_impl__swizzle_copy_3_3(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len3 < src_len3) ? dst_len3 : src_len3; ++ if (len > 0) { ++ memmove(dst_ptr, src_ptr, len * 3); + } +- + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; ++wuffs_private_impl__swizzle_copy_4_4(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- +- size_t n = len; +- while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- uint8_t s3 = s[3]; +- d[0] = s2; +- d[1] = s2; +- d[2] = s1; +- d[3] = s1; +- d[4] = s0; +- d[5] = s0; +- d[6] = s3; +- d[7] = s3; +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ if (len > 0) { ++ memmove(dst_ptr, src_ptr, len * 4); + } + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_copy_8_8(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- +- size_t n = len; +- while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = +- wuffs_base__color_u32__as__color_u64(wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8; ++ if (len > 0) { ++ memmove(dst_ptr, src_ptr, len * 8); + } + return len; + } + ++// -------- ++ + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++wuffs_private_impl__swizzle_bgr_565__bgr(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; +- + size_t n = len; ++ ++ // TODO: unroll. ++ + while (n >= 1) { +- uint64_t s0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); +- wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); ++ uint32_t b5 = (uint32_t)(s[0] >> 3); ++ uint32_t g6 = (uint32_t)(s[1] >> 2); ++ uint32_t r5 = (uint32_t)(s[2] >> 3); ++ uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + +- s += 1 * 4; +- d += 1 * 8; ++ s += 1 * 3; ++ d += 1 * 2; + n -= 1; + } ++ + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; ++wuffs_private_impl__swizzle_bgr_565__bgrx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; +- + size_t n = len; ++ ++ // TODO: unroll. ++ + while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = +- wuffs_base__color_u32__as__color_u64(wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), wuffs_base__composite_nonpremul_premul_u64_axxx(d0, s0)); ++ uint32_t b5 = (uint32_t)(s[0] >> 3); ++ uint32_t g6 = (uint32_t)(s[1] >> 2); ++ uint32_t r5 = (uint32_t)(s[2] >> 3); ++ uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + + s += 1 * 4; +- d += 1 * 8; ++ d += 1 * 2; + n -= 1; + } ++ + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( ++wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22217,13 +23221,14 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( + // TODO: unroll. + + while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); + + s += 1 * 4; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22231,16 +23236,16 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src( ++wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22248,13 +23253,14 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src( + // TODO: unroll. + + while (n >= 1) { +- uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(s0)); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))))); + + s += 1 * 8; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22262,16 +23268,16 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over( ++wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22279,13 +23285,38 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)); ++ // Extract 16-bit color components. ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sr = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sb = 0x101 * ((uint32_t)s[0]); ++ ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); + + s += 1 * 4; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22293,16 +23324,16 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src_over( ++wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22310,16 +23341,38 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint64_t d0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); +- uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u64__as__color_u32( +- wuffs_base__composite_premul_nonpremul_u64_axxx(d0, s0))); ++ // Extract 16-bit color components. ++ uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); ++ uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); ++ uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); ++ uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); ++ ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); + + s += 1 * 8; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22327,16 +23380,15 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++wuffs_private_impl__swizzle_bgr_565__bgra_premul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22344,13 +23396,12 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_premul_premul_u32_axxx(d0, s0)); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); + + s += 1 * 4; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22358,19 +23409,16 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over( ++wuffs_private_impl__swizzle_bgr_565__bgra_premul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22378,14 +23426,38 @@ wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)); ++ // Extract 16-bit color components. ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sr = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sb = 0x101 * ((uint32_t)s[0]); + +- s += 1 * 1; +- d += 1 * 4; ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++ ++ s += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22393,16 +23465,15 @@ wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++wuffs_private_impl__swizzle_bgr_565__rgb(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22410,14 +23481,14 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( + // TODO: unroll. + + while (n >= 1) { +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); ++ uint32_t r5 = (uint32_t)(s[0] >> 3); ++ uint32_t g6 = (uint32_t)(s[1] >> 2); ++ uint32_t b5 = (uint32_t)(s[2] >> 3); ++ uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + +- s += 1 * 4; +- d += 1 * 4; ++ s += 1 * 3; ++ d += 1 * 2; + n -= 1; + } + +@@ -22425,16 +23496,16 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over( ++wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22442,14 +23513,15 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))))); + + s += 1 * 4; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22457,16 +23529,16 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src( ++wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22474,32 +23546,54 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src( + // TODO: unroll. + + while (n >= 1) { +- uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( +- s0))); +- +- s += 1 * 8; +- d += 1 * 4; +- n -= 1; ++ // Extract 16-bit color components. ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sb = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sr = 0x101 * ((uint32_t)s[0]); ++ ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++ ++ s += 1 * 4; ++ d += 1 * 2; ++ n -= 1; + } + + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++wuffs_private_impl__swizzle_bgr_565__rgba_premul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22507,17 +23601,14 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint64_t d0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); +- uint64_t s0 = wuffs_base__swap_u64_argb_abgr( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u64__as__color_u32( +- wuffs_base__composite_premul_nonpremul_u64_axxx(d0, s0))); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); + +- s += 1 * 8; +- d += 1 * 4; ++ s += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22525,47 +23616,70 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__rgba_premul__src_over( ++wuffs_private_impl__swizzle_bgr_565__rgba_premul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_premul_premul_u32_axxx(d0, s0)); ++ // Extract 16-bit color components. ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sb = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sr = 0x101 * ((uint32_t)s[0]); ++ ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); + + s += 1 * 4; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__bgr(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++wuffs_private_impl__swizzle_bgr_565__y(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22573,12 +23687,13 @@ wuffs_base__pixel_swizzler__bgrw__bgr(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- 0xFF000000 | wuffs_base__peek_u24le__no_bounds_check(s + (0 * 3))); ++ uint32_t y5 = (uint32_t)(s[0] >> 3); ++ uint32_t y6 = (uint32_t)(s[0] >> 2); ++ uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + +- s += 1 * 3; +- d += 1 * 4; ++ s += 1 * 1; ++ d += 1 * 2; + n -= 1; + } + +@@ -22586,15 +23701,15 @@ wuffs_base__pixel_swizzler__bgrw__bgr(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__bgr_565(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++wuffs_private_impl__swizzle_bgr_565__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; + size_t src_len2 = src_len / 2; +- size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22602,12 +23717,13 @@ wuffs_base__pixel_swizzler__bgrw__bgr_565(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))); ++ uint32_t y5 = (uint32_t)(s[0] >> 3); ++ uint32_t y6 = (uint32_t)(s[0] >> 2); ++ uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + + s += 1 * 2; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22615,15 +23731,15 @@ wuffs_base__pixel_swizzler__bgrw__bgr_565(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__bgrx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22631,100 +23747,121 @@ wuffs_base__pixel_swizzler__bgrw__bgrx(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- 0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); + +- s += 1 * 4; +- d += 1 * 4; ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ s0))); ++ ++ s += 1 * 2; ++ d += 1 * 2; + n -= 1; + } + + return len; + } + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__rgb__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- __m128i shuffle = _mm_set_epi8(+0x00, +0x09, +0x0A, +0x0B, // +- +0x00, +0x06, +0x07, +0x08, // +- +0x00, +0x03, +0x04, +0x05, // +- +0x00, +0x00, +0x01, +0x02); +- __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00); ++ // TODO: unroll. + +- while (n >= 6) { +- __m128i x; +- x = _mm_lddqu_si128((const __m128i*)(const void*)s); +- x = _mm_shuffle_epi8(x, shuffle); +- x = _mm_or_si128(x, or_ff); +- _mm_storeu_si128((__m128i*)(void*)d, x); ++ while (n >= 1) { ++ // Extract 16-bit color components. ++ uint32_t sa = 0x101 * ((uint32_t)s[1]); ++ uint32_t sy = 0x101 * ((uint32_t)s[0]); + +- s += 4 * 3; +- d += 4 * 4; +- n -= 4; +- } ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; + +- while (n >= 1) { +- uint8_t b0 = s[0]; +- uint8_t b1 = s[1]; +- uint8_t b2 = s[2]; +- d[0] = b2; +- d[1] = b1; +- d[2] = b0; +- d[3] = 0xFF; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; + +- s += 1 * 3; +- d += 1 * 4; ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sy * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sy * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sy * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++ ++ s += 1 * 2; ++ d += 1 * 2; + n -= 1; + } + + return len; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__rgb(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++wuffs_private_impl__swizzle_bgr_565__index__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len2 = dst_len / 2; ++ size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ const size_t loop_unroll_count = 4; ++ ++ while (n >= loop_unroll_count) { ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4))); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (1 * 2), wuffs_base__peek_u16le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[1] * 4))); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (2 * 2), wuffs_base__peek_u16le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[2] * 4))); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (3 * 2), wuffs_base__peek_u16le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[3] * 4))); ++ ++ s += loop_unroll_count * 1; ++ d += loop_unroll_count * 2; ++ n -= loop_unroll_count; ++ } ++ + while (n >= 1) { +- uint8_t b0 = s[0]; +- uint8_t b1 = s[1]; +- uint8_t b2 = s[2]; +- d[0] = b2; +- d[1] = b1; +- d[2] = b0; +- d[3] = 0xFF; ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4))); + +- s += 1 * 3; +- d += 1 * 4; ++ s += 1 * 1; ++ d += 1 * 2; + n -= 1; + } + +@@ -22732,15 +23869,19 @@ wuffs_base__pixel_swizzler__bgrw__rgb(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__rgbx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++wuffs_private_impl__swizzle_bgr_565__index_bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len2 = dst_len / 2; ++ size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22748,82 +23889,83 @@ wuffs_base__pixel_swizzler__bgrw__rgbx(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- uint8_t b0 = s[0]; +- uint8_t b1 = s[1]; +- uint8_t b2 = s[2]; +- d[0] = b2; +- d[1] = b1; +- d[2] = b0; +- d[3] = 0xFF; ++ uint32_t d0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2))); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0))); + +- s += 1 * 4; +- d += 1 * 4; ++ s += 1 * 1; ++ d += 1 * 2; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw_4x16le__bgr(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3; ++wuffs_private_impl__swizzle_bgr_565__index_binary_alpha__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len2 = dst_len / 2; ++ size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s0; +- d[1] = s0; +- d[2] = s1; +- d[3] = s1; +- d[4] = s2; +- d[5] = s2; +- d[6] = 0xFF; +- d[7] = 0xFF; ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)s0); ++ } + +- s += 1 * 3; +- d += 1 * 8; ++ s += 1 * 1; ++ d += 1 * 2; + n -= 1; + } + + return len; + } + ++// -------- ++ + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw_4x16le__bgr_565(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; ++wuffs_private_impl__swizzle_bgr__bgr_565(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; + size_t src_len2 = src_len / 2; +- size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), +- wuffs_base__color_u32__as__color_u64( +- wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); ++ uint32_t s0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))); ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + + s += 1 * 2; +- d += 1 * 8; ++ d += 1 * 3; + n -= 1; + } + +@@ -22831,87 +23973,46 @@ wuffs_base__pixel_swizzler__bgrw_4x16le__bgr_565(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw_4x16le__bgrx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; ++wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s0; +- d[1] = s0; +- d[2] = s1; +- d[3] = s1; +- d[4] = s2; +- d[5] = s2; +- d[6] = 0xFF; +- d[7] = 0xFF; +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; +- } +- +- return len; +-} +- +-static uint64_t // +-wuffs_base__pixel_swizzler__bgrw_4x16le__rgb(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // TODO: unroll. + + while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s2; +- d[1] = s2; +- d[2] = s1; +- d[3] = s1; +- d[4] = s0; +- d[5] = s0; +- d[6] = 0xFF; +- d[7] = 0xFF; ++ uint32_t s0 = ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + +- s += 1 * 3; +- d += 1 * 8; ++ s += 1 * 4; ++ d += 1 * 3; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__rgb__bgr_565(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len3 = dst_len / 3; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22919,13 +24020,12 @@ wuffs_base__pixel_swizzler__rgb__bgr_565(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u24le__no_bounds_check( +- d + (0 * 3), +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); ++ uint32_t s0 = ++ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + +- s += 1 * 2; ++ s += 1 * 8; + d += 1 * 3; + n -= 1; + } +@@ -22933,154 +24033,200 @@ wuffs_base__pixel_swizzler__rgb__bgr_565(uint8_t* dst_ptr, + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src( ++wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; +- + size_t n = len; ++ ++ // TODO: unroll. ++ + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__color_u64__as__color_u32__swap_u32_argb_abgr( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sr = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sb = 0x101 * ((uint32_t)s[0]); + +- s += 1 * 8; +- d += 1 * 4; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); ++ ++ s += 1 * 4; ++ d += 1 * 3; + n -= 1; + } ++ + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src_over( ++wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len3 = dst_len / 3; + size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- uint64_t d0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); +- uint64_t s0 = wuffs_base__swap_u64_argb_abgr( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u64__as__color_u32( +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0))); ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); ++ uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); ++ uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); ++ uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); + + s += 1 * 8; +- d += 1 * 4; ++ d += 1 * 3; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__rgbw__bgr_565(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++wuffs_private_impl__swizzle_bgr__bgra_premul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- // TODO: unroll. +- + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s0; ++ d[1] = s1; ++ d[2] = s2; + +- s += 1 * 2; +- d += 1 * 4; ++ s += 1 * 4; ++ d += 1 * 3; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__index__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } ++wuffs_private_impl__swizzle_bgr__bgra_premul__src_over(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len3 = dst_len / 3; +- size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- const size_t loop_unroll_count = 4; ++ while (n >= 1) { ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sr = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sb = 0x101 * ((uint32_t)s[0]); + +- // The comparison in the while condition is ">", not ">=", because with +- // ">=", the last 4-byte store could write past the end of the dst slice. +- // +- // Each 4-byte store writes one too many bytes, but a subsequent store +- // will overwrite that with the correct byte. There is always another +- // store, whether a 4-byte store in this loop or a 1-byte store in the +- // next loop. +- while (n > loop_unroll_count) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (1 * 3), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[1] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (2 * 3), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[2] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (3 * 3), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[3] * 4))); ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; + +- s += loop_unroll_count * 1; +- d += loop_unroll_count * 3; +- n -= loop_unroll_count; ++ // Composite src (premul) over dst (premul). ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); ++ ++ s += 1 * 4; ++ d += 1 * 3; ++ n -= 1; + } + ++ return len; ++} ++ ++static uint64_t // ++wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; ++ ++ // TODO: unroll. ++ + while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); + wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + +- s += 1 * 1; ++ s += 1 * 4; + d += 1 * 3; + n -= 1; + } +@@ -23089,19 +24235,16 @@ wuffs_base__pixel_swizzler__xxx__index__src(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over( ++wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } + size_t dst_len3 = dst_len / 3; +- size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -23109,14 +24252,12 @@ wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint32_t d0 = +- wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000; +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- wuffs_base__poke_u24le__no_bounds_check( +- d + (0 * 3), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + +- s += 1 * 1; ++ s += 1 * 8; + d += 1 * 3; + n -= 1; + } +@@ -23125,60 +24266,46 @@ wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over( ++wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } + size_t dst_len3 = dst_len / 3; +- size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- const size_t loop_unroll_count = 4; ++ // TODO: unroll. + +- while (n >= loop_unroll_count) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); +- } +- uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[1] * 4)); +- if (s1) { +- wuffs_base__poke_u24le__no_bounds_check(d + (1 * 3), s1); +- } +- uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[2] * 4)); +- if (s2) { +- wuffs_base__poke_u24le__no_bounds_check(d + (2 * 3), s2); +- } +- uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[3] * 4)); +- if (s3) { +- wuffs_base__poke_u24le__no_bounds_check(d + (3 * 3), s3); +- } ++ while (n >= 1) { ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sb = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sr = 0x101 * ((uint32_t)s[0]); + +- s += loop_unroll_count * 1; +- d += loop_unroll_count * 3; +- n -= loop_unroll_count; +- } ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); +- } ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; + +- s += 1 * 1; ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); ++ ++ s += 1 * 4; + d += 1 * 3; + n -= 1; + } +@@ -23187,15 +24314,16 @@ wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__xxxx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -23203,10 +24331,29 @@ wuffs_base__pixel_swizzler__xxx__xxxx(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u24le__no_bounds_check( +- d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); ++ uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); ++ uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); ++ uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); + +- s += 1 * 4; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); ++ ++ s += 1 * 8; + d += 1 * 3; + n -= 1; + } +@@ -23215,27 +24362,28 @@ wuffs_base__pixel_swizzler__xxx__xxxx(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__y(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgr__rgba_premul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len3 = dst_len / 3; +- size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- // TODO: unroll. +- + while (n >= 1) { + uint8_t s0 = s[0]; +- d[0] = s0; +- d[1] = s0; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s2; ++ d[1] = s1; + d[2] = s0; + +- s += 1 * 1; ++ s += 1 * 4; + d += 1 * 3; + n -= 1; + } +@@ -23244,28 +24392,43 @@ wuffs_base__pixel_swizzler__xxx__y(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgr__rgba_premul__src_over(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len3 = dst_len / 3; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- // TODO: unroll. +- + while (n >= 1) { +- uint8_t s0 = s[0]; +- d[0] = s0; +- d[1] = s0; +- d[2] = s0; ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sb = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sr = 0x101 * ((uint32_t)s[0]); + +- s += 1 * 2; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); ++ ++ s += 1 * 4; + d += 1 * 3; + n -= 1; + } +@@ -23273,114 +24436,63 @@ wuffs_base__pixel_swizzler__xxx__y_16be(uint8_t* dst_ptr, + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__index__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++wuffs_private_impl__swizzle_bgr__rgbx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- const size_t loop_unroll_count = 4; +- +- while (n >= loop_unroll_count) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (1 * 4), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[1] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (2 * 4), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[2] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (3 * 4), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[3] * 4))); +- +- s += loop_unroll_count * 1; +- d += loop_unroll_count * 4; +- n -= loop_unroll_count; +- } ++ // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4))); ++ uint8_t b0 = s[0]; ++ uint8_t b1 = s[1]; ++ uint8_t b2 = s[2]; ++ d[0] = b2; ++ d[1] = b1; ++ d[2] = b0; + +- s += 1 * 1; +- d += 1 * 4; ++ s += 1 * 4; ++ d += 1 * 3; + n -= 1; + } + + return len; + } + ++// -------- ++ + static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over( ++wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } + size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- const size_t loop_unroll_count = 4; +- +- while (n >= loop_unroll_count) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); +- } +- uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[1] * 4)); +- if (s1) { +- wuffs_base__poke_u32le__no_bounds_check(d + (1 * 4), s1); +- } +- uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[2] * 4)); +- if (s2) { +- wuffs_base__poke_u32le__no_bounds_check(d + (2 * 4), s2); +- } +- uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[3] * 4)); +- if (s3) { +- wuffs_base__poke_u32le__no_bounds_check(d + (3 * 4), s3); +- } +- +- s += loop_unroll_count * 1; +- d += loop_unroll_count * 4; +- n -= loop_unroll_count; +- } +- + while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); +- } ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); + +- s += 1 * 1; ++ s += 1 * 4; + d += 1 * 4; + n -= 1; + } +@@ -23388,75 +24500,88 @@ wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over( + return len; + } + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__y__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; ++ + size_t n = len; ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), wuffs_base__color_u64__as__color_u32( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); + +- __m128i shuffle = _mm_set_epi8(+0x03, +0x03, +0x03, +0x03, // +- +0x02, +0x02, +0x02, +0x02, // +- +0x01, +0x01, +0x01, +0x01, // +- +0x00, +0x00, +0x00, +0x00); +- __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00); +- +- while (n >= 4) { +- __m128i x; +- x = _mm_cvtsi32_si128((int)(wuffs_base__peek_u32le__no_bounds_check(s))); +- x = _mm_shuffle_epi8(x, shuffle); +- x = _mm_or_si128(x, or_ff); +- _mm_storeu_si128((__m128i*)(void*)d, x); +- +- s += 4 * 1; +- d += 4 * 4; +- n -= 4; ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; + } ++ return len; ++} ++ ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + + while (n >= 1) { ++ uint64_t d0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); ++ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); + wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); ++ d + (0 * 4), ++ wuffs_base__color_u64__as__color_u32( ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, ++ s0))); + +- s += 1 * 1; ++ s += 1 * 8; + d += 1 * 4; + n -= 1; + } + + return len; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + + static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__y(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); + wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); ++ d + (0 * 4), ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0)); + +- s += 1 * 1; ++ s += 1 * 4; + d += 1 * 4; + n -= 1; + } +@@ -23465,24 +24590,28 @@ wuffs_base__pixel_swizzler__xxxx__y(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len4 = dst_len / 4; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); + wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_premul_u32_axxx(d0, s0)); + +- s += 1 * 2; ++ s += 1 * 4; + d += 1 * 4; + n -= 1; + } +@@ -23490,33 +24619,36 @@ wuffs_base__pixel_swizzler__xxxx__y_16be(uint8_t* dst_ptr, + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__xxxxxxxx__index__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + if (dst_palette_len != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return 0; + } +- size_t dst_len8 = dst_len / 8; +- size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4)))); ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); + + s += 1 * 1; +- d += 1 * 8; ++ d += 1 * 4; + n -= 1; + } + +@@ -23524,33 +24656,30 @@ wuffs_base__pixel_swizzler__xxxxxxxx__index__src(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxxxxxxx__index_binary_alpha__src_over( ++wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len8 = dst_len / 8; +- size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), wuffs_base__color_u32__as__color_u64(s0)); +- } ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); + +- s += 1 * 1; +- d += 1 * 8; ++ s += 1 * 4; ++ d += 1 * 4; + n -= 1; + } + +@@ -23558,24 +24687,29 @@ wuffs_base__pixel_swizzler__xxxxxxxx__index_binary_alpha__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxxxxxxx__y(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), 0xFFFF000000000000 | (0x010101010101 * (uint64_t)s[0])); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0)); + +- s += 1 * 1; +- d += 1 * 8; ++ s += 1 * 4; ++ d += 1 * 4; + n -= 1; + } + +@@ -23583,53 +24717,59 @@ wuffs_base__pixel_swizzler__xxxxxxxx__y(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxxxxxxx__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { +- uint64_t s0 = +- ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(s + (0 * 2)))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), 0xFFFF000000000000 | (0x000100010001 * s0)); ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_premul_u32_axxx(d0, s0)); + +- s += 1 * 2; +- d += 1 * 8; ++ s += 1 * 4; ++ d += 1 * 4; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__y__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; + size_t src_len2 = src_len / 2; +- size_t len = (dst_len < src_len2) ? dst_len : src_len2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- d[0] = s[0]; ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); + + s += 1 * 2; +- d += 1 * 1; ++ d += 1 * 4; + n -= 1; + } + +@@ -23637,27 +24777,31 @@ wuffs_base__pixel_swizzler__y__y_16be(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__y_16le__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; ++wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; + size_t src_len2 = src_len / 2; +- size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- d[0] = s1; +- d[1] = s0; ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); + + s += 1 * 2; +- d += 1 * 2; ++ d += 1 * 4; + n -= 1; + } + +@@ -23667,6862 +24811,6000 @@ wuffs_base__pixel_swizzler__y_16le__y_16be(uint8_t* dst_ptr, + // -------- + + static uint64_t // +-wuffs_base__pixel_swizzler__transparent_black_src( ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, +- uint64_t num_pixels, +- uint32_t dst_pixfmt_bytes_per_pixel) { +- uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel; +- if (n > num_pixels) { +- n = num_pixels; ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ ++ size_t n = len; ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ uint8_t s3 = s[3]; ++ d[0] = s0; ++ d[1] = s0; ++ d[2] = s1; ++ d[3] = s1; ++ d[4] = s2; ++ d[5] = s2; ++ d[6] = s3; ++ d[7] = s3; ++ ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; + } +- memset(dst_ptr, 0, ((size_t)(n * dst_pixfmt_bytes_per_pixel))); +- return n; ++ return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__transparent_black_src_over( ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, +- uint64_t num_pixels, +- uint32_t dst_pixfmt_bytes_per_pixel) { +- uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel; +- if (n > num_pixels) { +- n = num_pixels; ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); ++ ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; + } +- return n; ++ return len; + } + +-// -------- ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__y(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- return wuffs_base__pixel_swizzler__copy_1_1; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__bgr_565__y; ++ s += 1 * 8; ++ d += 1 * 8; ++ n -= 1; ++ } ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__xxx__y; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__xxxx__y__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__xxxx__y; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); ++ wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__xxxxxxxx__y; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; + } +- return NULL; ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__y_16be(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- return wuffs_base__pixel_swizzler__y__y_16be; +- +- case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: +- return wuffs_base__pixel_swizzler__y_16le__y_16be; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: +- return wuffs_base__pixel_swizzler__copy_2_2; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_premul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__bgr_565__y_16be; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; ++ } ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__xxx__y_16be; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len8 = dst_len / 8; ++ size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- return wuffs_base__pixel_swizzler__xxxx__y_16be; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__xxxxxxxx__y_16be; ++ s += 1 * 1; ++ d += 1 * 8; ++ n -= 1; + } +- return NULL; +-} + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__indexed__bgra_nonpremul( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_1_1; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- if (wuffs_base__pixel_swizzler__squash_align4_bgr_565_8888( +- dst_palette.ptr, dst_palette.len, src_palette.ptr, +- src_palette.len, true) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__bgr_565__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__bgr_565__index_bgra_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- if (wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over; +- } +- return NULL; ++ size_t n = len; ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ uint8_t s3 = s[3]; ++ d[0] = s2; ++ d[1] = s2; ++ d[2] = s1; ++ d[3] = s1; ++ d[4] = s0; ++ d[5] = s0; ++ d[6] = s3; ++ d[7] = s3; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__index_bgra_nonpremul__src_over; +- } +- return NULL; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxxxxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over; +- } +- return NULL; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- if (wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over; +- } +- return NULL; +- +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- if (wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over; +- } +- return NULL; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; ++ } ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__index_bgra_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- if (wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over; +- } +- return NULL; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- // TODO. +- break; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; + } +- return NULL; ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__indexed__bgra_binary( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_1_1; +- } +- return NULL; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- if (wuffs_base__pixel_swizzler__squash_align4_bgr_565_8888( +- dst_palette.ptr, dst_palette.len, src_palette.ptr, +- src_palette.len, false) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__index_binary_alpha__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over; +- } +- return NULL; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); ++ wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over; +- } +- return NULL; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; ++ } ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxxxxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__xxxxxxxx__index_binary_alpha__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over; +- } +- return NULL; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_premul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over; +- } +- return NULL; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; + } +- return NULL; ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgr_565( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__copy_2_2; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- return wuffs_base__pixel_swizzler__bgr__bgr_565; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t s0 = ((uint64_t)(s[1]) * 0x0101000000000000) | ++ ((uint64_t)(s[0]) * 0x0000010101010101); ++ wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- return wuffs_base__pixel_swizzler__bgrw__bgr_565; ++ s += 1 * 2; ++ d += 1 * 8; ++ n -= 1; ++ } ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__bgrw_4x16le__bgr_565; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__rgb__bgr_565; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = ((uint64_t)(s[1]) * 0x0101000000000000) | ++ ((uint64_t)(s[0]) * 0x0000010101010101); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- return wuffs_base__pixel_swizzler__rgbw__bgr_565; ++ s += 1 * 2; ++ d += 1 * 8; ++ n -= 1; + } +- return NULL; ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgr(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__bgr_565__bgr; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- return wuffs_base__pixel_swizzler__copy_3_3; ++// -------- + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- return wuffs_base__pixel_swizzler__bgrw__bgr; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__bgrw_4x16le__bgr; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__swap_rgb_bgr; ++ while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__bgrw__rgb__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__bgrw__rgb; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; +-} + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgra_nonpremul( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_4_4; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over; +- } +- return NULL; ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- // TODO. +- break; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_nonpremul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- // TODO. +- break; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; ++ ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgra_nonpremul_4x16le( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); ++ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u64__as__color_u32( ++ wuffs_private_impl__composite_premul_nonpremul_u64_axxx(d0, s0))); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_8_8; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over; +- } +- return NULL; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src_over; +- } +- return NULL; ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- // TODO. +- break; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul_4x16le__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src_over; +- } +- break; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_premul_u32_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- // TODO. +- break; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; +-} + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgra_premul( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__bgra_premul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_4_4; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over; +- } +- return NULL; ++ s += 1 * 1; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__rgba_premul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_premul__src_over; +- } +- return NULL; +- } +- return NULL; +-} ++ // TODO: unroll. + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgrx(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__bgr_565__bgrx; ++ while (n >= 1) { ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- return wuffs_base__pixel_swizzler__xxx__xxxx; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- return wuffs_base__pixel_swizzler__bgrw__bgrx; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__bgrw_4x16le__bgrx; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- return wuffs_base__pixel_swizzler__copy_4_4; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__bgr__rgbx; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- return wuffs_base__pixel_swizzler__bgrw__rgbx; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; +-} + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__rgb(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__bgr_565__rgb; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- return wuffs_base__pixel_swizzler__swap_rgb_bgr; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__bgrw__rgb__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__bgrw__rgb; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__bgrw_4x16le__rgb; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__copy_3_3; ++ while (n >= 1) { ++ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( ++ s0))); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- return wuffs_base__pixel_swizzler__bgrw__bgr; ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; +-} +- +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__rgba_nonpremul( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src_over; +- } +- return NULL; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); ++ uint64_t s0 = wuffs_private_impl__swap_u64_argb_abgr( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u64__as__color_u32( ++ wuffs_private_impl__composite_premul_nonpremul_u64_axxx(d0, s0))); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- // TODO. +- break; ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_4_4; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_premul_u32_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- // TODO. +- break; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; ++ ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__rgba_premul( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__rgba_premul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src_over; +- } +- return NULL; ++ s += 1 * 2; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_premul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__bgra_premul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_4_4; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); ++ ++ s += 1 * 2; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; ++ ++ return len; + } + + // -------- + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +-wuffs_base__pixel_swizzler__prepare(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__pixel_format src_pixfmt, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- if (!p) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- p->private_impl.func = NULL; +- p->private_impl.transparent_black_func = NULL; +- p->private_impl.dst_pixfmt_bytes_per_pixel = 0; +- p->private_impl.src_pixfmt_bytes_per_pixel = 0; ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__bgr(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- wuffs_base__pixel_swizzler__func func = NULL; +- wuffs_base__pixel_swizzler__transparent_black_func transparent_black_func = +- NULL; ++ // TODO: unroll. + +- uint32_t dst_pixfmt_bits_per_pixel = +- wuffs_base__pixel_format__bits_per_pixel(&dst_pixfmt); +- if ((dst_pixfmt_bits_per_pixel == 0) || +- ((dst_pixfmt_bits_per_pixel & 7) != 0)) { +- return wuffs_base__make_status( +- wuffs_base__error__unsupported_pixel_swizzler_option); +- } ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ 0xFF000000 | wuffs_base__peek_u24le__no_bounds_check(s + (0 * 3))); + +- uint32_t src_pixfmt_bits_per_pixel = +- wuffs_base__pixel_format__bits_per_pixel(&src_pixfmt); +- if ((src_pixfmt_bits_per_pixel == 0) || +- ((src_pixfmt_bits_per_pixel & 7) != 0)) { +- return wuffs_base__make_status( +- wuffs_base__error__unsupported_pixel_swizzler_option); ++ s += 1 * 3; ++ d += 1 * 4; ++ n -= 1; + } + +- // TODO: support many more formats. +- +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- transparent_black_func = +- wuffs_base__pixel_swizzler__transparent_black_src; +- break; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- transparent_black_func = +- wuffs_base__pixel_swizzler__transparent_black_src_over; +- break; +- } ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__bgr_565(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- switch (src_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- func = wuffs_base__pixel_swizzler__prepare__y(p, dst_pixfmt, dst_palette, +- src_palette, blend); +- break; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: +- func = wuffs_base__pixel_swizzler__prepare__y_16be( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))); + +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- func = wuffs_base__pixel_swizzler__prepare__indexed__bgra_nonpremul( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ s += 1 * 2; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: +- func = wuffs_base__pixel_swizzler__prepare__indexed__bgra_binary( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- func = wuffs_base__pixel_swizzler__prepare__bgr_565( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__bgrx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- func = wuffs_base__pixel_swizzler__prepare__bgr( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- func = wuffs_base__pixel_swizzler__prepare__bgra_nonpremul( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ 0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- func = wuffs_base__pixel_swizzler__prepare__bgra_nonpremul_4x16le( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- func = wuffs_base__pixel_swizzler__prepare__bgra_premul( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- func = wuffs_base__pixel_swizzler__prepare__bgrx( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- func = wuffs_base__pixel_swizzler__prepare__rgb( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ __m128i shuffle = _mm_set_epi8(+0x00, +0x0B, +0x0A, +0x09, // ++ +0x00, +0x08, +0x07, +0x06, // ++ +0x00, +0x05, +0x04, +0x03, // ++ +0x00, +0x02, +0x01, +0x00); ++ __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- func = wuffs_base__pixel_swizzler__prepare__rgba_nonpremul( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ while (n >= 6) { ++ __m128i x; ++ x = _mm_lddqu_si128((const __m128i*)(const void*)s); ++ x = _mm_shuffle_epi8(x, shuffle); ++ x = _mm_or_si128(x, or_ff); ++ _mm_storeu_si128((__m128i*)(void*)d, x); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- func = wuffs_base__pixel_swizzler__prepare__rgba_premul( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ s += 4 * 3; ++ d += 4 * 4; ++ n -= 4; + } + +- p->private_impl.func = func; +- p->private_impl.transparent_black_func = transparent_black_func; +- p->private_impl.dst_pixfmt_bytes_per_pixel = dst_pixfmt_bits_per_pixel / 8; +- p->private_impl.src_pixfmt_bytes_per_pixel = src_pixfmt_bits_per_pixel / 8; +- return wuffs_base__make_status( +- func ? NULL : wuffs_base__error__unsupported_pixel_swizzler_option); +-} ++ while (n >= 1) { ++ uint8_t b0 = s[0]; ++ uint8_t b1 = s[1]; ++ uint8_t b2 = s[2]; ++ d[0] = b0; ++ d[1] = b1; ++ d[2] = b2; ++ d[3] = 0xFF; + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( +- const wuffs_base__pixel_swizzler* p, +- uint32_t up_to_num_pixels, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- const uint8_t** ptr_iop_r, +- const uint8_t* io2_r) { +- if (p && p->private_impl.func) { +- const uint8_t* iop_r = *ptr_iop_r; +- uint64_t src_len = wuffs_base__u64__min( +- ((uint64_t)up_to_num_pixels) * +- ((uint64_t)p->private_impl.src_pixfmt_bytes_per_pixel), +- ((uint64_t)(io2_r - iop_r))); +- uint64_t n = +- (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, +- dst_palette.len, iop_r, (size_t)src_len); +- *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel; +- return n; ++ s += 1 * 3; ++ d += 1 * 4; ++ n -= 1; + } +- return 0; +-} + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- const uint8_t** ptr_iop_r, +- const uint8_t* io2_r) { +- if (p && p->private_impl.func) { +- const uint8_t* iop_r = *ptr_iop_r; +- uint64_t src_len = ((uint64_t)(io2_r - iop_r)); +- uint64_t n = +- (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, +- dst_palette.len, iop_r, (size_t)src_len); +- *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel; +- return n; +- } +- return 0; ++ return len; + } + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src) { +- if (p && p->private_impl.func) { +- return (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, +- dst_palette.len, src.ptr, src.len); +- } +- return 0; +-} ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- uint64_t num_pixels) { +- if (p && p->private_impl.transparent_black_func) { +- return (*p->private_impl.transparent_black_func)( +- dst.ptr, dst.len, dst_palette.ptr, dst_palette.len, num_pixels, +- p->private_impl.dst_pixfmt_bytes_per_pixel); ++ __m128i shuffle = _mm_set_epi8(+0x00, +0x09, +0x0A, +0x0B, // ++ +0x00, +0x06, +0x07, +0x08, // ++ +0x00, +0x03, +0x04, +0x05, // ++ +0x00, +0x00, +0x01, +0x02); ++ __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00); ++ ++ while (n >= 6) { ++ __m128i x; ++ x = _mm_lddqu_si128((const __m128i*)(const void*)s); ++ x = _mm_shuffle_epi8(x, shuffle); ++ x = _mm_or_si128(x, or_ff); ++ _mm_storeu_si128((__m128i*)(void*)d, x); ++ ++ s += 4 * 3; ++ d += 4 * 4; ++ n -= 4; + } +- return 0; +-} + +-// -------- ++ while (n >= 1) { ++ uint8_t b0 = s[0]; ++ uint8_t b1 = s[1]; ++ uint8_t b2 = s[2]; ++ d[0] = b2; ++ d[1] = b1; ++ d[2] = b0; ++ d[3] = 0xFF; + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx_x86_avx2( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2); ++ s += 1 * 3; ++ d += 1 * 4; ++ n -= 1; ++ } + +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_rgbx_x86_avx2( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2); ++ return len; ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-#if defined(__GNUC__) && !defined(__clang__) +-// No-op. +-#else +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column, +- bool last_column); +-#endif +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__rgb(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-// -------- ++ while (n >= 1) { ++ uint8_t b0 = s[0]; ++ uint8_t b1 = s[1]; ++ uint8_t b2 = s[2]; ++ d[0] = b2; ++ d[1] = b1; ++ d[2] = b0; ++ d[3] = 0xFF; + +-static inline uint32_t // +-wuffs_base__u32__max_of_4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) { +- return wuffs_base__u32__max( // +- wuffs_base__u32__max(a, b), // +- wuffs_base__u32__max(c, d)); +-} ++ s += 1 * 3; ++ d += 1 * 4; ++ n -= 1; ++ } + +-static inline uint32_t // +-wuffs_base__u32__min_of_5(uint32_t a, +- uint32_t b, +- uint32_t c, +- uint32_t d, +- uint32_t e) { +- return wuffs_base__u32__min( // +- wuffs_base__u32__min( // +- wuffs_base__u32__min(a, b), // +- wuffs_base__u32__min(c, d)), // +- e); ++ return len; + } + +-// -------- ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__rgbx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-typedef void (*wuffs_base__pixel_swizzler__swizzle_ycc__convert_4_func)( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2, +- const uint8_t* up3); ++ // TODO: unroll. + +-static void // +-wuffs_base__pixel_swizzler__swizzle_cmyk__convert_4_general( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2, +- const uint8_t* up3) { +- for (; x < x_end; x++) { +- // It's called CMYK but, but for Adobe CMYK JPEG images in practice, it's +- // RGBW: 0xFFu means no ink instead of full ink. Note that a double +- // inversion is a no-op, so inversions might be implicit in the code below. +- uint32_t r = ((uint32_t)(*up0++)); +- uint32_t g = ((uint32_t)(*up1++)); +- uint32_t b = ((uint32_t)(*up2++)); +- uint32_t w = ((uint32_t)(*up3++)); +- r = ((r * w) + 0x7Fu) / 0xFFu; +- g = ((g * w) + 0x7Fu) / 0xFFu; +- b = ((b * w) + 0x7Fu) / 0xFFu; +- wuffs_base__pixel_buffer__set_color_u32_at( +- dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u)); +- } +-} ++ while (n >= 1) { ++ uint8_t b0 = s[0]; ++ uint8_t b1 = s[1]; ++ uint8_t b2 = s[2]; ++ d[0] = b2; ++ d[1] = b1; ++ d[2] = b0; ++ d[3] = 0xFF; + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycck__convert_4_general( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2, +- const uint8_t* up3) { +- for (; x < x_end; x++) { +- // We invert once again: 0xFFu means no ink instead of full ink. +- uint32_t color = // +- wuffs_base__color_ycc__as__color_u32( // +- *up0++, *up1++, *up2++); +- uint32_t r = 0xFFu - (0xFFu & (color >> 16u)); +- uint32_t g = 0xFFu - (0xFFu & (color >> 8u)); +- uint32_t b = 0xFFu - (0xFFu & (color >> 0u)); +- uint32_t w = ((uint32_t)(*up3++)); +- r = ((r * w) + 0x7Fu) / 0xFFu; +- g = ((g * w) + 0x7Fu) / 0xFFu; +- b = ((b * w) + 0x7Fu) / 0xFFu; +- wuffs_base__pixel_buffer__set_color_u32_at( +- dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u)); ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } ++ ++ return len; + } + + // -------- + +-typedef void (*wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func)( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2); ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw_4x16le__bgr(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-static void // +-wuffs_base__pixel_swizzler__swizzle_rgb__convert_3_general( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- for (; x < x_end; x++) { +- uint32_t color = 0xFF000000u | // +- (((uint32_t)(*up0++)) << 16u) | // +- (((uint32_t)(*up1++)) << 8u) | // +- (((uint32_t)(*up2++)) << 0u); +- wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color); +- } +-} ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s0; ++ d[1] = s0; ++ d[2] = s1; ++ d[3] = s1; ++ d[4] = s2; ++ d[5] = s2; ++ d[6] = 0xFF; ++ d[7] = 0xFF; + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_general( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- for (; x < x_end; x++) { +- uint32_t color = // +- wuffs_base__color_ycc__as__color_u32( // +- *up0++, *up1++, *up2++); +- wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color); ++ s += 1 * 3; ++ d += 1 * 8; ++ n -= 1; + } +-} +- +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- size_t dst_stride = dst->private_impl.planes[0].stride; +- uint8_t* dst_iter = dst->private_impl.planes[0].ptr + +- (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); + +- for (; x < x_end; x++) { +- uint32_t color = // +- wuffs_base__color_ycc__as__color_u32( // +- *up0++, *up1++, *up2++); +- wuffs_base__poke_u32le__no_bounds_check(dst_iter, color); +- dst_iter += 4u; +- } ++ return len; + } + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_rgbx( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- size_t dst_stride = dst->private_impl.planes[0].stride; +- uint8_t* dst_iter = dst->private_impl.planes[0].ptr + +- (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw_4x16le__bgr_565(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- for (; x < x_end; x++) { +- uint32_t color = // +- wuffs_base__color_ycc__as__color_u32_abgr( // +- *up0++, *up1++, *up2++); +- wuffs_base__poke_u32le__no_bounds_check(dst_iter, color); +- dst_iter += 4u; ++ while (n >= 1) { ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_base__color_u32__as__color_u64( ++ wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); ++ ++ s += 1 * 2; ++ d += 1 * 8; ++ n -= 1; + } ++ ++ return len; + } + +-// -------- ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw_4x16le__bgrx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-// wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upsamples to a +-// destination slice at least 480 (YCCK) or 672 (YCC) bytes long and whose +-// src_len (multiplied by 1, 2, 3 or 4) is positive but no more than that. This +-// 480 or 672 length is just under 1/4 or 1/3 of the scratch_buffer_2k slice +-// length. Both (480 * 4) = 1920 and (672 * 3) = 2016 are less than 2048. +-// +-// 480 and 672 are nice round numbers because a JPEG MCU is 1, 2, 3 or 4 blocks +-// wide and each block is 8 pixels wide. We have: +-// 480 = 1 * 8 * 60, 672 = 1 * 8 * 84 +-// 480 = 2 * 8 * 30, 672 = 2 * 8 * 42 +-// 480 = 3 * 8 * 20, 672 = 3 * 8 * 28 +-// 480 = 4 * 8 * 15, 672 = 4 * 8 * 21 +-// +-// Box filters are equivalent to nearest neighbor upsampling. These ignore the +-// src_ptr_minor, h1v2_bias, first_column and last_column arguments. +-// +-// Triangle filters use a 3:1 ratio (in 1 dimension), or 9:3:3:1 (in 2 +-// dimensions), which is higher quality (less blocky) but also higher +-// computational effort. +-// +-// In theory, we could use triangle filters for any (inv_h, inv_v) combination. +-// In practice, matching libjpeg-turbo, we only implement it for the common +-// chroma subsampling ratios (YCC420, YCC422 or YCC440), corresponding to an +-// (inv_h, inv_v) pair of (2, 2), (2, 1) or (1, 2). +-typedef const uint8_t* ( +- *wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func)( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, // Nearest row. +- const uint8_t* src_ptr_minor, // Adjacent row, alternating above or below. +- size_t src_len, +- uint32_t h1v2_bias, +- bool first_column, +- bool last_column); ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s0; ++ d[1] = s0; ++ d[2] = s1; ++ d[3] = s1; ++ d[4] = s2; ++ d[5] = s2; ++ d[6] = 0xFF; ++ d[7] = 0xFF; + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1vn_box( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor_ignored, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column_ignored, +- bool last_column_ignored) { +- return src_ptr_major; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; ++ } ++ ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2vn_box( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor_ignored, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column_ignored, +- bool last_column_ignored) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp = src_ptr_major; +- while (src_len--) { +- uint8_t sv = *sp++; +- *dp++ = sv; +- *dp++ = sv; ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw_4x16le__rgb(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; ++ ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s2; ++ d[1] = s2; ++ d[2] = s1; ++ d[3] = s1; ++ d[4] = s0; ++ d[5] = s0; ++ d[6] = 0xFF; ++ d[7] = 0xFF; ++ ++ s += 1 * 3; ++ d += 1 * 8; ++ n -= 1; + } +- return dst_ptr; ++ ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h3vn_box( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor_ignored, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column_ignored, +- bool last_column_ignored) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp = src_ptr_major; +- while (src_len--) { +- uint8_t sv = *sp++; +- *dp++ = sv; +- *dp++ = sv; +- *dp++ = sv; ++// -------- ++ ++static uint64_t // ++wuffs_private_impl__swizzle_rgb__bgr_565(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; ++ ++ // TODO: unroll. ++ ++ while (n >= 1) { ++ wuffs_base__poke_u24le__no_bounds_check( ++ d + (0 * 3), ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); ++ ++ s += 1 * 2; ++ d += 1 * 3; ++ n -= 1; + } +- return dst_ptr; ++ ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h4vn_box( ++// -------- ++ ++static uint64_t // ++wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src( + uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor_ignored, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column_ignored, +- bool last_column_ignored) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp = src_ptr_major; +- while (src_len--) { +- uint8_t sv = *sp++; +- *dp++ = sv; +- *dp++ = sv; +- *dp++ = sv; +- *dp++ = sv; ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ ++ size_t n = len; ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__color_u64__as__color_u32__swap_u32_argb_abgr( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); ++ ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; + } +- return dst_ptr; ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1v2_triangle( ++static uint64_t // ++wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src_over( + uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor, +- size_t src_len, +- uint32_t h1v2_bias, +- bool first_column, +- bool last_column) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp_major = src_ptr_major; +- const uint8_t* sp_minor = src_ptr_minor; +- while (src_len--) { +- *dp++ = (uint8_t)(((3u * ((uint32_t)(*sp_major++))) + // +- (1u * ((uint32_t)(*sp_minor++))) + // +- h1v2_bias) >> +- 2u); ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; ++ ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); ++ uint64_t s0 = wuffs_private_impl__swap_u64_argb_abgr( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u64__as__color_u32( ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, ++ s0))); ++ ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; + } +- return dst_ptr; ++ ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v1_triangle( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column, +- bool last_column) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp = src_ptr_major; ++// -------- + +- if (first_column) { +- src_len--; +- if ((src_len <= 0u) && last_column) { +- uint8_t sv = *sp++; +- *dp++ = sv; +- *dp++ = sv; +- return dst_ptr; +- } +- uint32_t svp1 = sp[+1]; +- uint8_t sv = *sp++; +- *dp++ = sv; +- *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svp1 + 2u) >> 2u); +- if (src_len <= 0u) { +- return dst_ptr; +- } +- } ++static uint64_t // ++wuffs_private_impl__swizzle_rgbw__bgr_565(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- if (last_column) { +- src_len--; +- } ++ // TODO: unroll. + +- for (; src_len > 0u; src_len--) { +- uint32_t svm1 = sp[-1]; +- uint32_t svp1 = sp[+1]; +- uint32_t sv3 = 3u * (uint32_t)(*sp++); +- *dp++ = (uint8_t)((sv3 + svm1 + 1u) >> 2u); +- *dp++ = (uint8_t)((sv3 + svp1 + 2u) >> 2u); +- } ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); + +- if (last_column) { +- uint32_t svm1 = sp[-1]; +- uint8_t sv = *sp++; +- *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svm1 + 1u) >> 2u); +- *dp++ = sv; ++ s += 1 * 2; ++ d += 1 * 4; ++ n -= 1; + } + +- return dst_ptr; ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v2_triangle( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column, +- bool last_column) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp_major = src_ptr_major; +- const uint8_t* sp_minor = src_ptr_minor; ++// -------- + +- if (first_column) { +- src_len--; +- if ((src_len <= 0u) && last_column) { +- uint32_t sv = (12u * ((uint32_t)(*sp_major++))) + // +- (4u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + 7u) >> 4u); +- return dst_ptr; +- } ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__index__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len3 = dst_len / 3; ++ size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- uint32_t sv_major_m1 = sp_major[-0]; // Clamp offset to zero. +- uint32_t sv_minor_m1 = sp_minor[-0]; // Clamp offset to zero. +- uint32_t sv_major_p1 = sp_major[+1]; +- uint32_t sv_minor_p1 = sp_minor[+1]; ++ const size_t loop_unroll_count = 4; + +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); +- if (src_len <= 0u) { +- return dst_ptr; +- } +- } ++ // The comparison in the while condition is ">", not ">=", because with ++ // ">=", the last 4-byte store could write past the end of the dst slice. ++ // ++ // Each 4-byte store writes one too many bytes, but a subsequent store ++ // will overwrite that with the correct byte. There is always another ++ // store, whether a 4-byte store in this loop or a 1-byte store in the ++ // next loop. ++ while (n > loop_unroll_count) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (1 * 3), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[1] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (2 * 3), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[2] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (3 * 3), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[3] * 4))); + +- if (last_column) { +- src_len--; ++ s += loop_unroll_count * 1; ++ d += loop_unroll_count * 3; ++ n -= loop_unroll_count; + } + +- for (; src_len > 0u; src_len--) { +- uint32_t sv_major_m1 = sp_major[-1]; +- uint32_t sv_minor_m1 = sp_minor[-1]; +- uint32_t sv_major_p1 = sp_major[+1]; +- uint32_t sv_minor_p1 = sp_minor[+1]; ++ while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ s += 1 * 1; ++ d += 1 * 3; ++ n -= 1; + } + +- if (last_column) { +- uint32_t sv_major_m1 = sp_major[-1]; +- uint32_t sv_minor_m1 = sp_minor[-1]; +- uint32_t sv_major_p1 = sp_major[+0]; // Clamp offset to zero. +- uint32_t sv_minor_p1 = sp_minor[+0]; // Clamp offset to zero. ++ return len; ++} + +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; + } ++ size_t dst_len3 = dst_len / 3; ++ size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- return dst_ptr; +-} ++ // TODO: unroll. + +-// wuffs_base__pixel_swizzler__swizzle_ycc__upsample_funcs is indexed by inv_h +-// and then inv_v. +-static const wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_funcs[4][4] = { +- { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1vn_box, +- }, +- { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2vn_box, +- }, +- { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h3vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h3vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h3vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h3vn_box, +- }, +- { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h4vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h4vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h4vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h4vn_box, +- }, +-}; ++ while (n >= 1) { ++ uint32_t d0 = ++ wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000; ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ wuffs_base__poke_u24le__no_bounds_check( ++ d + (0 * 3), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +-static inline uint32_t // +-wuffs_base__pixel_swizzler__has_triangle_upsampler(uint32_t inv_h, +- uint32_t inv_v) { +- if (inv_h == 1u) { +- return inv_v == 2u; +- } else if (inv_h == 2u) { +- return (inv_v == 1u) || (inv_v == 2u); ++ s += 1 * 1; ++ d += 1 * 3; ++ n -= 1; + } +- return false; ++ ++ return len; + } + +-// -------- ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len3 = dst_len / 3; ++ size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-// All of the wuffs_base__pixel_swizzler__swizzle_ycc__etc functions have +-// preconditions. See all of the checks made in +-// wuffs_base__pixel_swizzler__swizzle_ycck before calling these functions. For +-// example, (width > 0) is a precondition, but there are many more. ++ const size_t loop_unroll_count = 4; + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycck__general__triangle_filter_edge_row( +- wuffs_base__pixel_buffer* dst, +- uint32_t width, +- uint32_t y, +- const uint8_t* src_ptr0, +- const uint8_t* src_ptr1, +- const uint8_t* src_ptr2, +- const uint8_t* src_ptr3, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t stride3, +- uint32_t inv_h0, +- uint32_t inv_h1, +- uint32_t inv_h2, +- uint32_t inv_h3, +- uint32_t inv_v0, +- uint32_t inv_v1, +- uint32_t inv_v2, +- uint32_t inv_v3, +- uint32_t half_width_for_2to1, +- uint32_t h1v2_bias, +- uint8_t* scratch_buffer_2k_ptr, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc0, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc1, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc2, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc3, +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_4_func conv4func) { +- const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0); +- const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1); +- const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2); +- const uint8_t* src3 = src_ptr3 + ((y / inv_v3) * (size_t)stride3); +- uint32_t total_src_len0 = 0u; +- uint32_t total_src_len1 = 0u; +- uint32_t total_src_len2 = 0u; +- uint32_t total_src_len3 = 0u; +- +- uint32_t x = 0u; +- while (x < width) { +- bool first_column = x == 0u; +- uint32_t end = x + 480u; +- if (end > width) { +- end = width; ++ while (n >= loop_unroll_count) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++ } ++ uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[1] * 4)); ++ if (s1) { ++ wuffs_base__poke_u24le__no_bounds_check(d + (1 * 3), s1); ++ } ++ uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[2] * 4)); ++ if (s2) { ++ wuffs_base__poke_u24le__no_bounds_check(d + (2 * 3), s2); ++ } ++ uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[3] * 4)); ++ if (s3) { ++ wuffs_base__poke_u24le__no_bounds_check(d + (3 * 3), s3); + } + +- uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; +- uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; +- uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; +- uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3; +- total_src_len0 += src_len0; +- total_src_len1 += src_len1; +- total_src_len2 += src_len2; +- total_src_len3 += src_len3; +- +- const uint8_t* src_ptr_x0 = src0 + (x / inv_h0); +- const uint8_t* up0 = (*upfunc0)( // +- scratch_buffer_2k_ptr + (0u * 480u), // +- src_ptr_x0, // +- src_ptr_x0, // +- src_len0, // +- h1v2_bias, // +- first_column, // +- (total_src_len0 >= half_width_for_2to1)); +- +- const uint8_t* src_ptr_x1 = src1 + (x / inv_h1); +- const uint8_t* up1 = (*upfunc1)( // +- scratch_buffer_2k_ptr + (1u * 480u), // +- src_ptr_x1, // +- src_ptr_x1, // +- src_len1, // +- h1v2_bias, // +- first_column, // +- (total_src_len1 >= half_width_for_2to1)); +- +- const uint8_t* src_ptr_x2 = src2 + (x / inv_h2); +- const uint8_t* up2 = (*upfunc2)( // +- scratch_buffer_2k_ptr + (2u * 480u), // +- src_ptr_x2, // +- src_ptr_x2, // +- src_len2, // +- h1v2_bias, // +- first_column, // +- (total_src_len2 >= half_width_for_2to1)); ++ s += loop_unroll_count * 1; ++ d += loop_unroll_count * 3; ++ n -= loop_unroll_count; ++ } + +- const uint8_t* src_ptr_x3 = src3 + (x / inv_h3); +- const uint8_t* up3 = (*upfunc3)( // +- scratch_buffer_2k_ptr + (3u * 480u), // +- src_ptr_x3, // +- src_ptr_x3, // +- src_len3, // +- h1v2_bias, // +- first_column, // +- (total_src_len3 >= half_width_for_2to1)); ++ while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++ } + +- (*conv4func)(dst, x, end, y, up0, up1, up2, up3); +- x = end; ++ s += 1 * 1; ++ d += 1 * 3; ++ n -= 1; + } +-} +- +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycck__general__triangle_filter( +- wuffs_base__pixel_buffer* dst, +- uint32_t width, +- uint32_t height, +- const uint8_t* src_ptr0, +- const uint8_t* src_ptr1, +- const uint8_t* src_ptr2, +- const uint8_t* src_ptr3, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t stride3, +- uint32_t inv_h0, +- uint32_t inv_h1, +- uint32_t inv_h2, +- uint32_t inv_h3, +- uint32_t inv_v0, +- uint32_t inv_v1, +- uint32_t inv_v2, +- uint32_t inv_v3, +- uint32_t half_width_for_2to1, +- uint32_t half_height_for_2to1, +- uint8_t* scratch_buffer_2k_ptr, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func (*upfuncs)[4][4], +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_4_func conv4func) { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc0 = +- (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc1 = +- (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc2 = +- (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc3 = +- (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u]; + +- // First row. +- uint32_t h1v2_bias = 1u; +- wuffs_base__pixel_swizzler__swizzle_ycck__general__triangle_filter_edge_row( +- dst, width, 0u, // +- src_ptr0, src_ptr1, src_ptr2, src_ptr3, // +- stride0, stride1, stride2, stride3, // +- inv_h0, inv_h1, inv_h2, inv_h3, // +- inv_v0, inv_v1, inv_v2, inv_v3, // +- half_width_for_2to1, // +- h1v2_bias, // +- scratch_buffer_2k_ptr, // +- upfunc0, upfunc1, upfunc2, upfunc3, conv4func); +- h1v2_bias = 2u; ++ return len; ++} + +- // Middle rows. +- bool last_row = height == 2u * half_height_for_2to1; +- uint32_t y_max_excl = last_row ? (height - 1u) : height; +- uint32_t y; +- for (y = 1u; y < y_max_excl; y++) { +- const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0); +- const uint8_t* src0_minor = +- (inv_v0 != 2u) +- ? src0_major +- : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0)); +- const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1); +- const uint8_t* src1_minor = +- (inv_v1 != 2u) +- ? src1_major +- : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1)); +- const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2); +- const uint8_t* src2_minor = +- (inv_v2 != 2u) +- ? src2_major +- : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2)); +- const uint8_t* src3_major = src_ptr3 + ((y / inv_v3) * (size_t)stride3); +- const uint8_t* src3_minor = +- (inv_v3 != 2u) +- ? src3_major +- : ((y & 1u) ? (src3_major + stride3) : (src3_major - stride3)); +- uint32_t total_src_len0 = 0u; +- uint32_t total_src_len1 = 0u; +- uint32_t total_src_len2 = 0u; +- uint32_t total_src_len3 = 0u; ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__xxxx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- uint32_t x = 0u; +- while (x < width) { +- bool first_column = x == 0u; +- uint32_t end = x + 480u; +- if (end > width) { +- end = width; +- } ++ // TODO: unroll. + +- uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; +- uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; +- uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; +- uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3; +- total_src_len0 += src_len0; +- total_src_len1 += src_len1; +- total_src_len2 += src_len2; +- total_src_len3 += src_len3; ++ while (n >= 1) { ++ wuffs_base__poke_u24le__no_bounds_check( ++ d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + +- const uint8_t* up0 = (*upfunc0)( // +- scratch_buffer_2k_ptr + (0u * 480u), // +- src0_major + (x / inv_h0), // +- src0_minor + (x / inv_h0), // +- src_len0, // +- h1v2_bias, // +- first_column, // +- (total_src_len0 >= half_width_for_2to1)); ++ s += 1 * 4; ++ d += 1 * 3; ++ n -= 1; ++ } + +- const uint8_t* up1 = (*upfunc1)( // +- scratch_buffer_2k_ptr + (1u * 480u), // +- src1_major + (x / inv_h1), // +- src1_minor + (x / inv_h1), // +- src_len1, // +- h1v2_bias, // +- first_column, // +- (total_src_len1 >= half_width_for_2to1)); ++ return len; ++} + +- const uint8_t* up2 = (*upfunc2)( // +- scratch_buffer_2k_ptr + (2u * 480u), // +- src2_major + (x / inv_h2), // +- src2_minor + (x / inv_h2), // +- src_len2, // +- h1v2_bias, // +- first_column, // +- (total_src_len2 >= half_width_for_2to1)); ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__y(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- const uint8_t* up3 = (*upfunc3)( // +- scratch_buffer_2k_ptr + (3u * 480u), // +- src3_major + (x / inv_h3), // +- src3_minor + (x / inv_h3), // +- src_len3, // +- h1v2_bias, // +- first_column, // +- (total_src_len3 >= half_width_for_2to1)); ++ // TODO: unroll. + +- (*conv4func)(dst, x, end, y, up0, up1, up2, up3); +- x = end; +- } ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ d[0] = s0; ++ d[1] = s0; ++ d[2] = s0; + +- h1v2_bias ^= 3u; ++ s += 1 * 1; ++ d += 1 * 3; ++ n -= 1; + } + +- // Last row. +- if (y_max_excl != height) { +- wuffs_base__pixel_swizzler__swizzle_ycck__general__triangle_filter_edge_row( +- dst, width, height - 1u, // +- src_ptr0, src_ptr1, src_ptr2, src_ptr3, // +- stride0, stride1, stride2, stride3, // +- inv_h0, inv_h1, inv_h2, inv_h3, // +- inv_v0, inv_v1, inv_v2, inv_v3, // +- half_width_for_2to1, // +- h1v2_bias, // +- scratch_buffer_2k_ptr, // +- upfunc0, upfunc1, upfunc2, upfunc3, conv4func); +- } ++ return len; + } + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__general__triangle_filter_edge_row( +- wuffs_base__pixel_buffer* dst, +- uint32_t width, +- uint32_t y, +- const uint8_t* src_ptr0, +- const uint8_t* src_ptr1, +- const uint8_t* src_ptr2, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t inv_h0, +- uint32_t inv_h1, +- uint32_t inv_h2, +- uint32_t inv_v0, +- uint32_t inv_v1, +- uint32_t inv_v2, +- uint32_t half_width_for_2to1, +- uint32_t h1v2_bias, +- uint8_t* scratch_buffer_2k_ptr, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc0, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc1, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc2, +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func conv3func) { +- const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0); +- const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1); +- const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2); +- uint32_t total_src_len0 = 0u; +- uint32_t total_src_len1 = 0u; +- uint32_t total_src_len2 = 0u; +- +- uint32_t x = 0u; +- while (x < width) { +- bool first_column = x == 0u; +- uint32_t end = x + 672u; +- if (end > width) { +- end = width; +- } +- +- uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; +- uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; +- uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; +- total_src_len0 += src_len0; +- total_src_len1 += src_len1; +- total_src_len2 += src_len2; +- +- const uint8_t* src_ptr_x0 = src0 + (x / inv_h0); +- const uint8_t* up0 = (*upfunc0)( // +- scratch_buffer_2k_ptr + (0u * 672u), // +- src_ptr_x0, // +- src_ptr_x0, // +- src_len0, // +- h1v2_bias, // +- first_column, // +- (total_src_len0 >= half_width_for_2to1)); ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- const uint8_t* src_ptr_x1 = src1 + (x / inv_h1); +- const uint8_t* up1 = (*upfunc1)( // +- scratch_buffer_2k_ptr + (1u * 672u), // +- src_ptr_x1, // +- src_ptr_x1, // +- src_len1, // +- h1v2_bias, // +- first_column, // +- (total_src_len1 >= half_width_for_2to1)); ++ // TODO: unroll. + +- const uint8_t* src_ptr_x2 = src2 + (x / inv_h2); +- const uint8_t* up2 = (*upfunc2)( // +- scratch_buffer_2k_ptr + (2u * 672u), // +- src_ptr_x2, // +- src_ptr_x2, // +- src_len2, // +- h1v2_bias, // +- first_column, // +- (total_src_len2 >= half_width_for_2to1)); ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ d[0] = s0; ++ d[1] = s0; ++ d[2] = s0; + +- (*conv3func)(dst, x, end, y, up0, up1, up2); +- x = end; ++ s += 1 * 2; ++ d += 1 * 3; ++ n -= 1; + } +-} + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__general__triangle_filter( +- wuffs_base__pixel_buffer* dst, +- uint32_t width, +- uint32_t height, +- const uint8_t* src_ptr0, +- const uint8_t* src_ptr1, +- const uint8_t* src_ptr2, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t inv_h0, +- uint32_t inv_h1, +- uint32_t inv_h2, +- uint32_t inv_v0, +- uint32_t inv_v1, +- uint32_t inv_v2, +- uint32_t half_width_for_2to1, +- uint32_t half_height_for_2to1, +- uint8_t* scratch_buffer_2k_ptr, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func (*upfuncs)[4][4], +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func conv3func) { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc0 = +- (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc1 = +- (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc2 = +- (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; ++ return len; ++} + +- // First row. +- uint32_t h1v2_bias = 1u; +- wuffs_base__pixel_swizzler__swizzle_ycc__general__triangle_filter_edge_row( +- dst, width, 0u, // +- src_ptr0, src_ptr1, src_ptr2, // +- stride0, stride1, stride2, // +- inv_h0, inv_h1, inv_h2, // +- inv_v0, inv_v1, inv_v2, // +- half_width_for_2to1, // +- h1v2_bias, // +- scratch_buffer_2k_ptr, // +- upfunc0, upfunc1, upfunc2, conv3func); +- h1v2_bias = 2u; ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__ya_nonpremul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // Middle rows. +- bool last_row = height == 2u * half_height_for_2to1; +- uint32_t y_max_excl = last_row ? (height - 1u) : height; +- uint32_t y; +- for (y = 1u; y < y_max_excl; y++) { +- const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0); +- const uint8_t* src0_minor = +- (inv_v0 != 2u) +- ? src0_major +- : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0)); +- const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1); +- const uint8_t* src1_minor = +- (inv_v1 != 2u) +- ? src1_major +- : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1)); +- const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2); +- const uint8_t* src2_minor = +- (inv_v2 != 2u) +- ? src2_major +- : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2)); +- uint32_t total_src_len0 = 0u; +- uint32_t total_src_len1 = 0u; +- uint32_t total_src_len2 = 0u; ++ // TODO: unroll. + +- uint32_t x = 0u; +- while (x < width) { +- bool first_column = x == 0u; +- uint32_t end = x + 672u; +- if (end > width) { +- end = width; +- } ++ while (n >= 1) { ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u24le__no_bounds_check( ++ d + (0 * 3), ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); + +- uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; +- uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; +- uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; +- total_src_len0 += src_len0; +- total_src_len1 += src_len1; +- total_src_len2 += src_len2; ++ s += 1 * 2; ++ d += 1 * 3; ++ n -= 1; ++ } + +- const uint8_t* up0 = (*upfunc0)( // +- scratch_buffer_2k_ptr + (0u * 672u), // +- src0_major + (x / inv_h0), // +- src0_minor + (x / inv_h0), // +- src_len0, // +- h1v2_bias, // +- first_column, // +- (total_src_len0 >= half_width_for_2to1)); ++ return len; ++} + +- const uint8_t* up1 = (*upfunc1)( // +- scratch_buffer_2k_ptr + (1u * 672u), // +- src1_major + (x / inv_h1), // +- src1_minor + (x / inv_h1), // +- src_len1, // +- h1v2_bias, // +- first_column, // +- (total_src_len1 >= half_width_for_2to1)); ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- const uint8_t* up2 = (*upfunc2)( // +- scratch_buffer_2k_ptr + (2u * 672u), // +- src2_major + (x / inv_h2), // +- src2_minor + (x / inv_h2), // +- src_len2, // +- h1v2_bias, // +- first_column, // +- (total_src_len2 >= half_width_for_2to1)); ++ // TODO: unroll. + +- (*conv3func)(dst, x, end, y, up0, up1, up2); +- x = end; +- } ++ while (n >= 1) { ++ uint32_t d0 = ++ wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000; ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u24le__no_bounds_check( ++ d + (0 * 3), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +- h1v2_bias ^= 3u; ++ s += 1 * 2; ++ d += 1 * 3; ++ n -= 1; + } + +- // Last row. +- if (y_max_excl != height) { +- wuffs_base__pixel_swizzler__swizzle_ycc__general__triangle_filter_edge_row( +- dst, width, height - 1u, // +- src_ptr0, src_ptr1, src_ptr2, // +- stride0, stride1, stride2, // +- inv_h0, inv_h1, inv_h2, // +- inv_v0, inv_v1, inv_v2, // +- half_width_for_2to1, // +- h1v2_bias, // +- scratch_buffer_2k_ptr, // +- upfunc0, upfunc1, upfunc2, conv3func); +- } ++ return len; + } + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__general__box_filter( +- wuffs_base__pixel_buffer* dst, +- uint32_t width, +- uint32_t height, +- const uint8_t* src_ptr0, +- const uint8_t* src_ptr1, +- const uint8_t* src_ptr2, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t inv_h0, +- uint32_t inv_h1, +- uint32_t inv_h2, +- uint32_t inv_v0, +- uint32_t inv_v1, +- uint32_t inv_v2, +- uint32_t half_width_for_2to1, +- uint32_t half_height_for_2to1, +- uint8_t* scratch_buffer_2k_ptr, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func (*upfuncs)[4][4], +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func conv3func) { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc0 = +- (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc1 = +- (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc2 = +- (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; +- +- uint32_t y; +- for (y = 0u; y < height; y++) { +- const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0); +- const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1); +- const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2); ++// -------- + +- uint32_t x = 0u; +- while (x < width) { +- uint32_t end = x + 672u; +- if (end > width) { +- end = width; +- } ++static uint64_t // ++wuffs_private_impl__swizzle_xxxx__index__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; +- uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; +- uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ const size_t loop_unroll_count = 4; + +- const uint8_t* up0 = (*upfunc0)( // +- scratch_buffer_2k_ptr + (0u * 672u), // +- src0_major + (x / inv_h0), // +- src0_major + (x / inv_h0), // +- src_len0, // +- 0u, false, false); ++ while (n >= loop_unroll_count) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (1 * 4), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[1] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (2 * 4), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[2] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (3 * 4), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[3] * 4))); + +- const uint8_t* up1 = (*upfunc1)( // +- scratch_buffer_2k_ptr + (1u * 672u), // +- src1_major + (x / inv_h1), // +- src1_major + (x / inv_h1), // +- src_len1, // +- 0u, false, false); ++ s += loop_unroll_count * 1; ++ d += loop_unroll_count * 4; ++ n -= loop_unroll_count; ++ } + +- const uint8_t* up2 = (*upfunc2)( // +- scratch_buffer_2k_ptr + (2u * 672u), // +- src2_major + (x / inv_h2), // +- src2_major + (x / inv_h2), // +- src_len2, // +- 0u, false, false); ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4))); + +- (*conv3func)(dst, x, end, y, up0, up1, up2); +- x = end; +- } ++ s += 1 * 1; ++ d += 1 * 4; ++ n -= 1; + } +-} + +-// -------- ++ return len; ++} + +-// wuffs_base__pixel_swizzler__flattened_length is like +-// wuffs_base__table__flattened_length but returns uint64_t (not size_t) and +-// also accounts for subsampling. + static uint64_t // +-wuffs_base__pixel_swizzler__flattened_length(uint32_t width, +- uint32_t height, +- uint32_t stride, +- uint32_t inv_h, +- uint32_t inv_v) { +- uint64_t scaled_width = (((uint64_t)width) + (inv_h - 1u)) / inv_h; +- uint64_t scaled_height = (((uint64_t)height) + (inv_v - 1u)) / inv_v; +- if (scaled_height <= 0u) { +- return 0u; ++wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; + } +- return ((scaled_height - 1u) * stride) + scaled_width; +-} ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +-wuffs_base__pixel_swizzler__swizzle_ycck( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_buffer* dst, +- wuffs_base__slice_u8 dst_palette, +- uint32_t width, +- uint32_t height, +- wuffs_base__slice_u8 src0, +- wuffs_base__slice_u8 src1, +- wuffs_base__slice_u8 src2, +- wuffs_base__slice_u8 src3, +- uint32_t width0, +- uint32_t width1, +- uint32_t width2, +- uint32_t width3, +- uint32_t height0, +- uint32_t height1, +- uint32_t height2, +- uint32_t height3, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t stride3, +- uint8_t h0, +- uint8_t h1, +- uint8_t h2, +- uint8_t h3, +- uint8_t v0, +- uint8_t v1, +- uint8_t v2, +- uint8_t v3, +- bool is_rgb_or_cmyk, +- bool triangle_filter_for_2to1, +- wuffs_base__slice_u8 scratch_buffer_2k) { +- if (!p) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } else if (!dst || (width > 0xFFFFu) || (height > 0xFFFFu) || // +- (4u <= ((unsigned int)h0 - 1u)) || // +- (4u <= ((unsigned int)h1 - 1u)) || // +- (4u <= ((unsigned int)h2 - 1u)) || // +- (4u <= ((unsigned int)v0 - 1u)) || // +- (4u <= ((unsigned int)v1 - 1u)) || // +- (4u <= ((unsigned int)v2 - 1u)) || // +- (scratch_buffer_2k.len < 2048u)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ const size_t loop_unroll_count = 4; ++ ++ while (n >= loop_unroll_count) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); ++ } ++ uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[1] * 4)); ++ if (s1) { ++ wuffs_base__poke_u32le__no_bounds_check(d + (1 * 4), s1); ++ } ++ uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[2] * 4)); ++ if (s2) { ++ wuffs_base__poke_u32le__no_bounds_check(d + (2 * 4), s2); ++ } ++ uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[3] * 4)); ++ if (s3) { ++ wuffs_base__poke_u32le__no_bounds_check(d + (3 * 4), s3); ++ } ++ ++ s += loop_unroll_count * 1; ++ d += loop_unroll_count * 4; ++ n -= loop_unroll_count; + } +- if ((h3 != 0u) || (v3 != 0u)) { +- if ((4u <= ((unsigned int)h3 - 1u)) || // +- (4u <= ((unsigned int)v3 - 1u))) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ ++ while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); + } ++ ++ s += 1 * 1; ++ d += 1 * 4; ++ n -= 1; + } + +- uint32_t max_incl_h = wuffs_base__u32__max_of_4(h0, h1, h2, h3); +- uint32_t max_incl_v = wuffs_base__u32__max_of_4(v0, v1, v2, v3); ++ return len; ++} + +- // Calculate the inverse h and v ratios. +- // +- // It also canonicalizes (h=2 and max_incl_h=4) as equivalent to (h=1 and +- // max_incl_h=2). In both cases, the inv_h value is 2. +- uint32_t inv_h0 = max_incl_h / h0; +- uint32_t inv_h1 = max_incl_h / h1; +- uint32_t inv_h2 = max_incl_h / h2; +- uint32_t inv_h3 = h3 ? (max_incl_h / h3) : 0u; +- uint32_t inv_v0 = max_incl_v / v0; +- uint32_t inv_v1 = max_incl_v / v1; +- uint32_t inv_v2 = max_incl_v / v2; +- uint32_t inv_v3 = v3 ? (max_incl_v / v3) : 0u; ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++static uint64_t // ++wuffs_private_impl__swizzle_xxxx__y__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- uint32_t half_width_for_2to1 = (width + 1u) / 2u; +- uint32_t half_height_for_2to1 = (height + 1u) / 2u; +- +- width = wuffs_base__u32__min_of_5( // +- width, // +- width0 * inv_h0, // +- width1 * inv_h1, // +- width2 * inv_h2, // +- wuffs_base__pixel_config__width(&dst->pixcfg)); +- height = wuffs_base__u32__min_of_5( // +- height, // +- height0 * inv_v0, // +- height1 * inv_v1, // +- height2 * inv_v2, // +- wuffs_base__pixel_config__height(&dst->pixcfg)); ++ __m128i shuffle = _mm_set_epi8(+0x03, +0x03, +0x03, +0x03, // ++ +0x02, +0x02, +0x02, +0x02, // ++ +0x01, +0x01, +0x01, +0x01, // ++ +0x00, +0x00, +0x00, +0x00); ++ __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00); + +- if (((h0 * inv_h0) != max_incl_h) || // +- ((h1 * inv_h1) != max_incl_h) || // +- ((h2 * inv_h2) != max_incl_h) || // +- ((v0 * inv_v0) != max_incl_v) || // +- ((v1 * inv_v1) != max_incl_v) || // +- ((v2 * inv_v2) != max_incl_v) || // +- (src0.len < wuffs_base__pixel_swizzler__flattened_length( +- width, height, stride0, inv_h0, inv_v0)) || +- (src1.len < wuffs_base__pixel_swizzler__flattened_length( +- width, height, stride1, inv_h1, inv_v1)) || +- (src2.len < wuffs_base__pixel_swizzler__flattened_length( +- width, height, stride2, inv_h2, inv_v2))) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((h3 != 0u) || (v3 != 0u)) { +- if (((h3 * inv_h3) != max_incl_h) || // +- ((v3 * inv_v3) != max_incl_v) || // +- (src3.len < wuffs_base__pixel_swizzler__flattened_length( +- width, height, stride3, inv_h3, inv_v3))) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- } ++ while (n >= 4) { ++ __m128i x; ++ x = _mm_cvtsi32_si128((int)(wuffs_base__peek_u32le__no_bounds_check(s))); ++ x = _mm_shuffle_epi8(x, shuffle); ++ x = _mm_or_si128(x, or_ff); ++ _mm_storeu_si128((__m128i*)(void*)d, x); + +- if (wuffs_base__pixel_format__is_planar(&dst->pixcfg.private_impl.pixfmt)) { +- // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO. +- return wuffs_base__make_status( +- wuffs_base__error__unsupported_pixel_swizzler_option); ++ s += 4 * 1; ++ d += 4 * 4; ++ n -= 4; + } + +- switch (dst->pixcfg.private_impl.pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: +- case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- break; ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); + +- default: +- // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO. +- return wuffs_base__make_status( +- wuffs_base__error__unsupported_pixel_swizzler_option); ++ s += 1 * 1; ++ d += 1 * 4; ++ n -= 1; + } + +- if ((width <= 0u) || (height <= 0u)) { +- return wuffs_base__make_status(NULL); +- } ++ return len; ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func conv3func = NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_xxxx__y(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- if (is_rgb_or_cmyk) { +- conv3func = &wuffs_base__pixel_swizzler__swizzle_rgb__convert_3_general; +- } else { +- switch (dst->pixcfg.private_impl.pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +- if (wuffs_base__cpu_arch__have_x86_avx2()) { +- conv3func = +- &wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx_x86_avx2; +- break; +- } +-#endif +- conv3func = &wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx; +- break; +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +- if (wuffs_base__cpu_arch__have_x86_avx2()) { +- conv3func = +- &wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_rgbx_x86_avx2; +- break; +- } +-#endif +- conv3func = &wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_rgbx; +- break; +- default: +- conv3func = &wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_general; +- break; +- } ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); ++ ++ s += 1 * 1; ++ d += 1 * 4; ++ n -= 1; + } + +- void (*func)( +- wuffs_base__pixel_buffer * dst, // +- uint32_t width, // +- uint32_t height, // +- const uint8_t* src_ptr0, // +- const uint8_t* src_ptr1, // +- const uint8_t* src_ptr2, // +- uint32_t stride0, // +- uint32_t stride1, // +- uint32_t stride2, // +- uint32_t inv_h0, // +- uint32_t inv_h1, // +- uint32_t inv_h2, // +- uint32_t inv_v0, // +- uint32_t inv_v1, // +- uint32_t inv_v2, // +- uint32_t half_width_for_2to1, // +- uint32_t half_height_for_2to1, // +- uint8_t* scratch_buffer_2k_ptr, // +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func(*upfuncs)[4][4], +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func conv3func) = +- &wuffs_base__pixel_swizzler__swizzle_ycc__general__box_filter; +- +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfuncs[4][4]; +- memcpy(&upfuncs, &wuffs_base__pixel_swizzler__swizzle_ycc__upsample_funcs, +- sizeof upfuncs); ++ return len; ++} + +- if (triangle_filter_for_2to1 && +- (wuffs_base__pixel_swizzler__has_triangle_upsampler(inv_h0, inv_v0) || +- wuffs_base__pixel_swizzler__has_triangle_upsampler(inv_h1, inv_v1) || +- wuffs_base__pixel_swizzler__has_triangle_upsampler(inv_h2, inv_v2))) { +- func = &wuffs_base__pixel_swizzler__swizzle_ycc__general__triangle_filter; +- +- upfuncs[0][1] = +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1v2_triangle; +- upfuncs[1][0] = +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v1_triangle; +- upfuncs[1][1] = +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v2_triangle; +- +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-#if defined(__GNUC__) && !defined(__clang__) +- // Don't use our AVX2 implementation for GCC (but do use it for clang). For +- // some unknown reason, GCC performs noticably better on the non-SIMD +- // version. Possibly because GCC's auto-vectorizer is smarter (just with +- // SSE2, not AVX2) than our hand-written code, but that's just a guess. +- // +- // See commits 51bc60ef9298cb2efc1b29a9681191f66d49820d and +- // cd769a0cdf1b5affee13f6089b995f3d39569cb4 for benchmark numbers. +- // +- // See also https://godbolt.org/z/MbhbPGEz4 for Debian Bullseye's clang 11 +- // versus gcc 10, where only gcc auto-vectorizes, although later clang +- // versions will also auto-vectorize. +-#else +- if (wuffs_base__cpu_arch__have_x86_avx2()) { +- upfuncs[1][1] = +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2; +- } +-#endif +-#endif +- } ++static uint64_t // ++wuffs_private_impl__swizzle_xxxx__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- if ((h3 != 0u) || (v3 != 0u)) { +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_4_func conv4func = +- is_rgb_or_cmyk +- ? &wuffs_base__pixel_swizzler__swizzle_cmyk__convert_4_general +- : &wuffs_base__pixel_swizzler__swizzle_ycck__convert_4_general; +- wuffs_base__pixel_swizzler__swizzle_ycck__general__triangle_filter( // +- dst, width, height, // +- src0.ptr, src1.ptr, src2.ptr, src3.ptr, // +- stride0, stride1, stride2, stride3, // +- inv_h0, inv_h1, inv_h2, inv_h3, // +- inv_v0, inv_v1, inv_v2, inv_v3, // +- half_width_for_2to1, half_height_for_2to1, // +- scratch_buffer_2k.ptr, &upfuncs, conv4func); ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); + +- } else { +- (*func)( // +- dst, width, height, // +- src0.ptr, src1.ptr, src2.ptr, // +- stride0, stride1, stride2, // +- inv_h0, inv_h1, inv_h2, // +- inv_v0, inv_v1, inv_v2, // +- half_width_for_2to1, half_height_for_2to1, // +- scratch_buffer_2k.ptr, &upfuncs, conv3func); ++ s += 1 * 2; ++ d += 1 * 4; ++ n -= 1; + } + +- return wuffs_base__make_status(NULL); ++ return len; + } + + // -------- + +-// ‼ WUFFS MULTI-FILE SECTION +x86_avx2 +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx_x86_avx2( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- if ((x + 32u) > x_end) { +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx( // +- dst, x, x_end, y, up0, up1, up2); +- return; ++static uint64_t // ++wuffs_private_impl__swizzle_xxxxxxxx__index__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; + } ++ size_t dst_len8 = dst_len / 8; ++ size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- size_t dst_stride = dst->private_impl.planes[0].stride; +- uint8_t* dst_iter = dst->private_impl.planes[0].ptr + +- (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); +- +- // u0001 = u16x16 [0x0001 .. 0x0001] +- // u00FF = u16x16 [0x00FF .. 0x00FF] +- // uFF80 = u16x16 [0xFF80 .. 0xFF80] +- // uFFFF = u16x16 [0xFFFF .. 0xFFFF] +- const __m256i u0001 = _mm256_set1_epi16(+0x0001); +- const __m256i u00FF = _mm256_set1_epi16(+0x00FF); +- const __m256i uFF80 = _mm256_set1_epi16(-0x0080); +- const __m256i uFFFF = _mm256_set1_epi16(-0x0001); ++ while (n >= 1) { ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4)))); + +- // p8000_p0000 = u16x16 [0x8000 0x0000 .. 0x8000 0x0000] +- const __m256i p8000_p0000 = _mm256_set_epi16( // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000); ++ s += 1 * 1; ++ d += 1 * 8; ++ n -= 1; ++ } + +- // Per wuffs_base__color_ycc__as__color_u32, the formulae: +- // +- // R = Y + 1.40200 * Cr +- // G = Y - 0.34414 * Cb - 0.71414 * Cr +- // B = Y + 1.77200 * Cb +- // +- // When scaled by 1<<16: +- // +- // 0.34414 becomes 0x0581A = 22554. +- // 0.71414 becomes 0x0B6D2 = 46802. +- // 1.40200 becomes 0x166E9 = 91881. +- // 1.77200 becomes 0x1C5A2 = 116130. +- // +- // Separate the integer and fractional parts, since we work with signed +- // 16-bit SIMD lanes. The fractional parts range from -0.5 .. +0.5 (as +- // floating-point) which is from -0x8000 .. +0x8000 (as fixed-point). +- // +- // -0x3A5E = -0x20000 + 0x1C5A2 The B:Cb factor. +- // +0x66E9 = -0x10000 + 0x166E9 The R:Cr factor. +- // -0x581A = +0x00000 - 0x0581A The G:Cb factor. +- // +0x492E = +0x10000 - 0x0B6D2 The G:Cr factor. +- const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E); +- const __m256i p66E9 = _mm256_set1_epi16(+0x66E9); +- const __m256i m581A_p492E = _mm256_set_epi16( // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A); ++ return len; ++} + +- while (x < x_end) { +- // Load chroma values in even and odd columns (the high 8 bits of each +- // u16x16 element are zero) and then subtract 0x0080. +- // +- // cb_all = u8x32 [cb.00 cb.01 cb.02 cb.03 .. cb.1C cb.1D cb.1E cb.1F] +- // cb_eve = i16x16 [cb.00-0x80 cb.02-0x80 .. cb.1C-0x80 cb.1E-0x80 ] +- // cb_odd = i16x16 [cb.01-0x80 cb.03-0x80 .. cb.1D-0x80 cb.1F-0x80 ] +- // +- // Ditto for the cr_xxx Chroma-Red values. +- __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1); +- __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2); +- __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF)); +- __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF)); +- __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8)); +- __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8)); ++static uint64_t // ++wuffs_private_impl__swizzle_xxxxxxxx__index_binary_alpha__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len8 = dst_len / 8; ++ size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // ---- ++ while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), wuffs_base__color_u32__as__color_u64(s0)); ++ } + +- // Calculate: +- // +- // B-Y = (+1.77200 * Cb) as floating-point +- // R-Y = (+1.40200 * Cr) as floating-point +- // +- // B-Y = ((0x2_0000 - 0x3A5E) * Cb) as fixed-point +- // R-Y = ((0x1_0000 + 0x66E9) * Cr) as fixed-point +- // +- // B-Y = ((-0x3A5E * Cb) + ("2.0" * Cb)) +- // R-Y = ((+0x66E9 * Cr) + ("1.0" * Cr)) ++ s += 1 * 1; ++ d += 1 * 8; ++ n -= 1; ++ } + +- // Multiply by m3A5E or p66E9, taking the high 16 bits. There's also a +- // doubling (add x to itself), adding-of-1 and halving (shift right by 1). +- // That makes multiply-and-take-high round to nearest (instead of down). +- __m256i tmp_by_eve = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001), +- 1); +- __m256i tmp_by_odd = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001), +- 1); +- __m256i tmp_ry_eve = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001), +- 1); +- __m256i tmp_ry_odd = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001), +- 1); ++ return len; ++} + +- // Add (2 * Cb) and (1 * Cr). +- __m256i by_eve = +- _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve)); +- __m256i by_odd = +- _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd)); +- __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve); +- __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd); ++static uint64_t // ++wuffs_private_impl__swizzle_xxxxxxxx__y(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // ---- ++ while (n >= 1) { ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), 0xFFFF000000000000 | (0x010101010101 * (uint64_t)s[0])); + +- // Calculate: +- // +- // G-Y = (-0.34414 * Cb) + +- // (-0.71414 * Cr) as floating-point +- // +- // G-Y = ((+0x0_0000 - 0x581A) * Cb) + +- // ((-0x1_0000 + 0x492E) * Cr) as fixed-point +- // +- // G-Y = (-0x581A * Cb) + +- // (+0x492E * Cr) - ("1.0" * Cr) ++ s += 1 * 1; ++ d += 1 * 8; ++ n -= 1; ++ } + +- // Multiply-add to get ((-0x581A * Cb) + (+0x492E * Cr)). +- __m256i tmp0_gy_eve_lo = _mm256_madd_epi16( // +- _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E); +- __m256i tmp0_gy_eve_hi = _mm256_madd_epi16( // +- _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E); +- __m256i tmp0_gy_odd_lo = _mm256_madd_epi16( // +- _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E); +- __m256i tmp0_gy_odd_hi = _mm256_madd_epi16( // +- _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E); ++ return len; ++} + +- // Divide the i32x8 vectors by (1 << 16), rounding to nearest. +- __m256i tmp1_gy_eve_lo = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16); +- __m256i tmp1_gy_eve_hi = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16); +- __m256i tmp1_gy_odd_lo = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16); +- __m256i tmp1_gy_odd_hi = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16); ++static uint64_t // ++wuffs_private_impl__swizzle_xxxxxxxx__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // Pack the ((-0x581A * Cb) + (+0x492E * Cr)) as i16x16 and subtract Cr. +- __m256i gy_eve = _mm256_sub_epi16( +- _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve); +- __m256i gy_odd = _mm256_sub_epi16( +- _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd); ++ while (n >= 1) { ++ uint64_t s0 = ++ ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(s + (0 * 2)))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), 0xFFFF000000000000 | (0x000100010001 * s0)); + +- // ---- ++ s += 1 * 2; ++ d += 1 * 8; ++ n -= 1; ++ } + +- // Add Y to (B-Y), (G-Y) and (R-Y) to produce B, G and R. +- // +- // For the resultant packed_x_xxx vectors, only elements 0 ..= 7 and 16 ..= +- // 23 of the 32-element vectors matter (since we'll unpacklo but not +- // unpackhi them). Let … denote 8 ignored consecutive u8 values and let % +- // denote 0xFF. We'll end this section with: +- // +- // packed_b_eve = u8x32 [b00 b02 .. b0C b0E … b10 b12 .. b1C b1E …] +- // packed_b_odd = u8x32 [b01 b03 .. b0D b0F … b11 b13 .. b1D b1F …] +- // packed_g_eve = u8x32 [g00 g02 .. g0C g0E … g10 g12 .. g1C g1E …] +- // packed_g_odd = u8x32 [g01 g03 .. g0D g0F … g11 g13 .. g1D g1F …] +- // packed_r_eve = u8x32 [r00 r02 .. r0C r0E … r10 r12 .. r1C r1E …] +- // packed_r_odd = u8x32 [r01 r03 .. r0D r0F … r11 r13 .. r1D r1F …] +- // uFFFF = u8x32 [ % % .. % % … % % .. % % …] ++ return len; ++} + +- __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0); +- __m256i yy_eve = _mm256_and_si256(yy_all, u00FF); +- __m256i yy_odd = _mm256_srli_epi16(yy_all, 8); ++// -------- + +- __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve); +- __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd); +- __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve); +- __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd); ++static uint64_t // ++wuffs_private_impl__swizzle_y__bgra_nonpremul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len < src_len4) ? dst_len : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve); +- __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd); +- __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve); +- __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd); ++ while (n >= 1) { ++ uint32_t s0 = ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0); + +- __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve); +- __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd); +- __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve); +- __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd); ++ s += 1 * 4; ++ d += 1 * 1; ++ n -= 1; ++ } + +- // ---- ++ return len; ++} + +- // Mix those values (unpacking in 8, 16 and then 32 bit units) to get the +- // desired BGRX/RGBX order. +- // +- // From here onwards, all of our __m256i registers are u8x32. ++static uint64_t // ++wuffs_private_impl__swizzle_y__bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len < src_len4) ? dst_len : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // mix00 = [b00 g00 b02 g02 .. b0E g0E b10 g10 .. b1C g1C b1E g1E] +- // mix01 = [b01 g01 b03 g03 .. b0F g0F b11 g11 .. b1D g1D b1F g1F] +- // mix02 = [r00 % r02 % .. r0E % r10 % .. r1C % r1E %] +- // mix03 = [r01 % r03 % .. r0F % r11 % .. r1D % r1F %] +- // +- // See also § below. +- __m256i mix00 = _mm256_unpacklo_epi8(packed_b_eve, packed_g_eve); +- __m256i mix01 = _mm256_unpacklo_epi8(packed_b_odd, packed_g_odd); +- __m256i mix02 = _mm256_unpacklo_epi8(packed_r_eve, uFFFF); +- __m256i mix03 = _mm256_unpacklo_epi8(packed_r_odd, uFFFF); ++ while (n >= 1) { ++ uint32_t d0 = 0xFF000000 | (0x00010101 * ((uint32_t)(d[0]))); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray( ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +- // mix10 = [b00 g00 r00 % b02 g02 r02 % b04 g04 r04 % b06 g06 r06 % +- // b10 g10 r10 % b12 g12 r12 % b14 g14 r14 % b16 g16 r16 %] +- // mix11 = [b01 g01 r01 % b03 g03 r03 % b05 g05 r05 % b07 g07 r07 % +- // b11 g11 r11 % b13 g13 r13 % b15 g15 r15 % b17 g17 r17 %] +- // mix12 = [b08 g08 r08 % b0A g0A r0A % b0C g0C r0C % b0E g0E r0E % +- // b18 g18 r18 % b1A g1A r1A % b1C g1C r1C % b1E g1E r1E %] +- // mix13 = [b09 g09 r09 % b0B g0B r0B % b0D g0D r0D % b0F g0F r0F % +- // b19 g19 r19 % b1B g1B r1B % b1D g1D r1D % b1F g1F r1F %] +- __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02); +- __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03); +- __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02); +- __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03); ++ s += 1 * 4; ++ d += 1 * 1; ++ n -= 1; ++ } + +- // mix20 = [b00 g00 r00 % b01 g01 r01 % b02 g02 r02 % b03 g03 r03 % +- // b10 g10 r10 % b11 g11 r11 % b12 g12 r12 % b13 g13 r13 %] +- // mix21 = [b04 g04 r04 % b05 g05 r05 % b06 g06 r06 % b07 g07 r07 % +- // b14 g14 r14 % b15 g15 r15 % b16 g16 r16 % b17 g17 r17 %] +- // mix22 = [b08 g08 r08 % b09 g09 r09 % b0A g0A r0A % b0B g0B r0B % +- // b18 g18 r18 % b19 g19 r19 % b1A g1A r1A % b1B g1B r1B %] +- // mix23 = [b0C g0C r0C % b0D g0D r0D % b0E g0E r0E % b0F g0F r0F % +- // b1C g1C r1C % b1D g1D r1D % b1E g1E r1E % b1F g1F r1F %] +- __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11); +- __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11); +- __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13); +- __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13); ++ return len; ++} + +- // mix30 = [b00 g00 r00 % b01 g01 r01 % b02 g02 r02 % b03 g03 r03 % +- // b04 g04 r04 % b05 g05 r05 % b06 g06 r06 % b07 g07 r07 %] +- // mix31 = [b08 g08 r08 % b09 g09 r09 % b0A g0A r0A % b0B g0B r0B % +- // b0C g0C r0C % b0D g0D r0D % b0E g0E r0E % b0F g0F r0F %] +- // mix32 = [b10 g10 r10 % b11 g11 r11 % b12 g12 r12 % b13 g13 r13 % +- // b14 g14 r14 % b15 g15 r15 % b16 g16 r16 % b17 g17 r17 %] +- // mix33 = [b18 g18 r18 % b19 g19 r19 % b1A g1A r1A % b1B g1B r1B % +- // b1C g1C r1C % b1D g1D r1D % b1E g1E r1E % b1F g1F r1F %] +- __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20); +- __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20); +- __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31); +- __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31); ++static uint64_t // ++wuffs_private_impl__swizzle_y__bgrx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len < src_len4) ? dst_len : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // Write out four u8x32 SIMD registers (128 bytes, 32 BGRX/RGBX pixels). +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33); ++ while (n >= 1) { ++ uint32_t s0 = ++ 0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0); + +- // Advance by up to 32 pixels. The first iteration might be smaller than 32 +- // so that all of the remaining steps are exactly 32. +- uint32_t n = 32u - (31u & (x - x_end)); +- dst_iter += 4u * n; +- up0 += n; +- up1 += n; +- up2 += n; +- x += n; ++ s += 1 * 4; ++ d += 1 * 1; ++ n -= 1; + } ++ ++ return len; + } + +-// The rgbx flavor (below) is exactly the same as the bgrx flavor (above) +-// except for the lines marked with a § and that comments were stripped. +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_rgbx_x86_avx2( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- if ((x + 32u) > x_end) { +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx( // +- dst, x, x_end, y, up0, up1, up2); +- return; +- } ++static uint64_t // ++wuffs_private_impl__swizzle_y__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len < src_len2) ? dst_len : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- size_t dst_stride = dst->private_impl.planes[0].stride; +- uint8_t* dst_iter = dst->private_impl.planes[0].ptr + +- (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); ++ while (n >= 1) { ++ d[0] = s[0]; + +- const __m256i u0001 = _mm256_set1_epi16(+0x0001); +- const __m256i u00FF = _mm256_set1_epi16(+0x00FF); +- const __m256i uFF80 = _mm256_set1_epi16(-0x0080); +- const __m256i uFFFF = _mm256_set1_epi16(-0x0001); ++ s += 1 * 2; ++ d += 1 * 1; ++ n -= 1; ++ } + +- const __m256i p8000_p0000 = _mm256_set_epi16( // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000); ++ return len; ++} + +- const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E); +- const __m256i p66E9 = _mm256_set1_epi16(+0x66E9); +- const __m256i m581A_p492E = _mm256_set_epi16( // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A); ++static uint64_t // ++wuffs_private_impl__swizzle_y_16le__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- while (x < x_end) { +- __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1); +- __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2); +- __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF)); +- __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF)); +- __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8)); +- __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8)); ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ d[0] = s1; ++ d[1] = s0; + +- __m256i tmp_by_eve = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001), +- 1); +- __m256i tmp_by_odd = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001), +- 1); +- __m256i tmp_ry_eve = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001), +- 1); +- __m256i tmp_ry_odd = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001), +- 1); ++ s += 1 * 2; ++ d += 1 * 2; ++ n -= 1; ++ } + +- __m256i by_eve = +- _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve)); +- __m256i by_odd = +- _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd)); +- __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve); +- __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd); ++ return len; ++} + +- __m256i tmp0_gy_eve_lo = _mm256_madd_epi16( // +- _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E); +- __m256i tmp0_gy_eve_hi = _mm256_madd_epi16( // +- _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E); +- __m256i tmp0_gy_odd_lo = _mm256_madd_epi16( // +- _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E); +- __m256i tmp0_gy_odd_hi = _mm256_madd_epi16( // +- _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E); ++// -------- + +- __m256i tmp1_gy_eve_lo = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16); +- __m256i tmp1_gy_eve_hi = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16); +- __m256i tmp1_gy_odd_lo = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16); +- __m256i tmp1_gy_odd_hi = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16); ++static uint64_t // ++wuffs_private_impl__swizzle_ya_nonpremul__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- __m256i gy_eve = _mm256_sub_epi16( +- _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve); +- __m256i gy_odd = _mm256_sub_epi16( +- _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd); ++ while (n >= 1) { ++ uint32_t d0 = ((uint32_t)(d[1]) << 24) | ((uint32_t)(d[0]) * 0x010101); ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ uint32_t c0 = ++ wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)(c0 >> 16)); + +- __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0); +- __m256i yy_eve = _mm256_and_si256(yy_all, u00FF); +- __m256i yy_odd = _mm256_srli_epi16(yy_all, 8); ++ s += 1 * 2; ++ d += 1 * 2; ++ n -= 1; ++ } + +- __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve); +- __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd); +- __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve); +- __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd); ++ return len; ++} + +- __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve); +- __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd); +- __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve); +- __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd); ++// -------- + +- __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve); +- __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd); +- __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve); +- __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd); ++static uint64_t // ++wuffs_private_impl__swizzle_transparent_black_src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ uint64_t num_pixels, ++ uint32_t dst_pixfmt_bytes_per_pixel) { ++ uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel; ++ if (n > num_pixels) { ++ n = num_pixels; ++ } ++ memset(dst_ptr, 0, ((size_t)(n * dst_pixfmt_bytes_per_pixel))); ++ return n; ++} + +- // § Note the swapped B and R channels. +- __m256i mix00 = _mm256_unpacklo_epi8(packed_r_eve, packed_g_eve); +- __m256i mix01 = _mm256_unpacklo_epi8(packed_r_odd, packed_g_odd); +- __m256i mix02 = _mm256_unpacklo_epi8(packed_b_eve, uFFFF); +- __m256i mix03 = _mm256_unpacklo_epi8(packed_b_odd, uFFFF); ++static uint64_t // ++wuffs_private_impl__swizzle_transparent_black_src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ uint64_t num_pixels, ++ uint32_t dst_pixfmt_bytes_per_pixel) { ++ uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel; ++ if (n > num_pixels) { ++ n = num_pixels; ++ } ++ return n; ++} + +- __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02); +- __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03); +- __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02); +- __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03); ++// -------- + +- __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11); +- __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11); +- __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13); +- __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13); ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__y( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ return wuffs_private_impl__swizzle_copy_1_1; + +- __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20); +- __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20); +- __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31); +- __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_bgr_565__y; + +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_xxx__y; + +- uint32_t n = 32u - (31u & (x - x_end)); +- dst_iter += 4u * n; +- up0 += n; +- up1 += n; +- up2 += n; +- x += n; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_xxxx__y__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_xxxx__y; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_xxxxxxxx__y; + } ++ return NULL; + } + +-#if defined(__GNUC__) && !defined(__clang__) +-// No-op. +-#else +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column, +- bool last_column) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp_major = src_ptr_major; +- const uint8_t* sp_minor = src_ptr_minor; +- +- if (first_column) { +- src_len--; +- if ((src_len <= 0u) && last_column) { +- uint32_t sv = (12u * ((uint32_t)(*sp_major++))) + // +- (4u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + 7u) >> 4u); +- return dst_ptr; +- } +- +- uint32_t sv_major_m1 = sp_major[-0]; // Clamp offset to zero. +- uint32_t sv_minor_m1 = sp_minor[-0]; // Clamp offset to zero. +- uint32_t sv_major_p1 = sp_major[+1]; +- uint32_t sv_minor_p1 = sp_minor[+1]; +- +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); +- if (src_len <= 0u) { +- return dst_ptr; +- } +- } +- +- if (last_column) { +- src_len--; +- } +- +- if (src_len < 32) { +- // This fallback is the same as the non-SIMD-capable code path. +- for (; src_len > 0u; src_len--) { +- uint32_t sv_major_m1 = sp_major[-1]; +- uint32_t sv_minor_m1 = sp_minor[-1]; +- uint32_t sv_major_p1 = sp_major[+1]; +- uint32_t sv_minor_p1 = sp_minor[+1]; +- +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); +- } +- +- } else { +- while (src_len > 0u) { +- // Load 1+32+1 samples (six u8x32 vectors) from the major (jxx) and minor +- // (nxx) rows. +- // +- // major_p0 = [j00 j01 j02 j03 .. j28 j29 j30 j31] // p0 = "plus 0" +- // minor_p0 = [n00 n01 n02 n03 .. n28 n29 n30 n31] // p0 = "plus 0" +- // major_m1 = [jm1 j00 j01 j02 .. j27 j28 j29 j30] // m1 = "minus 1" +- // minor_m1 = [nm1 n00 n01 n02 .. n27 n28 n29 n30] // m1 = "minus 1" +- // major_p1 = [j01 j02 j03 j04 .. j29 j30 j31 j32] // p1 = "plus 1" +- // minor_p1 = [n01 n02 n03 n04 .. n29 n30 n31 n32] // p1 = "plus 1" +- __m256i major_p0 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 0)); +- __m256i minor_p0 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 0)); +- __m256i major_m1 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major - 1)); +- __m256i minor_m1 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor - 1)); +- __m256i major_p1 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 1)); +- __m256i minor_p1 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 1)); +- +- // Unpack, staying with u8x32 vectors. +- // +- // step1_p0_lo = [j00 n00 j01 n01 .. j07 n07 j16 n16 j17 n17 .. j23 n23] +- // step1_p0_hi = [j08 n08 j09 n09 .. j15 n15 j24 n24 j25 n25 .. j31 n31] +- // step1_m1_lo = [jm1 nm1 j00 n00 .. j06 n06 j15 n15 j16 n16 .. j22 n22] +- // step1_m1_hi = [j07 n07 j08 n08 .. j14 n14 j23 n23 j24 n24 .. j30 n30] +- // step1_p1_lo = [j01 n01 j02 n02 .. j08 n08 j17 n17 j18 n18 .. j24 n24] +- // step1_p1_hi = [j09 n09 j10 n10 .. j16 n16 j25 n25 j26 n26 .. j32 n32] +- __m256i step1_p0_lo = _mm256_unpacklo_epi8(major_p0, minor_p0); +- __m256i step1_p0_hi = _mm256_unpackhi_epi8(major_p0, minor_p0); +- __m256i step1_m1_lo = _mm256_unpacklo_epi8(major_m1, minor_m1); +- __m256i step1_m1_hi = _mm256_unpackhi_epi8(major_m1, minor_m1); +- __m256i step1_p1_lo = _mm256_unpacklo_epi8(major_p1, minor_p1); +- __m256i step1_p1_hi = _mm256_unpackhi_epi8(major_p1, minor_p1); +- +- // Multiply-add to get u16x16 vectors. +- // +- // step2_p0_lo = [9*j00+3*n00 9*j01+3*n01 .. 9*j23+3*n23] +- // step2_p0_hi = [9*j08+3*n08 9*j09+3*n09 .. 9*j31+3*n31] +- // step2_m1_lo = [3*jm1+1*nm1 3*j00+1*n00 .. 3*j22+1*n22] +- // step2_m1_hi = [3*j07+1*n07 3*j08+1*n08 .. 3*j30+1*n30] +- // step2_p1_lo = [3*j01+1*n01 3*j02+1*n02 .. 3*j24+1*n24] +- // step2_p1_hi = [3*j09+1*n09 3*j10+1*n10 .. 3*j32+1*n32] +- const __m256i k0309 = _mm256_set1_epi16(0x0309); +- const __m256i k0103 = _mm256_set1_epi16(0x0103); +- __m256i step2_p0_lo = _mm256_maddubs_epi16(step1_p0_lo, k0309); +- __m256i step2_p0_hi = _mm256_maddubs_epi16(step1_p0_hi, k0309); +- __m256i step2_m1_lo = _mm256_maddubs_epi16(step1_m1_lo, k0103); +- __m256i step2_m1_hi = _mm256_maddubs_epi16(step1_m1_hi, k0103); +- __m256i step2_p1_lo = _mm256_maddubs_epi16(step1_p1_lo, k0103); +- __m256i step2_p1_hi = _mm256_maddubs_epi16(step1_p1_hi, k0103); +- +- // Compute the weighted sums of (p0, m1) and (p0, p1). For example: +- // +- // step3_m1_lo[00] = ((9*j00) + (3*n00) + (3*jm1) + (1*nm1)) as u16 +- // step3_p1_hi[15] = ((9*j31) + (3*n31) + (3*j32) + (1*n32)) as u16 +- __m256i step3_m1_lo = _mm256_add_epi16(step2_p0_lo, step2_m1_lo); +- __m256i step3_m1_hi = _mm256_add_epi16(step2_p0_hi, step2_m1_hi); +- __m256i step3_p1_lo = _mm256_add_epi16(step2_p0_lo, step2_p1_lo); +- __m256i step3_p1_hi = _mm256_add_epi16(step2_p0_hi, step2_p1_hi); ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__y_16be( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ return wuffs_private_impl__swizzle_y__y_16be; + +- // Bias by 8 (on the left) or 7 (on the right) and then divide by 16 +- // (which is 9+3+3+1) to get a weighted average. On the left (m1), shift +- // the u16 right value by 4. On the right (p1), shift right by 4 and then +- // shift left by 8 so that, when still in the u16x16 little-endian +- // interpretation, we have: +- // - m1_element = (etcetera + 8) >> 4 +- // - p1_element = ((etcetera + 7) >> 4) << 8 +- // +- // step4_m1_lo = [0x00?? 0x00?? ... 0x00?? 0x00??] +- // step4_p1_lo = [0x??00 0x??00 ... 0x??00 0x??00] +- // step4_m1_hi = [0x00?? 0x00?? ... 0x00?? 0x00??] +- // step4_p1_hi = [0x??00 0x??00 ... 0x??00 0x??00] +- __m256i step4_m1_lo = _mm256_srli_epi16( +- _mm256_add_epi16(step3_m1_lo, _mm256_set1_epi16(8)), 4); +- __m256i step4_p1_lo = _mm256_slli_epi16( +- _mm256_srli_epi16(_mm256_add_epi16(step3_p1_lo, _mm256_set1_epi16(7)), +- 4), +- 8); +- __m256i step4_m1_hi = _mm256_srli_epi16( +- _mm256_add_epi16(step3_m1_hi, _mm256_set1_epi16(8)), 4); +- __m256i step4_p1_hi = _mm256_slli_epi16( +- _mm256_srli_epi16(_mm256_add_epi16(step3_p1_hi, _mm256_set1_epi16(7)), +- 4), +- 8); ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: ++ return wuffs_private_impl__swizzle_y_16le__y_16be; + +- // Bitwise-or two "0x00"-rich u16x16 vectors to get a u8x32 vector. Do +- // that twice. Once for the low columns and once for the high columns. +- // +- // In terms of jxx (major row) or nxx (minor row) source samples: +- // - low columns means ( 0 .. 8; 16 .. 24). +- // - high columns means ( 8 .. 16; 24 .. 32). +- // +- // In terms of dxx destination samples (there are twice as many): +- // - low columns means ( 0 .. 16; 32 .. 48). +- // - high columns means (16 .. 32; 48 .. 64). +- // +- // step5_lo = [d00 d01 .. d14 d15 d32 d33 .. d46 d47] +- // step5_hi = [d16 d17 .. d30 d31 d48 d49 .. d62 d63] +- // +- // The d00, d02 ... d62 even elements come from (p0, m1) weighted sums. +- // The d01, d03 ... d63 odd elements come from (p0, p1) weighted sums. +- __m256i step5_lo = _mm256_or_si256(step4_m1_lo, step4_p1_lo); +- __m256i step5_hi = _mm256_or_si256(step4_m1_hi, step4_p1_hi); ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: ++ return wuffs_private_impl__swizzle_copy_2_2; + +- // Permute and store. +- // +- // step6_00_31 = [d00 d01 .. d14 d15 d16 d17 .. d30 d31] +- // step6_32_63 = [d32 d33 .. d46 d47 d48 d49 .. d62 d63] +- __m256i step6_00_31 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x20); +- __m256i step6_32_63 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x31); +- _mm256_storeu_si256((__m256i*)(void*)(dp + 0x00), step6_00_31); +- _mm256_storeu_si256((__m256i*)(void*)(dp + 0x20), step6_32_63); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_bgr_565__y_16be; + +- // Advance by up to 32 source samples (64 destination samples). The first +- // iteration might be smaller than 32 so that all of the remaining steps +- // are exactly 32. +- size_t n = 32u - (31u & (0u - src_len)); +- dp += 2u * n; +- sp_major += n; +- sp_minor += n; +- src_len -= n; +- } +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_xxx__y_16be; + +- if (last_column) { +- uint32_t sv_major_m1 = sp_major[-1]; +- uint32_t sv_minor_m1 = sp_minor[-1]; +- uint32_t sv_major_p1 = sp_major[+0]; // Clamp offset to zero. +- uint32_t sv_minor_p1 = sp_minor[+0]; // Clamp offset to zero. ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ return wuffs_private_impl__swizzle_xxxx__y_16be; + +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_xxxxxxxx__y_16be; + } +- +- return dst_ptr; ++ return NULL; + } +-#endif +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) +-// ‼ WUFFS MULTI-FILE SECTION -x86_avx2 + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__UTF8) ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__ya_nonpremul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_2_2; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_ya_nonpremul__ya_nonpremul__src_over; ++ } ++ return NULL; + +-// ---------------- Unicode and UTF-8 ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point) { +- if (code_point <= 0x7F) { +- if (dst.len >= 1) { +- dst.ptr[0] = (uint8_t)(code_point); +- return 1; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxx__ya_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxx__ya_nonpremul__src_over; ++ } ++ return NULL; + +- } else if (code_point <= 0x07FF) { +- if (dst.len >= 2) { +- dst.ptr[0] = (uint8_t)(0xC0 | ((code_point >> 6))); +- dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); +- return 2; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src_over; ++ } ++ return NULL; + +- } else if (code_point <= 0xFFFF) { +- if ((dst.len >= 3) && ((code_point < 0xD800) || (0xDFFF < code_point))) { +- dst.ptr[0] = (uint8_t)(0xE0 | ((code_point >> 12))); +- dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F)); +- dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); +- return 3; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src_over; ++ } ++ return NULL; + +- } else if (code_point <= 0x10FFFF) { +- if (dst.len >= 4) { +- dst.ptr[0] = (uint8_t)(0xF0 | ((code_point >> 18))); +- dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 12) & 0x3F)); +- dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F)); +- dst.ptr[3] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); +- return 4; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src_over; ++ } ++ return NULL; + } +- +- return 0; ++ return NULL; + } + +-// wuffs_base__utf_8__byte_length_minus_1 is the byte length (minus 1) of a +-// UTF-8 encoded code point, based on the encoding's initial byte. +-// - 0x00 is 1-byte UTF-8 (ASCII). +-// - 0x01 is the start of 2-byte UTF-8. +-// - 0x02 is the start of 3-byte UTF-8. +-// - 0x03 is the start of 4-byte UTF-8. +-// - 0x40 is a UTF-8 tail byte. +-// - 0x80 is invalid UTF-8. +-// +-// RFC 3629 (UTF-8) gives this grammar for valid UTF-8: +-// UTF8-1 = %x00-7F +-// UTF8-2 = %xC2-DF UTF8-tail +-// UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) / +-// %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail ) +-// UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) / +-// %xF4 %x80-8F 2( UTF8-tail ) +-// UTF8-tail = %x80-BF +-static const uint8_t wuffs_base__utf_8__byte_length_minus_1[256] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x30 ..= 0x37. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. +- +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. +- +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x80 ..= 0x87. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x88 ..= 0x8F. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x90 ..= 0x97. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x98 ..= 0x9F. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA0 ..= 0xA7. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA8 ..= 0xAF. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB0 ..= 0xB7. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB8 ..= 0xBF. ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_nonpremul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_1_1; ++ } ++ return NULL; + +- 0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC0 ..= 0xC7. +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC8 ..= 0xCF. +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD0 ..= 0xD7. +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD8 ..= 0xDF. +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE0 ..= 0xE7. +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE8 ..= 0xEF. +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +-}; ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ if (wuffs_private_impl__swizzle_squash_align4_bgr_565_8888( ++ dst_palette.ptr, dst_palette.len, src_palette.ptr, ++ src_palette.len, true) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_bgr_565__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_bgr_565__index_bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output // +-wuffs_base__utf_8__next(const uint8_t* s_ptr, size_t s_len) { +- if (s_len == 0) { +- return wuffs_base__make_utf_8__next__output(0, 0); +- } +- uint32_t c = s_ptr[0]; +- switch (wuffs_base__utf_8__byte_length_minus_1[c & 0xFF]) { +- case 0: +- return wuffs_base__make_utf_8__next__output(c, 1); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ if (wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over; ++ } ++ return NULL; + +- case 1: +- if (s_len < 2) { +- break; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; + } +- c = wuffs_base__peek_u16le__no_bounds_check(s_ptr); +- if ((c & 0xC000) != 0x8000) { +- break; ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over; + } +- c = (0x0007C0 & (c << 6)) | (0x00003F & (c >> 8)); +- return wuffs_base__make_utf_8__next__output(c, 2); ++ return NULL; + +- case 2: +- if (s_len < 3) { +- break; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; + } +- c = wuffs_base__peek_u24le__no_bounds_check(s_ptr); +- if ((c & 0xC0C000) != 0x808000) { +- break; ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxxxxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over; + } +- c = (0x00F000 & (c << 12)) | (0x000FC0 & (c >> 2)) | +- (0x00003F & (c >> 16)); +- if ((c <= 0x07FF) || ((0xD800 <= c) && (c <= 0xDFFF))) { +- break; ++ return NULL; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ if (wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over; + } +- return wuffs_base__make_utf_8__next__output(c, 3); ++ return NULL; + +- case 3: +- if (s_len < 4) { +- break; ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ if (wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ if (wuffs_private_impl__swizzle_swap_rgbx_bgrx( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over; + } +- c = wuffs_base__peek_u32le__no_bounds_check(s_ptr); +- if ((c & 0xC0C0C000) != 0x80808000) { +- break; ++ return NULL; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ if (wuffs_private_impl__swizzle_swap_rgbx_bgrx( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; + } +- c = (0x1C0000 & (c << 18)) | (0x03F000 & (c << 4)) | +- (0x000FC0 & (c >> 10)) | (0x00003F & (c >> 24)); +- if ((c <= 0xFFFF) || (0x110000 <= c)) { +- break; ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over; + } +- return wuffs_base__make_utf_8__next__output(c, 4); +- } ++ return NULL; + +- return wuffs_base__make_utf_8__next__output( +- WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1); +-} ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ if (wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ if (wuffs_private_impl__swizzle_swap_rgbx_bgrx( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output // +-wuffs_base__utf_8__next_from_end(const uint8_t* s_ptr, size_t s_len) { +- if (s_len == 0) { +- return wuffs_base__make_utf_8__next__output(0, 0); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ // TODO. ++ break; + } +- const uint8_t* ptr = &s_ptr[s_len - 1]; +- if (*ptr < 0x80) { +- return wuffs_base__make_utf_8__next__output(*ptr, 1); ++ return NULL; ++} + +- } else if (*ptr < 0xC0) { +- const uint8_t* too_far = &s_ptr[(s_len > 4) ? (s_len - 4) : 0]; +- uint32_t n = 1; +- while (ptr != too_far) { +- ptr--; +- n++; +- if (*ptr < 0x80) { +- break; +- } else if (*ptr < 0xC0) { +- continue; ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_binary( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; + } +- wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(ptr, n); +- if (o.byte_length != n) { +- break; ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_1_1; + } +- return o; +- } +- } +- +- return wuffs_base__make_utf_8__next__output( +- WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1); +-} ++ return NULL; + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__utf_8__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) { +- // TODO: possibly optimize the all-ASCII case (4 or 8 bytes at a time). +- // +- // TODO: possibly optimize this by manually inlining the +- // wuffs_base__utf_8__next calls. +- size_t original_len = s_len; +- while (s_len > 0) { +- wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(s_ptr, s_len); +- if ((o.code_point > 0x7F) && (o.byte_length == 1)) { +- break; +- } +- s_ptr += o.byte_length; +- s_len -= o.byte_length; +- } +- return original_len - s_len; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ if (wuffs_private_impl__swizzle_squash_align4_bgr_565_8888( ++ dst_palette.ptr, dst_palette.len, src_palette.ptr, ++ src_palette.len, false) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__index_binary_alpha__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__ascii__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) { +- // TODO: possibly optimize this by checking 4 or 8 bytes at a time. +- const uint8_t* original_ptr = s_ptr; +- const uint8_t* p = s_ptr; +- const uint8_t* q = s_ptr + s_len; +- for (; (p != q) && ((*p & 0x80) == 0); p++) { +- } +- return (size_t)(p - original_ptr); +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over; ++ } ++ return NULL; + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__UTF8) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over; ++ } ++ return NULL; + +-#ifdef __cplusplus +-} // extern "C" +-#endif ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxxxxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxxxxxxx__index_binary_alpha__src_over; ++ } ++ return NULL; + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ if (wuffs_private_impl__swizzle_swap_rgbx_bgrx( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over; ++ } ++ return NULL; + +-// ---------------- Status Codes Implementations ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ if (wuffs_private_impl__swizzle_swap_rgbx_bgrx( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over; ++ } ++ return NULL; ++ } ++ return NULL; ++} + +-// ---------------- Private Consts ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgr_565( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_copy_2_2; + +-// ---------------- Private Initializer Prototypes ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ return wuffs_private_impl__swizzle_bgr__bgr_565; + +-// ---------------- Private Function Prototypes ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ return wuffs_private_impl__swizzle_bgrw__bgr_565; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_bgrw_4x16le__bgr_565; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up__choosy_default( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x); ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_rgb__bgr_565; + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up_arm_neon( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ return wuffs_private_impl__swizzle_rgbw__bgr_565; ++ } ++ return NULL; ++} + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up_x86_sse42( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgr( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_bgr_565__bgr; + +-// ---------------- VTables ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ return wuffs_private_impl__swizzle_copy_3_3; + +-const wuffs_base__hasher_u32__func_ptrs +-wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = { +- (uint32_t(*)(const void*))(&wuffs_adler32__hasher__checksum_u32), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_adler32__hasher__get_quirk), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_adler32__hasher__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- wuffs_base__slice_u8))(&wuffs_adler32__hasher__update), +- (uint32_t(*)(void*, +- wuffs_base__slice_u8))(&wuffs_adler32__hasher__update_u32), +-}; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_bgrw__bgr; + +-// ---------------- Initializer Implementations ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_bgrw_4x16le__bgr; + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_adler32__hasher__initialize( +- wuffs_adler32__hasher* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_swap_rgb_bgr; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42; ++ } + #endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } ++ return wuffs_private_impl__swizzle_bgrw__rgb; + } ++ return NULL; ++} + +- self->private_impl.choosy_up = &wuffs_adler32__hasher__up__choosy_default; ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_y__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_y__bgra_nonpremul__src_over; ++ } ++ return NULL; + +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = +- wuffs_base__hasher_u32__vtable_name; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = +- (const void*)(&wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32); +- return wuffs_base__make_status(NULL); +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-wuffs_adler32__hasher* +-wuffs_adler32__hasher__alloc(void) { +- wuffs_adler32__hasher* x = +- (wuffs_adler32__hasher*)(calloc(sizeof(wuffs_adler32__hasher), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_adler32__hasher__initialize( +- x, sizeof(wuffs_adler32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-size_t +-sizeof__wuffs_adler32__hasher(void) { +- return sizeof(wuffs_adler32__hasher); +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_4_4; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-// ---------------- Function Implementations ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-// -------- func adler32.hasher.get_quirk ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_adler32__hasher__get_quirk( +- const wuffs_adler32__hasher* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ // TODO. ++ break; + +- return 0u; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-// -------- func adler32.hasher.set_quirk ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_adler32__hasher__set_quirk( +- wuffs_adler32__hasher* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over; ++ } ++ return NULL; + +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ // TODO. ++ break; ++ } ++ return NULL; + } + +-// -------- func adler32.hasher.update ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul_4x16le( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_adler32__hasher__update( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +- if ( ! self->private_impl.f_started) { +- self->private_impl.f_started = true; +- self->private_impl.f_state = 1u; +- self->private_impl.choosy_up = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_adler32__hasher__up_arm_neon : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_adler32__hasher__up_x86_sse42 : +-#endif +- self->private_impl.choosy_up); +- } +- wuffs_adler32__hasher__up(self, a_x); +- return wuffs_base__make_empty_struct(); +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +-// -------- func adler32.hasher.update_u32 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_8_8; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_adler32__hasher__update_u32( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return 0; +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +- wuffs_adler32__hasher__update(self, a_x); +- return self->private_impl.f_state; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ // TODO. ++ break; + +-// -------- func adler32.hasher.up ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- return (*self->private_impl.choosy_up)(self, a_x); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src_over; ++ } ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src_over; ++ } ++ return NULL; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ // TODO. ++ break; ++ } ++ return NULL; + } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up__choosy_default( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s1 = 0; +- uint32_t v_s2 = 0; +- wuffs_base__slice_u8 v_remaining = {0}; +- wuffs_base__slice_u8 v_p = {0}; +- +- v_s1 = ((self->private_impl.f_state) & 0xFFFFu); +- v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); +- while (((uint64_t)(a_x.len)) > 0u) { +- v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); +- if (((uint64_t)(a_x.len)) > 5552u) { +- v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5552u); +- a_x = wuffs_base__slice_u8__subslice_j(a_x, 5552u); +- } +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8); +- while (v_p.ptr < i_end0_p) { +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- } +- v_p.len = 1; +- uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end1_p) { +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgra_premul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src_over; + } +- v_p.len = 0; +- } +- v_s1 %= 65521u; +- v_s2 %= 65521u; +- a_x = v_remaining; +- } +- self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func adler32.hasher.checksum_u32 +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_adler32__hasher__checksum_u32( +- const wuffs_adler32__hasher* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return self->private_impl.f_state; +-} +- +-// ‼ WUFFS MULTI-FILE SECTION +arm_neon +-// -------- func adler32.hasher.up_arm_neon ++ return NULL; + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up_arm_neon( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s1 = 0; +- uint32_t v_s2 = 0; +- wuffs_base__slice_u8 v_remaining = {0}; +- wuffs_base__slice_u8 v_p = {0}; +- uint8x16_t v_p__left = {0}; +- uint8x16_t v_p_right = {0}; +- uint32x4_t v_v1 = {0}; +- uint32x4_t v_v2 = {0}; +- uint16x8_t v_col0 = {0}; +- uint16x8_t v_col1 = {0}; +- uint16x8_t v_col2 = {0}; +- uint16x8_t v_col3 = {0}; +- uint32x2_t v_sum1 = {0}; +- uint32x2_t v_sum2 = {0}; +- uint32x2_t v_sum12 = {0}; +- uint32_t v_num_iterate_bytes = 0; +- uint64_t v_tail_index = 0; ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__bgra_premul__src_over; ++ } ++ return NULL; + +- v_s1 = ((self->private_impl.f_state) & 0xFFFFu); +- v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); +- while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { +- v_s1 += ((uint32_t)(a_x.ptr[0u])); +- v_s2 += v_s1; +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); +- } +- v_s1 %= 65521u; +- v_s2 %= 65521u; +- while (((uint64_t)(a_x.len)) > 0u) { +- v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); +- if (((uint64_t)(a_x.len)) > 5536u) { +- v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u); +- a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u); +- } +- v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u))); +- v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes)); +- v_v1 = vdupq_n_u32(0u); +- v_v2 = vdupq_n_u32(0u); +- v_col0 = vdupq_n_u16(0u); +- v_col1 = vdupq_n_u16(0u); +- v_col2 = vdupq_n_u16(0u); +- v_col3 = vdupq_n_u16(0u); +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 32; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32); +- while (v_p.ptr < i_end0_p) { +- v_p__left = vld1q_u8(v_p.ptr); +- v_p_right = vld1q_u8(v_p.ptr + 16u); +- v_v2 = vaddq_u32(v_v2, v_v1); +- v_v1 = vpadalq_u16(v_v1, vpadalq_u8(vpaddlq_u8(v_p__left), v_p_right)); +- v_col0 = vaddw_u8(v_col0, vget_low_u8(v_p__left)); +- v_col1 = vaddw_u8(v_col1, vget_high_u8(v_p__left)); +- v_col2 = vaddw_u8(v_col2, vget_low_u8(v_p_right)); +- v_col3 = vaddw_u8(v_col3, vget_high_u8(v_p_right)); +- v_p.ptr += 32; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over; + } +- v_p.len = 0; +- } +- v_v2 = vshlq_n_u32(v_v2, 5u); +- v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col0), ((uint16x4_t){32u, 31u, 30u, 29u})); +- v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col0), ((uint16x4_t){28u, 27u, 26u, 25u})); +- v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col1), ((uint16x4_t){24u, 23u, 22u, 21u})); +- v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col1), ((uint16x4_t){20u, 19u, 18u, 17u})); +- v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col2), ((uint16x4_t){16u, 15u, 14u, 13u})); +- v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col2), ((uint16x4_t){12u, 11u, 10u, 9u})); +- v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col3), ((uint16x4_t){8u, 7u, 6u, 5u})); +- v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col3), ((uint16x4_t){4u, 3u, 2u, 1u})); +- v_sum1 = vpadd_u32(vget_low_u32(v_v1), vget_high_u32(v_v1)); +- v_sum2 = vpadd_u32(vget_low_u32(v_v2), vget_high_u32(v_v2)); +- v_sum12 = vpadd_u32(v_sum1, v_sum2); +- v_s1 += vget_lane_u32(v_sum12, 0u); +- v_s2 += vget_lane_u32(v_sum12, 1u); +- v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u); +- if (v_tail_index < ((uint64_t)(a_x.len))) { +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- } +- v_p.len = 0; ++ return NULL; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src_over; + } +- } +- v_s1 %= 65521u; +- v_s2 %= 65521u; +- a_x = v_remaining; +- } +- self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-// ‼ WUFFS MULTI-FILE SECTION -arm_neon ++ return NULL; + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func adler32.hasher.up_x86_sse42 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_4_4; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over; ++ } ++ return NULL; + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up_x86_sse42( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s1 = 0; +- uint32_t v_s2 = 0; +- wuffs_base__slice_u8 v_remaining = {0}; +- wuffs_base__slice_u8 v_p = {0}; +- __m128i v_zeroes = {0}; +- __m128i v_ones = {0}; +- __m128i v_weights__left = {0}; +- __m128i v_weights_right = {0}; +- __m128i v_q__left = {0}; +- __m128i v_q_right = {0}; +- __m128i v_v1 = {0}; +- __m128i v_v2 = {0}; +- __m128i v_v2j = {0}; +- __m128i v_v2k = {0}; +- uint32_t v_num_iterate_bytes = 0; +- uint64_t v_tail_index = 0; ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__rgba_premul__src_over; ++ } ++ return NULL; + +- v_zeroes = _mm_set1_epi16((int16_t)(0u)); +- v_ones = _mm_set1_epi16((int16_t)(1u)); +- v_weights__left = _mm_set_epi8((int8_t)(17u), (int8_t)(18u), (int8_t)(19u), (int8_t)(20u), (int8_t)(21u), (int8_t)(22u), (int8_t)(23u), (int8_t)(24u), (int8_t)(25u), (int8_t)(26u), (int8_t)(27u), (int8_t)(28u), (int8_t)(29u), (int8_t)(30u), (int8_t)(31u), (int8_t)(32u)); +- v_weights_right = _mm_set_epi8((int8_t)(1u), (int8_t)(2u), (int8_t)(3u), (int8_t)(4u), (int8_t)(5u), (int8_t)(6u), (int8_t)(7u), (int8_t)(8u), (int8_t)(9u), (int8_t)(10u), (int8_t)(11u), (int8_t)(12u), (int8_t)(13u), (int8_t)(14u), (int8_t)(15u), (int8_t)(16u)); +- v_s1 = ((self->private_impl.f_state) & 0xFFFFu); +- v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); +- while (((uint64_t)(a_x.len)) > 0u) { +- v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); +- if (((uint64_t)(a_x.len)) > 5536u) { +- v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u); +- a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u); +- } +- v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u))); +- v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes)); +- v_v1 = _mm_setzero_si128(); +- v_v2j = _mm_setzero_si128(); +- v_v2k = _mm_setzero_si128(); +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 32; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32); +- while (v_p.ptr < i_end0_p) { +- v_q__left = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr)); +- v_q_right = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u)); +- v_v2j = _mm_add_epi32(v_v2j, v_v1); +- v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q__left, v_zeroes)); +- v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q_right, v_zeroes)); +- v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q__left, v_weights__left))); +- v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q_right, v_weights_right))); +- v_p.ptr += 32; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over; + } +- v_p.len = 0; +- } +- v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(177u))); +- v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(78u))); +- v_s1 += ((uint32_t)(_mm_cvtsi128_si32(v_v1))); +- v_v2 = _mm_add_epi32(v_v2k, _mm_slli_epi32(v_v2j, (int32_t)(5u))); +- v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(177u))); +- v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(78u))); +- v_s2 += ((uint32_t)(_mm_cvtsi128_si32(v_v2))); +- v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u); +- if (v_tail_index < ((uint64_t)(a_x.len))) { +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- } +- v_p.len = 0; ++ return NULL; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over; + } +- } +- v_s1 %= 65521u; +- v_s2 %= 65521u; +- a_x = v_remaining; ++ return NULL; + } +- self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); +- return wuffs_base__make_empty_struct(); ++ return NULL; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgrx( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ return wuffs_private_impl__swizzle_y__bgrx; + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_bgr_565__bgrx; + +-// ---------------- Status Codes Implementations ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ return wuffs_private_impl__swizzle_xxx__xxxx; + +-const char wuffs_bmp__error__bad_header[] = "#bmp: bad header"; +-const char wuffs_bmp__error__bad_rle_compression[] = "#bmp: bad RLE compression"; +-const char wuffs_bmp__error__truncated_input[] = "#bmp: truncated input"; +-const char wuffs_bmp__error__unsupported_bmp_file[] = "#bmp: unsupported BMP file"; +-const char wuffs_bmp__note__internal_note_short_read[] = "@bmp: internal note: short read"; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ return wuffs_private_impl__swizzle_bgrw__bgrx; + +-// ---------------- Private Consts ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_bgrw_4x16le__bgrx; + +-#define WUFFS_BMP__COMPRESSION_NONE 0 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ return wuffs_private_impl__swizzle_copy_4_4; + +-#define WUFFS_BMP__COMPRESSION_RLE8 1 ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_bgr__rgbx; + +-#define WUFFS_BMP__COMPRESSION_RLE4 2 ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ return wuffs_private_impl__swizzle_bgrw__rgbx; ++ } ++ return NULL; ++} + +-#define WUFFS_BMP__COMPRESSION_BITFIELDS 3 ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__rgb( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_bgr_565__rgb; + +-#define WUFFS_BMP__COMPRESSION_JPEG 4 ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ return wuffs_private_impl__swizzle_swap_rgb_bgr; + +-#define WUFFS_BMP__COMPRESSION_PNG 5 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_bgrw__rgb; + +-#define WUFFS_BMP__COMPRESSION_ALPHABITFIELDS 6 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_bgrw_4x16le__rgb; + +-#define WUFFS_BMP__COMPRESSION_LOW_BIT_DEPTH 256 ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_copy_3_3; + +-#define WUFFS_BMP__RLE_STATE_NEUTRAL 0 ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_bgrw__bgr; ++ } ++ return NULL; ++} + +-#define WUFFS_BMP__RLE_STATE_RUN 1 ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__rgba_nonpremul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-#define WUFFS_BMP__RLE_STATE_ESCAPE 2 ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-#define WUFFS_BMP__RLE_STATE_LITERAL 3 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-#define WUFFS_BMP__RLE_STATE_DELTA_X 4 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-#define WUFFS_BMP__RLE_STATE_DELTA_Y 5 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-// ---------------- Private Initializer Prototypes ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ // TODO. ++ break; + +-// ---------------- Private Function Prototypes ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_image_config( +- wuffs_bmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_4_4; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_frame_config( +- wuffs_bmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_frame( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ // TODO. ++ break; ++ } ++ return NULL; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_none( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__rgba_premul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__rgba_premul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_rle( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__rgba_premul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_bitfields( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_low_bit_depth( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_tell_me_more( +- wuffs_bmp__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__read_palette( +- wuffs_bmp__decoder* self, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__process_masks( +- wuffs_bmp__decoder* self); ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__bgra_premul__src_over; ++ } ++ return NULL; + +-// ---------------- VTables ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over; ++ } ++ return NULL; + +-const wuffs_base__image_decoder__func_ptrs +-wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_bmp__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_bmp__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_bmp__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_bmp__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_bmp__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_bmp__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_bmp__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_bmp__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_bmp__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bmp__decoder__workbuf_len), +-}; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_4_4; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over; ++ } ++ return NULL; ++ } ++ return NULL; ++} + +-// ---------------- Initializer Implementations ++// -------- + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_bmp__decoder__initialize( +- wuffs_bmp__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status // ++wuffs_base__pixel_swizzler__prepare(wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__pixel_format src_pixfmt, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ if (!p) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++ p->private_impl.func = NULL; ++ p->private_impl.transparent_black_func = NULL; ++ p->private_impl.dst_pixfmt_bytes_per_pixel = 0; ++ p->private_impl.src_pixfmt_bytes_per_pixel = 0; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++ // ---- ++ ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST) ++ switch (dst_pixfmt.repr) { ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR_565) ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ break; + #endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR) ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ break; + #endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL_4X16LE) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_PREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGB) ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_NONPREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_PREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ break; ++#endif ++ default: ++ return wuffs_base__make_status( ++ wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist); + } ++#endif // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST) + +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); +-} ++ // ---- + +-wuffs_bmp__decoder* +-wuffs_bmp__decoder__alloc(void) { +- wuffs_bmp__decoder* x = +- (wuffs_bmp__decoder*)(calloc(sizeof(wuffs_bmp__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_bmp__decoder__initialize( +- x, sizeof(wuffs_bmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ wuffs_base__pixel_swizzler__func func = NULL; ++ wuffs_base__pixel_swizzler__transparent_black_func transparent_black_func = ++ NULL; ++ ++ uint32_t dst_pixfmt_bits_per_pixel = ++ wuffs_base__pixel_format__bits_per_pixel(&dst_pixfmt); ++ if ((dst_pixfmt_bits_per_pixel == 0) || ++ ((dst_pixfmt_bits_per_pixel & 7) != 0)) { ++ return wuffs_base__make_status( ++ wuffs_base__error__unsupported_pixel_swizzler_option); + } +- return x; +-} + +-size_t +-sizeof__wuffs_bmp__decoder(void) { +- return sizeof(wuffs_bmp__decoder); +-} ++ uint32_t src_pixfmt_bits_per_pixel = ++ wuffs_base__pixel_format__bits_per_pixel(&src_pixfmt); ++ if ((src_pixfmt_bits_per_pixel == 0) || ++ ((src_pixfmt_bits_per_pixel & 7) != 0)) { ++ return wuffs_base__make_status( ++ wuffs_base__error__unsupported_pixel_swizzler_option); ++ } + +-// ---------------- Function Implementations ++ // TODO: support many more formats. + +-// -------- func bmp.decoder.get_quirk ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ transparent_black_func = ++ wuffs_private_impl__swizzle_transparent_black_src; ++ break; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bmp__decoder__get_quirk( +- const wuffs_bmp__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ transparent_black_func = ++ wuffs_private_impl__swizzle_transparent_black_src_over; ++ break; + } + +- return 0u; +-} ++ switch (src_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ func = wuffs_private_impl__pixel_swizzler__prepare__y( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; + +-// -------- func bmp.decoder.set_quirk ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: ++ func = wuffs_private_impl__pixel_swizzler__prepare__y_16be( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__set_quirk( +- wuffs_bmp__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: ++ func = wuffs_private_impl__pixel_swizzler__prepare__ya_nonpremul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ func = ++ wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_nonpremul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: ++ func = wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_binary( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgr_565( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgr( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul_4x16le( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgra_premul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgrx( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ func = wuffs_private_impl__pixel_swizzler__prepare__rgb( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ func = wuffs_private_impl__pixel_swizzler__prepare__rgba_nonpremul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ func = wuffs_private_impl__pixel_swizzler__prepare__rgba_premul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; + } + +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ p->private_impl.func = func; ++ p->private_impl.transparent_black_func = transparent_black_func; ++ p->private_impl.dst_pixfmt_bytes_per_pixel = dst_pixfmt_bits_per_pixel / 8; ++ p->private_impl.src_pixfmt_bytes_per_pixel = src_pixfmt_bits_per_pixel / 8; ++ return wuffs_base__make_status( ++ func ? NULL : wuffs_base__error__unsupported_pixel_swizzler_option); + } + +-// -------- func bmp.decoder.decode_image_config +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__decode_image_config( +- wuffs_bmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( ++ const wuffs_base__pixel_swizzler* p, ++ uint32_t up_to_num_pixels, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r) { ++ if (p && p->private_impl.func) { ++ const uint8_t* iop_r = *ptr_iop_r; ++ uint64_t src_len = wuffs_base__u64__min( ++ ((uint64_t)up_to_num_pixels) * ++ ((uint64_t)p->private_impl.src_pixfmt_bytes_per_pixel), ++ ((uint64_t)(io2_r - iop_r))); ++ uint64_t n = ++ (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, ++ dst_palette.len, iop_r, (size_t)src_len); ++ *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel; ++ return n; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ return 0; ++} ++ ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r) { ++ if (p && p->private_impl.func) { ++ const uint8_t* iop_r = *ptr_iop_r; ++ uint64_t src_len = ((uint64_t)(io2_r - iop_r)); ++ uint64_t n = ++ (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, ++ dst_palette.len, iop_r, (size_t)src_len); ++ *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel; ++ return n; + } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ return 0; ++} ++ ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src) { ++ if (p && p->private_impl.func) { ++ return (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, ++ dst_palette.len, src.ptr, src.len); + } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ return 0; ++} ++ ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ uint64_t num_pixels) { ++ if (p && p->private_impl.transparent_black_func) { ++ return (*p->private_impl.transparent_black_func)( ++ dst.ptr, dst.len, dst_palette.ptr, dst_palette.len, num_pixels, ++ p->private_impl.dst_pixfmt_bytes_per_pixel); + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ return 0; ++} + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++// -------- + +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2); + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2); + +- ok: +- self->private_impl.p_decode_image_config[0] = 0; +- goto exit; +- } ++#if defined(__GNUC__) && !defined(__clang__) ++// No-op. ++#else ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column, ++ bool last_column); ++#endif ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) + +- goto suspend; +- suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++// -------- + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; ++static inline uint32_t // ++wuffs_private_impl__u32__max_of_4(uint32_t a, ++ uint32_t b, ++ uint32_t c, ++ uint32_t d) { ++ return wuffs_base__u32__max( // ++ wuffs_base__u32__max(a, b), // ++ wuffs_base__u32__max(c, d)); + } + +-// -------- func bmp.decoder.do_decode_image_config ++static inline uint32_t // ++wuffs_private_impl__u32__min_of_5(uint32_t a, ++ uint32_t b, ++ uint32_t c, ++ uint32_t d, ++ uint32_t e) { ++ return wuffs_base__u32__min( // ++ wuffs_base__u32__min( // ++ wuffs_base__u32__min(a, b), // ++ wuffs_base__u32__min(c, d)), // ++ e); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_image_config( +- wuffs_bmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++// -------- + +- uint32_t v_magic = 0; +- uint32_t v_width = 0; +- uint32_t v_height = 0; +- uint32_t v_planes = 0; +- uint32_t v_dst_pixfmt = 0; +- uint32_t v_byte_width = 0; ++typedef void (*wuffs_private_impl__swizzle_ycc__convert_4_func)( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2, ++ const uint8_t* up3); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++static void // ++wuffs_private_impl__swizzle_cmyk__convert_4_general( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2, ++ const uint8_t* up3) { ++ for (; x < x_end; x++) { ++ // It's called CMYK but, but for Adobe CMYK JPEG images in practice, it's ++ // RGBW: 0xFFu means no ink instead of full ink. Note that a double ++ // inversion is a no-op, so inversions might be implicit in the code below. ++ uint32_t r = ((uint32_t)(*up0++)); ++ uint32_t g = ((uint32_t)(*up1++)); ++ uint32_t b = ((uint32_t)(*up2++)); ++ uint32_t w = ((uint32_t)(*up3++)); ++ r = ((r * w) + 0x7Fu) / 0xFFu; ++ g = ((g * w) + 0x7Fu) / 0xFFu; ++ b = ((b * w) + 0x7Fu) / 0xFFu; ++ wuffs_base__pixel_buffer__set_color_u32_at( ++ dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u)); + } ++} + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++static void // ++wuffs_private_impl__swizzle_ycck__convert_4_general( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2, ++ const uint8_t* up3) { ++ for (; x < x_end; x++) { ++ // We invert once again: 0xFFu means no ink instead of full ink. ++ uint32_t color = // ++ wuffs_base__color_ycc__as__color_u32( // ++ *up0++, *up1++, *up2++); ++ uint32_t r = 0xFFu - (0xFFu & (color >> 16u)); ++ uint32_t g = 0xFFu - (0xFFu & (color >> 8u)); ++ uint32_t b = 0xFFu - (0xFFu & (color >> 0u)); ++ uint32_t w = ((uint32_t)(*up3++)); ++ r = ((r * w) + 0x7Fu) / 0xFFu; ++ g = ((g * w) + 0x7Fu) / 0xFFu; ++ b = ((b * w) + 0x7Fu) / 0xFFu; ++ wuffs_base__pixel_buffer__set_color_u32_at( ++ dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u)); ++ } ++} + +- if ((self->private_impl.f_call_sequence != 0u) || (self->private_impl.f_io_redirect_fourcc == 1u)) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if (self->private_impl.f_io_redirect_fourcc != 0u) { +- status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); +- goto ok; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 8) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; +- } +- } +- v_magic = t_0; +- } +- if (v_magic != 19778u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } +- self->private_data.s_do_decode_image_config[0].scratch = 8u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++// -------- ++ ++typedef void (*wuffs_private_impl__swizzle_ycc__convert_3_func)( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2); ++ ++static void // ++wuffs_private_impl__swizzle_rgb__convert_3_general( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ for (; x < x_end; x++) { ++ uint32_t color = 0xFF000000u | // ++ (((uint32_t)(*up0++)) << 16u) | // ++ (((uint32_t)(*up1++)) << 8u) | // ++ (((uint32_t)(*up2++)) << 0u); ++ wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color); ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_general( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ for (; x < x_end; x++) { ++ uint32_t color = // ++ wuffs_base__color_ycc__as__color_u32( // ++ *up0++, *up1++, *up2++); ++ wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color); ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_bgrx(wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ size_t dst_stride = dst->private_impl.planes[0].stride; ++ uint8_t* dst_iter = dst->private_impl.planes[0].ptr + ++ (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); ++ ++ for (; x < x_end; x++) { ++ uint32_t color = // ++ wuffs_base__color_ycc__as__color_u32( // ++ *up0++, *up1++, *up2++); ++ wuffs_base__poke_u32le__no_bounds_check(dst_iter, color); ++ dst_iter += 4u; ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_rgbx(wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ size_t dst_stride = dst->private_impl.planes[0].stride; ++ uint8_t* dst_iter = dst->private_impl.planes[0].ptr + ++ (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); ++ ++ for (; x < x_end; x++) { ++ uint32_t color = // ++ wuffs_base__color_ycc__as__color_u32_abgr( // ++ *up0++, *up1++, *up2++); ++ wuffs_base__poke_u32le__no_bounds_check(dst_iter, color); ++ dst_iter += 4u; ++ } ++} ++ ++// -------- ++ ++// wuffs_private_impl__swizzle_ycc__upsample_func upsamples to a destination ++// slice at least 480 (YCCK) or 672 (YCC) bytes long and whose src_len ++// (multiplied by 1, 2, 3 or 4) is positive but no more than that. This 480 or ++// 672 length is just under 1/4 or 1/3 of the scratch_buffer_2k slice length. ++// Both (480 * 4) = 1920 and (672 * 3) = 2016 are less than 2048. ++// ++// 480 and 672 are nice round numbers because a JPEG MCU is 1, 2, 3 or 4 blocks ++// wide and each block is 8 pixels wide. We have: ++// 480 = 1 * 8 * 60, 672 = 1 * 8 * 84 ++// 480 = 2 * 8 * 30, 672 = 2 * 8 * 42 ++// 480 = 3 * 8 * 20, 672 = 3 * 8 * 28 ++// 480 = 4 * 8 * 15, 672 = 4 * 8 * 21 ++// ++// Box filters are equivalent to nearest neighbor upsampling. These ignore the ++// src_ptr_minor, h1v2_bias, first_column and last_column arguments. ++// ++// Triangle filters use a 3:1 ratio (in 1 dimension), or 9:3:3:1 (in 2 ++// dimensions), which is higher quality (less blocky) but also higher ++// computational effort. ++// ++// In theory, we could use triangle filters for any (inv_h, inv_v) combination. ++// In practice, matching libjpeg-turbo, we only implement it for the common ++// chroma subsampling ratios (YCC420, YCC422 or YCC440), corresponding to an ++// (inv_h, inv_v) pair of (2, 2), (2, 1) or (1, 2). ++typedef const uint8_t* (*wuffs_private_impl__swizzle_ycc__upsample_func)( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, // Nearest row. ++ const uint8_t* src_ptr_minor, // Adjacent row, alternating above or below. ++ size_t src_len, ++ uint32_t h1v2_bias, ++ bool first_column, ++ bool last_column); ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor_ignored, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column_ignored, ++ bool last_column_ignored) { ++ return src_ptr_major; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor_ignored, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column_ignored, ++ bool last_column_ignored) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp = src_ptr_major; ++ while (src_len--) { ++ uint8_t sv = *sp++; ++ *dp++ = sv; ++ *dp++ = sv; ++ } ++ return dst_ptr; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor_ignored, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column_ignored, ++ bool last_column_ignored) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp = src_ptr_major; ++ while (src_len--) { ++ uint8_t sv = *sp++; ++ *dp++ = sv; ++ *dp++ = sv; ++ *dp++ = sv; ++ } ++ return dst_ptr; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor_ignored, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column_ignored, ++ bool last_column_ignored) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp = src_ptr_major; ++ while (src_len--) { ++ uint8_t sv = *sp++; ++ *dp++ = sv; ++ *dp++ = sv; ++ *dp++ = sv; ++ *dp++ = sv; ++ } ++ return dst_ptr; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h1v2_triangle( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor, ++ size_t src_len, ++ uint32_t h1v2_bias, ++ bool first_column, ++ bool last_column) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp_major = src_ptr_major; ++ const uint8_t* sp_minor = src_ptr_minor; ++ while (src_len--) { ++ *dp++ = (uint8_t)(((3u * ((uint32_t)(*sp_major++))) + // ++ (1u * ((uint32_t)(*sp_minor++))) + // ++ h1v2_bias) >> ++ 2u); ++ } ++ return dst_ptr; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h2v1_triangle( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column, ++ bool last_column) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp = src_ptr_major; ++ ++ if (first_column) { ++ src_len--; ++ if ((src_len <= 0u) && last_column) { ++ uint8_t sv = *sp++; ++ *dp++ = sv; ++ *dp++ = sv; ++ return dst_ptr; + } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; +- } +- } +- self->private_impl.f_padding = t_1; ++ uint32_t svp1 = sp[+1]; ++ uint8_t sv = *sp++; ++ *dp++ = sv; ++ *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svp1 + 2u) >> 2u); ++ if (src_len <= 0u) { ++ return dst_ptr; + } +- if (self->private_impl.f_padding < 14u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; ++ } ++ ++ if (last_column) { ++ src_len--; ++ } ++ ++ for (; src_len > 0u; src_len--) { ++ uint32_t svm1 = sp[-1]; ++ uint32_t svp1 = sp[+1]; ++ uint32_t sv3 = 3u * (uint32_t)(*sp++); ++ *dp++ = (uint8_t)((sv3 + svm1 + 1u) >> 2u); ++ *dp++ = (uint8_t)((sv3 + svp1 + 2u) >> 2u); ++ } ++ ++ if (last_column) { ++ uint32_t svm1 = sp[-1]; ++ uint8_t sv = *sp++; ++ *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svm1 + 1u) >> 2u); ++ *dp++ = sv; ++ } ++ ++ return dst_ptr; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column, ++ bool last_column) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp_major = src_ptr_major; ++ const uint8_t* sp_minor = src_ptr_minor; ++ ++ if (first_column) { ++ src_len--; ++ if ((src_len <= 0u) && last_column) { ++ uint32_t sv = (12u * ((uint32_t)(*sp_major++))) + // ++ (4u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + 7u) >> 4u); ++ return dst_ptr; + } +- self->private_impl.f_padding -= 14u; +- self->private_impl.f_io_redirect_pos = wuffs_base__u64__sat_add(((uint64_t)(self->private_impl.f_padding)), wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; +- if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; +- } +- } +- self->private_impl.f_bitmap_info_len = t_2; ++ ++ uint32_t sv_major_m1 = sp_major[-0]; // Clamp offset to zero. ++ uint32_t sv_minor_m1 = sp_minor[-0]; // Clamp offset to zero. ++ uint32_t sv_major_p1 = sp_major[+1]; ++ uint32_t sv_minor_p1 = sp_minor[+1]; ++ ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ if (src_len <= 0u) { ++ return dst_ptr; + } +- if (self->private_impl.f_padding < self->private_impl.f_bitmap_info_len) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; ++ } ++ ++ if (last_column) { ++ src_len--; ++ } ++ ++ for (; src_len > 0u; src_len--) { ++ uint32_t sv_major_m1 = sp_major[-1]; ++ uint32_t sv_minor_m1 = sp_minor[-1]; ++ uint32_t sv_major_p1 = sp_major[+1]; ++ uint32_t sv_minor_p1 = sp_minor[+1]; ++ ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ } ++ ++ if (last_column) { ++ uint32_t sv_major_m1 = sp_major[-1]; ++ uint32_t sv_minor_m1 = sp_minor[-1]; ++ uint32_t sv_major_p1 = sp_major[+0]; // Clamp offset to zero. ++ uint32_t sv_minor_p1 = sp_minor[+0]; // Clamp offset to zero. ++ ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ } ++ ++ return dst_ptr; ++} ++ ++// wuffs_private_impl__swizzle_ycc__upsample_funcs is indexed by inv_h and then ++// inv_v. ++static const wuffs_private_impl__swizzle_ycc__upsample_func ++ wuffs_private_impl__swizzle_ycc__upsample_funcs[4][4] = { ++ { ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box, ++ }, ++ { ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box, ++ }, ++ { ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box, ++ }, ++ { ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box, ++ }, ++}; ++ ++static inline uint32_t // ++wuffs_private_impl__swizzle_has_triangle_upsampler(uint32_t inv_h, ++ uint32_t inv_v) { ++ if (inv_h == 1u) { ++ return inv_v == 2u; ++ } else if (inv_h == 2u) { ++ return (inv_v == 1u) || (inv_v == 2u); ++ } ++ return false; ++} ++ ++// -------- ++ ++// All of the wuffs_private_impl__swizzle_ycc__etc functions have ++// preconditions. See all of the checks made in ++// wuffs_base__pixel_swizzler__swizzle_ycck before calling these functions. For ++// example, (width > 0) is a precondition, but there are many more. ++ ++static void // ++wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t width, ++ uint32_t y, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ const uint8_t* src_ptr3, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t stride3, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_h3, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t inv_v3, ++ uint32_t half_width_for_2to1, ++ uint32_t h1v2_bias, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc3, ++ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) { ++ const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0); ++ const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1); ++ const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2); ++ const uint8_t* src3 = src_ptr3 + ((y / inv_v3) * (size_t)stride3); ++ uint32_t total_src_len0 = 0u; ++ uint32_t total_src_len1 = 0u; ++ uint32_t total_src_len2 = 0u; ++ uint32_t total_src_len3 = 0u; ++ ++ uint32_t x = 0u; ++ while (x < width) { ++ bool first_column = x == 0u; ++ uint32_t end = x + 480u; ++ if (end > width) { ++ end = width; + } +- self->private_impl.f_padding -= self->private_impl.f_bitmap_info_len; +- if (self->private_impl.f_bitmap_info_len == 12u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; +- if (num_bits_3 == 8) { +- t_3 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)) << 56; +- } +- } +- self->private_impl.f_width = t_3; ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3; ++ total_src_len0 += src_len0; ++ total_src_len1 += src_len1; ++ total_src_len2 += src_len2; ++ total_src_len3 += src_len3; ++ ++ const uint8_t* src_ptr_x0 = src0 + (x / inv_h0); ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 480u), // ++ src_ptr_x0, // ++ src_ptr_x0, // ++ src_len0, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len0 >= half_width_for_2to1)); ++ ++ const uint8_t* src_ptr_x1 = src1 + (x / inv_h1); ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 480u), // ++ src_ptr_x1, // ++ src_ptr_x1, // ++ src_len1, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len1 >= half_width_for_2to1)); ++ ++ const uint8_t* src_ptr_x2 = src2 + (x / inv_h2); ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 480u), // ++ src_ptr_x2, // ++ src_ptr_x2, // ++ src_len2, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len2 >= half_width_for_2to1)); ++ ++ const uint8_t* src_ptr_x3 = src3 + (x / inv_h3); ++ const uint8_t* up3 = (*upfunc3)( // ++ scratch_buffer_2k_ptr + (3u * 480u), // ++ src_ptr_x3, // ++ src_ptr_x3, // ++ src_len3, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len3 >= half_width_for_2to1)); ++ ++ (*conv4func)(dst, x, end, y, up0, up1, up2, up3); ++ x = end; ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycck__general__triangle_filter( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ const uint8_t* src_ptr3, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t stride3, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_h3, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t inv_v3, ++ uint32_t half_width_for_2to1, ++ uint32_t half_height_for_2to1, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) { ++ if ((x_min_incl != 0) || (y_min_incl != 0)) { ++ return; ++ } ++ ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 = ++ (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 = ++ (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 = ++ (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc3 = ++ (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u]; ++ ++ // First row. ++ uint32_t h1v2_bias = 1u; ++ wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row( ++ dst, x_max_excl, 0u, // ++ src_ptr0, src_ptr1, src_ptr2, src_ptr3, // ++ stride0, stride1, stride2, stride3, // ++ inv_h0, inv_h1, inv_h2, inv_h3, // ++ inv_v0, inv_v1, inv_v2, inv_v3, // ++ half_width_for_2to1, // ++ h1v2_bias, // ++ scratch_buffer_2k_ptr, // ++ upfunc0, upfunc1, upfunc2, upfunc3, conv4func); ++ h1v2_bias = 2u; ++ ++ // Middle rows. ++ bool last_row = y_max_excl == 2u * half_height_for_2to1; ++ uint32_t middle_y_max_excl = last_row ? (y_max_excl - 1u) : y_max_excl; ++ uint32_t y; ++ for (y = 1u; y < middle_y_max_excl; y++) { ++ const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0); ++ const uint8_t* src0_minor = ++ (inv_v0 != 2u) ++ ? src0_major ++ : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0)); ++ const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1); ++ const uint8_t* src1_minor = ++ (inv_v1 != 2u) ++ ? src1_major ++ : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1)); ++ const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2); ++ const uint8_t* src2_minor = ++ (inv_v2 != 2u) ++ ? src2_major ++ : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2)); ++ const uint8_t* src3_major = src_ptr3 + ((y / inv_v3) * (size_t)stride3); ++ const uint8_t* src3_minor = ++ (inv_v3 != 2u) ++ ? src3_major ++ : ((y & 1u) ? (src3_major + stride3) : (src3_major - stride3)); ++ uint32_t total_src_len0 = 0u; ++ uint32_t total_src_len1 = 0u; ++ uint32_t total_src_len2 = 0u; ++ uint32_t total_src_len3 = 0u; ++ ++ uint32_t x = 0u; ++ while (x < x_max_excl) { ++ bool first_column = x == 0u; ++ uint32_t end = x + 480u; ++ if (end > x_max_excl) { ++ end = x_max_excl; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 8) { +- t_4 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; +- } +- } +- self->private_impl.f_height = t_4; ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3; ++ total_src_len0 += src_len0; ++ total_src_len1 += src_len1; ++ total_src_len2 += src_len2; ++ total_src_len3 += src_len3; ++ ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 480u), // ++ src0_major + (x / inv_h0), // ++ src0_minor + (x / inv_h0), // ++ src_len0, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len0 >= half_width_for_2to1)); ++ ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 480u), // ++ src1_major + (x / inv_h1), // ++ src1_minor + (x / inv_h1), // ++ src_len1, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len1 >= half_width_for_2to1)); ++ ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 480u), // ++ src2_major + (x / inv_h2), // ++ src2_minor + (x / inv_h2), // ++ src_len2, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len2 >= half_width_for_2to1)); ++ ++ const uint8_t* up3 = (*upfunc3)( // ++ scratch_buffer_2k_ptr + (3u * 480u), // ++ src3_major + (x / inv_h3), // ++ src3_minor + (x / inv_h3), // ++ src_len3, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len3 >= half_width_for_2to1)); ++ ++ (*conv4func)(dst, x, end, y, up0, up1, up2, up3); ++ x = end; ++ } ++ ++ h1v2_bias ^= 3u; ++ } ++ ++ // Last row. ++ if (middle_y_max_excl != y_max_excl) { ++ wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row( ++ dst, x_max_excl, middle_y_max_excl, // ++ src_ptr0, src_ptr1, src_ptr2, src_ptr3, // ++ stride0, stride1, stride2, stride3, // ++ inv_h0, inv_h1, inv_h2, inv_h3, // ++ inv_v0, inv_v1, inv_v2, inv_v3, // ++ half_width_for_2to1, // ++ h1v2_bias, // ++ scratch_buffer_2k_ptr, // ++ upfunc0, upfunc1, upfunc2, upfunc3, conv4func); ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t width, ++ uint32_t y, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t half_width_for_2to1, ++ uint32_t h1v2_bias, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2, ++ wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) { ++ const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0); ++ const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1); ++ const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2); ++ uint32_t total_src_len0 = 0u; ++ uint32_t total_src_len1 = 0u; ++ uint32_t total_src_len2 = 0u; ++ ++ uint32_t x = 0u; ++ while (x < width) { ++ bool first_column = x == 0u; ++ uint32_t end = x + 672u; ++ if (end > width) { ++ end = width; ++ } ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ total_src_len0 += src_len0; ++ total_src_len1 += src_len1; ++ total_src_len2 += src_len2; ++ ++ const uint8_t* src_ptr_x0 = src0 + (x / inv_h0); ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 672u), // ++ src_ptr_x0, // ++ src_ptr_x0, // ++ src_len0, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len0 >= half_width_for_2to1)); ++ ++ const uint8_t* src_ptr_x1 = src1 + (x / inv_h1); ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 672u), // ++ src_ptr_x1, // ++ src_ptr_x1, // ++ src_len1, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len1 >= half_width_for_2to1)); ++ ++ const uint8_t* src_ptr_x2 = src2 + (x / inv_h2); ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 672u), // ++ src_ptr_x2, // ++ src_ptr_x2, // ++ src_len2, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len2 >= half_width_for_2to1)); ++ ++ (*conv3func)(dst, x, end, y, up0, up1, up2); ++ x = end; ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__general__triangle_filter( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t half_width_for_2to1, ++ uint32_t half_height_for_2to1, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) { ++ if ((x_min_incl != 0) || (y_min_incl != 0)) { ++ return; ++ } ++ ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 = ++ (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 = ++ (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 = ++ (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; ++ ++ // First row. ++ uint32_t h1v2_bias = 1u; ++ wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row( ++ dst, x_max_excl, 0u, // ++ src_ptr0, src_ptr1, src_ptr2, // ++ stride0, stride1, stride2, // ++ inv_h0, inv_h1, inv_h2, // ++ inv_v0, inv_v1, inv_v2, // ++ half_width_for_2to1, // ++ h1v2_bias, // ++ scratch_buffer_2k_ptr, // ++ upfunc0, upfunc1, upfunc2, conv3func); ++ h1v2_bias = 2u; ++ ++ // Middle rows. ++ bool last_row = y_max_excl == 2u * half_height_for_2to1; ++ uint32_t middle_y_max_excl = last_row ? (y_max_excl - 1u) : y_max_excl; ++ uint32_t y; ++ for (y = 1u; y < middle_y_max_excl; y++) { ++ const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0); ++ const uint8_t* src0_minor = ++ (inv_v0 != 2u) ++ ? src0_major ++ : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0)); ++ const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1); ++ const uint8_t* src1_minor = ++ (inv_v1 != 2u) ++ ? src1_major ++ : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1)); ++ const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2); ++ const uint8_t* src2_minor = ++ (inv_v2 != 2u) ++ ? src2_major ++ : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2)); ++ uint32_t total_src_len0 = 0u; ++ uint32_t total_src_len1 = 0u; ++ uint32_t total_src_len2 = 0u; ++ ++ uint32_t x = 0u; ++ while (x < x_max_excl) { ++ bool first_column = x == 0u; ++ uint32_t end = x + 672u; ++ if (end > x_max_excl) { ++ end = x_max_excl; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- uint32_t t_5; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_5 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5; +- if (num_bits_5 == 8) { +- t_5 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_5 += 8u; +- *scratch |= ((uint64_t)(num_bits_5)) << 56; +- } +- } +- v_planes = t_5; ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ total_src_len0 += src_len0; ++ total_src_len1 += src_len1; ++ total_src_len2 += src_len2; ++ ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 672u), // ++ src0_major + (x / inv_h0), // ++ src0_minor + (x / inv_h0), // ++ src_len0, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len0 >= half_width_for_2to1)); ++ ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 672u), // ++ src1_major + (x / inv_h1), // ++ src1_minor + (x / inv_h1), // ++ src_len1, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len1 >= half_width_for_2to1)); ++ ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 672u), // ++ src2_major + (x / inv_h2), // ++ src2_minor + (x / inv_h2), // ++ src_len2, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len2 >= half_width_for_2to1)); ++ ++ (*conv3func)(dst, x, end, y, up0, up1, up2); ++ x = end; ++ } ++ ++ h1v2_bias ^= 3u; ++ } ++ ++ // Last row. ++ if (middle_y_max_excl != y_max_excl) { ++ wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row( ++ dst, x_max_excl, middle_y_max_excl, // ++ src_ptr0, src_ptr1, src_ptr2, // ++ stride0, stride1, stride2, // ++ inv_h0, inv_h1, inv_h2, // ++ inv_v0, inv_v1, inv_v2, // ++ half_width_for_2to1, // ++ h1v2_bias, // ++ scratch_buffer_2k_ptr, // ++ upfunc0, upfunc1, upfunc2, conv3func); ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__general__box_filter( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t half_width_for_2to1, ++ uint32_t half_height_for_2to1, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) { ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 = ++ (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 = ++ (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 = ++ (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; ++ ++ uint32_t y; ++ for (y = y_min_incl; y < y_max_excl; y++) { ++ const uint8_t* src0_major = ++ src_ptr0 + (((y - y_min_incl) / inv_v0) * (size_t)stride0); ++ const uint8_t* src1_major = ++ src_ptr1 + (((y - y_min_incl) / inv_v1) * (size_t)stride1); ++ const uint8_t* src2_major = ++ src_ptr2 + (((y - y_min_incl) / inv_v2) * (size_t)stride2); ++ ++ uint32_t x = x_min_incl; ++ while (x < x_max_excl) { ++ uint32_t end = x + 672u; ++ if (end > x_max_excl) { ++ end = x_max_excl; + } +- if (v_planes != 1u) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 672u), // ++ src0_major + ((x - x_min_incl) / inv_h0), // ++ src0_major + ((x - x_min_incl) / inv_h0), // ++ src_len0, // ++ 0u, false, false); ++ ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 672u), // ++ src1_major + ((x - x_min_incl) / inv_h1), // ++ src1_major + ((x - x_min_incl) / inv_h1), // ++ src_len1, // ++ 0u, false, false); ++ ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 672u), // ++ src2_major + ((x - x_min_incl) / inv_h2), // ++ src2_major + ((x - x_min_incl) / inv_h2), // ++ src_len2, // ++ 0u, false, false); ++ ++ (*conv3func)(dst, x, end, y, up0, up1, up2); ++ x = end; ++ } ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycck__general__box_filter( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ const uint8_t* src_ptr3, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t stride3, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_h3, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t inv_v3, ++ uint32_t half_width_for_2to1, ++ uint32_t half_height_for_2to1, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) { ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 = ++ (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 = ++ (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 = ++ (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc3 = ++ (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u]; ++ ++ uint32_t y; ++ for (y = y_min_incl; y < y_max_excl; y++) { ++ const uint8_t* src0_major = ++ src_ptr0 + (((y - y_min_incl) / inv_v0) * (size_t)stride0); ++ const uint8_t* src1_major = ++ src_ptr1 + (((y - y_min_incl) / inv_v1) * (size_t)stride1); ++ const uint8_t* src2_major = ++ src_ptr2 + (((y - y_min_incl) / inv_v2) * (size_t)stride2); ++ const uint8_t* src3_major = ++ src_ptr3 + (((y - y_min_incl) / inv_v3) * (size_t)stride3); ++ ++ uint32_t x = x_min_incl; ++ while (x < x_max_excl) { ++ uint32_t end = x + 480u; ++ if (end > x_max_excl) { ++ end = x_max_excl; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); +- uint32_t t_6; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6; +- if (num_bits_6 == 8) { +- t_6 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_6 += 8u; +- *scratch |= ((uint64_t)(num_bits_6)) << 56; +- } +- } +- self->private_impl.f_bits_per_pixel = t_6; +- } +- } else if (self->private_impl.f_bitmap_info_len == 16u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- uint32_t t_7; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; +- if (num_bits_7 == 24) { +- t_7 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_7 += 8u; +- *scratch |= ((uint64_t)(num_bits_7)) << 56; +- } +- } +- v_width = t_7; +- } +- if (v_width > 2147483647u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } else if (v_width > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_width = v_width; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); +- uint32_t t_8; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; +- if (num_bits_8 == 24) { +- t_8 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_8 += 8u; +- *scratch |= ((uint64_t)(num_bits_8)) << 56; +- } +- } +- v_height = t_8; +- } +- if (v_height > 2147483647u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } else if (v_height > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_height = v_height; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); +- uint32_t t_9; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_9 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9; +- if (num_bits_9 == 8) { +- t_9 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_9 += 8u; +- *scratch |= ((uint64_t)(num_bits_9)) << 56; +- } +- } +- v_planes = t_9; +- } +- if (v_planes != 1u) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); +- uint32_t t_10; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_10 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10; +- if (num_bits_10 == 8) { +- t_10 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_10 += 8u; +- *scratch |= ((uint64_t)(num_bits_10)) << 56; +- } +- } +- self->private_impl.f_bits_per_pixel = t_10; +- } +- } else { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); +- uint32_t t_11; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(25); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11; +- if (num_bits_11 == 24) { +- t_11 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_11 += 8u; +- *scratch |= ((uint64_t)(num_bits_11)) << 56; +- } +- } +- v_width = t_11; +- } +- if (v_width > 2147483647u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } else if (v_width > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_width = v_width; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26); +- uint32_t t_12; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_12 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12; +- if (num_bits_12 == 24) { +- t_12 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_12 += 8u; +- *scratch |= ((uint64_t)(num_bits_12)) << 56; +- } +- } +- v_height = t_12; +- } +- if (v_height == 2147483648u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } else if (v_height > 2147483648u) { +- v_height = ((uint32_t)(0u - v_height)); +- if (v_height > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_height = v_height; +- self->private_impl.f_top_down = true; +- } else if (v_height > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } else { +- self->private_impl.f_height = v_height; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28); +- uint32_t t_13; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_13 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_13 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_13; +- if (num_bits_13 == 8) { +- t_13 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_13 += 8u; +- *scratch |= ((uint64_t)(num_bits_13)) << 56; +- } ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3; ++ ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 480u), // ++ src0_major + ((x - x_min_incl) / inv_h0), // ++ src0_major + ((x - x_min_incl) / inv_h0), // ++ src_len0, // ++ 0u, false, false); ++ ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 480u), // ++ src1_major + ((x - x_min_incl) / inv_h1), // ++ src1_major + ((x - x_min_incl) / inv_h1), // ++ src_len1, // ++ 0u, false, false); ++ ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 480u), // ++ src2_major + ((x - x_min_incl) / inv_h2), // ++ src2_major + ((x - x_min_incl) / inv_h2), // ++ src_len2, // ++ 0u, false, false); ++ ++ const uint8_t* up3 = (*upfunc3)( // ++ scratch_buffer_2k_ptr + (3u * 480u), // ++ src3_major + ((x - x_min_incl) / inv_h3), // ++ src3_major + ((x - x_min_incl) / inv_h3), // ++ src_len3, // ++ 0u, false, false); ++ ++ (*conv4func)(dst, x, end, y, up0, up1, up2, up3); ++ x = end; ++ } ++ } ++} ++ ++// -------- ++ ++// wuffs_private_impl__swizzle_flattened_length is like ++// wuffs_base__table__flattened_length but returns uint64_t (not size_t) and ++// also accounts for subsampling. ++static uint64_t // ++wuffs_private_impl__swizzle_flattened_length(uint32_t width, ++ uint32_t height, ++ uint32_t stride, ++ uint32_t inv_h, ++ uint32_t inv_v) { ++ uint64_t scaled_width = (((uint64_t)width) + (inv_h - 1u)) / inv_h; ++ uint64_t scaled_height = (((uint64_t)height) + (inv_v - 1u)) / inv_v; ++ if (scaled_height <= 0u) { ++ return 0u; ++ } ++ return ((scaled_height - 1u) * stride) + scaled_width; ++} ++ ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status // ++wuffs_base__pixel_swizzler__swizzle_ycck( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_buffer* dst, ++ wuffs_base__slice_u8 dst_palette, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ wuffs_base__slice_u8 src0, ++ wuffs_base__slice_u8 src1, ++ wuffs_base__slice_u8 src2, ++ wuffs_base__slice_u8 src3, ++ uint32_t width0, ++ uint32_t width1, ++ uint32_t width2, ++ uint32_t width3, ++ uint32_t height0, ++ uint32_t height1, ++ uint32_t height2, ++ uint32_t height3, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t stride3, ++ uint8_t h0, ++ uint8_t h1, ++ uint8_t h2, ++ uint8_t h3, ++ uint8_t v0, ++ uint8_t v1, ++ uint8_t v2, ++ uint8_t v3, ++ bool is_rgb_or_cmyk, ++ bool triangle_filter_for_2to1, ++ wuffs_base__slice_u8 scratch_buffer_2k) { ++ if (!p) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } else if (!dst || // ++ (x_min_incl > x_max_excl) || // ++ (x_max_excl > 0xFFFFu) || // ++ (y_min_incl > y_max_excl) || // ++ (y_max_excl > 0xFFFFu) || // ++ (4u <= ((unsigned int)h0 - 1u)) || // ++ (4u <= ((unsigned int)h1 - 1u)) || // ++ (4u <= ((unsigned int)h2 - 1u)) || // ++ (4u <= ((unsigned int)v0 - 1u)) || // ++ (4u <= ((unsigned int)v1 - 1u)) || // ++ (4u <= ((unsigned int)v2 - 1u)) || // ++ (triangle_filter_for_2to1 && ((x_min_incl | y_min_incl) > 0u)) || ++ (scratch_buffer_2k.len < 2048u)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((h3 != 0u) || (v3 != 0u)) { ++ if ((4u <= ((unsigned int)h3 - 1u)) || // ++ (4u <= ((unsigned int)v3 - 1u))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ } ++ ++ uint32_t max_incl_h = wuffs_private_impl__u32__max_of_4(h0, h1, h2, h3); ++ uint32_t max_incl_v = wuffs_private_impl__u32__max_of_4(v0, v1, v2, v3); ++ ++ // Calculate the inverse h and v ratios. ++ // ++ // It also canonicalizes (h=2 and max_incl_h=4) as equivalent to (h=1 and ++ // max_incl_h=2). In both cases, the inv_h value is 2. ++ uint32_t inv_h0 = max_incl_h / h0; ++ uint32_t inv_h1 = max_incl_h / h1; ++ uint32_t inv_h2 = max_incl_h / h2; ++ uint32_t inv_h3 = h3 ? (max_incl_h / h3) : 0u; ++ uint32_t inv_v0 = max_incl_v / v0; ++ uint32_t inv_v1 = max_incl_v / v1; ++ uint32_t inv_v2 = max_incl_v / v2; ++ uint32_t inv_v3 = v3 ? (max_incl_v / v3) : 0u; ++ ++ if (x_min_incl != 0) { ++ if ((x_min_incl % inv_h0) || (x_min_incl % inv_h1) || ++ (x_min_incl % inv_h2) || (inv_h3 && (x_min_incl % inv_h3))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ } ++ if (y_min_incl != 0) { ++ if ((y_min_incl % inv_v0) || (y_min_incl % inv_v1) || ++ (y_min_incl % inv_v2) || (inv_v3 && (y_min_incl % inv_v3))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ } ++ ++ uint32_t half_width_for_2to1 = ((x_max_excl - x_min_incl) + 1u) / 2u; ++ if (inv_h0 == 2) { ++ half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width0); ++ } ++ if (inv_h1 == 2) { ++ half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width1); ++ } ++ if (inv_h2 == 2) { ++ half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width2); ++ } ++ if (inv_h3 == 2) { ++ half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width3); ++ } ++ ++ uint32_t half_height_for_2to1 = ((y_max_excl - y_min_incl) + 1u) / 2u; ++ if (inv_v0 == 2) { ++ half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height0); ++ } ++ if (inv_v1 == 2) { ++ half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height1); ++ } ++ if (inv_v2 == 2) { ++ half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height2); ++ } ++ if (inv_v3 == 2) { ++ half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height3); ++ } ++ ++ x_max_excl = wuffs_base__u32__min( // ++ wuffs_base__pixel_config__width(&dst->pixcfg), // ++ x_min_incl + wuffs_private_impl__u32__min_of_5( // ++ x_max_excl - x_min_incl, // ++ width0 * inv_h0, // ++ width1 * inv_h1, // ++ width2 * inv_h2, // ++ inv_h3 ? (width3 * inv_h3) : 0xFFFFFFFF)); ++ y_max_excl = wuffs_base__u32__min( // ++ wuffs_base__pixel_config__height(&dst->pixcfg), // ++ y_min_incl + wuffs_private_impl__u32__min_of_5( // ++ y_max_excl - y_min_incl, // ++ height0 * inv_v0, // ++ height1 * inv_v1, // ++ height2 * inv_v2, // ++ inv_v3 ? (height3 * inv_v3) : 0xFFFFFFFF)); ++ ++ if ((x_min_incl >= x_max_excl) || (y_min_incl >= y_max_excl)) { ++ return wuffs_base__make_status(NULL); ++ } ++ uint32_t width = x_max_excl - x_min_incl; ++ uint32_t height = y_max_excl - y_min_incl; ++ ++ if (((h0 * inv_h0) != max_incl_h) || // ++ ((h1 * inv_h1) != max_incl_h) || // ++ ((h2 * inv_h2) != max_incl_h) || // ++ ((v0 * inv_v0) != max_incl_v) || // ++ ((v1 * inv_v1) != max_incl_v) || // ++ ((v2 * inv_v2) != max_incl_v) || // ++ (src0.len < wuffs_private_impl__swizzle_flattened_length( ++ width, height, stride0, inv_h0, inv_v0)) || ++ (src1.len < wuffs_private_impl__swizzle_flattened_length( ++ width, height, stride1, inv_h1, inv_v1)) || ++ (src2.len < wuffs_private_impl__swizzle_flattened_length( ++ width, height, stride2, inv_h2, inv_v2))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((h3 != 0u) || (v3 != 0u)) { ++ if (((h3 * inv_h3) != max_incl_h) || // ++ ((v3 * inv_v3) != max_incl_v) || // ++ (src3.len < wuffs_private_impl__swizzle_flattened_length( ++ width, height, stride3, inv_h3, inv_v3))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ } ++ ++ if (wuffs_base__pixel_format__is_planar(&dst->pixcfg.private_impl.pixfmt)) { ++ // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO. ++ return wuffs_base__make_status( ++ wuffs_base__error__unsupported_pixel_swizzler_option); ++ } ++ ++ // ---- ++ ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST) ++ switch (dst->pixcfg.private_impl.pixfmt.repr) { ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR_565) ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR) ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL_4X16LE) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_PREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGB) ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_NONPREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_PREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ break; ++#endif ++ default: ++ return wuffs_base__make_status( ++ wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist); ++ } ++#else // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST) ++ switch (dst->pixcfg.private_impl.pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: ++ case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ break; ++ ++ default: ++ // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO. ++ return wuffs_base__make_status( ++ wuffs_base__error__unsupported_pixel_swizzler_option); ++ } ++#endif // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST) ++ ++ // ---- ++ ++ wuffs_private_impl__swizzle_ycc__convert_3_func conv3func = NULL; ++ ++ if (is_rgb_or_cmyk) { ++ conv3func = &wuffs_private_impl__swizzle_rgb__convert_3_general; ++ } else { ++ switch (dst->pixcfg.private_impl.pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++ if (wuffs_base__cpu_arch__have_x86_avx2()) { ++ conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2; ++ break; + } +- v_planes = t_13; +- } +- if (v_planes != 1u) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30); +- uint32_t t_14; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_14 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(31); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_14 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_14; +- if (num_bits_14 == 8) { +- t_14 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_14 += 8u; +- *scratch |= ((uint64_t)(num_bits_14)) << 56; +- } ++#endif ++ conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_bgrx; ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++ if (wuffs_base__cpu_arch__have_x86_avx2()) { ++ conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2; ++ break; + } +- self->private_impl.f_bits_per_pixel = t_14; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32); +- uint32_t t_15; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_15 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_15 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_15; +- if (num_bits_15 == 24) { +- t_15 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_15 += 8u; +- *scratch |= ((uint64_t)(num_bits_15)) << 56; +- } +- } +- self->private_impl.f_compression = t_15; +- } +- if (self->private_impl.f_bits_per_pixel == 0u) { +- if (self->private_impl.f_compression == 4u) { +- self->private_impl.f_io_redirect_fourcc = 1246774599u; +- status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); +- goto ok; +- } else if (self->private_impl.f_compression == 5u) { +- self->private_impl.f_io_redirect_fourcc = 1347307296u; +- status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); +- goto ok; +- } +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- self->private_data.s_do_decode_image_config[0].scratch = 20u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(34); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- if (self->private_impl.f_bitmap_info_len == 40u) { +- if (self->private_impl.f_bits_per_pixel >= 16u) { +- if (self->private_impl.f_padding >= 16u) { +- self->private_impl.f_bitmap_info_len = 56u; +- self->private_impl.f_padding -= 16u; +- } else if (self->private_impl.f_padding >= 12u) { +- self->private_impl.f_bitmap_info_len = 52u; +- self->private_impl.f_padding -= 12u; +- } +- } +- } else if ((self->private_impl.f_bitmap_info_len != 52u) && +- (self->private_impl.f_bitmap_info_len != 56u) && +- (self->private_impl.f_bitmap_info_len != 64u) && +- (self->private_impl.f_bitmap_info_len != 108u) && +- (self->private_impl.f_bitmap_info_len != 124u)) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- if (self->private_impl.f_compression == 6u) { +- self->private_impl.f_compression = 3u; +- } +- if (self->private_impl.f_compression == 3u) { +- if (self->private_impl.f_bitmap_info_len >= 52u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(35); +- uint32_t t_16; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_16 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(36); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_16 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_16; +- if (num_bits_16 == 24) { +- t_16 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_16 += 8u; +- *scratch |= ((uint64_t)(num_bits_16)) << 56; +- } +- } +- self->private_impl.f_channel_masks[2u] = t_16; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(37); +- uint32_t t_17; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_17 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(38); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_17 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_17; +- if (num_bits_17 == 24) { +- t_17 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_17 += 8u; +- *scratch |= ((uint64_t)(num_bits_17)) << 56; +- } +- } +- self->private_impl.f_channel_masks[1u] = t_17; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(39); +- uint32_t t_18; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_18 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(40); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_18 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_18; +- if (num_bits_18 == 24) { +- t_18 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_18 += 8u; +- *scratch |= ((uint64_t)(num_bits_18)) << 56; +- } +- } +- self->private_impl.f_channel_masks[0u] = t_18; +- } +- if (self->private_impl.f_bitmap_info_len >= 56u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(41); +- uint32_t t_19; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_19 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(42); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_19 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_19; +- if (num_bits_19 == 24) { +- t_19 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_19 += 8u; +- *scratch |= ((uint64_t)(num_bits_19)) << 56; +- } +- } +- self->private_impl.f_channel_masks[3u] = t_19; +- } +- self->private_data.s_do_decode_image_config[0].scratch = ((uint32_t)(self->private_impl.f_bitmap_info_len - 56u)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(43); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- } +- if ((self->private_impl.f_channel_masks[0u] == 255u) && (self->private_impl.f_channel_masks[1u] == 65280u) && (self->private_impl.f_channel_masks[2u] == 16711680u)) { +- if (self->private_impl.f_bits_per_pixel == 24u) { +- self->private_impl.f_compression = 0u; +- } else if (self->private_impl.f_bits_per_pixel == 32u) { +- if ((self->private_impl.f_channel_masks[3u] == 0u) || (self->private_impl.f_channel_masks[3u] == 4278190080u)) { +- self->private_impl.f_compression = 0u; +- } +- } +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(44); +- status = wuffs_bmp__decoder__process_masks(self); +- if (status.repr) { +- goto suspend; +- } +- } +- } else if (self->private_impl.f_bitmap_info_len >= 40u) { +- self->private_data.s_do_decode_image_config[0].scratch = (self->private_impl.f_bitmap_info_len - 40u); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(45); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- } +- if (self->private_impl.f_compression != 3u) { +- if (self->private_impl.f_bits_per_pixel < 16u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(46); +- status = wuffs_bmp__decoder__read_palette(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } +- } +- if (self->private_impl.f_compression == 0u) { +- if ((self->private_impl.f_bits_per_pixel == 1u) || (self->private_impl.f_bits_per_pixel == 2u) || (self->private_impl.f_bits_per_pixel == 4u)) { +- self->private_impl.f_src_pixfmt = 2198077448u; +- self->private_impl.f_compression = 256u; +- } else if (self->private_impl.f_bits_per_pixel == 8u) { +- self->private_impl.f_src_pixfmt = 2198077448u; +- } else if (self->private_impl.f_bits_per_pixel == 16u) { +- self->private_impl.f_compression = 3u; +- self->private_impl.f_channel_masks[0u] = 31u; +- self->private_impl.f_channel_masks[1u] = 992u; +- self->private_impl.f_channel_masks[2u] = 31744u; +- self->private_impl.f_channel_masks[3u] = 0u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(47); +- status = wuffs_bmp__decoder__process_masks(self); +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_src_pixfmt = 2164308923u; +- } else if (self->private_impl.f_bits_per_pixel == 24u) { +- self->private_impl.f_src_pixfmt = 2147485832u; +- } else if (self->private_impl.f_bits_per_pixel == 32u) { +- if (self->private_impl.f_channel_masks[3u] == 0u) { +- self->private_impl.f_src_pixfmt = 2415954056u; +- } else { +- self->private_impl.f_src_pixfmt = 2164295816u; +- } +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- } else if (self->private_impl.f_compression == 1u) { +- if (self->private_impl.f_bits_per_pixel == 8u) { +- self->private_impl.f_src_pixfmt = 2198077448u; +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- } else if (self->private_impl.f_compression == 2u) { +- if (self->private_impl.f_bits_per_pixel == 4u) { +- self->private_impl.f_src_pixfmt = 2198077448u; +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- } else if (self->private_impl.f_compression == 3u) { +- if ((self->private_impl.f_bits_per_pixel == 16u) || (self->private_impl.f_bits_per_pixel == 32u)) { +- self->private_impl.f_src_pixfmt = 2164308923u; +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- if (((self->private_impl.f_bitmap_info_len < 40u) || (self->private_impl.f_bitmap_info_len == 64u)) && +- (self->private_impl.f_bits_per_pixel != 1u) && +- (self->private_impl.f_bits_per_pixel != 4u) && +- (self->private_impl.f_bits_per_pixel != 8u) && +- (self->private_impl.f_bits_per_pixel != 24u)) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } +- if (self->private_impl.f_bits_per_pixel == 1u) { +- v_byte_width = ((self->private_impl.f_width >> 3u) + (((self->private_impl.f_width & 7u) + 7u) >> 3u)); +- self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); +- } else if (self->private_impl.f_bits_per_pixel == 2u) { +- v_byte_width = ((self->private_impl.f_width >> 2u) + (((self->private_impl.f_width & 3u) + 3u) >> 2u)); +- self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); +- } else if (self->private_impl.f_bits_per_pixel == 4u) { +- v_byte_width = ((self->private_impl.f_width >> 1u) + (self->private_impl.f_width & 1u)); +- self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); +- } else if (self->private_impl.f_bits_per_pixel == 8u) { +- self->private_impl.f_pad_per_row = ((4u - (self->private_impl.f_width & 3u)) & 3u); +- } else if (self->private_impl.f_bits_per_pixel == 16u) { +- self->private_impl.f_pad_per_row = ((self->private_impl.f_width & 1u) * 2u); +- } else if (self->private_impl.f_bits_per_pixel == 24u) { +- self->private_impl.f_pad_per_row = (self->private_impl.f_width & 3u); +- } else if (self->private_impl.f_bits_per_pixel == 32u) { +- self->private_impl.f_pad_per_row = 0u; +- } +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- if (a_dst != NULL) { +- v_dst_pixfmt = 2164295816u; +- if ((self->private_impl.f_channel_num_bits[0u] > 8u) || +- (self->private_impl.f_channel_num_bits[1u] > 8u) || +- (self->private_impl.f_channel_num_bits[2u] > 8u) || +- (self->private_impl.f_channel_num_bits[3u] > 8u)) { +- v_dst_pixfmt = 2164308923u; +- } +- wuffs_base__image_config__set( +- a_dst, +- v_dst_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- (self->private_impl.f_channel_masks[3u] == 0u)); ++#endif ++ conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_rgbx; ++ break; ++ default: ++ conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_general; ++ break; + } +- self->private_impl.f_call_sequence = 32u; +- +- ok: +- self->private_impl.p_do_decode_image_config[0] = 0; +- goto exit; + } + +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ void (*func3)(wuffs_base__pixel_buffer * dst, // ++ uint32_t x_min_incl, // ++ uint32_t x_max_excl, // ++ uint32_t y_min_incl, // ++ uint32_t y_max_excl, // ++ const uint8_t* src_ptr0, // ++ const uint8_t* src_ptr1, // ++ const uint8_t* src_ptr2, // ++ uint32_t stride0, // ++ uint32_t stride1, // ++ uint32_t stride2, // ++ uint32_t inv_h0, // ++ uint32_t inv_h1, // ++ uint32_t inv_h2, // ++ uint32_t inv_v0, // ++ uint32_t inv_v1, // ++ uint32_t inv_v2, // ++ uint32_t half_width_for_2to1, // ++ uint32_t half_height_for_2to1, // ++ uint8_t* scratch_buffer_2k_ptr, // ++ wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) = ++ &wuffs_private_impl__swizzle_ycc__general__box_filter; ++ ++ void (*func4)(wuffs_base__pixel_buffer * dst, // ++ uint32_t x_min_incl, // ++ uint32_t x_max_excl, // ++ uint32_t y_min_incl, // ++ uint32_t y_max_excl, // ++ const uint8_t* src_ptr0, // ++ const uint8_t* src_ptr1, // ++ const uint8_t* src_ptr2, // ++ const uint8_t* src_ptr3, // ++ uint32_t stride0, // ++ uint32_t stride1, // ++ uint32_t stride2, // ++ uint32_t stride3, // ++ uint32_t inv_h0, // ++ uint32_t inv_h1, // ++ uint32_t inv_h2, // ++ uint32_t inv_h3, // ++ uint32_t inv_v0, // ++ uint32_t inv_v1, // ++ uint32_t inv_v2, // ++ uint32_t inv_v3, // ++ uint32_t half_width_for_2to1, // ++ uint32_t half_height_for_2to1, // ++ uint8_t* scratch_buffer_2k_ptr, // ++ wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) = ++ &wuffs_private_impl__swizzle_ycck__general__box_filter; ++ ++ wuffs_private_impl__swizzle_ycc__upsample_func upfuncs[4][4]; ++ memcpy(&upfuncs, &wuffs_private_impl__swizzle_ycc__upsample_funcs, ++ sizeof upfuncs); + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (triangle_filter_for_2to1 && ++ (wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h0, inv_v0) || ++ wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h1, inv_v1) || ++ wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h2, inv_v2) || ++ wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h3, inv_v3))) { ++ func3 = &wuffs_private_impl__swizzle_ycc__general__triangle_filter; ++ func4 = &wuffs_private_impl__swizzle_ycck__general__triangle_filter; ++ ++ upfuncs[0][1] = wuffs_private_impl__swizzle_ycc__upsample_inv_h1v2_triangle; ++ upfuncs[1][0] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v1_triangle; ++ upfuncs[1][1] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle; ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++#if defined(__GNUC__) && !defined(__clang__) ++ // Don't use our AVX2 implementation for GCC (but do use it for clang). For ++ // some unknown reason, GCC performs noticably better on the non-SIMD ++ // version. Possibly because GCC's auto-vectorizer is smarter (just with ++ // SSE2, not AVX2) than our hand-written code, but that's just a guess. ++ // ++ // See commits 51bc60ef9298cb2efc1b29a9681191f66d49820d and ++ // cd769a0cdf1b5affee13f6089b995f3d39569cb4 for benchmark numbers. ++ // ++ // See also https://godbolt.org/z/MbhbPGEz4 for Debian Bullseye's clang 11 ++ // versus gcc 10, where only gcc auto-vectorizes, although later clang ++ // versions will also auto-vectorize. ++#else ++ if (wuffs_base__cpu_arch__have_x86_avx2()) { ++ upfuncs[1][1] = ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2; ++ } ++#endif ++#endif + } + +- return status; +-} +- +-// -------- func bmp.decoder.decode_frame_config ++ if ((h3 != 0u) || (v3 != 0u)) { ++ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func = ++ is_rgb_or_cmyk ? &wuffs_private_impl__swizzle_cmyk__convert_4_general ++ : &wuffs_private_impl__swizzle_ycck__convert_4_general; ++ (*func4)( // ++ dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl, // ++ src0.ptr, src1.ptr, src2.ptr, src3.ptr, // ++ stride0, stride1, stride2, stride3, // ++ inv_h0, inv_h1, inv_h2, inv_h3, // ++ inv_v0, inv_v1, inv_v2, inv_v3, // ++ half_width_for_2to1, half_height_for_2to1, // ++ scratch_buffer_2k.ptr, &upfuncs, conv4func); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__decode_frame_config( +- wuffs_bmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } else { ++ (*func3)( // ++ dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl, // ++ src0.ptr, src1.ptr, src2.ptr, // ++ stride0, stride1, stride2, // ++ inv_h0, inv_h1, inv_h2, // ++ inv_v0, inv_v1, inv_v2, // ++ half_width_for_2to1, half_height_for_2to1, // ++ scratch_buffer_2k.ptr, &upfuncs, conv3func); + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ return wuffs_base__make_status(NULL); ++} + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++// -------- + +- ok: +- self->private_impl.p_decode_frame_config[0] = 0; +- goto exit; ++// ‼ WUFFS MULTI-FILE SECTION +x86_avx2 ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ if ((x + 32u) > x_end) { ++ wuffs_private_impl__swizzle_ycc__convert_3_bgrx( // ++ dst, x, x_end, y, up0, up1, up2); ++ return; + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ size_t dst_stride = dst->private_impl.planes[0].stride; ++ uint8_t* dst_iter = dst->private_impl.planes[0].ptr + ++ (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} ++ // u0001 = u16x16 [0x0001 .. 0x0001] ++ // u00FF = u16x16 [0x00FF .. 0x00FF] ++ // uFF80 = u16x16 [0xFF80 .. 0xFF80] ++ // uFFFF = u16x16 [0xFFFF .. 0xFFFF] ++ const __m256i u0001 = _mm256_set1_epi16(+0x0001); ++ const __m256i u00FF = _mm256_set1_epi16(+0x00FF); ++ const __m256i uFF80 = _mm256_set1_epi16(-0x0080); ++ const __m256i uFFFF = _mm256_set1_epi16(-0x0001); + +-// -------- func bmp.decoder.do_decode_frame_config ++ // p8000_p0000 = u16x16 [0x8000 0x0000 .. 0x8000 0x0000] ++ const __m256i p8000_p0000 = _mm256_set_epi16( // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_frame_config( +- wuffs_bmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ // Per wuffs_base__color_ycc__as__color_u32, the formulae: ++ // ++ // R = Y + 1.40200 * Cr ++ // G = Y - 0.34414 * Cb - 0.71414 * Cr ++ // B = Y + 1.77200 * Cb ++ // ++ // When scaled by 1<<16: ++ // ++ // 0.34414 becomes 0x0581A = 22554. ++ // 0.71414 becomes 0x0B6D2 = 46802. ++ // 1.40200 becomes 0x166E9 = 91881. ++ // 1.77200 becomes 0x1C5A2 = 116130. ++ // ++ // Separate the integer and fractional parts, since we work with signed ++ // 16-bit SIMD lanes. The fractional parts range from -0.5 .. +0.5 (as ++ // floating-point) which is from -0x8000 .. +0x8000 (as fixed-point). ++ // ++ // -0x3A5E = -0x20000 + 0x1C5A2 The B:Cb factor. ++ // +0x66E9 = -0x10000 + 0x166E9 The R:Cr factor. ++ // -0x581A = +0x00000 - 0x0581A The G:Cb factor. ++ // +0x492E = +0x10000 - 0x0B6D2 The G:Cr factor. ++ const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E); ++ const __m256i p66E9 = _mm256_set1_epi16(+0x66E9); ++ const __m256i m581A_p492E = _mm256_set_epi16( // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ while (x < x_end) { ++ // Load chroma values in even and odd columns (the high 8 bits of each ++ // u16x16 element are zero) and then subtract 0x0080. ++ // ++ // cb_all = u8x32 [cb.00 cb.01 cb.02 cb.03 .. cb.1C cb.1D cb.1E cb.1F] ++ // cb_eve = i16x16 [cb.00-0x80 cb.02-0x80 .. cb.1C-0x80 cb.1E-0x80 ] ++ // cb_odd = i16x16 [cb.01-0x80 cb.03-0x80 .. cb.1D-0x80 cb.1F-0x80 ] ++ // ++ // Ditto for the cr_xxx Chroma-Red values. ++ __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1); ++ __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2); ++ __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF)); ++ __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF)); ++ __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8)); ++ __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8)); + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ // ---- + +- if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_bmp__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; +- } +- } else if (self->private_impl.f_call_sequence == 64u) { +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height), +- ((wuffs_base__flicks)(0u)), +- 0u, +- self->private_impl.f_frame_config_io_position, +- 0u, +- true, +- false, +- 4278190080u); +- } +- self->private_impl.f_call_sequence = 64u; ++ // Calculate: ++ // ++ // B-Y = (+1.77200 * Cb) as floating-point ++ // R-Y = (+1.40200 * Cr) as floating-point ++ // ++ // B-Y = ((0x2_0000 - 0x3A5E) * Cb) as fixed-point ++ // R-Y = ((0x1_0000 + 0x66E9) * Cr) as fixed-point ++ // ++ // B-Y = ((-0x3A5E * Cb) + ("2.0" * Cb)) ++ // R-Y = ((+0x66E9 * Cr) + ("1.0" * Cr)) + +- ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; +- goto exit; +- } ++ // Multiply by m3A5E or p66E9, taking the high 16 bits. There's also a ++ // doubling (add x to itself), adding-of-1 and halving (shift right by 1). ++ // That makes multiply-and-take-high round to nearest (instead of down). ++ __m256i tmp_by_eve = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001), ++ 1); ++ __m256i tmp_by_odd = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001), ++ 1); ++ __m256i tmp_ry_eve = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001), ++ 1); ++ __m256i tmp_ry_odd = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001), ++ 1); + +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ // Add (2 * Cb) and (1 * Cr). ++ __m256i by_eve = ++ _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve)); ++ __m256i by_odd = ++ _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd)); ++ __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve); ++ __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd); + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++ // ---- + +- return status; +-} ++ // Calculate: ++ // ++ // G-Y = (-0.34414 * Cb) + ++ // (-0.71414 * Cr) as floating-point ++ // ++ // G-Y = ((+0x0_0000 - 0x581A) * Cb) + ++ // ((-0x1_0000 + 0x492E) * Cr) as fixed-point ++ // ++ // G-Y = (-0x581A * Cb) + ++ // (+0x492E * Cr) - ("1.0" * Cr) + +-// -------- func bmp.decoder.decode_frame ++ // Multiply-add to get ((-0x581A * Cb) + (+0x492E * Cr)). ++ __m256i tmp0_gy_eve_lo = _mm256_madd_epi16( // ++ _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E); ++ __m256i tmp0_gy_eve_hi = _mm256_madd_epi16( // ++ _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E); ++ __m256i tmp0_gy_odd_lo = _mm256_madd_epi16( // ++ _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E); ++ __m256i tmp0_gy_odd_hi = _mm256_madd_epi16( // ++ _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__decode_frame( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ // Divide the i32x8 vectors by (1 << 16), rounding to nearest. ++ __m256i tmp1_gy_eve_lo = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16); ++ __m256i tmp1_gy_eve_hi = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16); ++ __m256i tmp1_gy_odd_lo = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16); ++ __m256i tmp1_gy_odd_hi = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ // Pack the ((-0x581A * Cb) + (+0x492E * Cr)) as i16x16 and subtract Cr. ++ __m256i gy_eve = _mm256_sub_epi16( ++ _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve); ++ __m256i gy_odd = _mm256_sub_epi16( ++ _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ // ---- + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++ // Add Y to (B-Y), (G-Y) and (R-Y) to produce B, G and R. ++ // ++ // For the resultant packed_x_xxx vectors, only elements 0 ..= 7 and 16 ..= ++ // 23 of the 32-element vectors matter (since we'll unpacklo but not ++ // unpackhi them). Let … denote 8 ignored consecutive u8 values and let % ++ // denote 0xFF. We'll end this section with: ++ // ++ // packed_b_eve = u8x32 [b00 b02 .. b0C b0E … b10 b12 .. b1C b1E …] ++ // packed_b_odd = u8x32 [b01 b03 .. b0D b0F … b11 b13 .. b1D b1F …] ++ // packed_g_eve = u8x32 [g00 g02 .. g0C g0E … g10 g12 .. g1C g1E …] ++ // packed_g_odd = u8x32 [g01 g03 .. g0D g0F … g11 g13 .. g1D g1F …] ++ // packed_r_eve = u8x32 [r00 r02 .. r0C r0E … r10 r12 .. r1C r1E …] ++ // packed_r_odd = u8x32 [r01 r03 .. r0D r0F … r11 r13 .. r1D r1F …] ++ // uFFFF = u8x32 [ % % .. % % … % % .. % % …] + +- ok: +- self->private_impl.p_decode_frame[0] = 0; +- goto exit; +- } ++ __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0); ++ __m256i yy_eve = _mm256_and_si256(yy_all, u00FF); ++ __m256i yy_odd = _mm256_srli_epi16(yy_all, 8); + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve); ++ __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd); ++ __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve); ++ __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd); + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} ++ __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve); ++ __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd); ++ __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve); ++ __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd); + +-// -------- func bmp.decoder.do_decode_frame ++ __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve); ++ __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd); ++ __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve); ++ __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_frame( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ // ---- + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ // Mix those values (unpacking in 8, 16 and then 32 bit units) to get the ++ // desired BGRX/RGBX order. ++ // ++ // From here onwards, all of our __m256i registers are u8x32. + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ // mix00 = [b00 g00 b02 g02 .. b0E g0E b10 g10 .. b1C g1C b1E g1E] ++ // mix01 = [b01 g01 b03 g03 .. b0F g0F b11 g11 .. b1D g1D b1F g1F] ++ // mix02 = [r00 % r02 % .. r0E % r10 % .. r1C % r1E %] ++ // mix03 = [r01 % r03 % .. r0F % r11 % .. r1D % r1F %] ++ // ++ // See also § below. ++ __m256i mix00 = _mm256_unpacklo_epi8(packed_b_eve, packed_g_eve); ++ __m256i mix01 = _mm256_unpacklo_epi8(packed_b_odd, packed_g_odd); ++ __m256i mix02 = _mm256_unpacklo_epi8(packed_r_eve, uFFFF); ++ __m256i mix03 = _mm256_unpacklo_epi8(packed_r_odd, uFFFF); + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ // mix10 = [b00 g00 r00 % b02 g02 r02 % b04 g04 r04 % b06 g06 r06 % ++ // b10 g10 r10 % b12 g12 r12 % b14 g14 r14 % b16 g16 r16 %] ++ // mix11 = [b01 g01 r01 % b03 g03 r03 % b05 g05 r05 % b07 g07 r07 % ++ // b11 g11 r11 % b13 g13 r13 % b15 g15 r15 % b17 g17 r17 %] ++ // mix12 = [b08 g08 r08 % b0A g0A r0A % b0C g0C r0C % b0E g0E r0E % ++ // b18 g18 r18 % b1A g1A r1A % b1C g1C r1C % b1E g1E r1E %] ++ // mix13 = [b09 g09 r09 % b0B g0B r0B % b0D g0D r0D % b0F g0F r0F % ++ // b19 g19 r19 % b1B g1B r1B % b1D g1D r1D % b1F g1F r1F %] ++ __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02); ++ __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03); ++ __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02); ++ __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03); + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_bmp__decoder__do_decode_frame_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- self->private_data.s_do_decode_frame[0].scratch = self->private_impl.f_padding; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame[0].scratch; +- if ((self->private_impl.f_width > 0u) && (self->private_impl.f_height > 0u)) { +- self->private_impl.f_dst_x = 0u; +- if (self->private_impl.f_top_down) { +- self->private_impl.f_dst_y = 0u; +- self->private_impl.f_dst_y_inc = 1u; +- } else { +- self->private_impl.f_dst_y = ((uint32_t)(self->private_impl.f_height - 1u)); +- self->private_impl.f_dst_y_inc = 4294967295u; +- } +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)), +- wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), +- wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- while (true) { +- if (self->private_impl.f_compression == 0u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_bmp__decoder__swizzle_none(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } else if (self->private_impl.f_compression < 3u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_bmp__decoder__swizzle_rle(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } else if (self->private_impl.f_compression == 3u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_bmp__decoder__swizzle_bitfields(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } else { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_bmp__decoder__swizzle_low_bit_depth(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } else if (v_status.repr != wuffs_bmp__note__internal_note_short_read) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- } +- self->private_data.s_do_decode_frame[0].scratch = self->private_impl.f_pending_pad; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame[0].scratch; +- self->private_impl.f_pending_pad = 0u; +- } +- self->private_impl.f_call_sequence = 96u; ++ // mix20 = [b00 g00 r00 % b01 g01 r01 % b02 g02 r02 % b03 g03 r03 % ++ // b10 g10 r10 % b11 g11 r11 % b12 g12 r12 % b13 g13 r13 %] ++ // mix21 = [b04 g04 r04 % b05 g05 r05 % b06 g06 r06 % b07 g07 r07 % ++ // b14 g14 r14 % b15 g15 r15 % b16 g16 r16 % b17 g17 r17 %] ++ // mix22 = [b08 g08 r08 % b09 g09 r09 % b0A g0A r0A % b0B g0B r0B % ++ // b18 g18 r18 % b19 g19 r19 % b1A g1A r1A % b1B g1B r1B %] ++ // mix23 = [b0C g0C r0C % b0D g0D r0D % b0E g0E r0E % b0F g0F r0F % ++ // b1C g1C r1C % b1D g1D r1D % b1E g1E r1E % b1F g1F r1F %] ++ __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11); ++ __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11); ++ __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13); ++ __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13); + +- ok: +- self->private_impl.p_do_decode_frame[0] = 0; +- goto exit; +- } ++ // mix30 = [b00 g00 r00 % b01 g01 r01 % b02 g02 r02 % b03 g03 r03 % ++ // b04 g04 r04 % b05 g05 r05 % b06 g06 r06 % b07 g07 r07 %] ++ // mix31 = [b08 g08 r08 % b09 g09 r09 % b0A g0A r0A % b0B g0B r0B % ++ // b0C g0C r0C % b0D g0D r0D % b0E g0E r0E % b0F g0F r0F %] ++ // mix32 = [b10 g10 r10 % b11 g11 r11 % b12 g12 r12 % b13 g13 r13 % ++ // b14 g14 r14 % b15 g15 r15 % b16 g16 r16 % b17 g17 r17 %] ++ // mix33 = [b18 g18 r18 % b19 g19 r19 % b1A g1A r1A % b1B g1B r1B % ++ // b1C g1C r1C % b1D g1D r1D % b1E g1E r1E % b1F g1F r1F %] ++ __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20); ++ __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20); ++ __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31); ++ __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31); + +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ // Write out four u8x32 SIMD registers (128 bytes, 32 BGRX/RGBX pixels). ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33); + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ // Advance by up to 32 pixels. The first iteration might be smaller than 32 ++ // so that all of the remaining steps are exactly 32. ++ uint32_t n = 32u - (31u & (x - x_end)); ++ dst_iter += 4u * n; ++ up0 += n; ++ up1 += n; ++ up2 += n; ++ x += n; + } +- +- return status; + } + +-// -------- func bmp.decoder.swizzle_none ++// The rgbx flavor (below) is exactly the same as the bgrx flavor (above) ++// except for the lines marked with a § and that comments were stripped. ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ if ((x + 32u) > x_end) { ++ wuffs_private_impl__swizzle_ycc__convert_3_bgrx( // ++ dst, x, x_end, y, up0, up1, up2); ++ return; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_none( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ size_t dst_stride = dst->private_impl.planes[0].stride; ++ uint8_t* dst_iter = dst->private_impl.planes[0].ptr + ++ (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- uint32_t v_src_bytes_per_pixel = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_j = 0; +- uint64_t v_n = 0; ++ const __m256i u0001 = _mm256_set1_epi16(+0x0001); ++ const __m256i u00FF = _mm256_set1_epi16(+0x00FF); ++ const __m256i uFF80 = _mm256_set1_epi16(-0x0080); ++ const __m256i uFFFF = _mm256_set1_epi16(-0x0001); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ const __m256i p8000_p0000 = _mm256_set_epi16( // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000); + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- label__outer__continue:; +- while (true) { +- while (self->private_impl.f_pending_pad > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- self->private_impl.f_pending_pad -= 1u; +- iop_a_src += 1u; +- } +- while (true) { +- if (self->private_impl.f_dst_x == self->private_impl.f_width) { +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- if (self->private_impl.f_height > 0u) { +- self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; +- } +- goto label__outer__break; +- } else if (self->private_impl.f_pad_per_row != 0u) { +- self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; +- goto label__outer__continue; +- } +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); +- } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i >= ((uint64_t)(v_dst.len))) { +- if (self->private_impl.f_bits_per_pixel > 32u) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- v_src_bytes_per_pixel = (self->private_impl.f_bits_per_pixel / 8u); +- if (v_src_bytes_per_pixel == 0u) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); +- v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); +- v_j = v_n; +- while (v_j >= 8u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 8u); +- } +- v_j -= 8u; +- } +- while (v_j > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 1u); +- } +- v_j -= 1u; +- } +- } else { +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( +- &self->private_impl.f_swizzler, +- wuffs_base__slice_u8__subslice_i(v_dst, v_i), +- v_dst_palette, +- &iop_a_src, +- io2_a_src); +- } +- if (v_n == 0u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- } +- } +- label__outer__break:; +- status = wuffs_base__make_status(NULL); +- goto ok; ++ const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E); ++ const __m256i p66E9 = _mm256_set1_epi16(+0x66E9); ++ const __m256i m581A_p492E = _mm256_set_epi16( // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A); + +- ok: +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++ while (x < x_end) { ++ __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1); ++ __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2); ++ __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF)); ++ __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF)); ++ __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8)); ++ __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8)); + +- return status; +-} ++ __m256i tmp_by_eve = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001), ++ 1); ++ __m256i tmp_by_odd = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001), ++ 1); ++ __m256i tmp_ry_eve = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001), ++ 1); ++ __m256i tmp_ry_odd = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001), ++ 1); + +-// -------- func bmp.decoder.swizzle_rle ++ __m256i by_eve = ++ _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve)); ++ __m256i by_odd = ++ _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd)); ++ __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve); ++ __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_rle( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ __m256i tmp0_gy_eve_lo = _mm256_madd_epi16( // ++ _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E); ++ __m256i tmp0_gy_eve_hi = _mm256_madd_epi16( // ++ _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E); ++ __m256i tmp0_gy_odd_lo = _mm256_madd_epi16( // ++ _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E); ++ __m256i tmp0_gy_odd_hi = _mm256_madd_epi16( // ++ _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E); + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_row = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_n = 0; +- uint32_t v_p0 = 0; +- uint8_t v_code = 0; +- uint8_t v_indexes[2] = {0}; +- uint32_t v_rle_state = 0; +- uint32_t v_chunk_bits = 0; +- uint32_t v_chunk_count = 0; ++ __m256i tmp1_gy_eve_lo = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16); ++ __m256i tmp1_gy_eve_hi = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16); ++ __m256i tmp1_gy_odd_lo = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16); ++ __m256i tmp1_gy_odd_hi = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ __m256i gy_eve = _mm256_sub_epi16( ++ _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve); ++ __m256i gy_odd = _mm256_sub_epi16( ++ _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd); + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- v_rle_state = self->private_impl.f_rle_state; +- label__outer__continue:; +- while (true) { +- v_row = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { +- v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); +- } +- label__middle__continue:; +- while (true) { +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i <= ((uint64_t)(v_row.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_row, v_i); +- } else { +- v_dst = wuffs_base__utility__empty_slice_u8(); +- } +- while (true) { +- while (true) { +- if (v_rle_state == 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- if (v_code == 0u) { +- v_rle_state = 2u; +- continue; +- } +- self->private_impl.f_rle_length = ((uint32_t)(v_code)); +- v_rle_state = 1u; +- continue; +- } else if (v_rle_state == 1u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- if (self->private_impl.f_bits_per_pixel == 8u) { +- v_p0 = 0u; +- while (v_p0 < self->private_impl.f_rle_length) { +- self->private_data.f_scratch[v_p0] = v_code; +- v_p0 += 1u; +- } +- } else { +- v_indexes[0u] = ((uint8_t)((v_code >> 4u))); +- v_indexes[1u] = (v_code & 15u); +- v_p0 = 0u; +- while (v_p0 < self->private_impl.f_rle_length) { +- self->private_data.f_scratch[(v_p0 + 0u)] = v_indexes[0u]; +- self->private_data.f_scratch[(v_p0 + 1u)] = v_indexes[1u]; +- v_p0 += 2u; +- } +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_rle_length)); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, self->private_impl.f_rle_length); +- v_rle_state = 0u; +- goto label__middle__continue; +- } else if (v_rle_state == 2u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- if (v_code < 2u) { +- if ((self->private_impl.f_dst_y >= self->private_impl.f_height) && (v_code == 0u)) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); +- goto exit; +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, 18446744073709551615u); +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- if (v_code > 0u) { +- goto label__outer__break; +- } +- v_rle_state = 0u; +- goto label__outer__continue; +- } else if (v_code == 2u) { +- v_rle_state = 4u; +- continue; +- } +- self->private_impl.f_rle_length = ((uint32_t)(v_code)); +- self->private_impl.f_rle_padded = ((self->private_impl.f_bits_per_pixel == 8u) && ((v_code & 1u) != 0u)); +- v_rle_state = 3u; +- continue; +- } else if (v_rle_state == 3u) { +- if (self->private_impl.f_bits_per_pixel == 8u) { +- v_n = wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( +- &self->private_impl.f_swizzler, +- self->private_impl.f_rle_length, +- v_dst, +- v_dst_palette, +- &iop_a_src, +- io2_a_src); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_rle_length, ((uint32_t)(v_n))); +- } else { +- v_chunk_count = ((self->private_impl.f_rle_length + 3u) / 4u); +- v_p0 = 0u; +- while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 2u)) { +- v_chunk_bits = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2u; +- self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u)))); +- self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u)))); +- self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u)))); +- self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u)))); +- v_p0 = ((v_p0 & 255u) + 4u); +- v_chunk_count -= 1u; +- } +- v_p0 = wuffs_base__u32__min(v_p0, self->private_impl.f_rle_length); +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0)); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, v_p0); +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_rle_length, v_p0); +- } +- if (self->private_impl.f_rle_length > 0u) { +- goto label__goto_suspend__break; +- } +- if (self->private_impl.f_rle_padded) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- iop_a_src += 1u; +- self->private_impl.f_rle_padded = false; +- } +- v_rle_state = 0u; +- goto label__middle__continue; +- } else if (v_rle_state == 4u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- self->private_impl.f_rle_delta_x = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- v_rle_state = 5u; +- continue; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- if (self->private_impl.f_rle_delta_x > 0u) { +- wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, ((uint64_t)(self->private_impl.f_rle_delta_x))); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(self->private_impl.f_rle_delta_x))); +- self->private_impl.f_rle_delta_x = 0u; +- if (self->private_impl.f_dst_x > self->private_impl.f_width) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); +- goto exit; +- } +- } +- if (v_code > 0u) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_code -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- while (true) { +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); +- goto exit; +- } +- v_row = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { +- v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); +- } +- if (v_code <= 0u) { +- wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, ((uint64_t)(self->private_impl.f_dst_x))); +- break; +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u); +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_code -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } +- } +- v_rle_state = 0u; +- goto label__middle__continue; +- } +- } +- label__goto_suspend__break:; +- self->private_impl.f_rle_state = v_rle_state; +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- } +- label__outer__break:; +- while (self->private_impl.f_dst_y < self->private_impl.f_height) { +- v_row = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { +- v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u); +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- } +- status = wuffs_base__make_status(NULL); +- goto ok; ++ __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0); ++ __m256i yy_eve = _mm256_and_si256(yy_all, u00FF); ++ __m256i yy_odd = _mm256_srli_epi16(yy_all, 8); + +- ok: +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++ __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve); ++ __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd); ++ __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve); ++ __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd); + +- return status; +-} ++ __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve); ++ __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd); ++ __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve); ++ __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd); + +-// -------- func bmp.decoder.swizzle_bitfields ++ __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve); ++ __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd); ++ __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve); ++ __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_bitfields( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ // § Note the swapped B and R channels. ++ __m256i mix00 = _mm256_unpacklo_epi8(packed_r_eve, packed_g_eve); ++ __m256i mix01 = _mm256_unpacklo_epi8(packed_r_odd, packed_g_odd); ++ __m256i mix02 = _mm256_unpacklo_epi8(packed_b_eve, uFFFF); ++ __m256i mix03 = _mm256_unpacklo_epi8(packed_b_odd, uFFFF); + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_n = 0; +- uint32_t v_p0 = 0; +- uint32_t v_p1 = 0; +- uint32_t v_p1_temp = 0; +- uint32_t v_num_bits = 0; +- uint32_t v_c = 0; +- uint32_t v_c32 = 0; +- uint32_t v_channel = 0; ++ __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02); ++ __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03); ++ __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02); ++ __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11); ++ __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11); ++ __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13); ++ __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13); + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- label__outer__continue:; +- while (true) { +- while (self->private_impl.f_pending_pad > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- self->private_impl.f_pending_pad -= 1u; +- iop_a_src += 1u; +- } +- while (true) { +- if (self->private_impl.f_dst_x == self->private_impl.f_width) { +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- if (self->private_impl.f_height > 0u) { +- self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; +- } +- goto label__outer__break; +- } else if (self->private_impl.f_pad_per_row != 0u) { +- self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; +- goto label__outer__continue; +- } +- } +- v_p1_temp = ((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x)); +- v_p1 = wuffs_base__u32__min(v_p1_temp, 256u); +- v_p0 = 0u; +- while (v_p0 < v_p1) { +- if (self->private_impl.f_bits_per_pixel == 16u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- break; +- } +- v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2u; +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- break; +- } +- v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4u; +- } +- v_channel = 0u; +- while (v_channel < 4u) { +- if (self->private_impl.f_channel_num_bits[v_channel] == 0u) { +- self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = 255u; +- self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = 255u; +- } else { +- v_c = ((v_c32 & self->private_impl.f_channel_masks[v_channel]) >> self->private_impl.f_channel_shifts[v_channel]); +- v_num_bits = ((uint32_t)(self->private_impl.f_channel_num_bits[v_channel])); +- while (v_num_bits < 16u) { +- v_c |= ((uint32_t)(v_c << v_num_bits)); +- v_num_bits *= 2u; +- } +- v_c >>= (v_num_bits - 16u); +- self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = ((uint8_t)((v_c >> 0u))); +- self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = ((uint8_t)((v_c >> 8u))); +- } +- v_channel += 1u; +- } +- v_p0 += 1u; +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); +- } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i >= ((uint64_t)(v_dst.len))) { +- v_n = ((uint64_t)(v_p0)); +- } else { +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, (8u * v_p0))); +- } +- if (v_n == 0u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- } +- } +- label__outer__break:; +- status = wuffs_base__make_status(NULL); +- goto ok; ++ __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20); ++ __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20); ++ __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31); ++ __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31); + +- ok: +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33); + +- return status; ++ uint32_t n = 32u - (31u & (x - x_end)); ++ dst_iter += 4u * n; ++ up0 += n; ++ up1 += n; ++ up2 += n; ++ x += n; ++ } + } + +-// -------- func bmp.decoder.swizzle_low_bit_depth ++#if defined(__GNUC__) && !defined(__clang__) ++// No-op. ++#else ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column, ++ bool last_column) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp_major = src_ptr_major; ++ const uint8_t* sp_minor = src_ptr_minor; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_low_bit_depth( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ if (first_column) { ++ src_len--; ++ if ((src_len <= 0u) && last_column) { ++ uint32_t sv = (12u * ((uint32_t)(*sp_major++))) + // ++ (4u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + 7u) >> 4u); ++ return dst_ptr; ++ } + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_n = 0; +- uint32_t v_p0 = 0; +- uint32_t v_chunk_bits = 0; +- uint32_t v_chunk_count = 0; +- uint32_t v_pixels_per_chunk = 0; ++ uint32_t sv_major_m1 = sp_major[-0]; // Clamp offset to zero. ++ uint32_t sv_minor_m1 = sp_minor[-0]; // Clamp offset to zero. ++ uint32_t sv_major_p1 = sp_major[+1]; ++ uint32_t sv_minor_p1 = sp_minor[+1]; + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ if (src_len <= 0u) { ++ return dst_ptr; ++ } + } + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- while (true) { +- if (self->private_impl.f_dst_x == self->private_impl.f_width) { +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- break; +- } +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); +- } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i >= ((uint64_t)(v_dst.len))) { +- if (self->private_impl.f_bits_per_pixel == 1u) { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u); +- v_pixels_per_chunk = 32u; +- } else if (self->private_impl.f_bits_per_pixel == 2u) { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u); +- v_pixels_per_chunk = 16u; +- } else { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u); +- v_pixels_per_chunk = 8u; +- } +- while ((v_chunk_count >= 64u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 256u)) { +- iop_a_src += 256u; +- self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 64u)))); +- v_chunk_count -= 64u; +- } +- while ((v_chunk_count >= 8u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 32u)) { +- iop_a_src += 32u; +- self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 8u)))); +- v_chunk_count -= 8u; +- } +- while (v_chunk_count > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- iop_a_src += 4u; +- self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 1u)))); +- v_chunk_count -= 1u; +- } +- continue; +- } +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i); +- v_p0 = 0u; +- if (self->private_impl.f_bits_per_pixel == 1u) { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u); +- v_chunk_count = wuffs_base__u32__min(v_chunk_count, 16u); +- while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { +- v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4u; +- self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((1u & (v_chunk_bits >> 31u)))); +- self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((1u & (v_chunk_bits >> 30u)))); +- self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((1u & (v_chunk_bits >> 29u)))); +- self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((1u & (v_chunk_bits >> 28u)))); +- self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((1u & (v_chunk_bits >> 27u)))); +- self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((1u & (v_chunk_bits >> 26u)))); +- self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((1u & (v_chunk_bits >> 25u)))); +- self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((1u & (v_chunk_bits >> 24u)))); +- self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((1u & (v_chunk_bits >> 23u)))); +- self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((1u & (v_chunk_bits >> 22u)))); +- self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((1u & (v_chunk_bits >> 21u)))); +- self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((1u & (v_chunk_bits >> 20u)))); +- self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((1u & (v_chunk_bits >> 19u)))); +- self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((1u & (v_chunk_bits >> 18u)))); +- self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((1u & (v_chunk_bits >> 17u)))); +- self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((1u & (v_chunk_bits >> 16u)))); +- self->private_data.f_scratch[(v_p0 + 16u)] = ((uint8_t)((1u & (v_chunk_bits >> 15u)))); +- self->private_data.f_scratch[(v_p0 + 17u)] = ((uint8_t)((1u & (v_chunk_bits >> 14u)))); +- self->private_data.f_scratch[(v_p0 + 18u)] = ((uint8_t)((1u & (v_chunk_bits >> 13u)))); +- self->private_data.f_scratch[(v_p0 + 19u)] = ((uint8_t)((1u & (v_chunk_bits >> 12u)))); +- self->private_data.f_scratch[(v_p0 + 20u)] = ((uint8_t)((1u & (v_chunk_bits >> 11u)))); +- self->private_data.f_scratch[(v_p0 + 21u)] = ((uint8_t)((1u & (v_chunk_bits >> 10u)))); +- self->private_data.f_scratch[(v_p0 + 22u)] = ((uint8_t)((1u & (v_chunk_bits >> 9u)))); +- self->private_data.f_scratch[(v_p0 + 23u)] = ((uint8_t)((1u & (v_chunk_bits >> 8u)))); +- self->private_data.f_scratch[(v_p0 + 24u)] = ((uint8_t)((1u & (v_chunk_bits >> 7u)))); +- self->private_data.f_scratch[(v_p0 + 25u)] = ((uint8_t)((1u & (v_chunk_bits >> 6u)))); +- self->private_data.f_scratch[(v_p0 + 26u)] = ((uint8_t)((1u & (v_chunk_bits >> 5u)))); +- self->private_data.f_scratch[(v_p0 + 27u)] = ((uint8_t)((1u & (v_chunk_bits >> 4u)))); +- self->private_data.f_scratch[(v_p0 + 28u)] = ((uint8_t)((1u & (v_chunk_bits >> 3u)))); +- self->private_data.f_scratch[(v_p0 + 29u)] = ((uint8_t)((1u & (v_chunk_bits >> 2u)))); +- self->private_data.f_scratch[(v_p0 + 30u)] = ((uint8_t)((1u & (v_chunk_bits >> 1u)))); +- self->private_data.f_scratch[(v_p0 + 31u)] = ((uint8_t)((1u & (v_chunk_bits >> 0u)))); +- v_p0 = ((v_p0 & 511u) + 32u); +- v_chunk_count -= 1u; +- } +- } else if (self->private_impl.f_bits_per_pixel == 2u) { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u); +- v_chunk_count = wuffs_base__u32__min(v_chunk_count, 32u); +- while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { +- v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4u; +- self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((3u & (v_chunk_bits >> 30u)))); +- self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((3u & (v_chunk_bits >> 28u)))); +- self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((3u & (v_chunk_bits >> 26u)))); +- self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((3u & (v_chunk_bits >> 24u)))); +- self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((3u & (v_chunk_bits >> 22u)))); +- self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((3u & (v_chunk_bits >> 20u)))); +- self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((3u & (v_chunk_bits >> 18u)))); +- self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((3u & (v_chunk_bits >> 16u)))); +- self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((3u & (v_chunk_bits >> 14u)))); +- self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((3u & (v_chunk_bits >> 12u)))); +- self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((3u & (v_chunk_bits >> 10u)))); +- self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((3u & (v_chunk_bits >> 8u)))); +- self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((3u & (v_chunk_bits >> 6u)))); +- self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((3u & (v_chunk_bits >> 4u)))); +- self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((3u & (v_chunk_bits >> 2u)))); +- self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((3u & (v_chunk_bits >> 0u)))); +- v_p0 = ((v_p0 & 511u) + 16u); +- v_chunk_count -= 1u; +- } +- } else { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u); +- v_chunk_count = wuffs_base__u32__min(v_chunk_count, 64u); +- while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { +- v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4u; +- self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 28u)))); +- self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 24u)))); +- self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 20u)))); +- self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 16u)))); +- self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u)))); +- self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u)))); +- self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u)))); +- self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u)))); +- v_p0 = ((v_p0 & 511u) + 8u); +- v_chunk_count -= 1u; +- } +- } +- v_p0 = wuffs_base__u32__min(v_p0, wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x)); +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0)); +- if (v_n == 0u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- } +- status = wuffs_base__make_status(NULL); +- goto ok; +- +- ok: +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func bmp.decoder.frame_dirty_rect +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_bmp__decoder__frame_dirty_rect( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); ++ if (last_column) { ++ src_len--; + } + +- return wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height); +-} ++ if (src_len < 32) { ++ // This fallback is the same as the non-SIMD-capable code path. ++ for (; src_len > 0u; src_len--) { ++ uint32_t sv_major_m1 = sp_major[-1]; ++ uint32_t sv_minor_m1 = sp_minor[-1]; ++ uint32_t sv_major_p1 = sp_major[+1]; ++ uint32_t sv_minor_p1 = sp_minor[+1]; + +-// -------- func bmp.decoder.num_animation_loops ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_bmp__decoder__num_animation_loops( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ } else { ++ while (src_len > 0u) { ++ // Load 1+32+1 samples (six u8x32 vectors) from the major (jxx) and minor ++ // (nxx) rows. ++ // ++ // major_p0 = [j00 j01 j02 j03 .. j28 j29 j30 j31] // p0 = "plus 0" ++ // minor_p0 = [n00 n01 n02 n03 .. n28 n29 n30 n31] // p0 = "plus 0" ++ // major_m1 = [jm1 j00 j01 j02 .. j27 j28 j29 j30] // m1 = "minus 1" ++ // minor_m1 = [nm1 n00 n01 n02 .. n27 n28 n29 n30] // m1 = "minus 1" ++ // major_p1 = [j01 j02 j03 j04 .. j29 j30 j31 j32] // p1 = "plus 1" ++ // minor_p1 = [n01 n02 n03 n04 .. n29 n30 n31 n32] // p1 = "plus 1" ++ __m256i major_p0 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 0)); ++ __m256i minor_p0 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 0)); ++ __m256i major_m1 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major - 1)); ++ __m256i minor_m1 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor - 1)); ++ __m256i major_p1 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 1)); ++ __m256i minor_p1 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 1)); + +- return 0u; +-} ++ // Unpack, staying with u8x32 vectors. ++ // ++ // step1_p0_lo = [j00 n00 j01 n01 .. j07 n07 j16 n16 j17 n17 .. j23 n23] ++ // step1_p0_hi = [j08 n08 j09 n09 .. j15 n15 j24 n24 j25 n25 .. j31 n31] ++ // step1_m1_lo = [jm1 nm1 j00 n00 .. j06 n06 j15 n15 j16 n16 .. j22 n22] ++ // step1_m1_hi = [j07 n07 j08 n08 .. j14 n14 j23 n23 j24 n24 .. j30 n30] ++ // step1_p1_lo = [j01 n01 j02 n02 .. j08 n08 j17 n17 j18 n18 .. j24 n24] ++ // step1_p1_hi = [j09 n09 j10 n10 .. j16 n16 j25 n25 j26 n26 .. j32 n32] ++ __m256i step1_p0_lo = _mm256_unpacklo_epi8(major_p0, minor_p0); ++ __m256i step1_p0_hi = _mm256_unpackhi_epi8(major_p0, minor_p0); ++ __m256i step1_m1_lo = _mm256_unpacklo_epi8(major_m1, minor_m1); ++ __m256i step1_m1_hi = _mm256_unpackhi_epi8(major_m1, minor_m1); ++ __m256i step1_p1_lo = _mm256_unpacklo_epi8(major_p1, minor_p1); ++ __m256i step1_p1_hi = _mm256_unpackhi_epi8(major_p1, minor_p1); + +-// -------- func bmp.decoder.num_decoded_frame_configs ++ // Multiply-add to get u16x16 vectors. ++ // ++ // step2_p0_lo = [9*j00+3*n00 9*j01+3*n01 .. 9*j23+3*n23] ++ // step2_p0_hi = [9*j08+3*n08 9*j09+3*n09 .. 9*j31+3*n31] ++ // step2_m1_lo = [3*jm1+1*nm1 3*j00+1*n00 .. 3*j22+1*n22] ++ // step2_m1_hi = [3*j07+1*n07 3*j08+1*n08 .. 3*j30+1*n30] ++ // step2_p1_lo = [3*j01+1*n01 3*j02+1*n02 .. 3*j24+1*n24] ++ // step2_p1_hi = [3*j09+1*n09 3*j10+1*n10 .. 3*j32+1*n32] ++ const __m256i k0309 = _mm256_set1_epi16(0x0309); ++ const __m256i k0103 = _mm256_set1_epi16(0x0103); ++ __m256i step2_p0_lo = _mm256_maddubs_epi16(step1_p0_lo, k0309); ++ __m256i step2_p0_hi = _mm256_maddubs_epi16(step1_p0_hi, k0309); ++ __m256i step2_m1_lo = _mm256_maddubs_epi16(step1_m1_lo, k0103); ++ __m256i step2_m1_hi = _mm256_maddubs_epi16(step1_m1_hi, k0103); ++ __m256i step2_p1_lo = _mm256_maddubs_epi16(step1_p1_lo, k0103); ++ __m256i step2_p1_hi = _mm256_maddubs_epi16(step1_p1_hi, k0103); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bmp__decoder__num_decoded_frame_configs( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ // Compute the weighted sums of (p0, m1) and (p0, p1). For example: ++ // ++ // step3_m1_lo[00] = ((9*j00) + (3*n00) + (3*jm1) + (1*nm1)) as u16 ++ // step3_p1_hi[15] = ((9*j31) + (3*n31) + (3*j32) + (1*n32)) as u16 ++ __m256i step3_m1_lo = _mm256_add_epi16(step2_p0_lo, step2_m1_lo); ++ __m256i step3_m1_hi = _mm256_add_epi16(step2_p0_hi, step2_m1_hi); ++ __m256i step3_p1_lo = _mm256_add_epi16(step2_p0_lo, step2_p1_lo); ++ __m256i step3_p1_hi = _mm256_add_epi16(step2_p0_hi, step2_p1_hi); + +- if (self->private_impl.f_call_sequence > 32u) { +- return 1u; +- } +- return 0u; +-} ++ // Bias by 8 (on the left) or 7 (on the right) and then divide by 16 ++ // (which is 9+3+3+1) to get a weighted average. On the left (m1), shift ++ // the u16 right value by 4. On the right (p1), shift right by 4 and then ++ // shift left by 8 so that, when still in the u16x16 little-endian ++ // interpretation, we have: ++ // - m1_element = (etcetera + 8) >> 4 ++ // - p1_element = ((etcetera + 7) >> 4) << 8 ++ // ++ // step4_m1_lo = [0x00?? 0x00?? ... 0x00?? 0x00??] ++ // step4_p1_lo = [0x??00 0x??00 ... 0x??00 0x??00] ++ // step4_m1_hi = [0x00?? 0x00?? ... 0x00?? 0x00??] ++ // step4_p1_hi = [0x??00 0x??00 ... 0x??00 0x??00] ++ __m256i step4_m1_lo = _mm256_srli_epi16( ++ _mm256_add_epi16(step3_m1_lo, _mm256_set1_epi16(8)), 4); ++ __m256i step4_p1_lo = _mm256_slli_epi16( ++ _mm256_srli_epi16(_mm256_add_epi16(step3_p1_lo, _mm256_set1_epi16(7)), ++ 4), ++ 8); ++ __m256i step4_m1_hi = _mm256_srli_epi16( ++ _mm256_add_epi16(step3_m1_hi, _mm256_set1_epi16(8)), 4); ++ __m256i step4_p1_hi = _mm256_slli_epi16( ++ _mm256_srli_epi16(_mm256_add_epi16(step3_p1_hi, _mm256_set1_epi16(7)), ++ 4), ++ 8); + +-// -------- func bmp.decoder.num_decoded_frames ++ // Bitwise-or two "0x00"-rich u16x16 vectors to get a u8x32 vector. Do ++ // that twice. Once for the low columns and once for the high columns. ++ // ++ // In terms of jxx (major row) or nxx (minor row) source samples: ++ // - low columns means ( 0 .. 8; 16 .. 24). ++ // - high columns means ( 8 .. 16; 24 .. 32). ++ // ++ // In terms of dxx destination samples (there are twice as many): ++ // - low columns means ( 0 .. 16; 32 .. 48). ++ // - high columns means (16 .. 32; 48 .. 64). ++ // ++ // step5_lo = [d00 d01 .. d14 d15 d32 d33 .. d46 d47] ++ // step5_hi = [d16 d17 .. d30 d31 d48 d49 .. d62 d63] ++ // ++ // The d00, d02 ... d62 even elements come from (p0, m1) weighted sums. ++ // The d01, d03 ... d63 odd elements come from (p0, p1) weighted sums. ++ __m256i step5_lo = _mm256_or_si256(step4_m1_lo, step4_p1_lo); ++ __m256i step5_hi = _mm256_or_si256(step4_m1_hi, step4_p1_hi); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bmp__decoder__num_decoded_frames( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ // Permute and store. ++ // ++ // step6_00_31 = [d00 d01 .. d14 d15 d16 d17 .. d30 d31] ++ // step6_32_63 = [d32 d33 .. d46 d47 d48 d49 .. d62 d63] ++ __m256i step6_00_31 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x20); ++ __m256i step6_32_63 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x31); ++ _mm256_storeu_si256((__m256i*)(void*)(dp + 0x00), step6_00_31); ++ _mm256_storeu_si256((__m256i*)(void*)(dp + 0x20), step6_32_63); + +- if (self->private_impl.f_call_sequence > 64u) { +- return 1u; ++ // Advance by up to 32 source samples (64 destination samples). The first ++ // iteration might be smaller than 32 so that all of the remaining steps ++ // are exactly 32. ++ size_t n = 32u - (31u & (0u - src_len)); ++ dp += 2u * n; ++ sp_major += n; ++ sp_minor += n; ++ src_len -= n; ++ } + } +- return 0u; +-} + +-// -------- func bmp.decoder.restart_frame ++ if (last_column) { ++ uint32_t sv_major_m1 = sp_major[-1]; ++ uint32_t sv_minor_m1 = sp_minor[-1]; ++ uint32_t sv_major_p1 = sp_major[+0]; // Clamp offset to zero. ++ uint32_t sv_minor_p1 = sp_minor[+0]; // Clamp offset to zero. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__restart_frame( +- wuffs_bmp__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); + } + +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } +- if (a_index != 0u) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- self->private_impl.f_call_sequence = 40u; +- self->private_impl.f_frame_config_io_position = a_io_position; +- return wuffs_base__make_status(NULL); ++ return dst_ptr; + } ++#endif ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++// ‼ WUFFS MULTI-FILE SECTION -x86_avx2 + +-// -------- func bmp.decoder.set_report_metadata +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_bmp__decoder__set_report_metadata( +- wuffs_bmp__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_base__make_empty_struct(); +-} ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV) + +-// -------- func bmp.decoder.tell_me_more ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__UTF8) + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__tell_me_more( +- wuffs_bmp__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); ++// ---------------- Unicode and UTF-8 + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point) { ++ if (code_point <= 0x7F) { ++ if (dst.len >= 1) { ++ dst.ptr[0] = (uint8_t)(code_point); ++ return 1; ++ } + +- uint32_t coro_susp_point = self->private_impl.p_tell_me_more[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ } else if (code_point <= 0x07FF) { ++ if (dst.len >= 2) { ++ dst.ptr[0] = (uint8_t)(0xC0 | ((code_point >> 6))); ++ dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); ++ return 2; ++ } + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_bmp__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } else if (code_point <= 0xFFFF) { ++ if ((dst.len >= 3) && ((code_point < 0xD800) || (0xDFFF < code_point))) { ++ dst.ptr[0] = (uint8_t)(0xE0 | ((code_point >> 12))); ++ dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F)); ++ dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); ++ return 3; + } + +- ok: +- self->private_impl.p_tell_me_more[0] = 0; +- goto exit; ++ } else if (code_point <= 0x10FFFF) { ++ if (dst.len >= 4) { ++ dst.ptr[0] = (uint8_t)(0xF0 | ((code_point >> 18))); ++ dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 12) & 0x3F)); ++ dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F)); ++ dst.ptr[3] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); ++ return 4; ++ } + } + +- goto suspend; +- suspend: +- self->private_impl.p_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; ++ return 0; + } + +-// -------- func bmp.decoder.do_tell_me_more +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_tell_me_more( +- wuffs_bmp__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++// wuffs_base__utf_8__byte_length_minus_1 is the byte length (minus 1) of a ++// UTF-8 encoded code point, based on the encoding's initial byte. ++// - 0x00 is 1-byte UTF-8 (ASCII). ++// - 0x01 is the start of 2-byte UTF-8. ++// - 0x02 is the start of 3-byte UTF-8. ++// - 0x03 is the start of 4-byte UTF-8. ++// - 0x40 is a UTF-8 tail byte. ++// - 0x80 is invalid UTF-8. ++// ++// RFC 3629 (UTF-8) gives this grammar for valid UTF-8: ++// UTF8-1 = %x00-7F ++// UTF8-2 = %xC2-DF UTF8-tail ++// UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) / ++// %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail ) ++// UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) / ++// %xF4 %x80-8F 2( UTF8-tail ) ++// UTF8-tail = %x80-BF ++static const uint8_t wuffs_base__utf_8__byte_length_minus_1[256] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x30 ..= 0x37. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. + +- if (self->private_impl.f_io_redirect_fourcc <= 1u) { +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; +- } +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- 1u, +- self->private_impl.f_io_redirect_fourcc, +- 0u, +- self->private_impl.f_io_redirect_pos, +- 18446744073709551615u); +- } +- self->private_impl.f_io_redirect_fourcc = 1u; ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. + +- goto ok; +- ok: +- goto exit; +- exit: +- return status; +-} ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x80 ..= 0x87. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x88 ..= 0x8F. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x90 ..= 0x97. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x98 ..= 0x9F. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA0 ..= 0xA7. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA8 ..= 0xAF. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB0 ..= 0xB7. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB8 ..= 0xBF. + +-// -------- func bmp.decoder.history_retain_length ++ 0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC0 ..= 0xC7. ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC8 ..= 0xCF. ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD0 ..= 0xD7. ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD8 ..= 0xDF. ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE0 ..= 0xE7. ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE8 ..= 0xEF. ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bmp__decoder__history_retain_length( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output // ++wuffs_base__utf_8__next(const uint8_t* s_ptr, size_t s_len) { ++ if (s_len == 0) { ++ return wuffs_base__make_utf_8__next__output(0, 0); + } ++ uint32_t c = s_ptr[0]; ++ switch (wuffs_base__utf_8__byte_length_minus_1[c & 0xFF]) { ++ case 0: ++ return wuffs_base__make_utf_8__next__output(c, 1); + +- return 0u; +-} ++ case 1: ++ if (s_len < 2) { ++ break; ++ } ++ c = wuffs_base__peek_u16le__no_bounds_check(s_ptr); ++ if ((c & 0xC000) != 0x8000) { ++ break; ++ } ++ c = (0x0007C0 & (c << 6)) | (0x00003F & (c >> 8)); ++ return wuffs_base__make_utf_8__next__output(c, 2); + +-// -------- func bmp.decoder.workbuf_len ++ case 2: ++ if (s_len < 3) { ++ break; ++ } ++ c = wuffs_base__peek_u24le__no_bounds_check(s_ptr); ++ if ((c & 0xC0C000) != 0x808000) { ++ break; ++ } ++ c = (0x00F000 & (c << 12)) | (0x000FC0 & (c >> 2)) | ++ (0x00003F & (c >> 16)); ++ if ((c <= 0x07FF) || ((0xD800 <= c) && (c <= 0xDFFF))) { ++ break; ++ } ++ return wuffs_base__make_utf_8__next__output(c, 3); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_bmp__decoder__workbuf_len( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ case 3: ++ if (s_len < 4) { ++ break; ++ } ++ c = wuffs_base__peek_u32le__no_bounds_check(s_ptr); ++ if ((c & 0xC0C0C000) != 0x80808000) { ++ break; ++ } ++ c = (0x1C0000 & (c << 18)) | (0x03F000 & (c << 4)) | ++ (0x000FC0 & (c >> 10)) | (0x00003F & (c >> 24)); ++ if ((c <= 0xFFFF) || (0x110000 <= c)) { ++ break; ++ } ++ return wuffs_base__make_utf_8__next__output(c, 4); + } + +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ return wuffs_base__make_utf_8__next__output( ++ WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1); + } + +-// -------- func bmp.decoder.read_palette +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__read_palette( +- wuffs_bmp__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_i = 0; +- uint32_t v_argb = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_read_palette[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_read_palette[0].v_i; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output // ++wuffs_base__utf_8__next_from_end(const uint8_t* s_ptr, size_t s_len) { ++ if (s_len == 0) { ++ return wuffs_base__make_utf_8__next__output(0, 0); + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ const uint8_t* ptr = &s_ptr[s_len - 1]; ++ if (*ptr < 0x80) { ++ return wuffs_base__make_utf_8__next__output(*ptr, 1); + +- if (self->private_impl.f_bitmap_info_len == 12u) { +- while ((v_i < 256u) && (self->private_impl.f_padding >= 3u)) { +- self->private_impl.f_padding -= 3u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { +- t_0 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); +- iop_a_src += 3; +- } else { +- self->private_data.s_read_palette[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_read_palette[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 16) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; +- } +- } +- v_argb = t_0; +- } +- v_argb |= 4278190080u; +- self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); +- self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); +- self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); +- v_i += 1u; ++ } else if (*ptr < 0xC0) { ++ const uint8_t* too_far = &s_ptr[(s_len > 4) ? (s_len - 4) : 0]; ++ uint32_t n = 1; ++ while (ptr != too_far) { ++ ptr--; ++ n++; ++ if (*ptr < 0x80) { ++ break; ++ } else if (*ptr < 0xC0) { ++ continue; + } +- } else { +- while ((v_i < 256u) && (self->private_impl.f_padding >= 4u)) { +- self->private_impl.f_padding -= 4u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_read_palette[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_read_palette[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; +- } +- } +- v_argb = t_1; +- } +- v_argb |= 4278190080u; +- self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); +- self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); +- self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); +- v_i += 1u; ++ wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(ptr, n); ++ if (o.byte_length != n) { ++ break; + } ++ return o; + } +- while (v_i < 256u) { +- self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u; +- v_i += 1u; +- } +- +- goto ok; +- ok: +- self->private_impl.p_read_palette[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_read_palette[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_read_palette[0].v_i = v_i; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return status; ++ return wuffs_base__make_utf_8__next__output( ++ WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1); + } + +-// -------- func bmp.decoder.process_masks +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__process_masks( +- wuffs_bmp__decoder* self) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_i = 0; +- uint32_t v_mask = 0; +- uint32_t v_n = 0; +- +- while (v_i < 4u) { +- v_mask = self->private_impl.f_channel_masks[v_i]; +- if (v_mask != 0u) { +- v_n = 0u; +- while ((v_mask & 1u) == 0u) { +- v_n += 1u; +- v_mask >>= 1u; +- } +- self->private_impl.f_channel_shifts[v_i] = ((uint8_t)((v_n & 31u))); +- v_n = 0u; +- while ((v_mask & 1u) == 1u) { +- v_n += 1u; +- v_mask >>= 1u; +- } +- if ((v_mask != 0u) || (v_n > 32u)) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } +- self->private_impl.f_channel_num_bits[v_i] = ((uint8_t)(v_n)); +- } else if (v_i != 3u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__utf_8__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) { ++ // TODO: possibly optimize the all-ASCII case (4 or 8 bytes at a time). ++ // ++ // TODO: possibly optimize this by manually inlining the ++ // wuffs_base__utf_8__next calls. ++ size_t original_len = s_len; ++ while (s_len > 0) { ++ wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(s_ptr, s_len); ++ if ((o.code_point > 0x7F) && (o.byte_length == 1)) { ++ break; + } +- v_i += 1u; ++ s_ptr += o.byte_length; ++ s_len -= o.byte_length; + } ++ return original_len - s_len; ++} + +- goto ok; +- ok: +- goto exit; +- exit: +- return status; ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__ascii__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) { ++ // TODO: possibly optimize this by checking 4 or 8 bytes at a time. ++ const uint8_t* original_ptr = s_ptr; ++ const uint8_t* p = s_ptr; ++ const uint8_t* q = s_ptr + s_len; ++ for (; (p != q) && ((*p & 0x80) == 0); p++) { ++ } ++ return (size_t)(p - original_ptr); + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__UTF8) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) ++#ifdef __cplusplus ++} // extern "C" ++#endif + +-// ---------------- Status Codes Implementations ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) + +-const char wuffs_bzip2__error__bad_huffman_code_over_subscribed[] = "#bzip2: bad Huffman code (over-subscribed)"; +-const char wuffs_bzip2__error__bad_huffman_code_under_subscribed[] = "#bzip2: bad Huffman code (under-subscribed)"; +-const char wuffs_bzip2__error__bad_block_header[] = "#bzip2: bad block header"; +-const char wuffs_bzip2__error__bad_block_length[] = "#bzip2: bad block length"; +-const char wuffs_bzip2__error__bad_checksum[] = "#bzip2: bad checksum"; +-const char wuffs_bzip2__error__bad_header[] = "#bzip2: bad header"; +-const char wuffs_bzip2__error__bad_number_of_sections[] = "#bzip2: bad number of sections"; +-const char wuffs_bzip2__error__truncated_input[] = "#bzip2: truncated input"; +-const char wuffs_bzip2__error__unsupported_block_randomization[] = "#bzip2: unsupported block randomization"; +-const char wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state[] = "#bzip2: internal error: inconsistent Huffman decoder state"; ++// ---------------- Status Codes Implementations + + // ---------------- Private Consts + +-static const uint8_t +-WUFFS_BZIP2__CLAMP_TO_5[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 1, 2, 3, 4, 5, 5, 5, +-}; +- +-static const uint32_t +-WUFFS_BZIP2__REV_CRC32_TABLE[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 79764919, 159529838, 222504665, 319059676, 398814059, 445009330, 507990021, +- 638119352, 583659535, 797628118, 726387553, 890018660, 835552979, 1015980042, 944750013, +- 1276238704, 1221641927, 1167319070, 1095957929, 1595256236, 1540665371, 1452775106, 1381403509, +- 1780037320, 1859660671, 1671105958, 1733955601, 2031960084, 2111593891, 1889500026, 1952343757, +- 2552477408, 2632100695, 2443283854, 2506133561, 2334638140, 2414271883, 2191915858, 2254759653, +- 3190512472, 3135915759, 3081330742, 3009969537, 2905550212, 2850959411, 2762807018, 2691435357, +- 3560074640, 3505614887, 3719321342, 3648080713, 3342211916, 3287746299, 3467911202, 3396681109, +- 4063920168, 4143685023, 4223187782, 4286162673, 3779000052, 3858754371, 3904687514, 3967668269, +- 881225847, 809987520, 1023691545, 969234094, 662832811, 591600412, 771767749, 717299826, +- 311336399, 374308984, 453813921, 533576470, 25881363, 88864420, 134795389, 214552010, +- 2023205639, 2086057648, 1897238633, 1976864222, 1804852699, 1867694188, 1645340341, 1724971778, +- 1587496639, 1516133128, 1461550545, 1406951526, 1302016099, 1230646740, 1142491917, 1087903418, +- 2896545431, 2825181984, 2770861561, 2716262478, 3215044683, 3143675388, 3055782693, 3001194130, +- 2326604591, 2389456536, 2200899649, 2280525302, 2578013683, 2640855108, 2418763421, 2498394922, +- 3769900519, 3832873040, 3912640137, 3992402750, 4088425275, 4151408268, 4197601365, 4277358050, +- 3334271071, 3263032808, 3476998961, 3422541446, 3585640067, 3514407732, 3694837229, 3640369242, +- 1762451694, 1842216281, 1619975040, 1682949687, 2047383090, 2127137669, 1938468188, 2001449195, +- 1325665622, 1271206113, 1183200824, 1111960463, 1543535498, 1489069629, 1434599652, 1363369299, +- 622672798, 568075817, 748617968, 677256519, 907627842, 853037301, 1067152940, 995781531, +- 51762726, 131386257, 177728840, 240578815, 269590778, 349224269, 429104020, 491947555, +- 4046411278, 4126034873, 4172115296, 4234965207, 3794477266, 3874110821, 3953728444, 4016571915, +- 3609705398, 3555108353, 3735388376, 3664026991, 3290680682, 3236090077, 3449943556, 3378572211, +- 3174993278, 3120533705, 3032266256, 2961025959, 2923101090, 2868635157, 2813903052, 2742672763, +- 2604032198, 2683796849, 2461293480, 2524268063, 2284983834, 2364738477, 2175806836, 2238787779, +- 1569362073, 1498123566, 1409854455, 1355396672, 1317987909, 1246755826, 1192025387, 1137557660, +- 2072149281, 2135122070, 1912620623, 1992383480, 1753615357, 1816598090, 1627664531, 1707420964, +- 295390185, 358241886, 404320391, 483945776, 43990325, 106832002, 186451547, 266083308, +- 932423249, 861060070, 1041341759, 986742920, 613929101, 542559546, 756411363, 701822548, +- 3316196985, 3244833742, 3425377559, 3370778784, 3601682597, 3530312978, 3744426955, 3689838204, +- 3819031489, 3881883254, 3928223919, 4007849240, 4037393693, 4100235434, 4180117107, 4259748804, +- 2310601993, 2373574846, 2151335527, 2231098320, 2596047829, 2659030626, 2470359227, 2550115596, +- 2947551409, 2876312838, 2788305887, 2733848168, 3165939309, 3094707162, 3040238851, 2985771188, +-}; +- + // ---------------- Private Initializer Prototypes + + // ---------------- Private Function Prototypes + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__do_transform_io( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__prepare_block( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__read_code_lengths( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__build_huffman_tree( +- wuffs_bzip2__decoder* self, +- uint32_t a_which); +- + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_bzip2__decoder__build_huffman_table( +- wuffs_bzip2__decoder* self, +- uint32_t a_which); ++wuffs_adler32__hasher__up( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_bzip2__decoder__invert_bwt( +- wuffs_bzip2__decoder* self); ++wuffs_adler32__hasher__up__choosy_default( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x); + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_bzip2__decoder__flush_fast( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__flush_slow( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__decode_huffman_fast( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src); ++wuffs_adler32__hasher__up_arm_neon( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__decode_huffman_slow( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src); ++static wuffs_base__empty_struct ++wuffs_adler32__hasher__up_x86_sse42( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + + // ---------------- VTables + +-const wuffs_base__io_transformer__func_ptrs +-wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++const wuffs_base__hasher_u32__func_ptrs ++wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = { ++ (uint32_t(*)(const void*))(&wuffs_adler32__hasher__checksum_u32), + (uint64_t(*)(const void*, +- uint32_t))(&wuffs_bzip2__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_bzip2__decoder__history_retain_length), ++ uint32_t))(&wuffs_adler32__hasher__get_quirk), + (wuffs_base__status(*)(void*, + uint32_t, +- uint64_t))(&wuffs_bzip2__decoder__set_quirk), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_bzip2__decoder__transform_io), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bzip2__decoder__workbuf_len), ++ uint64_t))(&wuffs_adler32__hasher__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_adler32__hasher__update), ++ (uint32_t(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_adler32__hasher__update_u32), + }; + + // ---------------- Initializer Implementations + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_bzip2__decoder__initialize( +- wuffs_bzip2__decoder* self, ++wuffs_adler32__hasher__initialize( ++ wuffs_adler32__hasher* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ +@@ -30559,23 +30841,25 @@ wuffs_bzip2__decoder__initialize( + } + } + ++ self->private_impl.choosy_up = &wuffs_adler32__hasher__up__choosy_default; ++ + self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = +- wuffs_base__io_transformer__vtable_name; +- self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = +- (const void*)(&wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = ++ wuffs_base__hasher_u32__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = ++ (const void*)(&wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32); + return wuffs_base__make_status(NULL); + } + +-wuffs_bzip2__decoder* +-wuffs_bzip2__decoder__alloc(void) { +- wuffs_bzip2__decoder* x = +- (wuffs_bzip2__decoder*)(calloc(sizeof(wuffs_bzip2__decoder), 1)); ++wuffs_adler32__hasher* ++wuffs_adler32__hasher__alloc(void) { ++ wuffs_adler32__hasher* x = ++ (wuffs_adler32__hasher*)(calloc(1, sizeof(wuffs_adler32__hasher))); + if (!x) { + return NULL; + } +- if (wuffs_bzip2__decoder__initialize( +- x, sizeof(wuffs_bzip2__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ if (wuffs_adler32__hasher__initialize( ++ x, sizeof(wuffs_adler32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } +@@ -30583,18 +30867,18 @@ wuffs_bzip2__decoder__alloc(void) { + } + + size_t +-sizeof__wuffs_bzip2__decoder(void) { +- return sizeof(wuffs_bzip2__decoder); ++sizeof__wuffs_adler32__hasher(void) { ++ return sizeof(wuffs_adler32__hasher); + } + + // ---------------- Function Implementations + +-// -------- func bzip2.decoder.get_quirk ++// -------- func adler32.hasher.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bzip2__decoder__get_quirk( +- const wuffs_bzip2__decoder* self, ++wuffs_adler32__hasher__get_quirk( ++ const wuffs_adler32__hasher* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -30607,12 +30891,12 @@ wuffs_bzip2__decoder__get_quirk( + return 0u; + } + +-// -------- func bzip2.decoder.set_quirk ++// -------- func adler32.hasher.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bzip2__decoder__set_quirk( +- wuffs_bzip2__decoder* self, ++wuffs_adler32__hasher__set_quirk( ++ wuffs_adler32__hasher* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -30625,369 +30909,699 @@ wuffs_bzip2__decoder__set_quirk( + : wuffs_base__error__initialize_not_called); + } + +- if (a_key == 1u) { +- self->private_impl.f_ignore_checksum = (a_value > 0u); +- return wuffs_base__make_status(NULL); +- } + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func bzip2.decoder.history_retain_length ++// -------- func adler32.hasher.update + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bzip2__decoder__history_retain_length( +- const wuffs_bzip2__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_adler32__hasher__update( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return 0; ++ return wuffs_base__make_empty_struct(); + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); + } + +- return 0u; ++ if ( ! self->private_impl.f_started) { ++ self->private_impl.f_started = true; ++ self->private_impl.f_state = 1u; ++ self->private_impl.choosy_up = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_adler32__hasher__up_arm_neon : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_adler32__hasher__up_x86_sse42 : ++#endif ++ self->private_impl.choosy_up); ++ } ++ wuffs_adler32__hasher__up(self, a_x); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func bzip2.decoder.workbuf_len ++// -------- func adler32.hasher.update_u32 + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_bzip2__decoder__workbuf_len( +- const wuffs_bzip2__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_adler32__hasher__update_u32( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ return 0; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return 0; + } + +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ wuffs_adler32__hasher__update(self, a_x); ++ return self->private_impl.f_state; + } + +-// -------- func bzip2.decoder.transform_io ++// -------- func adler32.hasher.up + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bzip2__decoder__transform_io( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++static wuffs_base__empty_struct ++wuffs_adler32__hasher__up( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ return (*self->private_impl.choosy_up)(self, a_x); ++} + +- uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_adler32__hasher__up__choosy_default( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_s1 = 0; ++ uint32_t v_s2 = 0; ++ wuffs_base__slice_u8 v_remaining = {0}; ++ wuffs_base__slice_u8 v_p = {0}; + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_bzip2__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); +- v_status = t_0; ++ v_s1 = ((self->private_impl.f_state) & 0xFFFFu); ++ v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); ++ while (((uint64_t)(a_x.len)) > 0u) { ++ v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); ++ if (((uint64_t)(a_x.len)) > 5552u) { ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5552u); ++ a_x = wuffs_base__slice_u8__subslice_j(a_x, 5552u); ++ } ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 1; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8)); ++ while (v_p.ptr < i_end0_p) { ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; + } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__truncated_input); +- goto exit; ++ v_p.len = 1; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end1_p) { ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ v_p.len = 0; + } +- +- ok: +- self->private_impl.p_transform_io[0] = 0; +- goto exit; ++ v_s1 %= 65521u; ++ v_s2 %= 65521u; ++ a_x = v_remaining; + } ++ self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); ++ return wuffs_base__make_empty_struct(); ++} + +- goto suspend; +- suspend: +- self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++// -------- func adler32.hasher.checksum_u32 + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_adler32__hasher__checksum_u32( ++ const wuffs_adler32__hasher* self) { ++ if (!self) { ++ return 0; + } +- return status; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return self->private_impl.f_state; + } + +-// -------- func bzip2.decoder.do_transform_io ++// ‼ WUFFS MULTI-FILE SECTION +arm_neon ++// -------- func adler32.hasher.up_arm_neon + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__do_transform_io( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- uint32_t v_i = 0; +- uint64_t v_tag = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint32_t v_final_checksum_want = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++static wuffs_base__empty_struct ++wuffs_adler32__hasher__up_arm_neon( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_s1 = 0; ++ uint32_t v_s2 = 0; ++ wuffs_base__slice_u8 v_remaining = {0}; ++ wuffs_base__slice_u8 v_p = {0}; ++ uint8x16_t v_p__left = {0}; ++ uint8x16_t v_p_right = {0}; ++ uint32x4_t v_v1 = {0}; ++ uint32x4_t v_v2 = {0}; ++ uint16x8_t v_col0 = {0}; ++ uint16x8_t v_col1 = {0}; ++ uint16x8_t v_col2 = {0}; ++ uint16x8_t v_col3 = {0}; ++ uint32x2_t v_sum1 = {0}; ++ uint32x2_t v_sum2 = {0}; ++ uint32x2_t v_sum12 = {0}; ++ uint32_t v_num_iterate_bytes = 0; ++ uint64_t v_tail_index = 0; + +- uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_do_transform_io[0].v_i; +- v_tag = self->private_data.s_do_transform_io[0].v_tag; +- v_final_checksum_want = self->private_data.s_do_transform_io[0].v_final_checksum_want; ++ v_s1 = ((self->private_impl.f_state) & 0xFFFFu); ++ v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); ++ while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { ++ v_s1 += ((uint32_t)(a_x.ptr[0u])); ++ v_s2 += v_s1; ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c != 66u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); +- goto exit; ++ v_s1 %= 65521u; ++ v_s2 %= 65521u; ++ while (((uint64_t)(a_x.len)) > 0u) { ++ v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); ++ if (((uint64_t)(a_x.len)) > 5536u) { ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u); ++ a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u); + } ++ v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u))); ++ v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes)); ++ v_v1 = vdupq_n_u32(0u); ++ v_v2 = vdupq_n_u32(0u); ++ v_col0 = vdupq_n_u16(0u); ++ v_col1 = vdupq_n_u16(0u); ++ v_col2 = vdupq_n_u16(0u); ++ v_col3 = vdupq_n_u16(0u); + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 32; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32)); ++ while (v_p.ptr < i_end0_p) { ++ v_p__left = vld1q_u8(v_p.ptr); ++ v_p_right = vld1q_u8(v_p.ptr + 16u); ++ v_v2 = vaddq_u32(v_v2, v_v1); ++ v_v1 = vpadalq_u16(v_v1, vpadalq_u8(vpaddlq_u8(v_p__left), v_p_right)); ++ v_col0 = vaddw_u8(v_col0, vget_low_u8(v_p__left)); ++ v_col1 = vaddw_u8(v_col1, vget_high_u8(v_p__left)); ++ v_col2 = vaddw_u8(v_col2, vget_low_u8(v_p_right)); ++ v_col3 = vaddw_u8(v_col3, vget_high_u8(v_p_right)); ++ v_p.ptr += 32; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- if (v_c != 90u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); +- goto exit; ++ v_p.len = 0; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_v2 = vshlq_n_u32(v_v2, 5u); ++ v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col0), ((uint16x4_t){32u, 31u, 30u, 29u})); ++ v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col0), ((uint16x4_t){28u, 27u, 26u, 25u})); ++ v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col1), ((uint16x4_t){24u, 23u, 22u, 21u})); ++ v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col1), ((uint16x4_t){20u, 19u, 18u, 17u})); ++ v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col2), ((uint16x4_t){16u, 15u, 14u, 13u})); ++ v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col2), ((uint16x4_t){12u, 11u, 10u, 9u})); ++ v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col3), ((uint16x4_t){8u, 7u, 6u, 5u})); ++ v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col3), ((uint16x4_t){4u, 3u, 2u, 1u})); ++ v_sum1 = vpadd_u32(vget_low_u32(v_v1), vget_high_u32(v_v1)); ++ v_sum2 = vpadd_u32(vget_low_u32(v_v2), vget_high_u32(v_v2)); ++ v_sum12 = vpadd_u32(v_sum1, v_sum2); ++ v_s1 += vget_lane_u32(v_sum12, 0u); ++ v_s2 += vget_lane_u32(v_sum12, 1u); ++ v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u); ++ if (v_tail_index < ((uint64_t)(a_x.len))) { ++ { ++ wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 1; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end0_p) { ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; + } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; + } +- if (v_c != 104u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); +- goto exit; ++ v_s1 %= 65521u; ++ v_s2 %= 65521u; ++ a_x = v_remaining; ++ } ++ self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++// ‼ WUFFS MULTI-FILE SECTION -arm_neon ++ ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func adler32.hasher.up_x86_sse42 ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_adler32__hasher__up_x86_sse42( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_s1 = 0; ++ uint32_t v_s2 = 0; ++ wuffs_base__slice_u8 v_remaining = {0}; ++ wuffs_base__slice_u8 v_p = {0}; ++ __m128i v_zeroes = {0}; ++ __m128i v_ones = {0}; ++ __m128i v_weights__left = {0}; ++ __m128i v_weights_right = {0}; ++ __m128i v_q__left = {0}; ++ __m128i v_q_right = {0}; ++ __m128i v_v1 = {0}; ++ __m128i v_v2 = {0}; ++ __m128i v_v2j = {0}; ++ __m128i v_v2k = {0}; ++ uint32_t v_num_iterate_bytes = 0; ++ uint64_t v_tail_index = 0; ++ ++ v_zeroes = _mm_set1_epi16((int16_t)(0u)); ++ v_ones = _mm_set1_epi16((int16_t)(1u)); ++ v_weights__left = _mm_set_epi8((int8_t)(17u), (int8_t)(18u), (int8_t)(19u), (int8_t)(20u), (int8_t)(21u), (int8_t)(22u), (int8_t)(23u), (int8_t)(24u), (int8_t)(25u), (int8_t)(26u), (int8_t)(27u), (int8_t)(28u), (int8_t)(29u), (int8_t)(30u), (int8_t)(31u), (int8_t)(32u)); ++ v_weights_right = _mm_set_epi8((int8_t)(1u), (int8_t)(2u), (int8_t)(3u), (int8_t)(4u), (int8_t)(5u), (int8_t)(6u), (int8_t)(7u), (int8_t)(8u), (int8_t)(9u), (int8_t)(10u), (int8_t)(11u), (int8_t)(12u), (int8_t)(13u), (int8_t)(14u), (int8_t)(15u), (int8_t)(16u)); ++ v_s1 = ((self->private_impl.f_state) & 0xFFFFu); ++ v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); ++ while (((uint64_t)(a_x.len)) > 0u) { ++ v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); ++ if (((uint64_t)(a_x.len)) > 5536u) { ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u); ++ a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u); + } ++ v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u))); ++ v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes)); ++ v_v1 = _mm_setzero_si128(); ++ v_v2j = _mm_setzero_si128(); ++ v_v2k = _mm_setzero_si128(); + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; +- } +- if ((v_c < 49u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); +- goto exit; +- } +- self->private_impl.f_max_incl_block_size = (((uint32_t)((v_c - 48u))) * 100000u); +- while (true) { +- v_tag = 0u; +- v_i = 0u; +- while (v_i < 48u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; +- } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- v_tag <<= 1u; +- v_tag |= ((uint64_t)((self->private_impl.f_bits >> 31u))); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- } +- if (v_tag == 25779555029136u) { +- break; +- } else if (v_tag != 54156738319193u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- status = wuffs_bzip2__decoder__prepare_block(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_block_size = 0u; +- self->private_impl.f_decode_huffman_finished = false; +- self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[(self->private_data.f_huffman_selectors[0u] & 7u)]; +- self->private_impl.f_decode_huffman_ticks = 50u; +- self->private_impl.f_decode_huffman_section = 0u; +- self->private_impl.f_decode_huffman_run_shift = 0u; +- while ( ! self->private_impl.f_decode_huffman_finished) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_bzip2__decoder__decode_huffman_fast(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; +- goto exit; +- } else if (self->private_impl.f_decode_huffman_finished) { +- break; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- status = wuffs_bzip2__decoder__decode_huffman_slow(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } +- wuffs_bzip2__decoder__invert_bwt(self); +- self->private_impl.f_block_checksum_have = 4294967295u; +- if (self->private_impl.f_original_pointer >= self->private_impl.f_block_size) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); +- goto exit; +- } +- self->private_impl.f_flush_pointer = (self->private_data.f_bwt[self->private_impl.f_original_pointer] >> 12u); +- self->private_impl.f_flush_repeat_count = 0u; +- self->private_impl.f_flush_prev = 0u; +- while (self->private_impl.f_block_size > 0u) { +- wuffs_bzip2__decoder__flush_fast(self, a_dst); +- if (self->private_impl.f_block_size <= 0u) { +- break; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- status = wuffs_bzip2__decoder__flush_slow(self, a_dst); +- if (status.repr) { +- goto suspend; +- } +- } +- self->private_impl.f_block_checksum_have ^= 4294967295u; +- if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_block_checksum_have != self->private_impl.f_block_checksum_want)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum); +- goto exit; ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 32; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32)); ++ while (v_p.ptr < i_end0_p) { ++ v_q__left = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr)); ++ v_q_right = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u)); ++ v_v2j = _mm_add_epi32(v_v2j, v_v1); ++ v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q__left, v_zeroes)); ++ v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q_right, v_zeroes)); ++ v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q__left, v_weights__left))); ++ v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q_right, v_weights_right))); ++ v_p.ptr += 32; + } +- self->private_impl.f_final_checksum_have = (self->private_impl.f_block_checksum_have ^ ((self->private_impl.f_final_checksum_have >> 31u) | ((uint32_t)(self->private_impl.f_final_checksum_have << 1u)))); ++ v_p.len = 0; + } +- v_final_checksum_want = 0u; +- v_i = 0u; +- while (v_i < 32u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; ++ v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(177u))); ++ v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(78u))); ++ v_s1 += ((uint32_t)(_mm_cvtsi128_si32(v_v1))); ++ v_v2 = _mm_add_epi32(v_v2k, _mm_slli_epi32(v_v2j, (int32_t)(5u))); ++ v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(177u))); ++ v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(78u))); ++ v_s2 += ((uint32_t)(_mm_cvtsi128_si32(v_v2))); ++ v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u); ++ if (v_tail_index < ((uint64_t)(a_x.len))) { ++ { ++ wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 1; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end0_p) { ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; ++ v_p.len = 0; + } +- v_final_checksum_want <<= 1u; +- v_final_checksum_want |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; + } +- if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_final_checksum_have != v_final_checksum_want)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum); +- goto exit; +- } +- +- goto ok; +- ok: +- self->private_impl.p_do_transform_io[0] = 0; +- goto exit; ++ v_s1 %= 65521u; ++ v_s2 %= 65521u; ++ a_x = v_remaining; + } ++ self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +- goto suspend; +- suspend: +- self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_transform_io[0].v_i = v_i; +- self->private_data.s_do_transform_io[0].v_tag = v_tag; +- self->private_data.s_do_transform_io[0].v_final_checksum_want = v_final_checksum_want; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) + +- return status; +-} ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) + +-// -------- func bzip2.decoder.prepare_block ++// ---------------- Status Codes Implementations + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__prepare_block( +- wuffs_bzip2__decoder* self, ++const char wuffs_bmp__error__bad_header[] = "#bmp: bad header"; ++const char wuffs_bmp__error__bad_rle_compression[] = "#bmp: bad RLE compression"; ++const char wuffs_bmp__error__truncated_input[] = "#bmp: truncated input"; ++const char wuffs_bmp__error__unsupported_bmp_file[] = "#bmp: unsupported BMP file"; ++const char wuffs_bmp__note__internal_note_short_read[] = "@bmp: internal note: short read"; ++ ++// ---------------- Private Consts ++ ++#define WUFFS_BMP__COMPRESSION_NONE 0u ++ ++#define WUFFS_BMP__COMPRESSION_RLE8 1u ++ ++#define WUFFS_BMP__COMPRESSION_RLE4 2u ++ ++#define WUFFS_BMP__COMPRESSION_BITFIELDS 3u ++ ++#define WUFFS_BMP__COMPRESSION_JPEG 4u ++ ++#define WUFFS_BMP__COMPRESSION_PNG 5u ++ ++#define WUFFS_BMP__COMPRESSION_ALPHABITFIELDS 6u ++ ++#define WUFFS_BMP__COMPRESSION_LOW_BIT_DEPTH 256u ++ ++#define WUFFS_BMP__RLE_STATE_NEUTRAL 0u ++ ++#define WUFFS_BMP__RLE_STATE_RUN 1u ++ ++#define WUFFS_BMP__RLE_STATE_ESCAPE 2u ++ ++#define WUFFS_BMP__RLE_STATE_LITERAL 3u ++ ++#define WUFFS_BMP__RLE_STATE_DELTA_X 4u ++ ++#define WUFFS_BMP__RLE_STATE_DELTA_Y 5u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__do_decode_image_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__do_decode_frame_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__do_decode_frame( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_none( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_rle( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_bitfields( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_low_bit_depth( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__do_tell_me_more( ++ wuffs_bmp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__read_palette( ++ wuffs_bmp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__process_masks( ++ wuffs_bmp__decoder* self); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_bmp__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_bmp__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_bmp__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_bmp__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_bmp__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_bmp__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_bmp__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_bmp__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bmp__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_bmp__decoder__initialize( ++ wuffs_bmp__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_bmp__decoder* ++wuffs_bmp__decoder__alloc(void) { ++ wuffs_bmp__decoder* x = ++ (wuffs_bmp__decoder*)(calloc(1, sizeof(wuffs_bmp__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_bmp__decoder__initialize( ++ x, sizeof(wuffs_bmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_bmp__decoder(void) { ++ return sizeof(wuffs_bmp__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func bmp.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_bmp__decoder__get_quirk( ++ const wuffs_bmp__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func bmp.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__set_quirk( ++ wuffs_bmp__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func bmp.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__decode_image_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint32_t v_i = 0; +- uint32_t v_j = 0; +- uint32_t v_selector = 0; +- uint32_t v_sel_ff = 0; +- uint8_t v_movee = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); + ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func bmp.decoder.do_decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__do_decode_image_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_magic = 0; ++ uint32_t v_width = 0; ++ uint32_t v_height = 0; ++ uint32_t v_planes = 0; ++ uint32_t v_n = 0; ++ uint32_t v_dst_pixfmt = 0; ++ uint32_t v_byte_width = 0; ++ + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -30999,797 +31613,1141 @@ wuffs_bzip2__decoder__prepare_block( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_prepare_block[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_prepare_block[0].v_i; +- v_selector = self->private_data.s_prepare_block[0].v_selector; +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- self->private_impl.f_block_checksum_want = 0u; +- v_i = 0u; +- while (v_i < 32u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if ((self->private_impl.f_call_sequence != 0u) || (self->private_impl.f_io_redirect_fourcc == 1u)) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if (self->private_impl.f_io_redirect_fourcc != 0u) { ++ status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); ++ goto ok; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- self->private_impl.f_block_checksum_want <<= 1u; +- self->private_impl.f_block_checksum_want |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- } +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 8) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; ++ v_magic = t_0; + } +- if ((self->private_impl.f_bits >> 31u) != 0u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__unsupported_block_randomization); ++ if (v_magic != 19778u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); + goto exit; + } +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- self->private_impl.f_original_pointer = 0u; +- v_i = 0u; +- while (v_i < 24u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ self->private_data.s_do_decode_image_config.scratch = 8u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; + } +- self->private_impl.f_original_pointer <<= 1u; +- self->private_impl.f_original_pointer |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; ++ self->private_impl.f_padding = t_1; + } +- v_i = 0u; +- while (v_i < 256u) { +- self->private_data.f_presence[v_i] = 0u; +- v_i += 1u; ++ if (self->private_impl.f_padding < 14u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; + } +- v_i = 0u; +- while (v_i < 256u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ self->private_impl.f_padding -= 14u; ++ self->private_impl.f_io_redirect_pos = wuffs_base__u64__sat_add(((uint64_t)(self->private_impl.f_padding)), wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- if ((self->private_impl.f_bits >> 31u) != 0u) { +- self->private_data.f_presence[v_i] = 1u; + } +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 16u; ++ self->private_impl.f_bitmap_info_len = t_2; + } +- self->private_data.f_scratch = 0u; +- v_i = 0u; +- while (v_i < 256u) { +- if (self->private_data.f_presence[v_i] == 0u) { +- v_i += 16u; +- continue; +- } +- while (true) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_impl.f_padding < self->private_impl.f_bitmap_info_len) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_padding -= self->private_impl.f_bitmap_info_len; ++ if (self->private_impl.f_bitmap_info_len == 12u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 8) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- self->private_data.f_scratch += (self->private_impl.f_bits >> 31u); +- self->private_data.f_presence[(v_i & 255u)] = ((uint8_t)((self->private_impl.f_bits >> 31u))); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- if ((v_i & 15u) == 0u) { +- break; + } ++ self->private_impl.f_width = t_3; + } +- } +- if ((self->private_data.f_scratch < 1u) || (256u < self->private_data.f_scratch)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; +- } +- self->private_impl.f_num_symbols = (self->private_data.f_scratch + 2u); +- self->private_data.f_scratch = 0u; +- v_i = 0u; +- while (v_i < 3u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 8) { ++ t_4 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; + } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; ++ self->private_impl.f_height = t_4; + } +- self->private_data.f_scratch <<= 1u; +- self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- } +- if ((self->private_data.f_scratch < 2u) || (6u < self->private_data.f_scratch)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; +- } +- self->private_impl.f_num_huffman_codes = self->private_data.f_scratch; +- self->private_data.f_scratch = 0u; +- v_i = 0u; +- while (v_i < 15u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ uint32_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_5 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5; ++ if (num_bits_5 == 8) { ++ t_5 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)) << 56; + } +- uint8_t t_6 = *iop_a_src++; +- v_c = t_6; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; ++ v_planes = t_5; + } +- self->private_data.f_scratch <<= 1u; +- self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- } +- if ((self->private_data.f_scratch < 1u) || (18001u < self->private_data.f_scratch)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; +- } +- self->private_impl.f_num_sections = self->private_data.f_scratch; +- v_i = 0u; +- while (v_i < self->private_impl.f_num_huffman_codes) { +- self->private_data.f_mtft[v_i] = ((uint8_t)(v_i)); +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < self->private_impl.f_num_sections) { +- v_selector = 0u; +- while (true) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (v_planes != 1u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ uint32_t t_6; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_7 = *iop_a_src++; +- v_c = t_7; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6; ++ if (num_bits_6 == 8) { ++ t_6 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_6 += 8u; ++ *scratch |= ((uint64_t)(num_bits_6)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- if ((self->private_impl.f_bits >> 31u) == 0u) { +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- break; + } +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_selector += 1u; +- if (v_selector >= self->private_impl.f_num_huffman_codes) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; ++ self->private_impl.f_bits_per_pixel = t_6; ++ } ++ } else if (self->private_impl.f_bitmap_info_len == 16u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ uint32_t t_7; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; ++ if (num_bits_7 == 24) { ++ t_7 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_7 += 8u; ++ *scratch |= ((uint64_t)(num_bits_7)) << 56; ++ } + } ++ v_width = t_7; + } +- if (v_selector == 0u) { +- self->private_data.f_huffman_selectors[v_i] = self->private_data.f_mtft[0u]; +- } else { +- v_sel_ff = (v_selector & 255u); +- v_movee = self->private_data.f_mtft[v_sel_ff]; +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_sel_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_sel_ff)); +- self->private_data.f_mtft[0u] = v_movee; +- self->private_data.f_huffman_selectors[v_i] = v_movee; ++ if (v_width > 2147483647u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } else if (v_width > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; + } +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < self->private_impl.f_num_huffman_codes) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ self->private_impl.f_width = v_width; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); ++ uint32_t t_8; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; ++ if (num_bits_8 == 24) { ++ t_8 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_8 += 8u; ++ *scratch |= ((uint64_t)(num_bits_8)) << 56; ++ } ++ } ++ v_height = t_8; + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_bzip2__decoder__read_code_lengths(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ if (v_height > 2147483647u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } else if (v_height > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; + } +- if (status.repr) { +- goto suspend; ++ self->private_impl.f_height = v_height; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); ++ uint32_t t_9; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_9 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9; ++ if (num_bits_9 == 8) { ++ t_9 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_9 += 8u; ++ *scratch |= ((uint64_t)(num_bits_9)) << 56; ++ } ++ } ++ v_planes = t_9; + } +- v_status = wuffs_bzip2__decoder__build_huffman_tree(self, v_i); +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; ++ if (v_planes != 1u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } +- wuffs_bzip2__decoder__build_huffman_table(self, v_i); +- v_i += 1u; +- } +- v_i = 0u; +- v_j = 0u; +- while (v_i < 256u) { +- if (self->private_data.f_presence[v_i] != 0u) { +- self->private_data.f_mtft[(v_j & 255u)] = ((uint8_t)(v_i)); +- v_j += 1u; +- } +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < 256u) { +- self->private_data.f_letter_counts[v_i] = 0u; +- v_i += 1u; +- } +- +- goto ok; +- ok: +- self->private_impl.p_prepare_block[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_prepare_block[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_prepare_block[0].v_i = v_i; +- self->private_data.s_prepare_block[0].v_selector = v_selector; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func bzip2.decoder.read_code_lengths +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__read_code_lengths( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- uint32_t v_i = 0; +- uint32_t v_code_length = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_read_code_lengths[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_read_code_lengths[0].v_i; +- v_code_length = self->private_data.s_read_code_lengths[0].v_code_length; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- self->private_impl.f_code_lengths_bitmask = 0u; +- v_i = 0u; +- while (v_i < 5u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); ++ uint32_t t_10; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_10 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10; ++ if (num_bits_10 == 8) { ++ t_10 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_10 += 8u; ++ *scratch |= ((uint64_t)(num_bits_10)) << 56; + } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; ++ self->private_impl.f_bits_per_pixel = t_10; + } +- v_code_length <<= 1u; +- v_code_length |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < self->private_impl.f_num_symbols) { +- while (true) { +- if ((v_code_length < 1u) || (20u < v_code_length)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; +- } +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ } else { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); ++ uint32_t t_11; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(25); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11; ++ if (num_bits_11 == 24) { ++ t_11 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_11 += 8u; ++ *scratch |= ((uint64_t)(num_bits_11)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; + } +- if ((self->private_impl.f_bits >> 31u) == 0u) { +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- break; +- } +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ v_width = t_11; ++ } ++ if (v_width > 2147483647u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } else if (v_width > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_width = v_width; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26); ++ uint32_t t_12; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_12 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12; ++ if (num_bits_12 == 24) { ++ t_12 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_12 += 8u; ++ *scratch |= ((uint64_t)(num_bits_12)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; + } +- if ((self->private_impl.f_bits >> 31u) == 0u) { +- v_code_length += 1u; ++ v_height = t_12; ++ } ++ if (v_height == 2147483648u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } else if (v_height > 2147483648u) { ++ v_height = ((uint32_t)(0u - v_height)); ++ if (v_height > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_height = v_height; ++ self->private_impl.f_top_down = true; ++ } else if (v_height > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } else { ++ self->private_impl.f_height = v_height; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28); ++ uint32_t t_13; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_13 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; + } else { +- v_code_length -= 1u; ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_13 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_13; ++ if (num_bits_13 == 8) { ++ t_13 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_13 += 8u; ++ *scratch |= ((uint64_t)(num_bits_13)) << 56; ++ } + } +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; ++ v_planes = t_13; + } +- self->private_impl.f_code_lengths_bitmask |= (((uint32_t)(1u)) << (v_code_length & 31u)); +- self->private_data.f_bwt[v_i] = v_code_length; +- v_i += 1u; +- } +- +- goto ok; +- ok: +- self->private_impl.p_read_code_lengths[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_read_code_lengths[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_read_code_lengths[0].v_i = v_i; +- self->private_data.s_read_code_lengths[0].v_code_length = v_code_length; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func bzip2.decoder.build_huffman_tree +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__build_huffman_tree( +- wuffs_bzip2__decoder* self, +- uint32_t a_which) { +- uint32_t v_code_length = 0; +- uint32_t v_symbol_index = 0; +- uint32_t v_num_branch_nodes = 0; +- uint32_t v_stack_height = 0; +- uint32_t v_stack_values[21] = {0}; +- uint32_t v_node_index = 0; +- uint16_t v_leaf_value = 0; +- +- self->private_data.f_huffman_trees[a_which][0u][0u] = 0u; +- self->private_data.f_huffman_trees[a_which][0u][1u] = 0u; +- v_num_branch_nodes = 1u; +- v_stack_height = 1u; +- v_stack_values[0u] = 0u; +- v_code_length = 1u; +- while (v_code_length <= 20u) { +- if ((self->private_impl.f_code_lengths_bitmask & (((uint32_t)(1u)) << v_code_length)) == 0u) { +- v_code_length += 1u; +- continue; +- } +- v_symbol_index = 0u; +- while (v_symbol_index < self->private_impl.f_num_symbols) { +- if (self->private_data.f_bwt[v_symbol_index] != v_code_length) { +- v_symbol_index += 1u; +- continue; ++ if (v_planes != 1u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; + } +- while (true) { +- if (v_stack_height <= 0u) { +- return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_over_subscribed); +- } else if (v_stack_height >= v_code_length) { +- break; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30); ++ uint32_t t_14; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_14 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(31); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_14 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_14; ++ if (num_bits_14 == 8) { ++ t_14 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_14 += 8u; ++ *scratch |= ((uint64_t)(num_bits_14)) << 56; ++ } + } +- v_node_index = v_stack_values[(v_stack_height - 1u)]; +- if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) { +- self->private_data.f_huffman_trees[a_which][v_node_index][0u] = ((uint16_t)(v_num_branch_nodes)); ++ self->private_impl.f_bits_per_pixel = t_14; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32); ++ uint32_t t_15; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_15 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- self->private_data.f_huffman_trees[a_which][v_node_index][1u] = ((uint16_t)(v_num_branch_nodes)); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_15 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_15; ++ if (num_bits_15 == 24) { ++ t_15 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_15 += 8u; ++ *scratch |= ((uint64_t)(num_bits_15)) << 56; ++ } + } +- if (v_num_branch_nodes >= 257u) { +- return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed); ++ self->private_impl.f_compression = t_15; ++ } ++ if (self->private_impl.f_bits_per_pixel == 0u) { ++ if (self->private_impl.f_compression == 4u) { ++ self->private_impl.f_io_redirect_fourcc = 1246774599u; ++ status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); ++ goto ok; ++ } else if (self->private_impl.f_compression == 5u) { ++ self->private_impl.f_io_redirect_fourcc = 1347307296u; ++ status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); ++ goto ok; + } +- v_stack_values[v_stack_height] = v_num_branch_nodes; +- self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][0u] = 0u; +- self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][1u] = 0u; +- v_num_branch_nodes += 1u; +- v_stack_height += 1u; ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; + } +- v_node_index = v_stack_values[(v_stack_height - 1u)]; +- if (v_symbol_index < 2u) { +- v_leaf_value = ((uint16_t)((769u + v_symbol_index))); +- } else if ((v_symbol_index + 1u) < self->private_impl.f_num_symbols) { +- v_leaf_value = ((uint16_t)((511u + v_symbol_index))); +- } else { +- v_leaf_value = 768u; ++ self->private_data.s_do_decode_image_config.scratch = 20u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(34); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) { +- self->private_data.f_huffman_trees[a_which][v_node_index][0u] = v_leaf_value; +- } else { +- self->private_data.f_huffman_trees[a_which][v_node_index][1u] = v_leaf_value; +- v_stack_height -= 1u; +- while (v_stack_height > 0u) { +- v_node_index = v_stack_values[(v_stack_height - 1u)]; +- if (self->private_data.f_huffman_trees[a_which][v_node_index][1u] == 0u) { +- break; ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ if (self->private_impl.f_bitmap_info_len == 40u) { ++ if (self->private_impl.f_bits_per_pixel >= 16u) { ++ if (self->private_impl.f_padding >= 16u) { ++ self->private_impl.f_bitmap_info_len = 56u; ++ self->private_impl.f_padding -= 16u; ++ } else if (self->private_impl.f_padding >= 12u) { ++ self->private_impl.f_bitmap_info_len = 52u; ++ self->private_impl.f_padding -= 12u; + } +- v_stack_height -= 1u; + } ++ } else if ((self->private_impl.f_bitmap_info_len != 52u) && ++ (self->private_impl.f_bitmap_info_len != 56u) && ++ (self->private_impl.f_bitmap_info_len != 64u) && ++ (self->private_impl.f_bitmap_info_len != 108u) && ++ (self->private_impl.f_bitmap_info_len != 124u)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ if (self->private_impl.f_compression == 6u) { ++ self->private_impl.f_compression = 3u; ++ } ++ if (self->private_impl.f_compression == 3u) { ++ if (self->private_impl.f_bitmap_info_len >= 52u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(35); ++ uint32_t t_16; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_16 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(36); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_16 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_16; ++ if (num_bits_16 == 24) { ++ t_16 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_16 += 8u; ++ *scratch |= ((uint64_t)(num_bits_16)) << 56; ++ } ++ } ++ self->private_impl.f_channel_masks[2u] = t_16; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(37); ++ uint32_t t_17; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_17 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(38); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_17 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_17; ++ if (num_bits_17 == 24) { ++ t_17 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_17 += 8u; ++ *scratch |= ((uint64_t)(num_bits_17)) << 56; ++ } ++ } ++ self->private_impl.f_channel_masks[1u] = t_17; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(39); ++ uint32_t t_18; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_18 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(40); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_18 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_18; ++ if (num_bits_18 == 24) { ++ t_18 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_18 += 8u; ++ *scratch |= ((uint64_t)(num_bits_18)) << 56; ++ } ++ } ++ self->private_impl.f_channel_masks[0u] = t_18; ++ } ++ if (self->private_impl.f_bitmap_info_len >= 56u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(41); ++ uint32_t t_19; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_19 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(42); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_19 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_19; ++ if (num_bits_19 == 24) { ++ t_19 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_19 += 8u; ++ *scratch |= ((uint64_t)(num_bits_19)) << 56; ++ } ++ } ++ self->private_impl.f_channel_masks[3u] = t_19; ++ } ++ self->private_data.s_do_decode_image_config.scratch = ((uint32_t)(self->private_impl.f_bitmap_info_len - 56u)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(43); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ } ++ if ((self->private_impl.f_channel_masks[0u] == 255u) && (self->private_impl.f_channel_masks[1u] == 65280u) && (self->private_impl.f_channel_masks[2u] == 16711680u)) { ++ if (self->private_impl.f_bits_per_pixel == 24u) { ++ self->private_impl.f_compression = 0u; ++ } else if (self->private_impl.f_bits_per_pixel == 32u) { ++ if ((self->private_impl.f_channel_masks[3u] == 0u) || (self->private_impl.f_channel_masks[3u] == 4278190080u)) { ++ self->private_impl.f_compression = 0u; ++ } ++ } ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(44); ++ status = wuffs_bmp__decoder__process_masks(self); ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ } else if (self->private_impl.f_bitmap_info_len >= 40u) { ++ v_n = (self->private_impl.f_bitmap_info_len - 40u); ++ self->private_data.s_do_decode_image_config.scratch = v_n; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(45); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; + } +- v_symbol_index += 1u; + } +- v_code_length += 1u; ++ if (self->private_impl.f_compression != 3u) { ++ if (self->private_impl.f_bits_per_pixel < 16u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(46); ++ status = wuffs_bmp__decoder__read_palette(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ } ++ if (self->private_impl.f_compression == 0u) { ++ if ((self->private_impl.f_bits_per_pixel == 1u) || (self->private_impl.f_bits_per_pixel == 2u) || (self->private_impl.f_bits_per_pixel == 4u)) { ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ self->private_impl.f_compression = 256u; ++ } else if (self->private_impl.f_bits_per_pixel == 8u) { ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ } else if (self->private_impl.f_bits_per_pixel == 16u) { ++ self->private_impl.f_compression = 3u; ++ self->private_impl.f_channel_masks[0u] = 31u; ++ self->private_impl.f_channel_masks[1u] = 992u; ++ self->private_impl.f_channel_masks[2u] = 31744u; ++ self->private_impl.f_channel_masks[3u] = 0u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(47); ++ status = wuffs_bmp__decoder__process_masks(self); ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ } else if (self->private_impl.f_bits_per_pixel == 24u) { ++ self->private_impl.f_src_pixfmt = 2147485832u; ++ } else if (self->private_impl.f_bits_per_pixel == 32u) { ++ if (self->private_impl.f_channel_masks[3u] == 0u) { ++ self->private_impl.f_src_pixfmt = 2415954056u; ++ } else { ++ self->private_impl.f_src_pixfmt = 2164295816u; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ } else if (self->private_impl.f_compression == 1u) { ++ if (self->private_impl.f_bits_per_pixel == 8u) { ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ } else if (self->private_impl.f_compression == 2u) { ++ if (self->private_impl.f_bits_per_pixel == 4u) { ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ } else if (self->private_impl.f_compression == 3u) { ++ if ((self->private_impl.f_bits_per_pixel == 16u) || (self->private_impl.f_bits_per_pixel == 32u)) { ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ if (((self->private_impl.f_bitmap_info_len < 40u) || (self->private_impl.f_bitmap_info_len == 64u)) && ++ (self->private_impl.f_bits_per_pixel != 1u) && ++ (self->private_impl.f_bits_per_pixel != 4u) && ++ (self->private_impl.f_bits_per_pixel != 8u) && ++ (self->private_impl.f_bits_per_pixel != 24u)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } ++ if (self->private_impl.f_bits_per_pixel == 1u) { ++ v_byte_width = ((self->private_impl.f_width >> 3u) + (((self->private_impl.f_width & 7u) + 7u) >> 3u)); ++ self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); ++ } else if (self->private_impl.f_bits_per_pixel == 2u) { ++ v_byte_width = ((self->private_impl.f_width >> 2u) + (((self->private_impl.f_width & 3u) + 3u) >> 2u)); ++ self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); ++ } else if (self->private_impl.f_bits_per_pixel == 4u) { ++ v_byte_width = ((self->private_impl.f_width >> 1u) + (self->private_impl.f_width & 1u)); ++ self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); ++ } else if (self->private_impl.f_bits_per_pixel == 8u) { ++ self->private_impl.f_pad_per_row = ((4u - (self->private_impl.f_width & 3u)) & 3u); ++ } else if (self->private_impl.f_bits_per_pixel == 16u) { ++ self->private_impl.f_pad_per_row = ((self->private_impl.f_width & 1u) * 2u); ++ } else if (self->private_impl.f_bits_per_pixel == 24u) { ++ self->private_impl.f_pad_per_row = (self->private_impl.f_width & 3u); ++ } else if (self->private_impl.f_bits_per_pixel == 32u) { ++ self->private_impl.f_pad_per_row = 0u; ++ } ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ v_dst_pixfmt = 2164295816u; ++ if ((self->private_impl.f_channel_num_bits[0u] > 8u) || ++ (self->private_impl.f_channel_num_bits[1u] > 8u) || ++ (self->private_impl.f_channel_num_bits[2u] > 8u) || ++ (self->private_impl.f_channel_num_bits[3u] > 8u)) { ++ v_dst_pixfmt = 2164308923u; ++ } else if (((self->private_impl.f_src_pixfmt == 2198077448u) || (self->private_impl.f_src_pixfmt == 2147485832u) || (self->private_impl.f_src_pixfmt == 2415954056u)) || ((self->private_impl.f_src_pixfmt == 2164308923u) && (self->private_impl.f_channel_masks[3u] == 0u))) { ++ v_dst_pixfmt = 2415954056u; ++ } ++ wuffs_base__image_config__set( ++ a_dst, ++ v_dst_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ (self->private_impl.f_channel_masks[3u] == 0u)); ++ } ++ self->private_impl.f_call_sequence = 32u; ++ ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; + } +- if (v_stack_height != 0u) { +- return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- return wuffs_base__make_status(NULL); ++ ++ return status; + } + +-// -------- func bzip2.decoder.build_huffman_table ++// -------- func bmp.decoder.decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_bzip2__decoder__build_huffman_table( +- wuffs_bzip2__decoder* self, +- uint32_t a_which) { +- uint32_t v_i = 0; +- uint32_t v_bits = 0; +- uint16_t v_n_bits = 0; +- uint16_t v_child = 0; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__decode_frame_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- while (v_i < 256u) { +- v_bits = (v_i << 24u); +- v_n_bits = 0u; +- v_child = 0u; +- while ((v_child < 257u) && (v_n_bits < 8u)) { +- v_child = self->private_data.f_huffman_trees[a_which][v_child][(v_bits >> 31u)]; +- v_bits <<= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_n_bits += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- self->private_data.f_huffman_tables[a_which][v_i] = ((uint16_t)((v_child | (v_n_bits << 12u)))); +- v_i += 1u; ++ ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; + } +- return wuffs_base__make_empty_struct(); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; + } + +-// -------- func bzip2.decoder.invert_bwt ++// -------- func bmp.decoder.do_decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_bzip2__decoder__invert_bwt( +- wuffs_bzip2__decoder* self) { +- uint32_t v_i = 0; +- uint32_t v_letter = 0; +- uint32_t v_sum = 0; +- uint32_t v_old_sum = 0; ++static wuffs_base__status ++wuffs_bmp__decoder__do_decode_frame_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- v_sum = 0u; +- v_i = 0u; +- while (v_i < 256u) { +- v_old_sum = v_sum; +- v_sum += self->private_data.f_letter_counts[v_i]; +- self->private_data.f_letter_counts[v_i] = v_old_sum; +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < self->private_impl.f_block_size) { +- v_letter = (self->private_data.f_bwt[v_i] & 255u); +- self->private_data.f_bwt[(self->private_data.f_letter_counts[v_letter] & 1048575u)] |= (v_i << 12u); +- self->private_data.f_letter_counts[v_letter] += 1u; +- v_i += 1u; ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func bzip2.decoder.flush_fast +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_bzip2__decoder__flush_fast( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst) { +- uint32_t v_flush_pointer = 0; +- uint32_t v_flush_repeat_count = 0; +- uint8_t v_flush_prev = 0; +- uint32_t v_block_checksum_have = 0; +- uint32_t v_block_size = 0; +- uint32_t v_entry = 0; +- uint8_t v_curr = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- v_flush_pointer = self->private_impl.f_flush_pointer; +- v_flush_repeat_count = self->private_impl.f_flush_repeat_count; +- v_flush_prev = self->private_impl.f_flush_prev; +- v_block_checksum_have = self->private_impl.f_block_checksum_have; +- v_block_size = self->private_impl.f_block_size; +- while ((v_block_size > 0u) && (((uint64_t)(io2_a_dst - iop_a_dst)) >= 255u)) { +- if (v_flush_repeat_count < 4u) { +- v_entry = self->private_data.f_bwt[v_flush_pointer]; +- v_curr = ((uint8_t)(v_entry)); +- v_flush_pointer = (v_entry >> 12u); +- if (v_curr == v_flush_prev) { +- v_flush_repeat_count += 1u; +- } else { +- v_flush_repeat_count = 1u; ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_curr)] ^ ((uint32_t)(v_block_checksum_have << 8u))); +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_curr), iop_a_dst += 1); +- v_flush_prev = v_curr; +- v_block_size -= 1u; +- } else { +- v_entry = self->private_data.f_bwt[v_flush_pointer]; +- v_curr = ((uint8_t)(v_entry)); +- v_flush_pointer = (v_entry >> 12u); +- v_flush_repeat_count = ((uint32_t)(v_curr)); +- while (v_flush_repeat_count > 0u) { +- v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_flush_prev)] ^ ((uint32_t)(v_block_checksum_have << 8u))); +- if (((uint64_t)(io2_a_dst - iop_a_dst)) > 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_flush_prev), iop_a_dst += 1); +- } +- v_flush_repeat_count -= 1u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_bmp__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- v_flush_repeat_count = 0u; +- v_flush_prev = v_curr; +- v_block_size -= 1u; ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ self->private_impl.f_frame_config_io_position, ++ 0u, ++ true, ++ false, ++ 4278190080u); ++ } ++ self->private_impl.f_call_sequence = 64u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; + } +- self->private_impl.f_flush_pointer = v_flush_pointer; +- self->private_impl.f_flush_repeat_count = v_flush_repeat_count; +- self->private_impl.f_flush_prev = v_flush_prev; +- self->private_impl.f_block_checksum_have = v_block_checksum_have; +- if (v_block_size <= 900000u) { +- self->private_impl.f_block_size = v_block_size; +- } +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return wuffs_base__make_empty_struct(); ++ return status; + } + +-// -------- func bzip2.decoder.flush_slow ++// -------- func bmp.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__flush_slow( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__decode_frame( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_flush_pointer = 0; +- uint32_t v_flush_repeat_count = 0; +- uint8_t v_flush_prev = 0; +- uint32_t v_block_checksum_have = 0; +- uint32_t v_block_size = 0; +- uint32_t v_entry = 0; +- uint8_t v_curr = 0; +- +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_flush_slow[0]; +- if (coro_susp_point) { +- v_flush_pointer = self->private_data.s_flush_slow[0].v_flush_pointer; +- v_flush_repeat_count = self->private_data.s_flush_slow[0].v_flush_repeat_count; +- v_flush_prev = self->private_data.s_flush_slow[0].v_flush_prev; +- v_block_checksum_have = self->private_data.s_flush_slow[0].v_block_checksum_have; +- v_block_size = self->private_data.s_flush_slow[0].v_block_size; +- v_curr = self->private_data.s_flush_slow[0].v_curr; +- } ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- v_flush_pointer = self->private_impl.f_flush_pointer; +- v_flush_repeat_count = self->private_impl.f_flush_repeat_count; +- v_flush_prev = self->private_impl.f_flush_prev; +- v_block_checksum_have = self->private_impl.f_block_checksum_have; +- v_block_size = self->private_impl.f_block_size; +- while ((v_block_size > 0u) && ! (self->private_impl.p_flush_slow[0] != 0)) { +- if (v_flush_repeat_count < 4u) { +- v_entry = self->private_data.f_bwt[v_flush_pointer]; +- v_curr = ((uint8_t)(v_entry)); +- v_flush_pointer = (v_entry >> 12u); +- if (v_curr == v_flush_prev) { +- v_flush_repeat_count += 1u; +- } else { +- v_flush_repeat_count = 1u; +- } +- v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_curr)] ^ ((uint32_t)(v_block_checksum_have << 8u))); +- self->private_data.s_flush_slow[0].scratch = v_curr; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (iop_a_dst == io2_a_dst) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- goto suspend; +- } +- *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow[0].scratch)); +- v_flush_prev = v_curr; +- v_block_size -= 1u; +- } else { +- v_entry = self->private_data.f_bwt[v_flush_pointer]; +- v_curr = ((uint8_t)(v_entry)); +- v_flush_pointer = (v_entry >> 12u); +- v_flush_repeat_count = ((uint32_t)(v_curr)); +- while (v_flush_repeat_count > 0u) { +- v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_flush_prev)] ^ ((uint32_t)(v_block_checksum_have << 8u))); +- self->private_data.s_flush_slow[0].scratch = v_flush_prev; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (iop_a_dst == io2_a_dst) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- goto suspend; +- } +- *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow[0].scratch)); +- v_flush_repeat_count -= 1u; +- } +- v_flush_repeat_count = 0u; +- v_flush_prev = v_curr; +- v_block_size -= 1u; ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; + } +- } +- self->private_impl.f_flush_pointer = v_flush_pointer; +- self->private_impl.f_flush_repeat_count = v_flush_repeat_count; +- self->private_impl.f_flush_prev = v_flush_prev; +- self->private_impl.f_block_checksum_have = v_block_checksum_have; +- if (v_block_size <= 900000u) { +- self->private_impl.f_block_size = v_block_size; ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + +- goto ok; + ok: +- self->private_impl.p_flush_slow[0] = 0; ++ self->private_impl.p_decode_frame = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_flush_slow[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_flush_slow[0].v_flush_pointer = v_flush_pointer; +- self->private_data.s_flush_slow[0].v_flush_repeat_count = v_flush_repeat_count; +- self->private_data.s_flush_slow[0].v_flush_prev = v_flush_prev; +- self->private_data.s_flush_slow[0].v_block_checksum_have = v_block_checksum_have; +- self->private_data.s_flush_slow[0].v_block_size = v_block_size; +- self->private_data.s_flush_slow[0].v_curr = v_curr; ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; + + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- + return status; + } + +-// -------- func bzip2.decoder.decode_huffman_fast ++// -------- func bmp.decoder.do_decode_frame + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_bzip2__decoder__decode_huffman_fast( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src) { ++wuffs_bmp__decoder__do_decode_frame( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_block_size = 0; +- uint8_t v_which = 0; +- uint32_t v_ticks = 0; +- uint32_t v_section = 0; +- uint32_t v_run_shift = 0; +- uint16_t v_table_entry = 0; +- uint16_t v_child = 0; +- uint32_t v_child_ff = 0; +- uint32_t v_i = 0; +- uint32_t v_j = 0; +- uint32_t v_output = 0; +- uint32_t v_run = 0; +- uint32_t v_mtft0 = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -31802,90 +32760,132 @@ wuffs_bzip2__decoder__decode_huffman_fast( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- v_bits = self->private_impl.f_bits; +- v_n_bits = self->private_impl.f_n_bits; +- v_block_size = self->private_impl.f_block_size; +- v_which = self->private_impl.f_decode_huffman_which; +- v_ticks = self->private_impl.f_decode_huffman_ticks; +- v_section = self->private_impl.f_decode_huffman_section; +- v_run_shift = self->private_impl.f_decode_huffman_run_shift; +- while (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { +- if (v_ticks > 0u) { +- v_ticks -= 1u; +- } else { +- v_ticks = 49u; +- v_section += 1u; +- if (v_section >= self->private_impl.f_num_sections) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections); +- goto exit; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_which = WUFFS_BZIP2__CLAMP_TO_5[(self->private_data.f_huffman_selectors[(v_section & 32767u)] & 7u)]; +- } +- v_bits |= (wuffs_base__peek_u32be__no_bounds_check(iop_a_src) >> v_n_bits); +- iop_a_src += ((31u - v_n_bits) >> 3u); +- v_n_bits |= 24u; +- v_table_entry = self->private_data.f_huffman_tables[v_which][(v_bits >> 24u)]; +- v_bits <<= (v_table_entry >> 12u); +- v_n_bits -= ((uint32_t)((v_table_entry >> 12u))); +- v_child = (v_table_entry & 1023u); +- while (v_child < 257u) { +- v_child = self->private_data.f_huffman_trees[v_which][v_child][(v_bits >> 31u)]; +- v_bits <<= 1u; +- if (v_n_bits <= 0u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_bmp__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- v_n_bits -= 1u; +- } +- if (v_child < 768u) { +- v_child_ff = ((uint32_t)((v_child & 255u))); +- v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff])); +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff)); +- self->private_data.f_mtft[0u] = ((uint8_t)(v_output)); +- self->private_data.f_letter_counts[v_output] += 1u; +- self->private_data.f_bwt[v_block_size] = v_output; +- if (v_block_size >= self->private_impl.f_max_incl_block_size) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); +- goto exit; ++ if (status.repr) { ++ goto suspend; + } +- v_block_size += 1u; +- v_run_shift = 0u; +- continue; +- } else if (v_child == 768u) { +- self->private_impl.f_decode_huffman_finished = true; +- break; +- } +- if (v_run_shift >= 23u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); +- goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } +- v_run = ((((uint32_t)(v_child)) & 3u) << v_run_shift); +- v_run_shift += 1u; +- v_i = v_block_size; +- v_j = (v_run + v_block_size); +- if (v_j > self->private_impl.f_max_incl_block_size) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); +- goto exit; ++ self->private_data.s_do_decode_frame.scratch = self->private_impl.f_padding; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_block_size = v_j; +- v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u])); +- self->private_data.f_letter_counts[v_mtft0] += v_run; +- while (v_i < v_j) { +- self->private_data.f_bwt[v_i] = v_mtft0; +- v_i += 1u; ++ iop_a_src += self->private_data.s_do_decode_frame.scratch; ++ if ((self->private_impl.f_width > 0u) && (self->private_impl.f_height > 0u)) { ++ self->private_impl.f_dst_x = 0u; ++ if (self->private_impl.f_top_down) { ++ self->private_impl.f_dst_y = 0u; ++ self->private_impl.f_dst_y_inc = 1u; ++ } else { ++ self->private_impl.f_dst_y = ((uint32_t)(self->private_impl.f_height - 1u)); ++ self->private_impl.f_dst_y_inc = 4294967295u; ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), ++ wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ while (true) { ++ if (self->private_impl.f_compression == 0u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_bmp__decoder__swizzle_none(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } else if (self->private_impl.f_compression < 3u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_bmp__decoder__swizzle_rle(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } else if (self->private_impl.f_compression == 3u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_bmp__decoder__swizzle_bitfields(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } else { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_bmp__decoder__swizzle_low_bit_depth(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if (v_status.repr != wuffs_bmp__note__internal_note_short_read) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ } ++ self->private_data.s_do_decode_frame.scratch = self->private_impl.f_pending_pad; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame.scratch; ++ self->private_impl.f_pending_pad = 0u; + } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; + } +- self->private_impl.f_bits = v_bits; +- self->private_impl.f_n_bits = v_n_bits; +- self->private_impl.f_block_size = v_block_size; +- self->private_impl.f_decode_huffman_which = v_which; +- self->private_impl.f_decode_huffman_ticks = v_ticks; +- self->private_impl.f_decode_huffman_section = v_section; +- self->private_impl.f_decode_huffman_run_shift = v_run_shift; +- status = wuffs_base__make_status(NULL); +- goto ok; + +- ok: ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ + goto exit; + exit: + if (a_src && a_src->data.ptr) { +@@ -31895,24 +32895,27 @@ wuffs_bzip2__decoder__decode_huffman_fast( + return status; + } + +-// -------- func bzip2.decoder.decode_huffman_slow ++// -------- func bmp.decoder.swizzle_none + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_bzip2__decoder__decode_huffman_slow( +- wuffs_bzip2__decoder* self, ++wuffs_bmp__decoder__swizzle_none( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint32_t v_node_index = 0; +- uint16_t v_child = 0; +- uint32_t v_child_ff = 0; +- uint32_t v_i = 0; +- uint32_t v_j = 0; +- uint32_t v_output = 0; +- uint32_t v_run = 0; +- uint32_t v_mtft0 = 0; ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ uint32_t v_src_bytes_per_pixel = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_j = 0; ++ uint64_t v_n = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -31925,99 +32928,90 @@ wuffs_bzip2__decoder__decode_huffman_slow( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow[0]; +- if (coro_susp_point) { +- v_node_index = self->private_data.s_decode_huffman_slow[0].v_node_index; ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while ( ! (self->private_impl.p_decode_huffman_slow[0] != 0)) { +- if (self->private_impl.f_decode_huffman_ticks > 0u) { +- self->private_impl.f_decode_huffman_ticks -= 1u; +- } else { +- self->private_impl.f_decode_huffman_ticks = 49u; +- self->private_impl.f_decode_huffman_section += 1u; +- if (self->private_impl.f_decode_huffman_section >= self->private_impl.f_num_sections) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections); +- goto exit; +- } +- self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[(self->private_data.f_huffman_selectors[(self->private_impl.f_decode_huffman_section & 32767u)] & 7u)]; ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ label__outer__continue:; ++ while (true) { ++ while (self->private_impl.f_pending_pad > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; + } +- v_node_index = 0u; +- while (true) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- v_child = self->private_data.f_huffman_trees[self->private_impl.f_decode_huffman_which][v_node_index][(self->private_impl.f_bits >> 31u)]; +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- if (v_child < 257u) { +- v_node_index = ((uint32_t)(v_child)); +- continue; +- } else if (v_child < 768u) { +- v_child_ff = ((uint32_t)((v_child & 255u))); +- v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff])); +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff)); +- self->private_data.f_mtft[0u] = ((uint8_t)(v_output)); +- self->private_data.f_letter_counts[v_output] += 1u; +- self->private_data.f_bwt[self->private_impl.f_block_size] = v_output; +- if (self->private_impl.f_block_size >= self->private_impl.f_max_incl_block_size) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); +- goto exit; ++ self->private_impl.f_pending_pad -= 1u; ++ iop_a_src += 1u; ++ } ++ while (true) { ++ if (self->private_impl.f_dst_x == self->private_impl.f_width) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ if (self->private_impl.f_height > 0u) { ++ self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; + } +- self->private_impl.f_block_size += 1u; +- self->private_impl.f_decode_huffman_run_shift = 0u; +- break; +- } else if (v_child == 768u) { +- self->private_impl.f_decode_huffman_finished = true; + goto label__outer__break; ++ } else if (self->private_impl.f_pad_per_row != 0u) { ++ self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; ++ goto label__outer__continue; + } +- if (self->private_impl.f_decode_huffman_run_shift >= 23u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); ++ } ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i >= ((uint64_t)(v_dst.len))) { ++ if (self->private_impl.f_bits_per_pixel > 32u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } +- v_run = ((((uint32_t)(v_child)) & 3u) << self->private_impl.f_decode_huffman_run_shift); +- self->private_impl.f_decode_huffman_run_shift += 1u; +- v_i = self->private_impl.f_block_size; +- v_j = (v_run + self->private_impl.f_block_size); +- if (v_j > self->private_impl.f_max_incl_block_size) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); ++ v_src_bytes_per_pixel = (self->private_impl.f_bits_per_pixel / 8u); ++ if (v_src_bytes_per_pixel == 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } +- self->private_impl.f_block_size = v_j; +- v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u])); +- self->private_data.f_letter_counts[v_mtft0] += v_run; +- while (v_i < v_j) { +- self->private_data.f_bwt[v_i] = v_mtft0; +- v_i += 1u; ++ v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); ++ v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); ++ v_j = v_n; ++ while (v_j >= 8u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 8u); ++ } ++ v_j -= 8u; + } +- break; ++ while (v_j > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 1u); ++ } ++ v_j -= 1u; ++ } ++ } else { ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( ++ &self->private_impl.f_swizzler, ++ wuffs_base__slice_u8__subslice_i(v_dst, v_i), ++ v_dst_palette, ++ &iop_a_src, ++ io2_a_src); ++ } ++ if (v_n == 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; + } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); + } +- label__outer__break:; +- +- goto ok; +- ok: +- self->private_impl.p_decode_huffman_slow[0] = 0; +- goto exit; + } ++ label__outer__break:; ++ status = wuffs_base__make_status(NULL); ++ goto ok; + +- goto suspend; +- suspend: +- self->private_impl.p_decode_huffman_slow[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_huffman_slow[0].v_node_index = v_node_index; +- ++ ok: + goto exit; + exit: + if (a_src && a_src->data.ptr) { +@@ -32027,256 +33021,33 @@ wuffs_bzip2__decoder__decode_huffman_slow( + return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_cbor__error__bad_input[] = "#cbor: bad input"; +-const char wuffs_cbor__error__unsupported_recursion_depth[] = "#cbor: unsupported recursion depth"; +-const char wuffs_cbor__error__internal_error_inconsistent_i_o[] = "#cbor: internal error: inconsistent I/O"; +-const char wuffs_cbor__error__internal_error_inconsistent_token_length[] = "#cbor: internal error: inconsistent token length"; +- +-// ---------------- Private Consts +- +-static const uint32_t +-WUFFS_CBOR__LITERALS[4] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 8388612, 8388616, 8388610, 8388609, +-}; +- +-static const uint8_t +-WUFFS_CBOR__TOKEN_LENGTHS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, +- 2, 3, 5, 9, 0, 0, 0, 1, +-}; +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-// ---------------- VTables +- +-const wuffs_base__token_decoder__func_ptrs +-wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__token_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_cbor__decoder__decode_tokens), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_cbor__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_cbor__decoder__history_retain_length), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_cbor__decoder__set_quirk), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_cbor__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_cbor__decoder__initialize( +- wuffs_cbor__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } +- +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } +- } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name = +- wuffs_base__token_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers = +- (const void*)(&wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_cbor__decoder* +-wuffs_cbor__decoder__alloc(void) { +- wuffs_cbor__decoder* x = +- (wuffs_cbor__decoder*)(calloc(sizeof(wuffs_cbor__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_cbor__decoder__initialize( +- x, sizeof(wuffs_cbor__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} +- +-size_t +-sizeof__wuffs_cbor__decoder(void) { +- return sizeof(wuffs_cbor__decoder); +-} +- +-// ---------------- Function Implementations +- +-// -------- func cbor.decoder.get_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_cbor__decoder__get_quirk( +- const wuffs_cbor__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func cbor.decoder.set_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_cbor__decoder__set_quirk( +- wuffs_cbor__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +-} +- +-// -------- func cbor.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_cbor__decoder__history_retain_length( +- const wuffs_cbor__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func cbor.decoder.workbuf_len +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_cbor__decoder__workbuf_len( +- const wuffs_cbor__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- +- return wuffs_base__utility__empty_range_ii_u64(); +-} +- +-// -------- func cbor.decoder.decode_tokens ++// -------- func bmp.decoder.swizzle_rle + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_cbor__decoder__decode_tokens( +- wuffs_cbor__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_rle( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint64_t v_string_length = 0; +- uint64_t v_n64 = 0; +- uint32_t v_depth = 0; +- uint32_t v_stack_byte = 0; +- uint32_t v_stack_bit = 0; +- uint32_t v_stack_val = 0; +- uint32_t v_token_length = 0; +- uint32_t v_vminor = 0; +- uint32_t v_vminor_alt = 0; +- uint32_t v_continued = 0; +- uint8_t v_c = 0; +- uint8_t v_c_major = 0; +- uint8_t v_c_minor = 0; +- bool v_tagged = false; +- uint8_t v_indefinite_string_major_type = 0; ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_row = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_n = 0; ++ uint32_t v_p0 = 0; ++ uint8_t v_code = 0; ++ uint8_t v_indexes[2] = {0}; ++ uint32_t v_rle_state = 0; ++ uint32_t v_chunk_bits = 0; ++ uint32_t v_chunk_count = 0; + +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -32288,1231 +33059,590 @@ wuffs_cbor__decoder__decode_tokens( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_tokens[0]; +- if (coro_susp_point) { +- v_string_length = self->private_data.s_decode_tokens[0].v_string_length; +- v_depth = self->private_data.s_decode_tokens[0].v_depth; +- v_tagged = self->private_data.s_decode_tokens[0].v_tagged; +- v_indefinite_string_major_type = self->private_data.s_decode_tokens[0].v_indefinite_string_major_type; ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if (self->private_impl.f_end_of_data) { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_rle_state = self->private_impl.f_rle_state; ++ label__outer__continue:; ++ while (true) { ++ v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { ++ v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); + } +- label__outer__continue:; ++ label__middle__continue:; + while (true) { ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i <= ((uint64_t)(v_row.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_row, v_i); ++ } else { ++ v_dst = wuffs_base__utility__empty_slice_u8(); ++ } + while (true) { +- do { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- goto label__outer__continue; ++ if (v_rle_state == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; + } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ if (v_code == 0u) { ++ v_rle_state = 2u; ++ continue; ++ } ++ self->private_impl.f_rle_length = ((uint32_t)(v_code)); ++ v_rle_state = 1u; ++ continue; ++ } else if (v_rle_state == 1u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; ++ } ++ v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ if (self->private_impl.f_bits_per_pixel == 8u) { ++ v_p0 = 0u; ++ while (v_p0 < self->private_impl.f_rle_length) { ++ self->private_data.f_scratch[v_p0] = v_code; ++ v_p0 += 1u; ++ } ++ } else { ++ v_indexes[0u] = ((uint8_t)(((uint8_t)(v_code >> 4u)))); ++ v_indexes[1u] = ((uint8_t)(v_code & 15u)); ++ v_p0 = 0u; ++ while (v_p0 < self->private_impl.f_rle_length) { ++ self->private_data.f_scratch[(v_p0 + 0u)] = v_indexes[0u]; ++ self->private_data.f_scratch[(v_p0 + 1u)] = v_indexes[1u]; ++ v_p0 += 2u; ++ } ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_rle_length)); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, self->private_impl.f_rle_length); ++ v_rle_state = 0u; ++ goto label__middle__continue; ++ } else if (v_rle_state == 2u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; ++ } ++ v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ if (v_code < 2u) { ++ if ((self->private_impl.f_dst_y >= self->private_impl.f_height) && (v_code == 0u)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); + goto exit; + } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, 18446744073709551615u); ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ if (v_code > 0u) { ++ goto label__outer__break; ++ } ++ v_rle_state = 0u; + goto label__outer__continue; ++ } else if (v_code == 2u) { ++ v_rle_state = 4u; ++ continue; + } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if ((v_indefinite_string_major_type != 0u) && (v_indefinite_string_major_type != (v_c >> 5u))) { +- if (v_c != 255u) { +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); +- goto exit; ++ self->private_impl.f_rle_length = ((uint32_t)(v_code)); ++ self->private_impl.f_rle_padded = ((self->private_impl.f_bits_per_pixel == 8u) && (((uint8_t)(v_code & 1u)) != 0u)); ++ v_rle_state = 3u; ++ continue; ++ } else if (v_rle_state == 3u) { ++ if (self->private_impl.f_bits_per_pixel == 8u) { ++ v_n = wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( ++ &self->private_impl.f_swizzler, ++ self->private_impl.f_rle_length, ++ v_dst, ++ v_dst_palette, ++ &iop_a_src, ++ io2_a_src); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_rle_length, ((uint32_t)(v_n))); ++ } else { ++ v_chunk_count = ((self->private_impl.f_rle_length + 3u) / 4u); ++ v_p0 = 0u; ++ while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 2u)) { ++ v_chunk_bits = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2u; ++ self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u)))); ++ self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u)))); ++ self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u)))); ++ self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u)))); ++ v_p0 = ((v_p0 & 255u) + 4u); ++ v_chunk_count -= 1u; + } +- v_vminor = 4194560u; +- if (v_indefinite_string_major_type == 3u) { +- v_vminor |= 19u; ++ v_p0 = wuffs_base__u32__min(v_p0, self->private_impl.f_rle_length); ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0)); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, v_p0); ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_rle_length, v_p0); ++ } ++ if (self->private_impl.f_rle_length > 0u) { ++ break; ++ } ++ if (self->private_impl.f_rle_padded) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; + } +- v_indefinite_string_major_type = 0u; + iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; ++ self->private_impl.f_rle_padded = false; ++ } ++ v_rle_state = 0u; ++ goto label__middle__continue; ++ } else if (v_rle_state == 4u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; + } ++ self->private_impl.f_rle_delta_x = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1u; +- v_c_major = ((uint8_t)((v_c >> 5u))); +- v_c_minor = (v_c & 31u); +- if (v_c_minor < 24u) { +- v_string_length = ((uint64_t)(v_c_minor)); +- } else { +- while (true) { +- if (v_c_minor == 24u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 1u) { +- v_string_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); +- iop_a_src += 1u; +- break; +- } +- } else if (v_c_minor == 25u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 2u) { +- v_string_length = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2u; +- break; +- } +- } else if (v_c_minor == 26u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { +- v_string_length = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4u; +- break; +- } +- } else if (v_c_minor == 27u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 8u) { +- v_string_length = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); +- iop_a_src += 8u; +- break; +- } +- } else { +- v_string_length = 0u; +- break; +- } +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- goto label__outer__continue; +- } +- status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); +- goto exit; +- } ++ v_rle_state = 5u; ++ continue; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; ++ } ++ v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ if (self->private_impl.f_rle_delta_x > 0u) { ++ wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, ((uint64_t)(self->private_impl.f_rle_delta_x))); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(self->private_impl.f_rle_delta_x))); ++ self->private_impl.f_rle_delta_x = 0u; ++ if (self->private_impl.f_dst_x > self->private_impl.f_width) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); ++ goto exit; + } +- if (v_c_major == 0u) { +- if (v_c_minor < 26u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((14680064u | ((uint32_t)((v_string_length & 65535u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor < 28u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((14680064u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- *iop_a_dst++ = wuffs_base__make_token( +- (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } +- } else if (v_c_major == 1u) { +- if (v_c_minor < 26u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length & 65535u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor < 28u) { +- if (v_string_length < 9223372036854775808u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length >> 46u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- *iop_a_dst++ = wuffs_base__make_token( +- (~((18446744073709551615u - v_string_length) & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } else { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | +- (((uint64_t)(16777216u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- goto label__goto_parsed_a_leaf_value__break; +- } +- } else if (v_c_major == 2u) { +- if (v_c_minor < 28u) { +- if (v_string_length == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } else if (v_c_minor == 31u) { +- if (v_indefinite_string_major_type != 0u) { +- break; +- } +- v_indefinite_string_major_type = 2u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__outer__continue; +- } else { +- break; +- } +- while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- continue; +- } +- v_n64 = wuffs_base__u64__min(v_string_length, ((uint64_t)(io2_a_src - iop_a_src))); +- v_token_length = ((uint32_t)((v_n64 & 65535u))); +- if (v_n64 > 65535u) { +- v_token_length = 65535u; +- } else if (v_token_length <= 0u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- continue; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) { +- status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length); +- goto exit; +- } +- v_string_length -= ((uint64_t)(v_token_length)); +- v_continued = 0u; +- if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) { +- v_continued = 1u; +- } +- iop_a_src += v_token_length; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194816u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (v_string_length > 0u) { +- continue; +- } else if (v_indefinite_string_major_type > 0u) { +- goto label__outer__continue; +- } +- goto label__goto_parsed_a_leaf_value__break; +- } +- } else if (v_c_major == 3u) { +- if (v_c_minor < 28u) { +- if (v_string_length == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } else if (v_c_minor == 31u) { +- if (v_indefinite_string_major_type != 0u) { +- break; +- } +- v_indefinite_string_major_type = 3u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__outer__continue; +- } else { +- break; +- } +- while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- continue; +- } +- v_n64 = wuffs_base__u64__min(v_string_length, 65535u); +- v_n64 = ((uint64_t)(wuffs_base__utf_8__longest_valid_prefix(iop_a_src, +- ((size_t)(wuffs_base__u64__min(((uint64_t)(io2_a_src - iop_a_src)), v_n64)))))); +- v_token_length = ((uint32_t)((v_n64 & 65535u))); +- if (v_token_length <= 0u) { +- if ((a_src && a_src->meta.closed) || (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); +- continue; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) { +- status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length); +- goto exit; +- } +- v_string_length -= ((uint64_t)(v_token_length)); +- v_continued = 0u; +- if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) { +- v_continued = 1u; +- } +- iop_a_src += v_token_length; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (v_string_length > 0u) { +- continue; +- } else if (v_indefinite_string_major_type > 0u) { +- goto label__outer__continue; +- } +- goto label__goto_parsed_a_leaf_value__break; +- } +- } else if (v_c_major == 4u) { +- if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) { +- break; +- } else if (v_depth >= 1024u) { +- v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])); +- while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) { +- iop_a_src--; +- v_token_length -= 1u; +- } +- status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth); +- goto exit; +- } +- v_vminor = 2105361u; +- v_vminor_alt = 2101282u; +- if (v_depth > 0u) { +- v_stack_byte = ((v_depth - 1u) / 16u); +- v_stack_bit = (((v_depth - 1u) & 15u) * 2u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- v_vminor = 2105377u; +- v_vminor_alt = 2105378u; +- } else { +- v_vminor = 2105409u; +- v_vminor_alt = 2113570u; +- } +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (v_c_minor == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } +- v_stack_byte = (v_depth / 16u); +- v_stack_bit = ((v_depth & 15u) * 2u); +- self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(3u)) << v_stack_bit)); +- self->private_data.f_container_num_remaining[v_depth] = v_string_length; +- v_depth += 1u; +- v_tagged = false; +- goto label__outer__continue; +- } else if (v_c_major == 5u) { +- if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) { +- break; +- } else if (v_depth >= 1024u) { +- v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])); +- while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) { +- iop_a_src--; +- v_token_length -= 1u; +- } +- status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth); ++ } ++ if (v_code > 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_code -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ while (true) { ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); + goto exit; + } +- v_vminor = 2113553u; +- v_vminor_alt = 2101314u; +- if (v_depth > 0u) { +- v_stack_byte = ((v_depth - 1u) / 16u); +- v_stack_bit = (((v_depth - 1u) & 15u) * 2u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- v_vminor = 2113569u; +- v_vminor_alt = 2105410u; +- } else { +- v_vminor = 2113601u; +- v_vminor_alt = 2113602u; +- } +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (v_c_minor == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; ++ v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { ++ v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); + } +- v_stack_byte = (v_depth / 16u); +- v_stack_bit = ((v_depth & 15u) * 2u); +- self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(3u)) << v_stack_bit); +- self->private_data.f_container_num_remaining[v_depth] = v_string_length; +- v_depth += 1u; +- v_tagged = false; +- goto label__outer__continue; +- } else if (v_c_major == 6u) { +- if (v_c_minor >= 28u) { ++ if (v_code <= 0u) { ++ wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, ((uint64_t)(self->private_impl.f_dst_x))); + break; + } +- if (v_string_length < 262144u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | +- (((uint64_t)((4194304u | ((uint32_t)(v_string_length))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } else { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | +- (((uint64_t)((4194304u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- *iop_a_dst++ = wuffs_base__make_token( +- (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- v_tagged = true; +- goto label__outer__continue; +- } else if (v_c_major == 7u) { +- if (v_c_minor < 20u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | +- (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor < 24u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(WUFFS_CBOR__LITERALS[(v_c_minor & 3u)])) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor == 24u) { +- if (v_string_length < 24u) { +- if ( ! (iop_a_src > io1_a_src)) { +- status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- iop_a_src--; +- break; +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | +- (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor < 28u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(10490113u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor == 31u) { +- if (v_tagged || (v_depth <= 0u)) { +- break; +- } +- v_depth -= 1u; +- if (self->private_data.f_container_num_remaining[v_depth] != 0u) { +- break; +- } +- v_stack_byte = (v_depth / 16u); +- v_stack_bit = ((v_depth & 15u) * 2u); +- v_stack_val = (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit)); +- if (v_stack_val == 1u) { +- break; +- } +- if (v_stack_val != 3u) { +- v_vminor_alt = 2097186u; +- } else { +- v_vminor_alt = 2097218u; +- } +- if (v_depth <= 0u) { +- v_vminor_alt |= 4096u; +- } else { +- v_stack_byte = ((v_depth - 1u) / 16u); +- v_stack_bit = (((v_depth - 1u) & 15u) * 2u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- v_vminor_alt |= 8192u; +- } else { +- v_vminor_alt |= 16384u; +- } +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } +- } +- } while (0); +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- label__goto_parsed_a_leaf_value__break:; +- v_tagged = false; +- while (v_depth > 0u) { +- v_stack_byte = ((v_depth - 1u) / 16u); +- v_stack_bit = (((v_depth - 1u) & 15u) * 2u); +- self->private_data.f_stack[v_stack_byte] ^= (((uint32_t)(1u)) << (v_stack_bit + 1u)); +- if (1u == (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit))) { +- goto label__outer__continue; +- } +- if (self->private_data.f_container_num_remaining[(v_depth - 1u)] <= 0u) { +- goto label__outer__continue; +- } +- self->private_data.f_container_num_remaining[(v_depth - 1u)] -= 1u; +- if (self->private_data.f_container_num_remaining[(v_depth - 1u)] > 0u) { +- goto label__outer__continue; +- } +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- continue; +- } +- v_depth -= 1u; +- v_stack_byte = (v_depth / 16u); +- v_stack_bit = ((v_depth & 15u) * 2u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- v_vminor_alt = 2097186u; +- } else { +- v_vminor_alt = 2097218u; +- } +- if (v_depth <= 0u) { +- v_vminor_alt |= 4096u; +- } else { +- v_stack_byte = ((v_depth - 1u) / 16u); +- v_stack_bit = (((v_depth - 1u) & 15u) * 2u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- v_vminor_alt |= 8192u; +- } else { +- v_vminor_alt |= 16384u; ++ wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_code -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif + } + } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_rle_state = 0u; ++ goto label__middle__continue; + } +- break; ++ self->private_impl.f_rle_state = v_rle_state; ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; + } +- self->private_impl.f_end_of_data = true; +- +- ok: +- self->private_impl.p_decode_tokens[0] = 0; +- goto exit; + } ++ label__outer__break:; ++ while (self->private_impl.f_dst_y < self->private_impl.f_height) { ++ v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { ++ v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u); ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; + +- goto suspend; +- suspend: +- self->private_impl.p_decode_tokens[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; +- self->private_data.s_decode_tokens[0].v_string_length = v_string_length; +- self->private_data.s_decode_tokens[0].v_depth = v_depth; +- self->private_data.s_decode_tokens[0].v_tagged = v_tagged; +- self->private_data.s_decode_tokens[0].v_indefinite_string_major_type = v_indefinite_string_major_type; +- ++ ok: + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } + return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) ++// -------- func bmp.decoder.swizzle_bitfields + +-// ---------------- Status Codes Implementations ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_bitfields( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// ---------------- Private Consts ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_n = 0; ++ uint32_t v_p0 = 0; ++ uint32_t v_p1 = 0; ++ uint32_t v_p1_temp = 0; ++ uint32_t v_num_bits = 0; ++ uint32_t v_c = 0; ++ uint32_t v_c32 = 0; ++ uint32_t v_channel = 0; + +-static const uint32_t +-WUFFS_CRC32__IEEE_TABLE[16][256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- { +- 0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, +- 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, +- 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, +- 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, +- 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, +- 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, +- 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, +- 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, +- 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, +- 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, +- 1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223, +- 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, +- 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, +- 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, +- 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, +- 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, +- 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, +- 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, +- 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, +- 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, +- 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, +- 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161, +- 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, +- 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, +- 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, +- 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, +- 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, +- 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, +- 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, +- 2932959818, 3654703836, 1088359270, 936918000, 2847714899, 3736837829, 1202900863, 817233897, +- 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, +- 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117, +- }, { +- 0, 421212481, 842424962, 724390851, 1684849924, 2105013317, 1448781702, 1329698503, +- 3369699848, 3519200073, 4210026634, 3824474571, 2897563404, 3048111693, 2659397006, 2274893007, +- 1254232657, 1406739216, 2029285587, 1643069842, 783210325, 934667796, 479770071, 92505238, +- 2182846553, 2600511768, 2955803355, 2838940570, 3866582365, 4285295644, 3561045983, 3445231262, +- 2508465314, 2359236067, 2813478432, 3198777185, 4058571174, 3908292839, 3286139684, 3670389349, +- 1566420650, 1145479147, 1869335592, 1987116393, 959540142, 539646703, 185010476, 303839341, +- 3745920755, 3327985586, 3983561841, 4100678960, 3140154359, 2721170102, 2300350837, 2416418868, +- 396344571, 243568058, 631889529, 1018359608, 1945336319, 1793607870, 1103436669, 1490954812, +- 4034481925, 3915546180, 3259968903, 3679722694, 2484439553, 2366552896, 2787371139, 3208174018, +- 950060301, 565965900, 177645455, 328046286, 1556873225, 1171730760, 1861902987, 2011255754, +- 3132841300, 2745199637, 2290958294, 2442530455, 3738671184, 3352078609, 3974232786, 4126854035, +- 1919080284, 1803150877, 1079293406, 1498383519, 370020952, 253043481, 607678682, 1025720731, +- 1711106983, 2095471334, 1472923941, 1322268772, 26324643, 411738082, 866634785, 717028704, +- 2904875439, 3024081134, 2668790573, 2248782444, 3376948395, 3495106026, 4219356713, 3798300520, +- 792689142, 908347575, 487136116, 68299317, 1263779058, 1380486579, 2036719216, 1618931505, +- 3890672638, 4278043327, 3587215740, 3435896893, 2206873338, 2593195963, 2981909624, 2829542713, +- 998479947, 580430090, 162921161, 279890824, 1609522511, 1190423566, 1842954189, 1958874764, +- 4082766403, 3930137346, 3245109441, 3631694208, 2536953671, 2385372678, 2768287173, 3155920004, +- 1900120602, 1750776667, 1131931800, 1517083097, 355290910, 204897887, 656092572, 1040194781, +- 3113746450, 2692952403, 2343461520, 2461357009, 3723805974, 3304059991, 4022511508, 4141455061, +- 2919742697, 3072101800, 2620513899, 2234183466, 3396041197, 3547351212, 4166851439, 3779471918, +- 1725839073, 2143618976, 1424512099, 1307796770, 45282277, 464110244, 813994343, 698327078, +- 3838160568, 4259225593, 3606301754, 3488152955, 2158586812, 2578602749, 2996767038, 2877569151, +- 740041904, 889656817, 506086962, 120682355, 1215357364, 1366020341, 2051441462, 1667084919, +- 3422213966, 3538019855, 4190942668, 3772220557, 2945847882, 3062702859, 2644537544, 2226864521, +- 52649286, 439905287, 823476164, 672009861, 1733269570, 2119477507, 1434057408, 1281543041, +- 2167981343, 2552493150, 3004082077, 2853541596, 3847487515, 4233048410, 3613549209, 3464057816, +- 1239502615, 1358593622, 2077699477, 1657543892, 764250643, 882293586, 532408465, 111204816, +- 1585378284, 1197851309, 1816695150, 1968414767, 974272232, 587794345, 136598634, 289367339, +- 2527558116, 2411481253, 2760973158, 3179948583, 4073438432, 3956313505, 3237863010, 3655790371, +- 347922877, 229101820, 646611775, 1066513022, 1892689081, 1774917112, 1122387515, 1543337850, +- 3697634229, 3313392372, 3998419255, 4148705398, 3087642289, 2702352368, 2319436851, 2468674930, +- }, { +- 0, 29518391, 59036782, 38190681, 118073564, 114017003, 76381362, 89069189, +- 236147128, 265370511, 228034006, 206958561, 152762724, 148411219, 178138378, 190596925, +- 472294256, 501532999, 530741022, 509615401, 456068012, 451764635, 413917122, 426358261, +- 305525448, 334993663, 296822438, 275991697, 356276756, 352202787, 381193850, 393929805, +- 944588512, 965684439, 1003065998, 973863097, 1061482044, 1049003019, 1019230802, 1023561829, +- 912136024, 933002607, 903529270, 874031361, 827834244, 815125939, 852716522, 856752605, +- 611050896, 631869351, 669987326, 640506825, 593644876, 580921211, 551983394, 556069653, +- 712553512, 733666847, 704405574, 675154545, 762387700, 749958851, 787859610, 792175277, +- 1889177024, 1901651959, 1931368878, 1927033753, 2006131996, 1985040171, 1947726194, 1976933189, +- 2122964088, 2135668303, 2098006038, 2093965857, 2038461604, 2017599123, 2047123658, 2076625661, +- 1824272048, 1836991623, 1866005214, 1861914857, 1807058540, 1786244187, 1748062722, 1777547317, +- 1655668488, 1668093247, 1630251878, 1625932113, 1705433044, 1684323811, 1713505210, 1742760333, +- 1222101792, 1226154263, 1263738702, 1251046777, 1339974652, 1310460363, 1281013650, 1301863845, +- 1187289752, 1191637167, 1161842422, 1149379777, 1103966788, 1074747507, 1112139306, 1133218845, +- 1425107024, 1429406311, 1467333694, 1454888457, 1408811148, 1379576507, 1350309090, 1371438805, +- 1524775400, 1528845279, 1499917702, 1487177649, 1575719220, 1546255107, 1584350554, 1605185389, +- 3778354048, 3774312887, 3803303918, 3816007129, 3862737756, 3892238699, 3854067506, 3833203973, +- 4012263992, 4007927823, 3970080342, 3982554209, 3895452388, 3924658387, 3953866378, 3932773565, +- 4245928176, 4241609415, 4271336606, 4283762345, 4196012076, 4225268251, 4187931714, 4166823541, +- 4076923208, 4072833919, 4035198246, 4047918865, 4094247316, 4123732899, 4153251322, 4132437965, +- 3648544096, 3636082519, 3673983246, 3678331705, 3732010428, 3753090955, 3723829714, 3694611429, +- 3614117080, 3601426159, 3572488374, 3576541825, 3496125444, 3516976691, 3555094634, 3525581405, +- 3311336976, 3298595879, 3336186494, 3340255305, 3260503756, 3281337595, 3251864226, 3222399125, +- 3410866088, 3398419871, 3368647622, 3372945905, 3427010420, 3448139075, 3485520666, 3456284973, +- 2444203584, 2423127159, 2452308526, 2481530905, 2527477404, 2539934891, 2502093554, 2497740997, +- 2679949304, 2659102159, 2620920726, 2650438049, 2562027300, 2574714131, 2603727690, 2599670141, +- 2374579504, 2353749767, 2383274334, 2412743529, 2323684844, 2336421851, 2298759554, 2294686645, +- 2207933576, 2186809023, 2149495014, 2178734801, 2224278612, 2236720739, 2266437690, 2262135309, +- 2850214048, 2820717207, 2858812622, 2879680249, 2934667388, 2938704459, 2909776914, 2897069605, +- 2817622296, 2788420399, 2759153014, 2780249921, 2700618180, 2704950259, 2742877610, 2730399645, +- 3049550800, 3020298727, 3057690558, 3078802825, 2999835404, 3004150075, 2974355298, 2961925461, +- 3151438440, 3121956959, 3092510214, 3113327665, 3168701108, 3172786307, 3210370778, 3197646061, +- }, { +- 0, 3099354981, 2852767883, 313896942, 2405603159, 937357362, 627793884, 2648127673, +- 3316918511, 2097696650, 1874714724, 3607201537, 1255587768, 4067088605, 3772741427, 1482887254, +- 1343838111, 3903140090, 4195393300, 1118632049, 3749429448, 1741137837, 1970407491, 3452858150, +- 2511175536, 756094997, 1067759611, 2266550430, 449832999, 2725482306, 2965774508, 142231497, +- 2687676222, 412010587, 171665333, 2995192016, 793786473, 2548850444, 2237264098, 1038456711, +- 1703315409, 3711623348, 3482275674, 1999841343, 3940814982, 1381529571, 1089329165, 4166106984, +- 4029413537, 1217896388, 1512189994, 3802027855, 2135519222, 3354724499, 3577784189, 1845280792, +- 899665998, 2367928107, 2677414085, 657096608, 3137160985, 37822588, 284462994, 2823350519, +- 2601801789, 598228824, 824021174, 2309093331, 343330666, 2898962447, 3195996129, 113467524, +- 1587572946, 3860600759, 4104763481, 1276501820, 3519211397, 1769898208, 2076913422, 3279374443, +- 3406630818, 1941006535, 1627703081, 3652755532, 1148164341, 4241751952, 3999682686, 1457141531, +- 247015245, 3053797416, 2763059142, 470583459, 2178658330, 963106687, 735213713, 2473467892, +- 992409347, 2207944806, 2435792776, 697522413, 3024379988, 217581361, 508405983, 2800865210, +- 4271038444, 1177467017, 1419450215, 3962007554, 1911572667, 3377213406, 3690561584, 1665525589, +- 1799331996, 3548628985, 3241568279, 2039091058, 3831314379, 1558270126, 1314193216, 4142438437, +- 2928380019, 372764438, 75645176, 3158189981, 568925988, 2572515393, 2346768303, 861712586, +- 3982079547, 1441124702, 1196457648, 4293663189, 1648042348, 3666298377, 3358779879, 1888390786, +- 686661332, 2421291441, 2196002399, 978858298, 2811169155, 523464422, 226935048, 3040519789, +- 3175145892, 100435649, 390670639, 2952089162, 841119475, 2325614998, 2553003640, 546822429, +- 2029308235, 3225988654, 3539796416, 1782671013, 4153826844, 1328167289, 1570739863, 3844338162, +- 1298864389, 4124540512, 3882013070, 1608431339, 3255406162, 2058742071, 1744848601, 3501990332, +- 2296328682, 811816591, 584513889, 2590678532, 129869501, 3204563416, 2914283062, 352848211, +- 494030490, 2781751807, 3078325777, 264757620, 2450577869, 715964072, 941166918, 2158327331, +- 3636881013, 1618608400, 1926213374, 3396585883, 1470427426, 4011365959, 4255988137, 1158766284, +- 1984818694, 3471935843, 3695453837, 1693991400, 4180638033, 1100160564, 1395044826, 3952793279, +- 3019491049, 189112716, 435162722, 2706139399, 1016811966, 2217162459, 2526189877, 774831696, +- 643086745, 2666061564, 2354934034, 887166583, 2838900430, 294275499, 54519365, 3145957664, +- 3823145334, 1532818963, 1240029693, 4048895640, 1820460577, 3560857924, 3331051178, 2117577167, +- 3598663992, 1858283101, 2088143283, 3301633750, 1495127663, 3785470218, 4078182116, 1269332353, +- 332098007, 2876706482, 3116540252, 25085497, 2628386432, 605395429, 916469259, 2384220526, +- 2254837415, 1054503362, 745528876, 2496903497, 151290352, 2981684885, 2735556987, 464596510, +- 1137851976, 4218313005, 3923506883, 1365741990, 3434129695, 1946996346, 1723425172, 3724871409, +- }, { +- 0, 1029712304, 2059424608, 1201699536, 4118849216, 3370159984, 2403399072, 2988497936, +- 812665793, 219177585, 1253054625, 2010132753, 3320900865, 4170237105, 3207642721, 2186319825, +- 1625331586, 1568718386, 438355170, 658566482, 2506109250, 2818578674, 4020265506, 3535817618, +- 1351670851, 1844508147, 709922595, 389064339, 2769320579, 2557498163, 3754961379, 3803185235, +- 3250663172, 4238411444, 3137436772, 2254525908, 876710340, 153198708, 1317132964, 1944187668, +- 4054934725, 3436268917, 2339452837, 3054575125, 70369797, 961670069, 2129760613, 1133623509, +- 2703341702, 2621542710, 3689016294, 3867263574, 1419845190, 1774270454, 778128678, 318858390, +- 2438067015, 2888948471, 3952189479, 3606153623, 1691440519, 1504803895, 504432359, 594620247, +- 1492342857, 1704161785, 573770537, 525542041, 2910060169, 2417219385, 3618876905, 3939730521, +- 1753420680, 1440954936, 306397416, 790849880, 2634265928, 2690882808, 3888375336, 3668168600, +- 940822475, 91481723, 1121164459, 2142483739, 3448989963, 4042473659, 3075684971, 2318603227, +- 140739594, 889433530, 1923340138, 1338244826, 4259521226, 3229813626, 2267247018, 3124975642, +- 2570221389, 2756861693, 3824297005, 3734113693, 1823658381, 1372780605, 376603373, 722643805, +- 2839690380, 2485261628, 3548540908, 4007806556, 1556257356, 1638052860, 637716780, 459464860, +- 4191346895, 3300051327, 2199040943, 3195181599, 206718479, 825388991, 1989285231, 1274166495, +- 3382881038, 4106388158, 3009607790, 2382549470, 1008864718, 21111934, 1189240494, 2072147742, +- 2984685714, 2357631266, 3408323570, 4131834434, 1147541074, 2030452706, 1051084082, 63335554, +- 2174155603, 3170292451, 4216760371, 3325460867, 1947622803, 1232499747, 248909555, 867575619, +- 3506841360, 3966111392, 2881909872, 2527485376, 612794832, 434546784, 1581699760, 1663499008, +- 3782634705, 3692447073, 2612412337, 2799048193, 351717905, 697754529, 1849071985, 1398190273, +- 1881644950, 1296545318, 182963446, 931652934, 2242328918, 3100053734, 4284967478, 3255255942, +- 1079497815, 2100821479, 983009079, 133672583, 3050795671, 2293717799, 3474399735, 4067887175, +- 281479188, 765927844, 1778867060, 1466397380, 3846680276, 3626469220, 2676489652, 2733102084, +- 548881365, 500656741, 1517752501, 1729575173, 3577210133, 3898068133, 2952246901, 2459410373, +- 3910527195, 3564487019, 2480257979, 2931134987, 479546907, 569730987, 1716854139, 1530213579, +- 3647316762, 3825568426, 2745561210, 2663766474, 753206746, 293940330, 1445287610, 1799716618, +- 2314567513, 3029685993, 4080348217, 3461678473, 2088098201, 1091956777, 112560889, 1003856713, +- 3112514712, 2229607720, 3276105720, 4263857736, 1275433560, 1902492648, 918929720, 195422344, +- 685033439, 364179055, 1377080511, 1869921551, 3713294623, 3761522863, 2811507327, 2599689167, +- 413436958, 633644462, 1650777982, 1594160846, 3978570462, 3494118254, 2548332990, 2860797966, +- 1211387997, 1968470509, 854852413, 261368461, 3182753437, 2161434413, 3346310653, 4195650637, +- 2017729436, 1160000044, 42223868, 1071931724, 2378480988, 2963576044, 4144295484, 3395602316, +- }, { +- 0, 3411858341, 1304994059, 2257875630, 2609988118, 1355649459, 3596215069, 486879416, +- 3964895853, 655315400, 2711298918, 1791488195, 2009251963, 3164476382, 973758832, 4048990933, +- 64357019, 3364540734, 1310630800, 2235723829, 2554806413, 1394316072, 3582976390, 517157411, +- 4018503926, 618222419, 2722963965, 1762783832, 1947517664, 3209171269, 970744811, 4068520014, +- 128714038, 3438335635, 1248109629, 2167961496, 2621261600, 1466012805, 3522553387, 447296910, +- 3959392091, 547575038, 2788632144, 1835791861, 1886307661, 3140622056, 1034314822, 4143626211, +- 75106221, 3475428360, 1236444838, 2196665603, 2682996155, 1421317662, 3525567664, 427767573, +- 3895035328, 594892389, 2782995659, 1857943406, 1941489622, 3101955187, 1047553757, 4113347960, +- 257428076, 3288652233, 1116777319, 2311878850, 2496219258, 1603640287, 3640781169, 308099796, +- 3809183745, 676813732, 2932025610, 1704983215, 2023410199, 3016104370, 894593820, 4262377657, +- 210634999, 3352484690, 1095150076, 2316991065, 2535410401, 1547934020, 3671583722, 294336591, +- 3772615322, 729897279, 2903845777, 1716123700, 2068629644, 2953845545, 914647431, 4258839074, +- 150212442, 3282623743, 1161604689, 2388688372, 2472889676, 1480171241, 3735940167, 368132066, +- 3836185911, 805002898, 2842635324, 1647574937, 2134298401, 3026852996, 855535146, 4188192143, +- 186781121, 3229539940, 1189784778, 2377547631, 2427670487, 1542429810, 3715886812, 371670393, +- 3882979244, 741170185, 2864262823, 1642462466, 2095107514, 3082559007, 824732849, 4201955092, +- 514856152, 3589064573, 1400419795, 2552522358, 2233554638, 1316849003, 3370776517, 62202976, +- 4075001525, 968836368, 3207280574, 1954014235, 1769133219, 2720925446, 616199592, 4024870413, +- 493229635, 3594175974, 1353627464, 2616354029, 2264355925, 1303087088, 3409966430, 6498043, +- 4046820398, 979978123, 3170710821, 2007099008, 1789187640, 2717386141, 661419827, 3962610838, +- 421269998, 3527459403, 1423225061, 2676515648, 2190300152, 1238466653, 3477467891, 68755798, +- 4115633027, 1041448998, 3095868040, 1943789869, 1860096405, 2776760880, 588673182, 3897205563, +- 449450869, 3516317904, 1459794558, 2623431131, 2170245475, 1242006214, 3432247400, 131015629, +- 4137259288, 1036337853, 3142660115, 1879958454, 1829294862, 2790523051, 549483013, 3952910752, +- 300424884, 3669282065, 1545650111, 2541513754, 2323209378, 1092980487, 3350330793, 216870412, +- 4256931033, 921128828, 2960342482, 2066738807, 1714085583, 2910195050, 736264132, 3770592353, +- 306060335, 3647131530, 1610005796, 2494197377, 2309971513, 1123257756, 3295149874, 255536279, +- 4268596802, 892423655, 3013951305, 2029645036, 1711070292, 2929725425, 674528607, 3815288570, +- 373562242, 3709388839, 1535949449, 2429577516, 2379569556, 1183418929, 3223189663, 188820282, +- 4195850735, 827017802, 3084859620, 2089020225, 1636228089, 2866415708, 743340786, 3876759895, +- 361896217, 3738094268, 1482340370, 2466671543, 2382584591, 1163888810, 3284924932, 144124321, +- 4190215028, 849168593, 3020503679, 2136336858, 1649465698, 2836138695, 798521449, 3838094284, +- }, { +- 0, 2792819636, 2543784233, 837294749, 4098827283, 1379413927, 1674589498, 3316072078, +- 871321191, 2509784531, 2758827854, 34034938, 3349178996, 1641505216, 1346337629, 4131942633, +- 1742642382, 3249117050, 4030828007, 1446413907, 2475800797, 904311657, 68069876, 2725880384, +- 1412551337, 4064729373, 3283010432, 1708771380, 2692675258, 101317902, 937551763, 2442587175, +- 3485284764, 1774858792, 1478633653, 4266992385, 1005723023, 2642744891, 2892827814, 169477906, +- 4233263099, 1512406095, 1808623314, 3451546982, 136139752, 2926205020, 2676114113, 972376437, +- 2825102674, 236236518, 1073525883, 2576072655, 1546420545, 4200303349, 3417542760, 1841601500, +- 2609703733, 1039917185, 202635804, 2858742184, 1875103526, 3384067218, 4166835727, 1579931067, +- 1141601657, 3799809741, 3549717584, 1977839588, 2957267306, 372464350, 668680259, 2175552503, +- 2011446046, 3516084394, 3766168119, 1175200131, 2209029901, 635180217, 338955812, 2990736784, +- 601221559, 2242044419, 3024812190, 306049834, 3617246628, 1911408144, 1074125965, 3866285881, +- 272279504, 3058543716, 2275784441, 567459149, 3832906691, 1107462263, 1944752874, 3583875422, +- 2343980261, 767641425, 472473036, 3126744696, 2147051766, 3649987394, 3899029983, 1309766251, +- 3092841090, 506333494, 801510315, 2310084639, 1276520081, 3932237093, 3683203000, 2113813516, +- 3966292011, 1243601823, 2079834370, 3716205238, 405271608, 3192979340, 2411259153, 701492901, +- 3750207052, 2045810168, 1209569125, 4000285905, 734575199, 2378150379, 3159862134, 438345922, +- 2283203314, 778166598, 529136603, 3120492655, 2086260449, 3660498261, 3955679176, 1303499900, +- 3153699989, 495890209, 744928700, 2316418568, 1337360518, 3921775410, 3626602927, 2120129051, +- 4022892092, 1237286280, 2018993941, 3726666913, 461853231, 3186645403, 2350400262, 711936178, +- 3693557851, 2052076527, 1270360434, 3989775046, 677911624, 2384402428, 3220639073, 427820757, +- 1202443118, 3789347034, 3493118535, 1984154099, 3018127229, 362020041, 612099668, 2181885408, +- 1950653705, 3526596285, 3822816288, 1168934804, 2148251930, 645706414, 395618355, 2984485767, +- 544559008, 2248295444, 3085590153, 295523645, 3560598451, 1917673479, 1134918298, 3855773998, +- 328860103, 3052210803, 2214924526, 577903450, 3889505748, 1101147744, 1883911421, 3594338121, +- 3424493451, 1785369663, 1535282850, 4260726038, 944946072, 2653270060, 2949491377, 163225861, +- 4294103532, 1501944408, 1752023237, 3457862513, 196998655, 2915761739, 2619532502, 978710370, +- 2881684293, 229902577, 1012666988, 2586515928, 1603020630, 4193987810, 3356702335, 1852063179, +- 2553040162, 1046169238, 263412747, 2848217023, 1818454321, 3390333573, 4227627032, 1569420204, +- 60859927, 2782375331, 2487203646, 843627658, 4159668740, 1368951216, 1617990445, 3322386585, +- 810543216, 2520310724, 2815490393, 27783917, 3288386659, 1652017111, 1402985802, 4125677310, +- 1685994201, 3255382381, 4091620336, 1435902020, 2419138250, 910562686, 128847843, 2715354199, +- 1469150398, 4058414858, 3222168983, 1719234083, 2749255853, 94984985, 876691844, 2453031472, +- }, { +- 0, 3433693342, 1109723005, 2391738339, 2219446010, 1222643300, 3329165703, 180685081, +- 3555007413, 525277995, 2445286600, 1567235158, 1471092047, 2600801745, 361370162, 3642757804, +- 2092642603, 2953916853, 1050555990, 4063508168, 4176560081, 878395215, 3134470316, 1987983410, +- 2942184094, 1676945920, 3984272867, 567356797, 722740324, 3887998202, 1764827929, 2778407815, +- 4185285206, 903635656, 3142804779, 2012833205, 2101111980, 2979425330, 1058630609, 4088621903, +- 714308067, 3862526333, 1756790430, 2753330688, 2933487385, 1651734407, 3975966820, 542535930, +- 2244825981, 1231508451, 3353891840, 188896414, 25648519, 3442302233, 1134713594, 2399689316, +- 1445480648, 2592229462, 336416693, 3634843435, 3529655858, 516441772, 2420588879, 1559052753, +- 698204909, 3845636723, 1807271312, 2803025166, 2916600855, 1635634313, 4025666410, 593021940, +- 4202223960, 919787974, 3093159461, 1962401467, 2117261218, 2996361020, 1008193759, 4038971457, +- 1428616134, 2576151384, 386135227, 3685348389, 3513580860, 499580322, 2471098945, 1608776415, +- 2260985971, 1248454893, 3303468814, 139259792, 42591881, 3458459159, 1085071860, 2349261162, +- 3505103035, 474062885, 2463016902, 1583654744, 1419882049, 2550902495, 377792828, 3660491170, +- 51297038, 3483679632, 1093385331, 2374089965, 2269427188, 1273935210, 3311514249, 164344343, +- 2890961296, 1627033870, 4000683757, 585078387, 672833386, 3836780532, 1782552599, 2794821769, +- 2142603813, 3005188795, 1032883544, 4047146438, 4227826911, 928351297, 3118105506, 1970307900, +- 1396409818, 2677114180, 287212199, 3719594553, 3614542624, 467372990, 2505346141, 1509854403, +- 2162073199, 1282711281, 3271268626, 240228748, 76845205, 3359543307, 1186043880, 2317064054, +- 796964081, 3811226735, 1839575948, 2702160658, 2882189835, 1734392469, 3924802934, 625327592, +- 4234522436, 818917338, 3191908409, 1927981223, 2016387518, 3028656416, 973776579, 4137723485, +- 2857232268, 1726474002, 3899187441, 616751215, 772270454, 3803048424, 1814228491, 2693328533, +- 2041117753, 3036871847, 999160644, 4146592730, 4259508931, 826864221, 3217552830, 1936586016, +- 3606501031, 442291769, 2496909786, 1484378436, 1388107869, 2652297411, 278519584, 3694387134, +- 85183762, 3384397196, 1194773103, 2342308593, 2170143720, 1307820918, 3279733909, 265733131, +- 2057717559, 3054258089, 948125770, 4096344276, 4276898253, 843467091, 3167309488, 1885556270, +- 2839764098, 1709792284, 3949353983, 667704161, 755585656, 3785577190, 1865176325, 2743489947, +- 102594076, 3401021058, 1144549729, 2291298815, 2186770662, 1325234296, 3228729243, 215514885, +- 3589828009, 424832311, 2547870420, 1534552650, 1370645331, 2635621325, 328688686, 3745342640, +- 2211456353, 1333405183, 3254067740, 224338562, 127544219, 3408931589, 1170156774, 2299866232, +- 1345666772, 2627681866, 303053225, 3736746295, 3565105198, 416624816, 2522494803, 1525692365, +- 4285207626, 868291796, 3176010551, 1910772649, 2065767088, 3079346734, 956571085, 4121828691, +- 747507711, 3760459617, 1856702594, 2717976604, 2831417605, 1684930971, 3940615800, 642451174, +- }, +- { +- 0, 393942083, 787884166, 965557445, 1575768332, 1251427663, 1931114890, 1684106697, +- 3151536664, 2896410203, 2502855326, 2186649309, 3862229780, 4048545623, 3368213394, 3753496529, +- 2898281073, 3149616690, 2184604407, 2504883892, 4046197629, 3864463166, 3755621371, 3366006712, +- 387506281, 6550570, 971950319, 781573292, 1257550181, 1569695014, 1677892067, 1937345952, +- 2196865699, 2508887776, 2886183461, 3145514598, 3743273903, 3362179052, 4058774313, 3868258154, +- 958996667, 777139448, 400492605, 10755198, 1690661303, 1941857780, 1244879153, 1565019506, +- 775012562, 961205393, 13101140, 398261271, 1943900638, 1688634781, 1563146584, 1246801179, +- 2515100362, 2190636681, 3139390028, 2892258831, 3355784134, 3749586821, 3874691904, 4052225795, +- 3734110983, 3387496260, 4033096577, 3877584834, 2206093835, 2483373640, 2911402637, 3136515790, +- 1699389727, 1915860316, 1270647193, 1556585946, 950464531, 803071056, 374397077, 19647702, +- 1917993334, 1697207605, 1554278896, 1272937907, 800985210, 952435769, 21510396, 372452543, +- 3381322606, 3740399405, 3883715560, 4027047851, 2489758306, 2199758369, 3130039012, 2917895847, +- 1550025124, 1259902439, 1922410786, 1710144865, 26202280, 385139947, 796522542, 939715693, +- 3887801276, 4039129087, 3377269562, 3728088953, 3126293168, 2905368307, 2493602358, 2212122229, +- 4037264341, 3889747862, 3730172755, 3375300368, 2907673305, 3124004506, 2209987167, 2495786524, +- 1266377165, 1543533966, 1703758155, 1928748296, 379007169, 32253058, 945887303, 790236164, +- 1716846671, 1898845196, 1218652361, 1608006794, 1002000707, 750929152, 357530053, 36990342, +- 3717046871, 3405166100, 4084959953, 3825245842, 2153902939, 2535122712, 2929187805, 3119304606, +- 3398779454, 3723384445, 3831720632, 4078468859, 2541294386, 2147616625, 3113171892, 2935238647, +- 1900929062, 1714877541, 1606142112, 1220599011, 748794154, 1004184937, 39295404, 355241455, +- 3835986668, 4091516591, 3394415210, 3710500393, 3108557792, 2922629027, 2545875814, 2160455461, +- 1601970420, 1208431799, 1904871538, 1727077425, 43020792, 367748539, 744905086, 991776061, +- 1214562461, 1595921630, 1720903707, 1911159896, 361271697, 49513938, 998160663, 738569556, +- 4089209477, 3838277318, 3712633347, 3392233024, 2924491657, 3106613194, 2158369551, 2547846988, +- 3100050248, 2948339467, 2519804878, 2169126797, 3844821572, 4065347079, 3420289730, 3701894785, +- 52404560, 342144275, 770279894, 982687125, 1593045084, 1233708063, 1879431386, 1736363161, +- 336019769, 58479994, 988899775, 764050940, 1240141877, 1586496630, 1729968307, 1885744368, +- 2950685473, 3097818978, 2166999975, 2522013668, 4063474221, 3846743662, 3703937707, 3418263272, +- 976650731, 760059304, 348170605, 62635310, 1742393575, 1889649828, 1227683937, 1582820386, +- 2179867635, 2526361520, 2937588597, 3093503798, 3691148031, 3413731004, 4076100217, 3851374138, +- 2532754330, 2173556697, 3087067932, 2944139103, 3407516310, 3697379029, 3857496592, 4070026835, +- 758014338, 978679233, 64506116, 346250567, 1891774606, 1740186829, 1580472328, 1229917259, +- }, { +- 0, 4022496062, 83218493, 3946298115, 166436986, 3861498692, 220098631, 3806075769, +- 332873972, 4229245898, 388141257, 4175494135, 440197262, 4127099824, 516501683, 4044053389, +- 665747944, 3362581206, 593187285, 3432594155, 776282514, 3246869164, 716239279, 3312622225, +- 880394524, 3686509090, 814485793, 3746462239, 1033003366, 3528460888, 963096923, 3601193573, +- 1331495888, 2694801646, 1269355501, 2758457555, 1186374570, 2843003028, 1111716759, 2910918825, +- 1552565028, 3007850522, 1484755737, 3082680359, 1432478558, 3131279456, 1368666979, 3193329757, +- 1760789048, 2268195078, 1812353541, 2210675003, 1628971586, 2396670332, 1710092927, 2318375233, +- 2066006732, 2498144754, 2144408305, 2417195471, 1926193846, 2634877320, 1983558283, 2583222709, +- 2662991776, 1903717534, 2588923805, 1972223139, 2538711002, 2022952164, 2477029351, 2087066841, +- 2372749140, 1655647338, 2308478825, 1717238871, 2223433518, 1799654416, 2155034387, 1873894445, +- 3105130056, 1456926070, 3185661557, 1378041163, 2969511474, 1597852940, 3020617231, 1539874097, +- 2864957116, 1157737858, 2922780289, 1106542015, 2737333958, 1290407416, 2816325371, 1210047941, +- 3521578096, 1042640718, 3574781005, 986759027, 3624707082, 936300340, 3707335735, 859512585, +- 3257943172, 770846650, 3334837433, 688390023, 3420185854, 605654976, 3475911875, 552361981, +- 4132013464, 428600998, 4072428965, 494812827, 4288816610, 274747100, 4216845791, 345349857, +- 3852387692, 173846098, 3781891409, 245988975, 3967116566, 62328360, 3900749099, 121822741, +- 3859089665, 164061759, 3807435068, 221426178, 4025395579, 2933317, 3944446278, 81334904, +- 4124199413, 437265099, 4045904328, 518386422, 4231653775, 335250097, 4174133682, 386814604, +- 3249244393, 778691543, 3311294676, 714879978, 3359647891, 662848429, 3434477742, 595039120, +- 3531393053, 1035903779, 3599308832, 961245982, 3684132967, 877986649, 3747788890, 815846244, +- 2841119441, 1184522735, 2913852140, 1114616274, 2696129195, 1332855189, 2756082326, 1266946472, +- 3129952805, 1431118107, 3195705880, 1371074854, 3009735263, 1554415969, 3079748194, 1481855324, +- 2398522169, 1630855175, 2315475716, 1707159610, 2266835779, 1759461501, 2213084030, 1814728768, +- 2636237773, 1927520499, 2580814832, 1981182158, 2496293815, 2064121993, 2420095882, 2147340468, +- 2025787041, 2541577631, 2085281436, 2475210146, 1901375195, 2660681189, 1973518054, 2590184920, +- 1801997909, 2225743211, 1872600680, 2153772374, 1652813359, 2369881361, 1719025170, 2310296876, +- 1594986313, 2966676599, 1541693300, 3022402634, 1459236659, 3107472397, 1376780046, 3184366640, +- 1288097725, 2734990467, 1211309952, 2817619134, 1160605639, 2867791097, 1104723962, 2920993988, +- 937561457, 3626001999, 857201996, 3704993394, 1040821515, 3519792693, 989625654, 3577615880, +- 607473029, 3421972155, 549494200, 3473077894, 769584639, 3256649409, 690699714, 3337180924, +- 273452185, 4287555495, 347692196, 4219156378, 430386403, 4133832669, 491977950, 4069562336, +- 60542061, 3965298515, 124656720, 3903616878, 175139863, 3853649705, 243645482, 3779581716, +- }, { +- 0, 3247366080, 1483520449, 2581751297, 2967040898, 1901571138, 3904227907, 691737987, +- 3133399365, 2068659845, 3803142276, 589399876, 169513671, 3415493895, 1383475974, 2482566342, +- 2935407819, 1870142219, 4137319690, 924099274, 506443593, 3751897225, 1178799752, 2278412616, +- 339027342, 3585866318, 1280941135, 2379694991, 2766951948, 1700956620, 4236308429, 1024339981, +- 2258407383, 1192382487, 3740284438, 528411094, 910556245, 4157285269, 1848198548, 2946996820, +- 1012887186, 4258378066, 1681119059, 2780629139, 2357599504, 1292419792, 3572147409, 358906641, +- 678054684, 3924071644, 1879503581, 2978491677, 2561882270, 1497229150, 3235873119, 22109855, +- 2460592729, 1395094937, 3401913240, 189516888, 577821147, 3825075739, 2048679962, 3146956762, +- 3595049455, 398902831, 2384764974, 1336573934, 1720805997, 2803873197, 1056822188, 4285729900, +- 1821112490, 2902796138, 887570795, 4117339819, 3696397096, 500978920, 2218668777, 1169222953, +- 2025774372, 3106931428, 550659301, 3780950821, 3362238118, 166293862, 2416645991, 1367722151, +- 3262987361, 66315169, 2584839584, 1537170016, 1923370979, 3005911075, 717813282, 3947244002, +- 1356109368, 2438613496, 146288633, 3375820857, 3759007162, 562248314, 3093388411, 2045739963, +- 3927406461, 731490493, 2994458300, 1945440636, 1523451135, 2604718911, 44219710, 3274466046, +- 4263662323, 1068272947, 2790189874, 1740649714, 1325080945, 2406874801, 379033776, 3608758128, +- 1155642294, 2238671990, 479005303, 3708016055, 4097359924, 901128180, 2891217397, 1843045941, +- 2011248031, 3060787807, 797805662, 3993195422, 3342353949, 112630237, 2673147868, 1591353372, +- 3441611994, 212601626, 2504944923, 1421914843, 2113644376, 3161815192, 630660761, 3826893145, +- 3642224980, 412692116, 2172340373, 1089836885, 1775141590, 2822790422, 832715543, 4029474007, +- 1674842129, 2723860433, 1001957840, 4197873168, 3540870035, 310623315, 2338445906, 1257178514, +- 4051548744, 821257608, 2836464521, 1755307081, 1101318602, 2150241802, 432566283, 3628511179, +- 1270766349, 2318435533, 332587724, 3529260300, 4217841807, 988411727, 2735444302, 1652903566, +- 1602977411, 2651169091, 132630338, 3328776322, 4015131905, 786223809, 3074340032, 1991273216, +- 3846741958, 616972294, 3173262855, 2091579847, 1435626564, 2485072772, 234706309, 3430124101, +- 2712218736, 1613231024, 4190475697, 944458353, 292577266, 3506339890, 1226630707, 2291284467, +- 459984181, 3672380149, 1124496628, 2189994804, 2880683703, 1782407543, 4091479926, 844224694, +- 257943739, 3469817723, 1462980986, 2529005242, 3213269817, 2114471161, 3890881272, 644152632, +- 3046902270, 1947391550, 3991973951, 746483711, 88439420, 3301680572, 1563018173, 2628197501, +- 657826727, 3871046759, 2136545894, 3201811878, 2548879397, 1449267173, 3481299428, 235845156, +- 2650161890, 1551408418, 3315268387, 68429027, 758067552, 3970035360, 1967360161, 3033356129, +- 2311284588, 1213053100, 3517963949, 270598509, 958010606, 4170500910, 1635167535, 2700636911, +- 855672361, 4069415401, 1802256360, 2866995240, 2212099499, 1113008747, 3686091882, 440112042, +- }, { +- 0, 2611301487, 3963330207, 2006897392, 50740095, 2560849680, 4013794784, 1956178319, +- 101480190, 2645113489, 3929532513, 1905435662, 84561281, 2662269422, 3912356638, 1922342769, +- 202960380, 2545787283, 3760419683, 2072395532, 253679235, 2495322860, 3810871324, 2021655667, +- 169122562, 2444351341, 3861841309, 2106214898, 152215677, 2461527058, 3844685538, 2123133581, +- 405920760, 2207553431, 4094313831, 1873742088, 456646791, 2157096168, 4144791064, 1823027831, +- 507358470, 2241388905, 4060492697, 1772322806, 490444409, 2258557462, 4043311334, 1789215881, +- 338245124, 2408348267, 4161972379, 1672996084, 388959611, 2357870868, 4212429796, 1622269835, +- 304431354, 2306870421, 4263435877, 1706791434, 287538053, 2324051946, 4246267162, 1723705717, +- 811841520, 2881944479, 3696765295, 1207788800, 862293135, 2831204576, 3747484176, 1157324415, +- 913293582, 2915732833, 3662962577, 1106318334, 896137841, 2932651550, 3646055662, 1123494017, +- 1014716940, 2816349795, 3493905555, 1273334012, 1065181555, 2765630748, 3544645612, 1222882179, +- 980888818, 2714919069, 3595350637, 1307180546, 963712909, 2731826146, 3578431762, 1324336509, +- 676490248, 3019317351, 3295277719, 1607253752, 726947703, 2968591128, 3345992168, 1556776327, +- 777919222, 3053147801, 3261432937, 1505806342, 760750473, 3070062054, 3244539670, 1522987897, +- 608862708, 3220163995, 3362856811, 1406423812, 659339915, 3169449700, 3413582868, 1355966587, +- 575076106, 3118709605, 3464325525, 1440228858, 557894773, 3135602714, 3447411434, 1457397381, +- 1623683040, 4217512847, 2365387135, 391757072, 1673614495, 4167309552, 2415577600, 341804655, +- 1724586270, 4251866481, 2331019137, 290835438, 1707942497, 4268256782, 2314648830, 307490961, +- 1826587164, 4152020595, 2162433155, 457265388, 1876539747, 4101829900, 2212636668, 407333779, +- 1792275682, 4051089549, 2263378557, 491595282, 1775619997, 4067460082, 2246988034, 508239213, +- 2029433880, 3813931127, 2496473735, 258500328, 2079362919, 3763716872, 2546668024, 208559511, +- 2130363110, 3848244873, 2462145657, 157552662, 2113730969, 3864638966, 2445764358, 174205801, +- 1961777636, 4014675339, 2564147067, 57707284, 2011718299, 3964481268, 2614361092, 7778411, +- 1927425818, 3913769845, 2665066885, 92077546, 1910772837, 3930150922, 2648673018, 108709525, +- 1352980496, 3405878399, 3164554895, 658115296, 1403183983, 3355946752, 3214507504, 607924639, +- 1453895406, 3440239233, 3130208369, 557218846, 1437504913, 3456883198, 3113552654, 573589345, +- 1555838444, 3340335491, 2961681267, 723707676, 1606028947, 3290383100, 3011612684, 673504355, +- 1521500946, 3239382909, 3062619533, 758026722, 1505130605, 3256038402, 3045975794, 774417053, +- 1217725416, 3543158663, 2762906999, 1057739032, 1267939479, 3493229816, 2812847624, 1007544935, +- 1318679830, 3577493881, 2728586121, 956803046, 1302285929, 3594125830, 2711933174, 973184153, +- 1150152212, 3743982203, 2830528651, 856898788, 1200346475, 3694041348, 2880457716, 806684571, +- 1115789546, 3643069573, 2931426933, 891243034, 1099408277, 3659722746, 2914794762, 907637093, +- }, { +- 0, 3717650821, 1616688459, 3184159950, 3233376918, 489665299, 2699419613, 2104690264, +- 1510200173, 2274691816, 979330598, 3888758691, 2595928571, 1194090622, 4209380528, 661706037, +- 3020400346, 1771143007, 3562738577, 164481556, 1958661196, 2837976521, 350386439, 3379863682, +- 3993269687, 865250354, 2388181244, 1406015865, 784146209, 4079732388, 1323412074, 2474079215, +- 3011398645, 1860735600, 3542286014, 246687547, 1942430051, 2924607718, 328963112, 3456978349, +- 3917322392, 887832861, 2300653011, 1421341782, 700772878, 4099025803, 1234716485, 2483986112, +- 125431087, 3673109674, 1730500708, 3132326369, 3351283641, 441867836, 2812031730, 2047535991, +- 1568292418, 2163009479, 1025936137, 3769651852, 2646824148, 1079348561, 4255113631, 537475098, +- 3180171691, 1612400686, 3721471200, 4717925, 2100624189, 2694980280, 493375094, 3237910515, +- 3884860102, 974691139, 2278750093, 1514417672, 657926224, 4204917205, 1198234907, 2600289438, +- 160053105, 3558665972, 1775665722, 3024116671, 3375586791, 346391650, 2842683564, 1962488105, +- 1401545756, 2384412057, 869618007, 3997403346, 2469432970, 1319524111, 4083956673, 788193860, +- 250862174, 3546612699, 1856990997, 3006903952, 3461001416, 333211981, 2920678787, 1937824774, +- 1425017139, 2305216694, 883735672, 3912918525, 2487837605, 1239398944, 4095071982, 696455019, +- 3136584836, 1734518017, 3668494799, 121507914, 2051872274, 2816200599, 437363545, 3347544796, +- 3774328809, 1029797484, 2158697122, 1564328743, 542033279, 4258798842, 1074950196, 2642717105, +- 2691310871, 2113731730, 3224801372, 497043929, 1624461185, 3175454212, 9435850, 3709412175, +- 4201248378, 671035391, 2587181873, 1201904308, 986750188, 3880142185, 1519135143, 2266689570, +- 342721485, 3388693064, 1949382278, 2846355203, 3570723163, 155332830, 3028835344, 1763607957, +- 1315852448, 2482538789, 775087595, 4087626862, 2396469814, 1396827059, 4002123645, 857560824, +- 320106210, 3464673127, 1934154665, 2933785132, 3551331444, 238804465, 3018961215, 1852270778, +- 1226292623, 2491507722, 692783300, 4108177729, 2309936921, 1412959900, 3924976210, 879016919, +- 2803091512, 2055541181, 3343875443, 450471158, 1739236014, 3124525867, 133568485, 3663777376, +- 4245691221, 545702608, 2639048222, 1088059291, 1034514883, 3762268230, 1576387720, 2153979149, +- 501724348, 3228659001, 2109407735, 2687359090, 3713981994, 13109167, 3171052385, 1620357860, +- 1206151121, 2591211092, 666423962, 4197321503, 2271022407, 1523307714, 3875649548, 982999433, +- 2850034278, 1953942499, 3384583981, 338329256, 1767471344, 3033506165, 151375291, 3566408766, +- 4091789579, 779425934, 2478797888, 1311354309, 861580189, 4006375960, 1392910038, 2391852883, +- 2929327945, 1930372812, 3469036034, 324244359, 1847629279, 3015068762, 243015828, 3555391761, +- 4103744548, 688715169, 2496043375, 1229996266, 874727090, 3920994103, 1417671673, 2313759356, +- 446585235, 3339223062, 2059594968, 2807313757, 3660002053, 129100416, 3128657486, 1743609803, +- 1084066558, 2634765179, 549535669, 4250396208, 2149900392, 1571961325, 3765982499, 1039043750, +- }, { +- 0, 2635063670, 3782132909, 2086741467, 430739227, 2225303149, 4173482934, 1707977408, +- 861478454, 2924937024, 3526875803, 1329085421, 720736557, 3086643291, 3415954816, 1452586230, +- 1722956908, 4223524122, 2279405761, 450042295, 2132718455, 3792785921, 2658170842, 58693292, +- 1441473114, 3370435372, 3028674295, 696911745, 1279765825, 3511176247, 2905172460, 807831706, +- 3445913816, 1349228974, 738901109, 2969918723, 3569940419, 1237784245, 900084590, 2829701656, +- 4265436910, 1664255896, 525574723, 2187084597, 3885099509, 2057177219, 117386584, 2616249390, +- 2882946228, 920233410, 1253605401, 3619119471, 2994391983, 796207833, 1393823490, 3457937012, +- 2559531650, 92322804, 2044829231, 3840835417, 2166609305, 472659183, 1615663412, 4249022530, +- 1102706673, 3702920839, 2698457948, 1037619754, 1477802218, 3306854812, 3111894087, 611605809, +- 1927342535, 4025419953, 2475568490, 243387420, 1800169180, 4131620778, 2317525617, 388842247, +- 655084445, 3120835307, 3328511792, 1533734470, 1051149446, 2745738736, 3754524715, 1120297309, +- 340972971, 2304586973, 4114354438, 1748234352, 234773168, 2431761350, 3968900637, 1906278251, +- 2363330345, 299003487, 1840466820, 4038896370, 2507210802, 142532932, 1948239007, 3910149609, +- 3213136159, 579563625, 1592415666, 3286611140, 2787646980, 992477042, 1195825833, 3662232543, +- 3933188933, 2002801203, 184645608, 2517538462, 4089658462, 1858919720, 313391347, 2409765253, +- 3644239219, 1144605701, 945318366, 2773977256, 3231326824, 1570095902, 569697989, 3170568115, +- 2205413346, 511446676, 1646078799, 4279421497, 2598330617, 131105167, 2075239508, 3871229218, +- 2955604436, 757403810, 1363424633, 3427521551, 2844163791, 881434553, 1223211618, 3588709140, +- 3854685070, 2026779384, 78583587, 2577462869, 4235025557, 1633861091, 486774840, 2148301134, +- 3600338360, 1268198606, 938871061, 2868504675, 3476308643, 1379640277, 777684494, 3008718712, +- 1310168890, 3541595724, 2943964055, 846639841, 1471879201, 3400857943, 3067468940, 735723002, +- 2102298892, 3762382970, 2619362721, 19901655, 1692534295, 4193118049, 2240594618, 411247564, +- 681945942, 3047836192, 3385552891, 1422167693, 822682701, 2886124859, 3496468704, 1298661782, +- 469546336, 2264093718, 4203901389, 1738379451, 38812283, 2673859341, 3812556502, 2117148576, +- 3268024339, 1606809957, 598006974, 3198893512, 3680933640, 1181316734, 973624229, 2802299603, +- 4052944421, 1822222163, 285065864, 2381456382, 3896478014, 1966106696, 156323219, 2489232613, +- 2759337087, 964150537, 1159127250, 3625517476, 3184831332, 551242258, 1555722185, 3249901247, +- 2535537225, 170842943, 1984954084, 3946848146, 2391651666, 327308324, 1877176831, 4075589769, +- 263086283, 2460058045, 4005602406, 1942963472, 369291216, 2332888742, 4151061373, 1784924683, +- 1022852861, 2717425547, 3717839440, 1083595558, 626782694, 3092517008, 3291821387, 1497027645, +- 1763466407, 4094934481, 2289211402, 360544636, 1890636732, 3988730570, 2447251217, 215086695, +- 1514488465, 3343557607, 3140191804, 639919946, 1139395978, 3739626748, 2726758695, 1065936977, +- }, { +- 0, 3120290792, 2827399569, 293431929, 2323408227, 864534155, 586863858, 2600537882, +- 3481914503, 1987188591, 1729068310, 3740575486, 1173727716, 4228805132, 3983743093, 1418249117, +- 1147313999, 4254680231, 3974377182, 1428157750, 3458136620, 2011505092, 1721256893, 3747844181, +- 2347455432, 839944224, 594403929, 2593536433, 26687147, 3094146371, 2836498234, 283794642, +- 2294627998, 826205558, 541298447, 2578994407, 45702141, 3141697557, 2856315500, 331624836, +- 1196225049, 4273416689, 4023010184, 1446090848, 3442513786, 1959480466, 1706436331, 3696098563, +- 3433538001, 1968994873, 1679888448, 3722103720, 1188807858, 4280295258, 3999102243, 1470541515, +- 53374294, 3134568126, 2879970503, 307431215, 2303854645, 816436189, 567589284, 2553242188, +- 3405478781, 1929420949, 1652411116, 3682996484, 1082596894, 4185703926, 3892424591, 1375368295, +- 91404282, 3163122706, 2918450795, 336584067, 2400113305, 922028401, 663249672, 2658384096, +- 2392450098, 929185754, 639587747, 2682555979, 82149713, 3172883129, 2892181696, 362343208, +- 1091578037, 4176212829, 3918960932, 1349337804, 3412872662, 1922537022, 1676344391, 3658557359, +- 1111377379, 4224032267, 3937989746, 1396912026, 3359776896, 1908013928, 1623494929, 3644803833, +- 2377615716, 877417100, 623982837, 2630542109, 130804743, 3190831087, 2941083030, 381060734, +- 106748588, 3215393092, 2933549885, 388083925, 2350956495, 903570471, 614862430, 2640172470, +- 3386185259, 1882115523, 1632872378, 3634920530, 1135178568, 4199721120, 3945775833, 1389631793, +- 1317531835, 4152109907, 3858841898, 1610259138, 3304822232, 2097172016, 1820140617, 3582394273, +- 2165193788, 955639764, 696815021, 2423477829, 192043359, 2995356343, 2750736590, 437203750, +- 182808564, 3005133852, 2724453989, 462947725, 2157513367, 962777471, 673168134, 2447663342, +- 3312231283, 2090301595, 1844056802, 3557935370, 1326499344, 4142603768, 3885397889, 1584245865, +- 3326266917, 2142836173, 1858371508, 3611272284, 1279175494, 4123357358, 3837270743, 1564721471, +- 164299426, 2955991370, 2706223923, 414607579, 2209834945, 978107433, 724686416, 2462715320, +- 2183156074, 1004243586, 715579643, 2472360723, 140260361, 2980573153, 2698675608, 421617264, +- 1302961645, 4099032581, 3845074044, 1557460884, 3352688782, 2116952934, 1867729183, 3601371895, +- 2222754758, 1032278062, 754596439, 2499928511, 234942117, 3086693709, 2793824052, 528319708, +- 1274365761, 4061043881, 3816027856, 1518873912, 3246989858, 2020800970, 1762628531, 3505670235, +- 3223196809, 2045103969, 1754834200, 3512958704, 1247965674, 4086934018, 3806642299, 1528765331, +- 261609486, 3060532198, 2802936223, 518697591, 2246819181, 1007707781, 762121468, 2492913428, +- 213497176, 3041029808, 2755593417, 499441441, 2261110843, 1061030867, 776167850, 2545465922, +- 3274734047, 2060165687, 1807140942, 3528266662, 1229724860, 4038575956, 3788156205, 1479636677, +- 1222322711, 4045468159, 3764231046, 1504067694, 3265744756, 2069664924, 1780612837, 3554288909, +- 2270357136, 1051278712, 802445057, 2519698665, 221152243, 3033880603, 2779263586, 475261322, +- }, { +- 0, 2926088593, 2275419491, 701019378, 3560000647, 2052709654, 1402038756, 4261017717, +- 1930665807, 3715829470, 4105419308, 1524313021, 2804077512, 155861593, 545453739, 2397726522, +- 3861331614, 1213181711, 1636244477, 3488582252, 840331801, 2625561480, 3048626042, 467584747, +- 2503254481, 995897408, 311723186, 3170637091, 1090907478, 4016929991, 3332753461, 1758288292, +- 390036349, 3109546732, 2426363422, 1056427919, 3272488954, 1835443819, 1152258713, 3938878216, +- 1680663602, 3393484195, 3817652561, 1306808512, 2954733749, 510998820, 935169494, 2580880455, +- 4044899811, 1601229938, 1991794816, 3637571857, 623446372, 2336332021, 2726898695, 216120726, +- 2181814956, 744704829, 95158223, 2881711710, 1446680107, 4166125498, 3516576584, 2146575065, +- 780072698, 2148951915, 2849952665, 129384968, 4199529085, 1411853292, 2112855838, 3548843663, +- 1567451573, 4077254692, 3670887638, 1957027143, 2304517426, 657765539, 251396177, 2694091200, +- 3361327204, 1714510325, 1341779207, 3784408214, 476611811, 2986349938, 2613617024, 899690513, +- 3142211371, 354600634, 1021997640, 2458051545, 1870338988, 3239283261, 3906682575, 1186180958, +- 960597383, 2536053782, 3202459876, 277428597, 3983589632, 1125666961, 1792074851, 3300423154, +- 1246892744, 3829039961, 3455203243, 1671079482, 2657312335, 806080478, 432241452, 3081497277, +- 3748049689, 1896751752, 1489409658, 4138600427, 190316446, 2772397583, 2365053693, 580864876, +- 2893360214, 35503559, 735381813, 2243795108, 2017747153, 3593269568, 4293150130, 1368183843, +- 1560145396, 4069882981, 3680356503, 1966430470, 2295112051, 648294626, 258769936, 2701399425, +- 804156091, 2173100842, 2823706584, 103204425, 4225711676, 1438101421, 2088704863, 3524758222, +- 3134903146, 347226875, 1031468553, 2467456920, 1860935661, 3229814396, 3914054286, 1193487135, +- 3385412645, 1738661300, 1315531078, 3758225623, 502792354, 3012596019, 2589468097, 875607120, +- 1271043721, 3853125400, 3429020650, 1644831355, 2683558414, 832261023, 408158061, 3057348348, +- 953223622, 2528745559, 3211865253, 286899508, 3974120769, 1116263632, 1799381026, 3307794867, +- 2917509143, 59586950, 709201268, 2217549029, 2043995280, 3619452161, 4269064691, 1344032866, +- 3740677976, 1889445577, 1498812987, 4148069290, 180845535, 2762992206, 2372361916, 588238637, +- 1921194766, 3706423967, 4112727661, 1531686908, 2796705673, 148555288, 554857194, 2407195515, +- 26248257, 2952271312, 2251333922, 676868275, 3584149702, 2076793175, 1375858085, 4234771508, +- 2493785488, 986493953, 319029491, 3178008930, 1083533591, 4009621638, 3342158964, 1767759333, +- 3887577823, 1239362382, 1612160956, 3464433197, 864482904, 2649647049, 3022443323, 441336490, +- 1706844275, 3419730402, 3793503504, 1282724993, 2978819316, 535149925, 908921239, 2554697734, +- 380632892, 3100077741, 2433735263, 1063734222, 3265180603, 1828069930, 1161729752, 3948283721, +- 2207997677, 770953084, 71007118, 2857626143, 1470763626, 4190274555, 3490330377, 2120394392, +- 4035494306, 1591758899, 1999168705, 3644880208, 616140069, 2328960180, 2736367686, 225524183, +- }, +-}; ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-static const uint8_t +-WUFFS_CRC32__IEEE_X86_SSE42_K1K2[16] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 212, 43, 68, 84, 1, 0, 0, 0, +- 150, 21, 228, 198, 1, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_CRC32__IEEE_X86_SSE42_K3K4[16] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 208, 151, 25, 117, 1, 0, 0, 0, +- 158, 0, 170, 204, 0, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ[16] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 36, 97, 205, 99, 1, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_CRC32__IEEE_X86_SSE42_PXMU[16] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 65, 6, 113, 219, 1, 0, 0, 0, +- 65, 22, 1, 247, 1, 0, 0, 0, +-}; +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x); ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ label__outer__continue:; ++ while (true) { ++ while (self->private_impl.f_pending_pad > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; ++ } ++ self->private_impl.f_pending_pad -= 1u; ++ iop_a_src += 1u; ++ } ++ while (true) { ++ if (self->private_impl.f_dst_x == self->private_impl.f_width) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ if (self->private_impl.f_height > 0u) { ++ self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; ++ } ++ goto label__outer__break; ++ } else if (self->private_impl.f_pad_per_row != 0u) { ++ self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; ++ goto label__outer__continue; ++ } ++ } ++ v_p1_temp = ((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x)); ++ v_p1 = wuffs_base__u32__min(v_p1_temp, 256u); ++ v_p0 = 0u; ++ while (v_p0 < v_p1) { ++ if (self->private_impl.f_bits_per_pixel == 16u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ break; ++ } ++ v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2u; ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ break; ++ } ++ v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4u; ++ } ++ v_channel = 0u; ++ while (v_channel < 4u) { ++ if (self->private_impl.f_channel_num_bits[v_channel] == 0u) { ++ self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = 255u; ++ self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = 255u; ++ } else { ++ v_c = ((v_c32 & self->private_impl.f_channel_masks[v_channel]) >> self->private_impl.f_channel_shifts[v_channel]); ++ v_num_bits = ((uint32_t)(self->private_impl.f_channel_num_bits[v_channel])); ++ while (v_num_bits < 16u) { ++ v_c |= ((uint32_t)(v_c << v_num_bits)); ++ v_num_bits *= 2u; ++ } ++ v_c >>= (v_num_bits - 16u); ++ self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = ((uint8_t)((v_c >> 0u))); ++ self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = ((uint8_t)((v_c >> 8u))); ++ } ++ v_channel += 1u; ++ } ++ v_p0 += 1u; ++ } ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i >= ((uint64_t)(v_dst.len))) { ++ v_n = ((uint64_t)(v_p0)); ++ } else { ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, (8u * v_p0))); ++ } ++ if (v_n == 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ } ++ } ++ label__outer__break:; ++ status = wuffs_base__make_status(NULL); ++ goto ok; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up__choosy_default( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x); ++ ok: ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_arm_crc32( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) ++ return status; ++} + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_x86_avx2( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) ++// -------- func bmp.decoder.swizzle_low_bit_depth + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_x86_sse42( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- +-// ---------------- VTables +- +-const wuffs_base__hasher_u32__func_ptrs +-wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32 = { +- (uint32_t(*)(const void*))(&wuffs_crc32__ieee_hasher__checksum_u32), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_crc32__ieee_hasher__get_quirk), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_crc32__ieee_hasher__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update), +- (uint32_t(*)(void*, +- wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update_u32), +-}; ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_low_bit_depth( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// ---------------- Initializer Implementations ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_n = 0; ++ uint32_t v_p0 = 0; ++ uint32_t v_chunk_bits = 0; ++ uint32_t v_chunk_count = 0; ++ uint32_t v_pixels_per_chunk = 0; + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_crc32__ieee_hasher__initialize( +- wuffs_crc32__ieee_hasher* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ while (true) { ++ if (self->private_impl.f_dst_x == self->private_impl.f_width) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ break; ++ } + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i >= ((uint64_t)(v_dst.len))) { ++ if (self->private_impl.f_bits_per_pixel == 1u) { ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u); ++ v_pixels_per_chunk = 32u; ++ } else if (self->private_impl.f_bits_per_pixel == 2u) { ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u); ++ v_pixels_per_chunk = 16u; ++ } else { ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u); ++ v_pixels_per_chunk = 8u; ++ } ++ while ((v_chunk_count >= 64u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 256u)) { ++ iop_a_src += 256u; ++ self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 64u)))); ++ v_chunk_count -= 64u; ++ } ++ while ((v_chunk_count >= 8u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 32u)) { ++ iop_a_src += 32u; ++ self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 8u)))); ++ v_chunk_count -= 8u; ++ } ++ while (v_chunk_count > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; ++ } ++ iop_a_src += 4u; ++ self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 1u)))); ++ v_chunk_count -= 1u; ++ } ++ continue; ++ } ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i); ++ v_p0 = 0u; ++ if (self->private_impl.f_bits_per_pixel == 1u) { ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u); ++ v_chunk_count = wuffs_base__u32__min(v_chunk_count, 16u); ++ while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { ++ v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4u; ++ self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((1u & (v_chunk_bits >> 31u)))); ++ self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((1u & (v_chunk_bits >> 30u)))); ++ self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((1u & (v_chunk_bits >> 29u)))); ++ self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((1u & (v_chunk_bits >> 28u)))); ++ self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((1u & (v_chunk_bits >> 27u)))); ++ self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((1u & (v_chunk_bits >> 26u)))); ++ self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((1u & (v_chunk_bits >> 25u)))); ++ self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((1u & (v_chunk_bits >> 24u)))); ++ self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((1u & (v_chunk_bits >> 23u)))); ++ self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((1u & (v_chunk_bits >> 22u)))); ++ self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((1u & (v_chunk_bits >> 21u)))); ++ self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((1u & (v_chunk_bits >> 20u)))); ++ self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((1u & (v_chunk_bits >> 19u)))); ++ self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((1u & (v_chunk_bits >> 18u)))); ++ self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((1u & (v_chunk_bits >> 17u)))); ++ self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((1u & (v_chunk_bits >> 16u)))); ++ self->private_data.f_scratch[(v_p0 + 16u)] = ((uint8_t)((1u & (v_chunk_bits >> 15u)))); ++ self->private_data.f_scratch[(v_p0 + 17u)] = ((uint8_t)((1u & (v_chunk_bits >> 14u)))); ++ self->private_data.f_scratch[(v_p0 + 18u)] = ((uint8_t)((1u & (v_chunk_bits >> 13u)))); ++ self->private_data.f_scratch[(v_p0 + 19u)] = ((uint8_t)((1u & (v_chunk_bits >> 12u)))); ++ self->private_data.f_scratch[(v_p0 + 20u)] = ((uint8_t)((1u & (v_chunk_bits >> 11u)))); ++ self->private_data.f_scratch[(v_p0 + 21u)] = ((uint8_t)((1u & (v_chunk_bits >> 10u)))); ++ self->private_data.f_scratch[(v_p0 + 22u)] = ((uint8_t)((1u & (v_chunk_bits >> 9u)))); ++ self->private_data.f_scratch[(v_p0 + 23u)] = ((uint8_t)((1u & (v_chunk_bits >> 8u)))); ++ self->private_data.f_scratch[(v_p0 + 24u)] = ((uint8_t)((1u & (v_chunk_bits >> 7u)))); ++ self->private_data.f_scratch[(v_p0 + 25u)] = ((uint8_t)((1u & (v_chunk_bits >> 6u)))); ++ self->private_data.f_scratch[(v_p0 + 26u)] = ((uint8_t)((1u & (v_chunk_bits >> 5u)))); ++ self->private_data.f_scratch[(v_p0 + 27u)] = ((uint8_t)((1u & (v_chunk_bits >> 4u)))); ++ self->private_data.f_scratch[(v_p0 + 28u)] = ((uint8_t)((1u & (v_chunk_bits >> 3u)))); ++ self->private_data.f_scratch[(v_p0 + 29u)] = ((uint8_t)((1u & (v_chunk_bits >> 2u)))); ++ self->private_data.f_scratch[(v_p0 + 30u)] = ((uint8_t)((1u & (v_chunk_bits >> 1u)))); ++ self->private_data.f_scratch[(v_p0 + 31u)] = ((uint8_t)((1u & (v_chunk_bits >> 0u)))); ++ v_p0 = ((v_p0 & 511u) + 32u); ++ v_chunk_count -= 1u; ++ } ++ } else if (self->private_impl.f_bits_per_pixel == 2u) { ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u); ++ v_chunk_count = wuffs_base__u32__min(v_chunk_count, 32u); ++ while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { ++ v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4u; ++ self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((3u & (v_chunk_bits >> 30u)))); ++ self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((3u & (v_chunk_bits >> 28u)))); ++ self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((3u & (v_chunk_bits >> 26u)))); ++ self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((3u & (v_chunk_bits >> 24u)))); ++ self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((3u & (v_chunk_bits >> 22u)))); ++ self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((3u & (v_chunk_bits >> 20u)))); ++ self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((3u & (v_chunk_bits >> 18u)))); ++ self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((3u & (v_chunk_bits >> 16u)))); ++ self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((3u & (v_chunk_bits >> 14u)))); ++ self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((3u & (v_chunk_bits >> 12u)))); ++ self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((3u & (v_chunk_bits >> 10u)))); ++ self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((3u & (v_chunk_bits >> 8u)))); ++ self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((3u & (v_chunk_bits >> 6u)))); ++ self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((3u & (v_chunk_bits >> 4u)))); ++ self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((3u & (v_chunk_bits >> 2u)))); ++ self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((3u & (v_chunk_bits >> 0u)))); ++ v_p0 = ((v_p0 & 511u) + 16u); ++ v_chunk_count -= 1u; ++ } + } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u); ++ v_chunk_count = wuffs_base__u32__min(v_chunk_count, 64u); ++ while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { ++ v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4u; ++ self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 28u)))); ++ self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 24u)))); ++ self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 20u)))); ++ self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 16u)))); ++ self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u)))); ++ self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u)))); ++ self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u)))); ++ self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u)))); ++ v_p0 = ((v_p0 & 511u) + 8u); ++ v_chunk_count -= 1u; ++ } ++ } ++ v_p0 = wuffs_base__u32__min(v_p0, wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x)); ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0)); ++ if (v_n == 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; + } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); + } ++ status = wuffs_base__make_status(NULL); ++ goto ok; + +- self->private_impl.choosy_up = &wuffs_crc32__ieee_hasher__up__choosy_default; ++ ok: ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = +- wuffs_base__hasher_u32__vtable_name; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = +- (const void*)(&wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32); +- return wuffs_base__make_status(NULL); ++ return status; + } + +-wuffs_crc32__ieee_hasher* +-wuffs_crc32__ieee_hasher__alloc(void) { +- wuffs_crc32__ieee_hasher* x = +- (wuffs_crc32__ieee_hasher*)(calloc(sizeof(wuffs_crc32__ieee_hasher), 1)); +- if (!x) { +- return NULL; ++// -------- func bmp.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_bmp__decoder__frame_dirty_rect( ++ const wuffs_bmp__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); + } +- if (wuffs_crc32__ieee_hasher__initialize( +- x, sizeof(wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); + } +- return x; +-} + +-size_t +-sizeof__wuffs_crc32__ieee_hasher(void) { +- return sizeof(wuffs_crc32__ieee_hasher); ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); + } + +-// ---------------- Function Implementations +- +-// -------- func crc32.ieee_hasher.get_quirk ++// -------- func bmp.decoder.num_animation_loops + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_crc32__ieee_hasher__get_quirk( +- const wuffs_crc32__ieee_hasher* self, +- uint32_t a_key) { ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_bmp__decoder__num_animation_loops( ++ const wuffs_bmp__decoder* self) { + if (!self) { + return 0; + } +@@ -33524,709 +33654,531 @@ wuffs_crc32__ieee_hasher__get_quirk( + return 0u; + } + +-// -------- func crc32.ieee_hasher.set_quirk ++// -------- func bmp.decoder.num_decoded_frame_configs + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_crc32__ieee_hasher__set_quirk( +- wuffs_crc32__ieee_hasher* self, +- uint32_t a_key, +- uint64_t a_value) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_bmp__decoder__num_decoded_frame_configs( ++ const wuffs_bmp__decoder* self) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return 0; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; + } + +-// -------- func crc32.ieee_hasher.update ++// -------- func bmp.decoder.num_decoded_frames + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__update( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_bmp__decoder__num_decoded_frames( ++ const wuffs_bmp__decoder* self) { + if (!self) { +- return wuffs_base__make_empty_struct(); ++ return 0; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- if (self->private_impl.f_state == 0u) { +- self->private_impl.choosy_up = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) +- wuffs_base__cpu_arch__have_arm_crc32() ? &wuffs_crc32__ieee_hasher__up_arm_crc32 : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +- wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_crc32__ieee_hasher__up_x86_avx2 : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc32__ieee_hasher__up_x86_sse42 : +-#endif +- self->private_impl.choosy_up); ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; + } +- wuffs_crc32__ieee_hasher__up(self, a_x); +- return wuffs_base__make_empty_struct(); ++ return 0u; + } + +-// -------- func crc32.ieee_hasher.update_u32 ++// -------- func bmp.decoder.restart_frame + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_crc32__ieee_hasher__update_u32( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__restart_frame( ++ wuffs_bmp__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { + if (!self) { +- return 0; ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- wuffs_crc32__ieee_hasher__update(self, a_x); +- return self->private_impl.f_state; ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if (a_index != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ self->private_impl.f_frame_config_io_position = a_io_position; ++ return wuffs_base__make_status(NULL); + } + +-// -------- func crc32.ieee_hasher.up ++// -------- func bmp.decoder.set_report_metadata + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { +- return (*self->private_impl.choosy_up)(self, a_x); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_bmp__decoder__set_report_metadata( ++ wuffs_bmp__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); + } + ++// -------- func bmp.decoder.tell_me_more ++ + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up__choosy_default( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s = 0; +- wuffs_base__slice_u8 v_p = {0}; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__tell_me_more( ++ wuffs_bmp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- v_s = (4294967295u ^ self->private_impl.f_state); +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 16; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32); +- while (v_p.ptr < i_end0_p) { +- v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | +- (((uint32_t)(v_p.ptr[1u])) << 8u) | +- (((uint32_t)(v_p.ptr[2u])) << 16u) | +- (((uint32_t)(v_p.ptr[3u])) << 24u)); +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ +- WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ +- WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ +- WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ +- WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ +- WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ +- WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ +- WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ +- WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ +- WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ +- WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ +- WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ +- WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ +- WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ +- WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ +- WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); +- v_p.ptr += 16; +- v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | +- (((uint32_t)(v_p.ptr[1u])) << 8u) | +- (((uint32_t)(v_p.ptr[2u])) << 16u) | +- (((uint32_t)(v_p.ptr[3u])) << 24u)); +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ +- WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ +- WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ +- WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ +- WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ +- WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ +- WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ +- WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ +- WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ +- WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ +- WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ +- WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ +- WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ +- WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ +- WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ +- WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); +- v_p.ptr += 16; +- } +- v_p.len = 16; +- uint8_t* i_end1_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16); +- while (v_p.ptr < i_end1_p) { +- v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | +- (((uint32_t)(v_p.ptr[1u])) << 8u) | +- (((uint32_t)(v_p.ptr[2u])) << 16u) | +- (((uint32_t)(v_p.ptr[3u])) << 24u)); +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ +- WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ +- WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ +- WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ +- WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ +- WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ +- WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ +- WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ +- WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ +- WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ +- WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ +- WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ +- WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ +- WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ +- WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ +- WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); +- v_p.ptr += 16; +- } +- v_p.len = 1; +- uint8_t* i_end2_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end2_p) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ v_p.ptr[0u])] ^ (v_s >> 8u)); +- v_p.ptr += 1; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_tell_me_more; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_bmp__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- v_p.len = 0; ++ ++ ok: ++ self->private_impl.p_tell_me_more = 0; ++ goto exit; + } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; + } + +-// -------- func crc32.ieee_hasher.checksum_u32 ++// -------- func bmp.decoder.do_tell_me_more + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_crc32__ieee_hasher__checksum_u32( +- const wuffs_crc32__ieee_hasher* self) { +- if (!self) { +- return 0; ++static wuffs_base__status ++wuffs_bmp__decoder__do_tell_me_more( ++ wuffs_bmp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ if (self->private_impl.f_io_redirect_fourcc <= 1u) { ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ 1u, ++ self->private_impl.f_io_redirect_fourcc, ++ 0u, ++ self->private_impl.f_io_redirect_pos, ++ 18446744073709551615u); + } ++ self->private_impl.f_io_redirect_fourcc = 1u; + +- return self->private_impl.f_state; ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ return status; + } + +-// ‼ WUFFS MULTI-FILE SECTION +arm_crc32 +-// -------- func crc32.ieee_hasher.up_arm_crc32 ++// -------- func bmp.decoder.workbuf_len + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_arm_crc32( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { +- wuffs_base__slice_u8 v_p = {0}; +- uint32_t v_s = 0; +- +- v_s = (4294967295u ^ self->private_impl.f_state); +- while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { +- v_s = __crc32b(v_s, a_x.ptr[0u]); +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_bmp__decoder__workbuf_len( ++ const wuffs_bmp__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 8; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 128) * 128); +- while (v_p.ptr < i_end0_p) { +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- } +- v_p.len = 8; +- uint8_t* i_end1_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8); +- while (v_p.ptr < i_end1_p) { +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- } +- v_p.len = 1; +- uint8_t* i_end2_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end2_p) { +- v_s = __crc32b(v_s, v_p.ptr[0u]); +- v_p.ptr += 1; +- } +- v_p.len = 0; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) +-// ‼ WUFFS MULTI-FILE SECTION -arm_crc32 + +-// ‼ WUFFS MULTI-FILE SECTION +x86_avx2 +-// -------- func crc32.ieee_hasher.up_x86_avx2 ++// -------- func bmp.decoder.read_palette + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_x86_avx2( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s = 0; +- wuffs_base__slice_u8 v_p = {0}; +- __m128i v_k = {0}; +- __m128i v_x0 = {0}; +- __m128i v_x1 = {0}; +- __m128i v_x2 = {0}; +- __m128i v_x3 = {0}; +- __m128i v_y0 = {0}; +- __m128i v_y1 = {0}; +- __m128i v_y2 = {0}; +- __m128i v_y3 = {0}; +- uint64_t v_tail_index = 0; ++static wuffs_base__status ++wuffs_bmp__decoder__read_palette( ++ wuffs_bmp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- v_s = (4294967295u ^ self->private_impl.f_state); +- while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ a_x.ptr[0u])] ^ (v_s >> 8u)); +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); ++ uint32_t v_i = 0; ++ uint32_t v_argb = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (((uint64_t)(a_x.len)) < 64u) { +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ v_p.ptr[0u])] ^ (v_s >> 8u)); +- v_p.ptr += 1; ++ ++ uint32_t coro_susp_point = self->private_impl.p_read_palette; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_read_palette.v_i; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_bitmap_info_len == 12u) { ++ while ((v_i < 256u) && (self->private_impl.f_padding >= 3u)) { ++ self->private_impl.f_padding -= 3u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { ++ t_0 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); ++ iop_a_src += 3; ++ } else { ++ self->private_data.s_read_palette.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_read_palette.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 16) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_argb = t_0; ++ } ++ v_argb |= 4278190080u; ++ self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); ++ self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); ++ self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); ++ v_i += 1u; ++ } ++ } else { ++ while ((v_i < 256u) && (self->private_impl.f_padding >= 4u)) { ++ self->private_impl.f_padding -= 4u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_read_palette.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_read_palette.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_argb = t_1; ++ } ++ v_argb |= 4278190080u; ++ self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); ++ self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); ++ self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); ++ v_i += 1u; + } +- v_p.len = 0; + } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); +- } +- v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)); +- v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); +- v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)); +- v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)); +- v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s))); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K1K2)); +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, 64u); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 64; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64); +- while (v_p.ptr < i_end0_p) { +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_y1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u)); +- v_y2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(0u)); +- v_y3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(17u)); +- v_x2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(17u)); +- v_x3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(_mm_xor_si128(v_x0, v_y0), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 0u))); +- v_x1 = _mm_xor_si128(_mm_xor_si128(v_x1, v_y1), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u))); +- v_x2 = _mm_xor_si128(_mm_xor_si128(v_x2, v_y2), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 32u))); +- v_x3 = _mm_xor_si128(_mm_xor_si128(v_x3, v_y3), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 48u))); +- v_p.ptr += 64; ++ while (v_i < 256u) { ++ self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u; ++ v_i += 1u; + } +- v_p.len = 0; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_read_palette = 0; ++ goto exit; + } +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K3K4)); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x2); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x3); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_x1 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(16u)); +- v_x2 = _mm_set_epi32((int32_t)(0u), (int32_t)(4294967295u), (int32_t)(0u), (int32_t)(4294967295u)); +- v_x0 = _mm_srli_si128(v_x0, (int32_t)(8u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ)); +- v_x1 = _mm_srli_si128(v_x0, (int32_t)(4u)); +- v_x0 = _mm_and_si128(v_x0, v_x2); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_PXMU)); +- v_x1 = _mm_and_si128(v_x0, v_x2); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(16u)); +- v_x1 = _mm_and_si128(v_x1, v_x2); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_s = ((uint32_t)(_mm_extract_epi32(v_x0, (int32_t)(1u)))); +- v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551552u); +- if (v_tail_index < ((uint64_t)(a_x.len))) { +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ v_p.ptr[0u])] ^ (v_s >> 8u)); +- v_p.ptr += 1; +- } +- v_p.len = 0; +- } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_read_palette = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_read_palette.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); ++ ++ return status; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) +-// ‼ WUFFS MULTI-FILE SECTION -x86_avx2 + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func crc32.ieee_hasher.up_x86_sse42 ++// -------- func bmp.decoder.process_masks + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_x86_sse42( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s = 0; +- wuffs_base__slice_u8 v_p = {0}; +- __m128i v_k = {0}; +- __m128i v_x0 = {0}; +- __m128i v_x1 = {0}; +- __m128i v_x2 = {0}; +- __m128i v_x3 = {0}; +- __m128i v_y0 = {0}; +- __m128i v_y1 = {0}; +- __m128i v_y2 = {0}; +- __m128i v_y3 = {0}; +- uint64_t v_tail_index = 0; ++static wuffs_base__status ++wuffs_bmp__decoder__process_masks( ++ wuffs_bmp__decoder* self) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- v_s = (4294967295u ^ self->private_impl.f_state); +- while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ a_x.ptr[0u])] ^ (v_s >> 8u)); +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); +- } +- if (((uint64_t)(a_x.len)) < 64u) { +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ v_p.ptr[0u])] ^ (v_s >> 8u)); +- v_p.ptr += 1; ++ uint32_t v_i = 0; ++ uint32_t v_mask = 0; ++ uint32_t v_n = 0; ++ ++ while (v_i < 4u) { ++ v_mask = self->private_impl.f_channel_masks[v_i]; ++ if (v_mask != 0u) { ++ v_n = 0u; ++ while ((v_mask & 1u) == 0u) { ++ v_n += 1u; ++ v_mask >>= 1u; + } +- v_p.len = 0; +- } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); +- } +- v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)); +- v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); +- v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)); +- v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)); +- v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s))); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K1K2)); +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, 64u); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 64; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64); +- while (v_p.ptr < i_end0_p) { +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_y1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u)); +- v_y2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(0u)); +- v_y3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(17u)); +- v_x2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(17u)); +- v_x3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(_mm_xor_si128(v_x0, v_y0), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 0u))); +- v_x1 = _mm_xor_si128(_mm_xor_si128(v_x1, v_y1), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u))); +- v_x2 = _mm_xor_si128(_mm_xor_si128(v_x2, v_y2), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 32u))); +- v_x3 = _mm_xor_si128(_mm_xor_si128(v_x3, v_y3), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 48u))); +- v_p.ptr += 64; +- } +- v_p.len = 0; +- } +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K3K4)); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x2); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x3); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_x1 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(16u)); +- v_x2 = _mm_set_epi32((int32_t)(0u), (int32_t)(4294967295u), (int32_t)(0u), (int32_t)(4294967295u)); +- v_x0 = _mm_srli_si128(v_x0, (int32_t)(8u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ)); +- v_x1 = _mm_srli_si128(v_x0, (int32_t)(4u)); +- v_x0 = _mm_and_si128(v_x0, v_x2); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_PXMU)); +- v_x1 = _mm_and_si128(v_x0, v_x2); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(16u)); +- v_x1 = _mm_and_si128(v_x1, v_x2); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_s = ((uint32_t)(_mm_extract_epi32(v_x0, (int32_t)(1u)))); +- v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551552u); +- if (v_tail_index < ((uint64_t)(a_x.len))) { +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ v_p.ptr[0u])] ^ (v_s >> 8u)); +- v_p.ptr += 1; ++ self->private_impl.f_channel_shifts[v_i] = ((uint8_t)((v_n & 31u))); ++ v_n = 0u; ++ while ((v_mask & 1u) == 1u) { ++ v_n += 1u; ++ v_mask >>= 1u; + } +- v_p.len = 0; ++ if ((v_mask != 0u) || (v_n > 32u)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_channel_num_bits[v_i] = ((uint8_t)(v_n)); ++ } else if (v_i != 3u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; + } ++ v_i += 1u; + } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); ++ ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ return status; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) + + // ---------------- Status Codes Implementations + +-const char wuffs_deflate__error__bad_huffman_code_over_subscribed[] = "#deflate: bad Huffman code (over-subscribed)"; +-const char wuffs_deflate__error__bad_huffman_code_under_subscribed[] = "#deflate: bad Huffman code (under-subscribed)"; +-const char wuffs_deflate__error__bad_huffman_code_length_count[] = "#deflate: bad Huffman code length count"; +-const char wuffs_deflate__error__bad_huffman_code_length_repetition[] = "#deflate: bad Huffman code length repetition"; +-const char wuffs_deflate__error__bad_huffman_code[] = "#deflate: bad Huffman code"; +-const char wuffs_deflate__error__bad_huffman_minimum_code_length[] = "#deflate: bad Huffman minimum code length"; +-const char wuffs_deflate__error__bad_block[] = "#deflate: bad block"; +-const char wuffs_deflate__error__bad_distance[] = "#deflate: bad distance"; +-const char wuffs_deflate__error__bad_distance_code_count[] = "#deflate: bad distance code count"; +-const char wuffs_deflate__error__bad_literal_length_code_count[] = "#deflate: bad literal/length code count"; +-const char wuffs_deflate__error__inconsistent_stored_block_length[] = "#deflate: inconsistent stored block length"; +-const char wuffs_deflate__error__missing_end_of_block_code[] = "#deflate: missing end-of-block code"; +-const char wuffs_deflate__error__no_huffman_codes[] = "#deflate: no Huffman codes"; +-const char wuffs_deflate__error__truncated_input[] = "#deflate: truncated input"; +-const char wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state[] = "#deflate: internal error: inconsistent Huffman decoder state"; +-const char wuffs_deflate__error__internal_error_inconsistent_i_o[] = "#deflate: internal error: inconsistent I/O"; +-const char wuffs_deflate__error__internal_error_inconsistent_distance[] = "#deflate: internal error: inconsistent distance"; +-const char wuffs_deflate__error__internal_error_inconsistent_n_bits[] = "#deflate: internal error: inconsistent n_bits"; ++const char wuffs_bzip2__error__bad_huffman_code_over_subscribed[] = "#bzip2: bad Huffman code (over-subscribed)"; ++const char wuffs_bzip2__error__bad_huffman_code_under_subscribed[] = "#bzip2: bad Huffman code (under-subscribed)"; ++const char wuffs_bzip2__error__bad_block_header[] = "#bzip2: bad block header"; ++const char wuffs_bzip2__error__bad_block_length[] = "#bzip2: bad block length"; ++const char wuffs_bzip2__error__bad_checksum[] = "#bzip2: bad checksum"; ++const char wuffs_bzip2__error__bad_header[] = "#bzip2: bad header"; ++const char wuffs_bzip2__error__bad_number_of_sections[] = "#bzip2: bad number of sections"; ++const char wuffs_bzip2__error__truncated_input[] = "#bzip2: truncated input"; ++const char wuffs_bzip2__error__unsupported_block_randomization[] = "#bzip2: unsupported block randomization"; ++const char wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state[] = "#bzip2: internal error: inconsistent Huffman decoder state"; + + // ---------------- Private Consts + + static const uint8_t +-WUFFS_DEFLATE__CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 16, 17, 18, 0, 8, 7, 9, 6, +- 10, 5, 11, 4, 12, 3, 13, 2, +- 14, 1, 15, +-}; +- +-static const uint8_t +-WUFFS_DEFLATE__REVERSE8[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 128, 64, 192, 32, 160, 96, 224, +- 16, 144, 80, 208, 48, 176, 112, 240, +- 8, 136, 72, 200, 40, 168, 104, 232, +- 24, 152, 88, 216, 56, 184, 120, 248, +- 4, 132, 68, 196, 36, 164, 100, 228, +- 20, 148, 84, 212, 52, 180, 116, 244, +- 12, 140, 76, 204, 44, 172, 108, 236, +- 28, 156, 92, 220, 60, 188, 124, 252, +- 2, 130, 66, 194, 34, 162, 98, 226, +- 18, 146, 82, 210, 50, 178, 114, 242, +- 10, 138, 74, 202, 42, 170, 106, 234, +- 26, 154, 90, 218, 58, 186, 122, 250, +- 6, 134, 70, 198, 38, 166, 102, 230, +- 22, 150, 86, 214, 54, 182, 118, 246, +- 14, 142, 78, 206, 46, 174, 110, 238, +- 30, 158, 94, 222, 62, 190, 126, 254, +- 1, 129, 65, 193, 33, 161, 97, 225, +- 17, 145, 81, 209, 49, 177, 113, 241, +- 9, 137, 73, 201, 41, 169, 105, 233, +- 25, 153, 89, 217, 57, 185, 121, 249, +- 5, 133, 69, 197, 37, 165, 101, 229, +- 21, 149, 85, 213, 53, 181, 117, 245, +- 13, 141, 77, 205, 45, 173, 109, 237, +- 29, 157, 93, 221, 61, 189, 125, 253, +- 3, 131, 67, 195, 35, 163, 99, 227, +- 19, 147, 83, 211, 51, 179, 115, 243, +- 11, 139, 75, 203, 43, 171, 107, 235, +- 27, 155, 91, 219, 59, 187, 123, 251, +- 7, 135, 71, 199, 39, 167, 103, 231, +- 23, 151, 87, 215, 55, 183, 119, 247, +- 15, 143, 79, 207, 47, 175, 111, 239, +- 31, 159, 95, 223, 63, 191, 127, 255, +-}; +- +-static const uint32_t +-WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1073741824, 1073742080, 1073742336, 1073742592, 1073742848, 1073743104, 1073743360, 1073743616, +- 1073743888, 1073744400, 1073744912, 1073745424, 1073745952, 1073746976, 1073748000, 1073749024, +- 1073750064, 1073752112, 1073754160, 1073756208, 1073758272, 1073762368, 1073766464, 1073770560, +- 1073774672, 1073782864, 1073791056, 1073799248, 1073807104, 134217728, 134217728, 134217728, ++WUFFS_BZIP2__CLAMP_TO_5[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 1u, 2u, 3u, 4u, 5u, 5u, 5u, + }; + + static const uint32_t +-WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1073741824, 1073742080, 1073742336, 1073742592, 1073742864, 1073743376, 1073743904, 1073744928, +- 1073745968, 1073748016, 1073750080, 1073754176, 1073758288, 1073766480, 1073774688, 1073791072, +- 1073807472, 1073840240, 1073873024, 1073938560, 1074004112, 1074135184, 1074266272, 1074528416, +- 1074790576, 1075314864, 1075839168, 1076887744, 1077936336, 1080033488, 134217728, 134217728, ++WUFFS_BZIP2__REV_CRC32_TABLE[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 79764919u, 159529838u, 222504665u, 319059676u, 398814059u, 445009330u, 507990021u, ++ 638119352u, 583659535u, 797628118u, 726387553u, 890018660u, 835552979u, 1015980042u, 944750013u, ++ 1276238704u, 1221641927u, 1167319070u, 1095957929u, 1595256236u, 1540665371u, 1452775106u, 1381403509u, ++ 1780037320u, 1859660671u, 1671105958u, 1733955601u, 2031960084u, 2111593891u, 1889500026u, 1952343757u, ++ 2552477408u, 2632100695u, 2443283854u, 2506133561u, 2334638140u, 2414271883u, 2191915858u, 2254759653u, ++ 3190512472u, 3135915759u, 3081330742u, 3009969537u, 2905550212u, 2850959411u, 2762807018u, 2691435357u, ++ 3560074640u, 3505614887u, 3719321342u, 3648080713u, 3342211916u, 3287746299u, 3467911202u, 3396681109u, ++ 4063920168u, 4143685023u, 4223187782u, 4286162673u, 3779000052u, 3858754371u, 3904687514u, 3967668269u, ++ 881225847u, 809987520u, 1023691545u, 969234094u, 662832811u, 591600412u, 771767749u, 717299826u, ++ 311336399u, 374308984u, 453813921u, 533576470u, 25881363u, 88864420u, 134795389u, 214552010u, ++ 2023205639u, 2086057648u, 1897238633u, 1976864222u, 1804852699u, 1867694188u, 1645340341u, 1724971778u, ++ 1587496639u, 1516133128u, 1461550545u, 1406951526u, 1302016099u, 1230646740u, 1142491917u, 1087903418u, ++ 2896545431u, 2825181984u, 2770861561u, 2716262478u, 3215044683u, 3143675388u, 3055782693u, 3001194130u, ++ 2326604591u, 2389456536u, 2200899649u, 2280525302u, 2578013683u, 2640855108u, 2418763421u, 2498394922u, ++ 3769900519u, 3832873040u, 3912640137u, 3992402750u, 4088425275u, 4151408268u, 4197601365u, 4277358050u, ++ 3334271071u, 3263032808u, 3476998961u, 3422541446u, 3585640067u, 3514407732u, 3694837229u, 3640369242u, ++ 1762451694u, 1842216281u, 1619975040u, 1682949687u, 2047383090u, 2127137669u, 1938468188u, 2001449195u, ++ 1325665622u, 1271206113u, 1183200824u, 1111960463u, 1543535498u, 1489069629u, 1434599652u, 1363369299u, ++ 622672798u, 568075817u, 748617968u, 677256519u, 907627842u, 853037301u, 1067152940u, 995781531u, ++ 51762726u, 131386257u, 177728840u, 240578815u, 269590778u, 349224269u, 429104020u, 491947555u, ++ 4046411278u, 4126034873u, 4172115296u, 4234965207u, 3794477266u, 3874110821u, 3953728444u, 4016571915u, ++ 3609705398u, 3555108353u, 3735388376u, 3664026991u, 3290680682u, 3236090077u, 3449943556u, 3378572211u, ++ 3174993278u, 3120533705u, 3032266256u, 2961025959u, 2923101090u, 2868635157u, 2813903052u, 2742672763u, ++ 2604032198u, 2683796849u, 2461293480u, 2524268063u, 2284983834u, 2364738477u, 2175806836u, 2238787779u, ++ 1569362073u, 1498123566u, 1409854455u, 1355396672u, 1317987909u, 1246755826u, 1192025387u, 1137557660u, ++ 2072149281u, 2135122070u, 1912620623u, 1992383480u, 1753615357u, 1816598090u, 1627664531u, 1707420964u, ++ 295390185u, 358241886u, 404320391u, 483945776u, 43990325u, 106832002u, 186451547u, 266083308u, ++ 932423249u, 861060070u, 1041341759u, 986742920u, 613929101u, 542559546u, 756411363u, 701822548u, ++ 3316196985u, 3244833742u, 3425377559u, 3370778784u, 3601682597u, 3530312978u, 3744426955u, 3689838204u, ++ 3819031489u, 3881883254u, 3928223919u, 4007849240u, 4037393693u, 4100235434u, 4180117107u, 4259748804u, ++ 2310601993u, 2373574846u, 2151335527u, 2231098320u, 2596047829u, 2659030626u, 2470359227u, 2550115596u, ++ 2947551409u, 2876312838u, 2788305887u, 2733848168u, 3165939309u, 3094707162u, 3040238851u, 2985771188u, + }; + +-#define WUFFS_DEFLATE__HUFFS_TABLE_SIZE 1024 +- +-#define WUFFS_DEFLATE__HUFFS_TABLE_MASK 1023 +- + // ---------------- Private Initializer Prototypes + + // ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__do_transform_io( +- wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__do_transform_io( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_blocks( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__prepare_block( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_uncompressed( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__read_code_lengths( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__init_fixed_huffman( +- wuffs_deflate__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__init_dynamic_huffman( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_src); ++wuffs_bzip2__decoder__build_huffman_tree( ++ wuffs_bzip2__decoder* self, ++ uint32_t a_which); + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__init_huff( +- wuffs_deflate__decoder* self, +- uint32_t a_which, +- uint32_t a_n_codes0, +- uint32_t a_n_codes1, +- uint32_t a_base_symbol); ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__build_huffman_table( ++ wuffs_bzip2__decoder* self, ++ uint32_t a_which); + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_bmi2( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__invert_bwt( ++ wuffs_bzip2__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast32( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src); ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__flush_fast( ++ wuffs_bzip2__decoder* self, ++ wuffs_base__io_buffer* a_dst); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast64( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src); ++wuffs_bzip2__decoder__flush_slow( ++ wuffs_bzip2__decoder* self, ++ wuffs_base__io_buffer* a_dst); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__decode_huffman_fast( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_slow( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__decode_huffman_slow( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + + // ---------------- VTables + + const wuffs_base__io_transformer__func_ptrs +-wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_bzip2__decoder__dst_history_retain_length), + (uint64_t(*)(const void*, +- uint32_t))(&wuffs_deflate__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_deflate__decoder__history_retain_length), ++ uint32_t))(&wuffs_bzip2__decoder__get_quirk), + (wuffs_base__status(*)(void*, + uint32_t, +- uint64_t))(&wuffs_deflate__decoder__set_quirk), ++ uint64_t))(&wuffs_bzip2__decoder__set_quirk), + (wuffs_base__status(*)(void*, + wuffs_base__io_buffer*, + wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_deflate__decoder__transform_io), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_deflate__decoder__workbuf_len), ++ wuffs_base__slice_u8))(&wuffs_bzip2__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bzip2__decoder__workbuf_len), + }; + + // ---------------- Initializer Implementations + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_deflate__decoder__initialize( +- wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__initialize( ++ wuffs_bzip2__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ +@@ -34263,25 +34215,23 @@ wuffs_deflate__decoder__initialize( + } + } + +- self->private_impl.choosy_decode_huffman_fast64 = &wuffs_deflate__decoder__decode_huffman_fast64__choosy_default; +- + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = + wuffs_base__io_transformer__vtable_name; + self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = +- (const void*)(&wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ (const void*)(&wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer); + return wuffs_base__make_status(NULL); + } + +-wuffs_deflate__decoder* +-wuffs_deflate__decoder__alloc(void) { +- wuffs_deflate__decoder* x = +- (wuffs_deflate__decoder*)(calloc(sizeof(wuffs_deflate__decoder), 1)); ++wuffs_bzip2__decoder* ++wuffs_bzip2__decoder__alloc(void) { ++ wuffs_bzip2__decoder* x = ++ (wuffs_bzip2__decoder*)(calloc(1, sizeof(wuffs_bzip2__decoder))); + if (!x) { + return NULL; + } +- if (wuffs_deflate__decoder__initialize( +- x, sizeof(wuffs_deflate__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ if (wuffs_bzip2__decoder__initialize( ++ x, sizeof(wuffs_bzip2__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } +@@ -34289,59 +34239,18 @@ wuffs_deflate__decoder__alloc(void) { + } + + size_t +-sizeof__wuffs_deflate__decoder(void) { +- return sizeof(wuffs_deflate__decoder); ++sizeof__wuffs_bzip2__decoder(void) { ++ return sizeof(wuffs_bzip2__decoder); + } + + // ---------------- Function Implementations + +-// -------- func deflate.decoder.add_history +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_deflate__decoder__add_history( +- wuffs_deflate__decoder* self, +- wuffs_base__slice_u8 a_hist) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); +- } +- +- wuffs_base__slice_u8 v_s = {0}; +- uint64_t v_n_copied = 0; +- uint32_t v_already_full = 0; +- +- v_s = a_hist; +- if (((uint64_t)(v_s.len)) >= 32768u) { +- v_s = wuffs_base__slice_u8__suffix(v_s, 32768u); +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s); +- self->private_impl.f_history_index = 32768u; +- } else { +- v_n_copied = wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, (self->private_impl.f_history_index & 32767u), 32768), v_s); +- if (v_n_copied < ((uint64_t)(v_s.len))) { +- v_s = wuffs_base__slice_u8__subslice_i(v_s, v_n_copied); +- v_n_copied = wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s); +- self->private_impl.f_history_index = (((uint32_t)((v_n_copied & 32767u))) + 32768u); +- } else { +- v_already_full = 0u; +- if (self->private_impl.f_history_index >= 32768u) { +- v_already_full = 32768u; +- } +- self->private_impl.f_history_index = ((self->private_impl.f_history_index & 32767u) + ((uint32_t)((v_n_copied & 32767u))) + v_already_full); +- } +- } +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, 32768, 33025), wuffs_base__make_slice_u8(self->private_data.f_history, 33025)); +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func deflate.decoder.get_quirk ++// -------- func bzip2.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_deflate__decoder__get_quirk( +- const wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__get_quirk( ++ const wuffs_bzip2__decoder* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -34351,15 +34260,18 @@ wuffs_deflate__decoder__get_quirk( + return 0; + } + ++ if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } + return 0u; + } + +-// -------- func deflate.decoder.set_quirk ++// -------- func bzip2.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_deflate__decoder__set_quirk( +- wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__set_quirk( ++ wuffs_bzip2__decoder* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -34372,32 +34284,36 @@ wuffs_deflate__decoder__set_quirk( + : wuffs_base__error__initialize_not_called); + } + ++ if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func deflate.decoder.history_retain_length ++// -------- func bzip2.decoder.dst_history_retain_length + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_deflate__decoder__history_retain_length( +- const wuffs_deflate__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_bzip2__decoder__dst_history_retain_length( ++ const wuffs_bzip2__decoder* self) { + if (!self) { +- return 0; ++ return wuffs_base__utility__make_optional_u63(false, 0u); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ return wuffs_base__utility__make_optional_u63(false, 0u); + } + +- return 0u; ++ return wuffs_base__utility__make_optional_u63(true, 0u); + } + +-// -------- func deflate.decoder.workbuf_len ++// -------- func bzip2.decoder.workbuf_len + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_deflate__decoder__workbuf_len( +- const wuffs_deflate__decoder* self) { ++wuffs_bzip2__decoder__workbuf_len( ++ const wuffs_bzip2__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } +@@ -34406,15 +34322,15 @@ wuffs_deflate__decoder__workbuf_len( + return wuffs_base__utility__empty_range_ii_u64(); + } + +- return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); + } + +-// -------- func deflate.decoder.transform_io ++// -------- func bzip2.decoder.transform_io + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_deflate__decoder__transform_io( +- wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__transform_io( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { +@@ -34441,17 +34357,17 @@ wuffs_deflate__decoder__transform_io( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_deflate__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ wuffs_base__status t_0 = wuffs_bzip2__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_deflate__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_bzip2__error__truncated_input); + goto exit; + } + status = v_status; +@@ -34459,13 +34375,13 @@ wuffs_deflate__decoder__transform_io( + } + + ok: +- self->private_impl.p_transform_io[0] = 0; ++ self->private_impl.p_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; +@@ -34476,103 +34392,22 @@ wuffs_deflate__decoder__transform_io( + return status; + } + +-// -------- func deflate.decoder.do_transform_io ++// -------- func bzip2.decoder.do_transform_io + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__do_transform_io( +- wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__do_transform_io( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint64_t v_mark = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } +- +- uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- self->private_impl.choosy_decode_huffman_fast64 = ( +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_bmi2() ? &wuffs_deflate__decoder__decode_huffman_bmi2 : +-#endif +- self->private_impl.choosy_decode_huffman_fast64); +- while (true) { +- v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); +- { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- wuffs_base__status t_0 = wuffs_deflate__decoder__decode_blocks(self, a_dst, a_src); +- v_status = t_0; +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- } +- if ( ! wuffs_base__status__is_suspension(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_transformed_history_count, wuffs_base__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)))); +- wuffs_deflate__decoder__add_history(self, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } +- +- ok: +- self->private_impl.p_do_transform_io[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func deflate.decoder.decode_blocks +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_blocks( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_final = 0; +- uint32_t v_b0 = 0; +- uint32_t v_type = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_i = 0; ++ uint64_t v_tag = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_final_checksum_want = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -34585,125 +34420,206 @@ wuffs_deflate__decoder__decode_blocks( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_blocks[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; + if (coro_susp_point) { +- v_final = self->private_data.s_decode_blocks[0].v_final; ++ v_i = self->private_data.s_do_transform_io.v_i; ++ v_tag = self->private_data.s_do_transform_io.v_tag; ++ v_final_checksum_want = self->private_data.s_do_transform_io.v_final_checksum_want; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- label__outer__continue:; +- while (v_final == 0u) { +- while (self->private_impl.f_n_bits < 3u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 66u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (v_c8 != 90u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (v_c8 != 104u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if ((v_c8 < 49u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_max_incl_block_size = (((uint32_t)(((uint8_t)(v_c8 - 48u)))) * 100000u); ++ while (true) { ++ v_tag = 0u; ++ v_i = 0u; ++ while (v_i < 48u) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; + } +- uint32_t t_0 = *iop_a_src++; +- v_b0 = t_0; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- self->private_impl.f_bits |= (v_b0 << (self->private_impl.f_n_bits & 3u)); +- self->private_impl.f_n_bits = ((self->private_impl.f_n_bits & 3u) + 8u); ++ v_tag <<= 1u; ++ v_tag |= ((uint64_t)((self->private_impl.f_bits >> 31u))); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; + } +- v_final = (self->private_impl.f_bits & 1u); +- v_type = ((self->private_impl.f_bits >> 1u) & 3u); +- self->private_impl.f_bits >>= 3u; +- self->private_impl.f_n_bits -= 3u; +- if (v_type == 0u) { ++ if (v_tag == 25779555029136u) { ++ break; ++ } else if (v_tag != 54156738319193u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ status = wuffs_bzip2__decoder__prepare_block(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_block_size = 0u; ++ self->private_impl.f_decode_huffman_finished = false; ++ self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[((uint8_t)(self->private_data.f_huffman_selectors[0u] & 7u))]; ++ self->private_impl.f_decode_huffman_ticks = 50u; ++ self->private_impl.f_decode_huffman_section = 0u; ++ self->private_impl.f_decode_huffman_run_shift = 0u; ++ while ( ! self->private_impl.f_decode_huffman_finished) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_deflate__decoder__decode_uncompressed(self, a_dst, a_src); ++ v_status = wuffs_bzip2__decoder__decode_huffman_fast(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- if (status.repr) { +- goto suspend; +- } +- continue; +- } else if (v_type == 1u) { +- v_status = wuffs_deflate__decoder__init_fixed_huffman(self); +- if ( ! wuffs_base__status__is_ok(&v_status)) { ++ if (wuffs_base__status__is_error(&v_status)) { + status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; ++ goto exit; ++ } else if (self->private_impl.f_decode_huffman_finished) { ++ break; + } +- } else if (v_type == 2u) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_deflate__decoder__init_dynamic_huffman(self, a_src); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ status = wuffs_bzip2__decoder__decode_huffman_slow(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_block); ++ } ++ wuffs_bzip2__decoder__invert_bwt(self); ++ self->private_impl.f_block_checksum_have = 4294967295u; ++ if (self->private_impl.f_original_pointer >= self->private_impl.f_block_size) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } +- self->private_impl.f_end_of_block = false; +- while (true) { +- if (sizeof(void*) == 4u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_deflate__decoder__decode_huffman_fast32(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } else { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_deflate__decoder__decode_huffman_fast64(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; +- goto exit; +- } +- if (self->private_impl.f_end_of_block) { +- goto label__outer__continue; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- status = wuffs_deflate__decoder__decode_huffman_slow(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ self->private_impl.f_flush_pointer = (self->private_data.f_bwt[self->private_impl.f_original_pointer] >> 12u); ++ self->private_impl.f_flush_repeat_count = 0u; ++ self->private_impl.f_flush_prev = 0u; ++ while (self->private_impl.f_block_size > 0u) { ++ wuffs_bzip2__decoder__flush_fast(self, a_dst); ++ if (self->private_impl.f_block_size <= 0u) { ++ break; + } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_bzip2__decoder__flush_slow(self, a_dst); + if (status.repr) { + goto suspend; + } +- if (self->private_impl.f_end_of_block) { +- goto label__outer__continue; ++ } ++ self->private_impl.f_block_checksum_have ^= 4294967295u; ++ if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_block_checksum_have != self->private_impl.f_block_checksum_want)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum); ++ goto exit; ++ } ++ self->private_impl.f_final_checksum_have = (self->private_impl.f_block_checksum_have ^ ((self->private_impl.f_final_checksum_have >> 31u) | ((uint32_t)(self->private_impl.f_final_checksum_have << 1u)))); ++ } ++ v_final_checksum_want = 0u; ++ v_i = 0u; ++ while (v_i < 32u) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; + } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } ++ v_final_checksum_want <<= 1u; ++ v_final_checksum_want |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; ++ } ++ if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_final_checksum_have != v_final_checksum_want)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum); ++ goto exit; + } + ++ goto ok; + ok: +- self->private_impl.p_decode_blocks[0] = 0; ++ self->private_impl.p_do_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_blocks[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_blocks[0].v_final = v_final; ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_transform_io.v_i = v_i; ++ self->private_data.s_do_transform_io.v_tag = v_tag; ++ self->private_data.s_do_transform_io.v_final_checksum_want = v_final_checksum_want; + + goto exit; + exit: +@@ -34714,32 +34630,23 @@ wuffs_deflate__decoder__decode_blocks( + return status; + } + +-// -------- func deflate.decoder.decode_uncompressed ++// -------- func bzip2.decoder.prepare_block + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_uncompressed( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__prepare_block( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_length = 0; +- uint32_t v_n_copied = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ uint32_t v_selector = 0; ++ uint32_t v_sel_ff = 0; ++ uint8_t v_movee = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -34751,387 +34658,287 @@ wuffs_deflate__decoder__decode_uncompressed( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_uncompressed[0]; ++ uint32_t coro_susp_point = self->private_impl.p_prepare_block; + if (coro_susp_point) { +- v_length = self->private_data.s_decode_uncompressed[0].v_length; ++ v_i = self->private_data.s_prepare_block.v_i; ++ v_selector = self->private_data.s_prepare_block.v_selector; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } +- self->private_impl.f_n_bits = 0u; +- self->private_impl.f_bits = 0u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_uncompressed[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { ++ self->private_impl.f_block_checksum_want = 0u; ++ v_i = 0u; ++ while (v_i < 32u) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_uncompressed[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- v_length = t_0; +- } +- if ((((v_length) & 0xFFFFu) + ((v_length) >> (32u - 16u))) != 65535u) { +- status = wuffs_base__make_status(wuffs_deflate__error__inconsistent_stored_block_length); +- goto exit; +- } +- v_length = ((v_length) & 0xFFFFu); +- while (true) { +- v_n_copied = wuffs_base__io_writer__limited_copy_u32_from_reader( +- &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src); +- if (v_length <= v_n_copied) { +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- v_length -= v_n_copied; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- } else { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- } ++ self->private_impl.f_block_checksum_want <<= 1u; ++ self->private_impl.f_block_checksum_want |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; + } +- +- ok: +- self->private_impl.p_decode_uncompressed[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_uncompressed[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_uncompressed[0].v_length = v_length; +- +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func deflate.decoder.init_fixed_huffman +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__init_fixed_huffman( +- wuffs_deflate__decoder* self) { +- uint32_t v_i = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- while (v_i < 144u) { +- self->private_data.f_code_lengths[v_i] = 8u; +- v_i += 1u; +- } +- while (v_i < 256u) { +- self->private_data.f_code_lengths[v_i] = 9u; +- v_i += 1u; +- } +- while (v_i < 280u) { +- self->private_data.f_code_lengths[v_i] = 7u; +- v_i += 1u; +- } +- while (v_i < 288u) { +- self->private_data.f_code_lengths[v_i] = 8u; +- v_i += 1u; +- } +- while (v_i < 320u) { +- self->private_data.f_code_lengths[v_i] = 5u; +- v_i += 1u; +- } +- v_status = wuffs_deflate__decoder__init_huff(self, +- 0u, +- 0u, +- 288u, +- 257u); +- if (wuffs_base__status__is_error(&v_status)) { +- return v_status; +- } +- v_status = wuffs_deflate__decoder__init_huff(self, +- 1u, +- 288u, +- 320u, +- 0u); +- if (wuffs_base__status__is_error(&v_status)) { +- return v_status; +- } +- return wuffs_base__make_status(NULL); +-} +- +-// -------- func deflate.decoder.init_dynamic_huffman +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__init_dynamic_huffman( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_b0 = 0; +- uint32_t v_n_lit = 0; +- uint32_t v_n_dist = 0; +- uint32_t v_n_clen = 0; +- uint32_t v_i = 0; +- uint32_t v_b1 = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint32_t v_mask = 0; +- uint32_t v_table_entry = 0; +- uint32_t v_table_entry_n_bits = 0; +- uint32_t v_b2 = 0; +- uint32_t v_n_extra_bits = 0; +- uint8_t v_rep_symbol = 0; +- uint32_t v_rep_count = 0; +- uint32_t v_b3 = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_init_dynamic_huffman[0]; +- if (coro_susp_point) { +- v_bits = self->private_data.s_init_dynamic_huffman[0].v_bits; +- v_n_bits = self->private_data.s_init_dynamic_huffman[0].v_n_bits; +- v_n_lit = self->private_data.s_init_dynamic_huffman[0].v_n_lit; +- v_n_dist = self->private_data.s_init_dynamic_huffman[0].v_n_dist; +- v_n_clen = self->private_data.s_init_dynamic_huffman[0].v_n_clen; +- v_i = self->private_data.s_init_dynamic_huffman[0].v_i; +- v_mask = self->private_data.s_init_dynamic_huffman[0].v_mask; +- v_n_extra_bits = self->private_data.s_init_dynamic_huffman[0].v_n_extra_bits; +- v_rep_symbol = self->private_data.s_init_dynamic_huffman[0].v_rep_symbol; +- v_rep_count = self->private_data.s_init_dynamic_huffman[0].v_rep_count; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- v_bits = self->private_impl.f_bits; +- v_n_bits = self->private_impl.f_n_bits; +- while (v_n_bits < 14u) { ++ if (self->private_impl.f_n_bits <= 0u) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_0 = *iop_a_src++; +- v_b0 = t_0; ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; + } +- v_bits |= (v_b0 << v_n_bits); +- v_n_bits += 8u; +- } +- v_n_lit = (((v_bits) & 0x1Fu) + 257u); +- if (v_n_lit > 286u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_literal_length_code_count); +- goto exit; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- v_bits >>= 5u; +- v_n_dist = (((v_bits) & 0x1Fu) + 1u); +- if (v_n_dist > 30u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_distance_code_count); ++ if ((self->private_impl.f_bits >> 31u) != 0u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__unsupported_block_randomization); + goto exit; + } +- v_bits >>= 5u; +- v_n_clen = (((v_bits) & 0xFu) + 4u); +- v_bits >>= 4u; +- v_n_bits -= 14u; ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ self->private_impl.f_original_pointer = 0u; + v_i = 0u; +- while (v_i < v_n_clen) { +- while (v_n_bits < 3u) { ++ while (v_i < 24u) { ++ if (self->private_impl.f_n_bits <= 0u) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_1 = *iop_a_src++; +- v_b1 = t_1; ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; + } +- v_bits |= (v_b1 << v_n_bits); +- v_n_bits += 8u; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = ((uint8_t)((v_bits & 7u))); +- v_bits >>= 3u; +- v_n_bits -= 3u; ++ self->private_impl.f_original_pointer <<= 1u; ++ self->private_impl.f_original_pointer |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; + v_i += 1u; + } +- while (v_i < 19u) { +- self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = 0u; ++ v_i = 0u; ++ while (v_i < 256u) { ++ self->private_data.f_presence[v_i] = 0u; + v_i += 1u; + } +- v_status = wuffs_deflate__decoder__init_huff(self, +- 0u, +- 0u, +- 19u, +- 4095u); +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; +- goto exit; +- } +- v_mask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); + v_i = 0u; +- while (v_i < (v_n_lit + v_n_dist)) { +- while (true) { +- v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_mask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- if (v_n_bits >= v_table_entry_n_bits) { +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- break; +- } ++ while (v_i < 256u) { ++ if (self->private_impl.f_n_bits <= 0u) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_2 = *iop_a_src++; +- v_b2 = t_2; ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; + } +- v_bits |= (v_b2 << v_n_bits); +- v_n_bits += 8u; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- if ((v_table_entry >> 24u) != 128u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; ++ if ((self->private_impl.f_bits >> 31u) != 0u) { ++ self->private_data.f_presence[v_i] = 1u; + } +- v_table_entry = ((v_table_entry >> 8u) & 255u); +- if (v_table_entry < 16u) { +- self->private_data.f_code_lengths[v_i] = ((uint8_t)(v_table_entry)); +- v_i += 1u; ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 16u; ++ } ++ self->private_data.f_scratch = 0u; ++ v_i = 0u; ++ while (v_i < 256u) { ++ if (self->private_data.f_presence[v_i] == 0u) { ++ v_i += 16u; + continue; + } +- v_n_extra_bits = 0u; +- v_rep_symbol = 0u; +- v_rep_count = 0u; +- if (v_table_entry == 16u) { +- v_n_extra_bits = 2u; +- if (v_i <= 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_repetition); +- goto exit; ++ while (true) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; ++ } ++ self->private_data.f_scratch += (self->private_impl.f_bits >> 31u); ++ self->private_data.f_presence[(v_i & 255u)] = ((uint8_t)((self->private_impl.f_bits >> 31u))); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; ++ if ((v_i & 15u) == 0u) { ++ break; + } +- v_rep_symbol = (self->private_data.f_code_lengths[(v_i - 1u)] & 15u); +- v_rep_count = 3u; +- } else if (v_table_entry == 17u) { +- v_n_extra_bits = 3u; +- v_rep_symbol = 0u; +- v_rep_count = 3u; +- } else if (v_table_entry == 18u) { +- v_n_extra_bits = 7u; +- v_rep_symbol = 0u; +- v_rep_count = 11u; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; + } +- while (v_n_bits < v_n_extra_bits) { ++ } ++ if ((self->private_data.f_scratch < 1u) || (256u < self->private_data.f_scratch)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); ++ goto exit; ++ } ++ self->private_impl.f_num_symbols = (self->private_data.f_scratch + 2u); ++ self->private_data.f_scratch = 0u; ++ v_i = 0u; ++ while (v_i < 3u) { ++ if (self->private_impl.f_n_bits <= 0u) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_3 = *iop_a_src++; +- v_b3 = t_3; ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; + } +- v_bits |= (v_b3 << v_n_bits); +- v_n_bits += 8u; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- v_rep_count += ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_n_extra_bits)); +- v_bits >>= v_n_extra_bits; +- v_n_bits -= v_n_extra_bits; +- while (v_rep_count > 0u) { +- if (v_i >= (v_n_lit + v_n_dist)) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count); +- goto exit; ++ self->private_data.f_scratch <<= 1u; ++ self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; ++ } ++ if ((self->private_data.f_scratch < 2u) || (6u < self->private_data.f_scratch)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); ++ goto exit; ++ } ++ self->private_impl.f_num_huffman_codes = self->private_data.f_scratch; ++ self->private_data.f_scratch = 0u; ++ v_i = 0u; ++ while (v_i < 15u) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; + } +- self->private_data.f_code_lengths[v_i] = v_rep_symbol; +- v_i += 1u; +- v_rep_count -= 1u; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } ++ self->private_data.f_scratch <<= 1u; ++ self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; + } +- if (v_i != (v_n_lit + v_n_dist)) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count); ++ if ((self->private_data.f_scratch < 1u) || (18001u < self->private_data.f_scratch)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); + goto exit; + } +- if (self->private_data.f_code_lengths[256u] == 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__missing_end_of_block_code); +- goto exit; ++ self->private_impl.f_num_sections = self->private_data.f_scratch; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_huffman_codes) { ++ self->private_data.f_mtft[v_i] = ((uint8_t)(v_i)); ++ v_i += 1u; + } +- v_status = wuffs_deflate__decoder__init_huff(self, +- 0u, +- 0u, +- v_n_lit, +- 257u); +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; +- goto exit; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_sections) { ++ v_selector = 0u; ++ while (true) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_7 = *iop_a_src++; ++ v_c8 = t_7; ++ } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; ++ } ++ if ((self->private_impl.f_bits >> 31u) == 0u) { ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ break; ++ } ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_selector += 1u; ++ if (v_selector >= self->private_impl.f_num_huffman_codes) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); ++ goto exit; ++ } ++ } ++ if (v_selector == 0u) { ++ self->private_data.f_huffman_selectors[v_i] = self->private_data.f_mtft[0u]; ++ } else { ++ v_sel_ff = (v_selector & 255u); ++ v_movee = self->private_data.f_mtft[v_sel_ff]; ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_sel_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_sel_ff)); ++ self->private_data.f_mtft[0u] = v_movee; ++ self->private_data.f_huffman_selectors[v_i] = v_movee; ++ } ++ v_i += 1u; + } +- v_status = wuffs_deflate__decoder__init_huff(self, +- 1u, +- v_n_lit, +- (v_n_lit + v_n_dist), +- 0u); +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; +- goto exit; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_huffman_codes) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_bzip2__decoder__read_code_lengths(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ v_status = wuffs_bzip2__decoder__build_huffman_tree(self, v_i); ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; ++ } ++ wuffs_bzip2__decoder__build_huffman_table(self, v_i); ++ v_i += 1u; ++ } ++ v_i = 0u; ++ v_j = 0u; ++ while (v_i < 256u) { ++ if (self->private_data.f_presence[v_i] != 0u) { ++ self->private_data.f_mtft[(v_j & 255u)] = ((uint8_t)(v_i)); ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 256u) { ++ self->private_data.f_letter_counts[v_i] = 0u; ++ v_i += 1u; + } +- self->private_impl.f_bits = v_bits; +- self->private_impl.f_n_bits = v_n_bits; + + goto ok; + ok: +- self->private_impl.p_init_dynamic_huffman[0] = 0; ++ self->private_impl.p_prepare_block = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_init_dynamic_huffman[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_init_dynamic_huffman[0].v_bits = v_bits; +- self->private_data.s_init_dynamic_huffman[0].v_n_bits = v_n_bits; +- self->private_data.s_init_dynamic_huffman[0].v_n_lit = v_n_lit; +- self->private_data.s_init_dynamic_huffman[0].v_n_dist = v_n_dist; +- self->private_data.s_init_dynamic_huffman[0].v_n_clen = v_n_clen; +- self->private_data.s_init_dynamic_huffman[0].v_i = v_i; +- self->private_data.s_init_dynamic_huffman[0].v_mask = v_mask; +- self->private_data.s_init_dynamic_huffman[0].v_n_extra_bits = v_n_extra_bits; +- self->private_data.s_init_dynamic_huffman[0].v_rep_symbol = v_rep_symbol; +- self->private_data.s_init_dynamic_huffman[0].v_rep_count = v_rep_count; ++ self->private_impl.p_prepare_block = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_prepare_block.v_i = v_i; ++ self->private_data.s_prepare_block.v_selector = v_selector; + + goto exit; + exit: +@@ -35142,285 +34949,295 @@ wuffs_deflate__decoder__init_dynamic_huffman( + return status; + } + +-// -------- func deflate.decoder.init_huff ++// -------- func bzip2.decoder.read_code_lengths + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__init_huff( +- wuffs_deflate__decoder* self, +- uint32_t a_which, +- uint32_t a_n_codes0, +- uint32_t a_n_codes1, +- uint32_t a_base_symbol) { +- uint16_t v_counts[16] = {0}; ++wuffs_bzip2__decoder__read_code_lengths( ++ wuffs_bzip2__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; + uint32_t v_i = 0; +- uint32_t v_remaining = 0; +- uint16_t v_offsets[16] = {0}; +- uint32_t v_n_symbols = 0; +- uint32_t v_count = 0; +- uint16_t v_symbols[320] = {0}; +- uint32_t v_min_cl = 0; +- uint32_t v_max_cl = 0; +- uint32_t v_initial_high_bits = 0; +- uint32_t v_prev_cl = 0; +- uint32_t v_prev_redirect_key = 0; +- uint32_t v_top = 0; +- uint32_t v_next_top = 0; +- uint32_t v_code = 0; +- uint32_t v_key = 0; +- uint32_t v_value = 0; +- uint32_t v_cl = 0; +- uint32_t v_redirect_key = 0; +- uint32_t v_j = 0; +- uint32_t v_reversed_key = 0; +- uint32_t v_symbol = 0; +- uint32_t v_high_bits = 0; +- uint32_t v_delta = 0; ++ uint32_t v_code_length = 0; + +- v_i = a_n_codes0; +- while (v_i < a_n_codes1) { +- if (v_counts[(self->private_data.f_code_lengths[v_i] & 15u)] >= 320u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_counts[(self->private_data.f_code_lengths[v_i] & 15u)] += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- v_i += 1u; +- } +- if ((((uint32_t)(v_counts[0u])) + a_n_codes0) == a_n_codes1) { +- return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- v_remaining = 1u; +- v_i = 1u; +- while (v_i <= 15u) { +- if (v_remaining > 1073741824u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- v_remaining <<= 1u; +- if (v_remaining < ((uint32_t)(v_counts[v_i]))) { +- return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_over_subscribed); +- } +- v_remaining -= ((uint32_t)(v_counts[v_i])); +- v_i += 1u; ++ ++ uint32_t coro_susp_point = self->private_impl.p_read_code_lengths; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_read_code_lengths.v_i; ++ v_code_length = self->private_data.s_read_code_lengths.v_code_length; + } +- if (v_remaining != 0u) { +- if ((a_which == 1u) && (v_counts[1u] == 1u) && ((((uint32_t)(v_counts[0u])) + a_n_codes0 + 1u) == a_n_codes1)) { +- v_i = 0u; +- while (v_i <= 29u) { +- if (self->private_data.f_code_lengths[(a_n_codes0 + v_i)] == 1u) { +- self->private_impl.f_n_huffs_bits[1u] = 1u; +- self->private_data.f_huffs[1u][0u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[v_i] | 1u); +- self->private_data.f_huffs[1u][1u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[31u] | 1u); +- return wuffs_base__make_status(NULL); ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_code_lengths_bitmask = 0u; ++ v_i = 0u; ++ while (v_i < 5u) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- v_i += 1u; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } ++ v_code_length <<= 1u; ++ v_code_length |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; + } +- return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_under_subscribed); +- } +- v_i = 1u; +- while (v_i <= 15u) { +- v_offsets[v_i] = ((uint16_t)(v_n_symbols)); +- v_count = ((uint32_t)(v_counts[v_i])); +- if (v_n_symbols > (320u - v_count)) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- v_n_symbols = (v_n_symbols + v_count); +- v_i += 1u; +- } +- if (v_n_symbols > 288u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- v_i = a_n_codes0; +- while (v_i < a_n_codes1) { +- if (v_i < a_n_codes0) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- if (self->private_data.f_code_lengths[v_i] != 0u) { +- if (v_offsets[(self->private_data.f_code_lengths[v_i] & 15u)] >= 320u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_symbols) { ++ while (true) { ++ if ((v_code_length < 1u) || (20u < v_code_length)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); ++ goto exit; ++ } ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; ++ } ++ if ((self->private_impl.f_bits >> 31u) == 0u) { ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ break; ++ } ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; ++ } ++ if ((self->private_impl.f_bits >> 31u) == 0u) { ++ v_code_length += 1u; ++ } else { ++ v_code_length -= 1u; ++ } ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; + } +- v_symbols[v_offsets[(self->private_data.f_code_lengths[v_i] & 15u)]] = ((uint16_t)((v_i - a_n_codes0))); +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_offsets[(self->private_data.f_code_lengths[v_i] & 15u)] += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } +- v_i += 1u; +- } +- v_min_cl = 1u; +- while (true) { +- if (v_counts[v_min_cl] != 0u) { +- break; +- } +- if (v_min_cl >= 9u) { +- return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_minimum_code_length); +- } +- v_min_cl += 1u; +- } +- v_max_cl = 15u; +- while (true) { +- if (v_counts[v_max_cl] != 0u) { +- break; +- } +- if (v_max_cl <= 1u) { +- return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes); ++ self->private_impl.f_code_lengths_bitmask |= (((uint32_t)(1u)) << (v_code_length & 31u)); ++ self->private_data.f_bwt[v_i] = v_code_length; ++ v_i += 1u; + } +- v_max_cl -= 1u; +- } +- if (v_max_cl <= 9u) { +- self->private_impl.f_n_huffs_bits[a_which] = v_max_cl; +- } else { +- self->private_impl.f_n_huffs_bits[a_which] = 9u; +- } +- v_i = 0u; +- if ((v_n_symbols != ((uint32_t)(v_offsets[v_max_cl]))) || (v_n_symbols != ((uint32_t)(v_offsets[15u])))) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- if ((a_n_codes0 + ((uint32_t)(v_symbols[0u]))) >= 320u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ ++ goto ok; ++ ok: ++ self->private_impl.p_read_code_lengths = 0; ++ goto exit; + } +- v_initial_high_bits = 512u; +- if (v_max_cl < 9u) { +- v_initial_high_bits = (((uint32_t)(1u)) << v_max_cl); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_read_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_read_code_lengths.v_i = v_i; ++ self->private_data.s_read_code_lengths.v_code_length = v_code_length; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_prev_cl = ((uint32_t)((self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[0u])))] & 15u))); +- v_prev_redirect_key = 4294967295u; +- v_top = 0u; +- v_next_top = 512u; +- v_code = 0u; +- v_key = 0u; +- v_value = 0u; +- while (true) { +- if ((a_n_codes0 + ((uint32_t)(v_symbols[v_i]))) >= 320u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ ++ return status; ++} ++ ++// -------- func bzip2.decoder.build_huffman_tree ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bzip2__decoder__build_huffman_tree( ++ wuffs_bzip2__decoder* self, ++ uint32_t a_which) { ++ uint32_t v_code_length = 0; ++ uint32_t v_symbol_index = 0; ++ uint32_t v_num_branch_nodes = 0; ++ uint32_t v_stack_height = 0; ++ uint32_t v_stack_values[21] = {0}; ++ uint32_t v_node_index = 0; ++ uint16_t v_leaf_value = 0; ++ ++ self->private_data.f_huffman_trees[a_which][0u][0u] = 0u; ++ self->private_data.f_huffman_trees[a_which][0u][1u] = 0u; ++ v_num_branch_nodes = 1u; ++ v_stack_height = 1u; ++ v_stack_values[0u] = 0u; ++ v_code_length = 1u; ++ while (v_code_length <= 20u) { ++ if ((self->private_impl.f_code_lengths_bitmask & (((uint32_t)(1u)) << v_code_length)) == 0u) { ++ v_code_length += 1u; ++ continue; + } +- v_cl = ((uint32_t)((self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[v_i])))] & 15u))); +- if (v_cl > v_prev_cl) { +- v_code <<= (v_cl - v_prev_cl); +- if (v_code >= 32768u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ v_symbol_index = 0u; ++ while (v_symbol_index < self->private_impl.f_num_symbols) { ++ if (self->private_data.f_bwt[v_symbol_index] != v_code_length) { ++ v_symbol_index += 1u; ++ continue; + } +- } +- v_prev_cl = v_cl; +- v_key = v_code; +- if (v_cl > 9u) { +- v_cl -= 9u; +- v_redirect_key = ((v_key >> v_cl) & 511u); +- v_key = ((v_key) & WUFFS_BASE__LOW_BITS_MASK__U32(v_cl)); +- if (v_prev_redirect_key != v_redirect_key) { +- v_prev_redirect_key = v_redirect_key; +- v_remaining = (((uint32_t)(1u)) << v_cl); +- v_j = v_prev_cl; +- while (v_j <= 15u) { +- if (v_remaining <= ((uint32_t)(v_counts[v_j]))) { +- break; +- } +- v_remaining -= ((uint32_t)(v_counts[v_j])); +- if (v_remaining > 1073741824u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- v_remaining <<= 1u; +- v_j += 1u; ++ while (true) { ++ if (v_stack_height <= 0u) { ++ return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_over_subscribed); ++ } else if (v_stack_height >= v_code_length) { ++ break; + } +- if ((v_j <= 9u) || (15u < v_j)) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ v_node_index = v_stack_values[(v_stack_height - 1u)]; ++ if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) { ++ self->private_data.f_huffman_trees[a_which][v_node_index][0u] = ((uint16_t)(v_num_branch_nodes)); ++ } else { ++ self->private_data.f_huffman_trees[a_which][v_node_index][1u] = ((uint16_t)(v_num_branch_nodes)); + } +- v_j -= 9u; +- v_initial_high_bits = (((uint32_t)(1u)) << v_j); +- v_top = v_next_top; +- if ((v_top + (((uint32_t)(1u)) << v_j)) > 1024u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ if (v_num_branch_nodes >= 257u) { ++ return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed); + } +- v_next_top = (v_top + (((uint32_t)(1u)) << v_j)); +- v_redirect_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_redirect_key >> 1u)])) | ((v_redirect_key & 1u) << 8u)); +- self->private_data.f_huffs[a_which][v_redirect_key] = (268435465u | (v_top << 8u) | (v_j << 4u)); ++ v_stack_values[v_stack_height] = v_num_branch_nodes; ++ self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][0u] = 0u; ++ self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][1u] = 0u; ++ v_num_branch_nodes += 1u; ++ v_stack_height += 1u; + } ++ v_node_index = v_stack_values[(v_stack_height - 1u)]; ++ if (v_symbol_index < 2u) { ++ v_leaf_value = ((uint16_t)((769u + v_symbol_index))); ++ } else if ((v_symbol_index + 1u) < self->private_impl.f_num_symbols) { ++ v_leaf_value = ((uint16_t)((511u + v_symbol_index))); ++ } else { ++ v_leaf_value = 768u; ++ } ++ if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) { ++ self->private_data.f_huffman_trees[a_which][v_node_index][0u] = v_leaf_value; ++ } else { ++ self->private_data.f_huffman_trees[a_which][v_node_index][1u] = v_leaf_value; ++ v_stack_height -= 1u; ++ while (v_stack_height > 0u) { ++ v_node_index = v_stack_values[(v_stack_height - 1u)]; ++ if (self->private_data.f_huffman_trees[a_which][v_node_index][1u] == 0u) { ++ break; ++ } ++ v_stack_height -= 1u; ++ } ++ } ++ v_symbol_index += 1u; + } +- if ((v_key >= 512u) || (v_counts[v_prev_cl] <= 0u)) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } ++ v_code_length += 1u; ++ } ++ if (v_stack_height != 0u) { ++ return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed); ++ } ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func bzip2.decoder.build_huffman_table ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__build_huffman_table( ++ wuffs_bzip2__decoder* self, ++ uint32_t a_which) { ++ uint32_t v_i = 0; ++ uint32_t v_bits = 0; ++ uint16_t v_n_bits = 0; ++ uint16_t v_child = 0; ++ ++ while (v_i < 256u) { ++ v_bits = (v_i << 24u); ++ v_n_bits = 0u; ++ v_child = 0u; ++ while ((v_child < 257u) && (v_n_bits < 8u)) { ++ v_child = self->private_data.f_huffman_trees[a_which][v_child][(v_bits >> 31u)]; ++ v_bits <<= 1u; + #if defined(__GNUC__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wconversion" + #endif +- v_counts[v_prev_cl] -= 1u; ++ v_n_bits += 1u; + #if defined(__GNUC__) + #pragma GCC diagnostic pop + #endif +- v_reversed_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_key >> 1u)])) | ((v_key & 1u) << 8u)); +- v_reversed_key >>= (9u - v_cl); +- v_symbol = ((uint32_t)(v_symbols[v_i])); +- if (v_symbol == 256u) { +- v_value = (536870912u | v_cl); +- } else if ((v_symbol < 256u) && (a_which == 0u)) { +- v_value = (2147483648u | (v_symbol << 8u) | v_cl); +- } else if (v_symbol >= a_base_symbol) { +- v_symbol -= a_base_symbol; +- if (a_which == 0u) { +- v_value = (WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl); +- } else { +- v_value = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl); +- } +- } else { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- v_high_bits = v_initial_high_bits; +- v_delta = (((uint32_t)(1u)) << v_cl); +- while (v_high_bits >= v_delta) { +- v_high_bits -= v_delta; +- if ((v_top + ((v_high_bits | v_reversed_key) & 511u)) >= 1024u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- self->private_data.f_huffs[a_which][(v_top + ((v_high_bits | v_reversed_key) & 511u))] = v_value; + } ++ self->private_data.f_huffman_tables[a_which][v_i] = ((uint16_t)(((uint16_t)(v_child | ((uint16_t)(v_n_bits << 12u)))))); + v_i += 1u; +- if (v_i >= v_n_symbols) { +- break; +- } +- v_code += 1u; +- if (v_code >= 32768u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } + } +- return wuffs_base__make_status(NULL); ++ return wuffs_base__make_empty_struct(); + } + +-// ‼ WUFFS MULTI-FILE SECTION +x86_bmi2 +-// -------- func deflate.decoder.decode_huffman_bmi2 ++// -------- func bzip2.decoder.invert_bwt + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("bmi2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_bmi2( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__invert_bwt( ++ wuffs_bzip2__decoder* self) { ++ uint32_t v_i = 0; ++ uint32_t v_letter = 0; ++ uint32_t v_sum = 0; ++ uint32_t v_old_sum = 0; + +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_table_entry = 0; +- uint32_t v_table_entry_n_bits = 0; +- uint64_t v_lmask = 0; +- uint64_t v_dmask = 0; +- uint32_t v_redir_top = 0; +- uint32_t v_redir_mask = 0; +- uint32_t v_length = 0; +- uint32_t v_dist_minus_1 = 0; +- uint32_t v_hlen = 0; +- uint32_t v_hdist = 0; +- uint32_t v_hdist_adjustment = 0; ++ v_sum = 0u; ++ v_i = 0u; ++ while (v_i < 256u) { ++ v_old_sum = v_sum; ++ v_sum += self->private_data.f_letter_counts[v_i]; ++ self->private_data.f_letter_counts[v_i] = v_old_sum; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < self->private_impl.f_block_size) { ++ v_letter = (self->private_data.f_bwt[v_i] & 255u); ++ self->private_data.f_bwt[(self->private_data.f_letter_counts[v_letter] & 1048575u)] |= (v_i << 12u); ++ self->private_data.f_letter_counts[v_letter] += 1u; ++ v_i += 1u; ++ } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func bzip2.decoder.flush_fast ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__flush_fast( ++ wuffs_bzip2__decoder* self, ++ wuffs_base__io_buffer* a_dst) { ++ uint32_t v_flush_pointer = 0; ++ uint32_t v_flush_repeat_count = 0; ++ uint8_t v_flush_prev = 0; ++ uint32_t v_block_checksum_have = 0; ++ uint32_t v_block_size = 0; ++ uint32_t v_entry = 0; ++ uint8_t v_curr = 0; + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -35435,217 +35252,204 @@ wuffs_deflate__decoder__decode_huffman_bmi2( + io2_a_dst = iop_a_dst; + } + } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } + +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } +- v_bits = ((uint64_t)(self->private_impl.f_bits)); +- v_n_bits = self->private_impl.f_n_bits; +- v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); +- v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); +- if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { +- status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); +- goto exit; ++ v_flush_pointer = self->private_impl.f_flush_pointer; ++ v_flush_repeat_count = self->private_impl.f_flush_repeat_count; ++ v_flush_prev = self->private_impl.f_flush_prev; ++ v_block_checksum_have = self->private_impl.f_block_checksum_have; ++ v_block_size = self->private_impl.f_block_size; ++ while ((v_block_size > 0u) && (((uint64_t)(io2_a_dst - iop_a_dst)) >= 255u)) { ++ if (v_flush_repeat_count < 4u) { ++ v_entry = self->private_data.f_bwt[v_flush_pointer]; ++ v_curr = ((uint8_t)(v_entry)); ++ v_flush_pointer = (v_entry >> 12u); ++ if (v_curr == v_flush_prev) { ++ v_flush_repeat_count += 1u; ++ } else { ++ v_flush_repeat_count = 1u; ++ } ++ v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[((uint8_t)(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_curr))] ^ ((uint32_t)(v_block_checksum_have << 8u))); ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_curr), iop_a_dst += 1); ++ v_flush_prev = v_curr; ++ v_block_size -= 1u; ++ } else { ++ v_entry = self->private_data.f_bwt[v_flush_pointer]; ++ v_curr = ((uint8_t)(v_entry)); ++ v_flush_pointer = (v_entry >> 12u); ++ v_flush_repeat_count = ((uint32_t)(v_curr)); ++ while (v_flush_repeat_count > 0u) { ++ v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[((uint8_t)(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_flush_prev))] ^ ((uint32_t)(v_block_checksum_have << 8u))); ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) > 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_flush_prev), iop_a_dst += 1); ++ } ++ v_flush_repeat_count -= 1u; ++ } ++ v_flush_repeat_count = 0u; ++ v_flush_prev = v_curr; ++ v_block_size -= 1u; ++ } + } +- v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); +- label__loop__continue:; +- while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) { +- v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u))); +- iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- v_length = (((v_table_entry >> 8u) & 255u) + 3u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_table_entry_n_bits > 0u) { +- v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 28u) == 1u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- if ((v_table_entry >> 24u) != 64u) { +- if ((v_table_entry >> 24u) == 8u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; ++ self->private_impl.f_flush_pointer = v_flush_pointer; ++ self->private_impl.f_flush_repeat_count = v_flush_repeat_count; ++ self->private_impl.f_flush_prev = v_flush_prev; ++ self->private_impl.f_block_checksum_have = v_block_checksum_have; ++ if (v_block_size <= 900000u) { ++ self->private_impl.f_block_size = v_block_size; ++ } ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func bzip2.decoder.flush_slow ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bzip2__decoder__flush_slow( ++ wuffs_bzip2__decoder* self, ++ wuffs_base__io_buffer* a_dst) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_flush_pointer = 0; ++ uint32_t v_flush_repeat_count = 0; ++ uint8_t v_flush_prev = 0; ++ uint32_t v_block_checksum_have = 0; ++ uint32_t v_block_size = 0; ++ uint32_t v_entry = 0; ++ uint8_t v_curr = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; + } +- v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- do { +- if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { +- v_hlen = 0u; +- v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); +- if (v_length > v_hdist) { +- v_length -= v_hdist; +- v_hlen = v_hdist; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_flush_slow; ++ if (coro_susp_point) { ++ v_flush_pointer = self->private_data.s_flush_slow.v_flush_pointer; ++ v_flush_repeat_count = self->private_data.s_flush_slow.v_flush_repeat_count; ++ v_flush_prev = self->private_data.s_flush_slow.v_flush_prev; ++ v_block_checksum_have = self->private_data.s_flush_slow.v_block_checksum_have; ++ v_block_size = self->private_data.s_flush_slow.v_block_size; ++ v_curr = self->private_data.s_flush_slow.v_curr; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ v_flush_pointer = self->private_impl.f_flush_pointer; ++ v_flush_repeat_count = self->private_impl.f_flush_repeat_count; ++ v_flush_prev = self->private_impl.f_flush_prev; ++ v_block_checksum_have = self->private_impl.f_block_checksum_have; ++ v_block_size = self->private_impl.f_block_size; ++ while ((v_block_size > 0u) && ! (self->private_impl.p_flush_slow != 0)) { ++ if (v_flush_repeat_count < 4u) { ++ v_entry = self->private_data.f_bwt[v_flush_pointer]; ++ v_curr = ((uint8_t)(v_entry)); ++ v_flush_pointer = (v_entry >> 12u); ++ if (v_curr == v_flush_prev) { ++ v_flush_repeat_count += 1u; + } else { +- v_hlen = v_length; +- v_length = 0u; +- } +- v_hdist += v_hdist_adjustment; +- if (self->private_impl.f_history_index < v_hdist) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); +- goto exit; +- } +- wuffs_base__io_writer__limited_copy_u32_from_slice( +- &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); +- if (v_length == 0u) { +- goto label__loop__continue; ++ v_flush_repeat_count = 1u; + } +- if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); +- goto exit; ++ v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[((uint8_t)(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_curr))] ^ ((uint32_t)(v_block_checksum_have << 8u))); ++ self->private_data.s_flush_slow.scratch = v_curr; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (iop_a_dst == io2_a_dst) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ goto suspend; + } +- } +- if ((v_dist_minus_1 + 1u) >= 8u) { +- wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } else if ((v_dist_minus_1 + 1u) == 1u) { +- wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow.scratch)); ++ v_flush_prev = v_curr; ++ v_block_size -= 1u; + } else { +- wuffs_base__io_writer__limited_copy_u32_from_history_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ v_entry = self->private_data.f_bwt[v_flush_pointer]; ++ v_curr = ((uint8_t)(v_entry)); ++ v_flush_pointer = (v_entry >> 12u); ++ v_flush_repeat_count = ((uint32_t)(v_curr)); ++ while (v_flush_repeat_count > 0u) { ++ v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[((uint8_t)(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_flush_prev))] ^ ((uint32_t)(v_block_checksum_have << 8u))); ++ self->private_data.s_flush_slow.scratch = v_flush_prev; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (iop_a_dst == io2_a_dst) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ goto suspend; ++ } ++ *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow.scratch)); ++ v_flush_repeat_count -= 1u; ++ } ++ v_flush_repeat_count = 0u; ++ v_flush_prev = v_curr; ++ v_block_size -= 1u; + } +- } while (0); +- } +- if (v_n_bits > 63u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } +- while (v_n_bits >= 8u) { +- v_n_bits -= 8u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); +- goto exit; + } +- } +- self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u)))); +- self->private_impl.f_n_bits = v_n_bits; +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ self->private_impl.f_flush_pointer = v_flush_pointer; ++ self->private_impl.f_flush_repeat_count = v_flush_repeat_count; ++ self->private_impl.f_flush_prev = v_flush_prev; ++ self->private_impl.f_block_checksum_have = v_block_checksum_have; ++ if (v_block_size <= 900000u) { ++ self->private_impl.f_block_size = v_block_size; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_flush_slow = 0; + goto exit; + } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_flush_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_flush_slow.v_flush_pointer = v_flush_pointer; ++ self->private_data.s_flush_slow.v_flush_repeat_count = v_flush_repeat_count; ++ self->private_data.s_flush_slow.v_flush_prev = v_flush_prev; ++ self->private_data.s_flush_slow.v_block_checksum_have = v_block_checksum_have; ++ self->private_data.s_flush_slow.v_block_size = v_block_size; ++ self->private_data.s_flush_slow.v_curr = v_curr; ++ + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } + + return status; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_bmi2 + +-// -------- func deflate.decoder.decode_huffman_fast32 ++// -------- func bzip2.decoder.decode_huffman_fast + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast32( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__decode_huffman_fast( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_bits = 0; + uint32_t v_n_bits = 0; +- uint32_t v_table_entry = 0; +- uint32_t v_table_entry_n_bits = 0; +- uint32_t v_lmask = 0; +- uint32_t v_dmask = 0; +- uint32_t v_redir_top = 0; +- uint32_t v_redir_mask = 0; +- uint32_t v_length = 0; +- uint32_t v_dist_minus_1 = 0; +- uint32_t v_hlen = 0; +- uint32_t v_hdist = 0; +- uint32_t v_hdist_adjustment = 0; ++ uint32_t v_block_size = 0; ++ uint8_t v_which = 0; ++ uint32_t v_ticks = 0; ++ uint32_t v_section = 0; ++ uint32_t v_run_shift = 0; ++ uint16_t v_table_entry = 0; ++ uint16_t v_child = 0; ++ uint32_t v_child_ff = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ uint32_t v_output = 0; ++ uint32_t v_run = 0; ++ uint32_t v_mtft0 = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -35657,205 +35461,92 @@ wuffs_deflate__decoder__decode_huffman_fast32( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } + v_bits = self->private_impl.f_bits; + v_n_bits = self->private_impl.f_n_bits; +- v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); +- v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); +- if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { +- status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); +- goto exit; +- } +- v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); +- label__loop__continue:; +- while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 12u)) { +- if (v_n_bits < 15u) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; ++ v_block_size = self->private_impl.f_block_size; ++ v_which = self->private_impl.f_decode_huffman_which; ++ v_ticks = self->private_impl.f_decode_huffman_ticks; ++ v_section = self->private_impl.f_decode_huffman_section; ++ v_run_shift = self->private_impl.f_decode_huffman_run_shift; ++ while (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { ++ if (v_ticks > 0u) { ++ v_ticks -= 1u; + } else { +- } +- v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- if (v_n_bits < 15u) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- } else { +- } +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ v_ticks = 49u; ++ v_section += 1u; ++ if (v_section >= self->private_impl.f_num_sections) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections); + goto exit; + } +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- v_length = (((v_table_entry >> 8u) & 255u) + 3u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_table_entry_n_bits > 0u) { +- if (v_n_bits < 15u) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- } else { +- } +- v_length = (((v_length + 253u + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } else { +- } +- if (v_n_bits < 15u) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- } else { ++ v_which = WUFFS_BZIP2__CLAMP_TO_5[((uint8_t)(self->private_data.f_huffman_selectors[(v_section & 32767u)] & 7u))]; + } +- v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 28u) == 1u) { +- if (v_n_bits < 15u) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- } else { ++ v_bits |= (wuffs_base__peek_u32be__no_bounds_check(iop_a_src) >> v_n_bits); ++ iop_a_src += ((31u - v_n_bits) >> 3u); ++ v_n_bits |= 24u; ++ v_table_entry = self->private_data.f_huffman_tables[v_which][(v_bits >> 24u)]; ++ v_bits <<= ((uint16_t)(v_table_entry >> 12u)); ++ v_n_bits -= ((uint32_t)(((uint16_t)(v_table_entry >> 12u)))); ++ v_child = ((uint16_t)(v_table_entry & 1023u)); ++ while (v_child < 257u) { ++ v_child = self->private_data.f_huffman_trees[v_which][v_child][(v_bits >> 31u)]; ++ v_bits <<= 1u; ++ if (v_n_bits <= 0u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } else { ++ v_n_bits -= 1u; + } +- if ((v_table_entry >> 24u) != 64u) { +- if ((v_table_entry >> 24u) == 8u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ if (v_child < 768u) { ++ v_child_ff = ((uint32_t)(((uint16_t)(v_child & 255u)))); ++ v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff])); ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff)); ++ self->private_data.f_mtft[0u] = ((uint8_t)(v_output)); ++ self->private_data.f_letter_counts[v_output] += 1u; ++ self->private_data.f_bwt[v_block_size] = v_output; ++ if (v_block_size >= self->private_impl.f_max_incl_block_size) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; ++ v_block_size += 1u; ++ v_run_shift = 0u; ++ continue; ++ } else if (v_child == 768u) { ++ self->private_impl.f_decode_huffman_finished = true; ++ break; + } +- v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_n_bits < v_table_entry_n_bits) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; ++ if (v_run_shift >= 23u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); ++ goto exit; + } +- v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- do { +- if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { +- v_hlen = 0u; +- v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); +- if (v_length > v_hdist) { +- v_length -= v_hdist; +- v_hlen = v_hdist; +- } else { +- v_hlen = v_length; +- v_length = 0u; +- } +- v_hdist += v_hdist_adjustment; +- if (self->private_impl.f_history_index < v_hdist) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); +- goto exit; +- } +- wuffs_base__io_writer__limited_copy_u32_from_slice( +- &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); +- if (v_length == 0u) { +- goto label__loop__continue; +- } +- if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); +- goto exit; +- } +- } +- if ((v_dist_minus_1 + 1u) >= 8u) { +- wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } else { +- wuffs_base__io_writer__limited_copy_u32_from_history_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } +- } while (0); +- } +- while (v_n_bits >= 8u) { +- v_n_bits -= 8u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); ++ v_run = ((((uint32_t)(v_child)) & 3u) << v_run_shift); ++ v_run_shift += 1u; ++ v_i = v_block_size; ++ v_j = (v_run + v_block_size); ++ if (v_j > self->private_impl.f_max_incl_block_size) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } ++ v_block_size = v_j; ++ v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u])); ++ self->private_data.f_letter_counts[v_mtft0] += v_run; ++ while (v_i < v_j) { ++ self->private_data.f_bwt[v_i] = v_mtft0; ++ v_i += 1u; ++ } + } +- self->private_impl.f_bits = (v_bits & ((((uint32_t)(1u)) << v_n_bits) - 1u)); ++ self->private_impl.f_bits = v_bits; + self->private_impl.f_n_bits = v_n_bits; +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } ++ self->private_impl.f_block_size = v_block_size; ++ self->private_impl.f_decode_huffman_which = v_which; ++ self->private_impl.f_decode_huffman_ticks = v_ticks; ++ self->private_impl.f_decode_huffman_section = v_section; ++ self->private_impl.f_decode_huffman_run_shift = v_run_shift; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ ++ ok: + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -35863,52 +35554,25 @@ wuffs_deflate__decoder__decode_huffman_fast32( + return status; + } + +-// -------- func deflate.decoder.decode_huffman_fast64 ++// -------- func bzip2.decoder.decode_huffman_slow + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast64( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__decode_huffman_slow( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { +- return (*self->private_impl.choosy_decode_huffman_fast64)(self, a_dst, a_src); +-} ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_table_entry = 0; +- uint32_t v_table_entry_n_bits = 0; +- uint64_t v_lmask = 0; +- uint64_t v_dmask = 0; +- uint32_t v_redir_top = 0; +- uint32_t v_redir_mask = 0; +- uint32_t v_length = 0; +- uint32_t v_dist_minus_1 = 0; +- uint32_t v_hlen = 0; +- uint32_t v_hdist = 0; +- uint32_t v_hdist_adjustment = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_node_index = 0; ++ uint16_t v_child = 0; ++ uint32_t v_child_ff = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ uint32_t v_output = 0; ++ uint32_t v_run = 0; ++ uint32_t v_mtft0 = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -35920,160 +35584,101 @@ wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } +- v_bits = ((uint64_t)(self->private_impl.f_bits)); +- v_n_bits = self->private_impl.f_n_bits; +- v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); +- v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); +- if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { +- status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); +- goto exit; ++ uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow; ++ if (coro_susp_point) { ++ v_node_index = self->private_data.s_decode_huffman_slow.v_node_index; + } +- v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); +- label__loop__continue:; +- while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) { +- v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u))); +- iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while ( ! (self->private_impl.p_decode_huffman_slow != 0)) { ++ if (self->private_impl.f_decode_huffman_ticks > 0u) { ++ self->private_impl.f_decode_huffman_ticks -= 1u; + } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- v_length = (((v_table_entry >> 8u) & 255u) + 3u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_table_entry_n_bits > 0u) { +- v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 28u) == 1u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- if ((v_table_entry >> 24u) != 64u) { +- if ((v_table_entry >> 24u) == 8u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; ++ self->private_impl.f_decode_huffman_ticks = 49u; ++ self->private_impl.f_decode_huffman_section += 1u; ++ if (self->private_impl.f_decode_huffman_section >= self->private_impl.f_num_sections) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections); ++ goto exit; ++ } ++ self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[((uint8_t)(self->private_data.f_huffman_selectors[(self->private_impl.f_decode_huffman_section & 32767u)] & 7u))]; + } +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- do { +- if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { +- v_hlen = 0u; +- v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); +- if (v_length > v_hdist) { +- v_length -= v_hdist; +- v_hlen = v_hdist; +- } else { +- v_hlen = v_length; +- v_length = 0u; ++ v_node_index = 0u; ++ while (true) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- v_hdist += v_hdist_adjustment; +- if (self->private_impl.f_history_index < v_hdist) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); +- goto exit; ++ v_child = self->private_data.f_huffman_trees[self->private_impl.f_decode_huffman_which][v_node_index][(self->private_impl.f_bits >> 31u)]; ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ if (v_child < 257u) { ++ v_node_index = ((uint32_t)(v_child)); ++ continue; ++ } else if (v_child < 768u) { ++ v_child_ff = ((uint32_t)(((uint16_t)(v_child & 255u)))); ++ v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff])); ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff)); ++ self->private_data.f_mtft[0u] = ((uint8_t)(v_output)); ++ self->private_data.f_letter_counts[v_output] += 1u; ++ self->private_data.f_bwt[self->private_impl.f_block_size] = v_output; ++ if (self->private_impl.f_block_size >= self->private_impl.f_max_incl_block_size) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); ++ goto exit; ++ } ++ self->private_impl.f_block_size += 1u; ++ self->private_impl.f_decode_huffman_run_shift = 0u; ++ break; ++ } else if (v_child == 768u) { ++ self->private_impl.f_decode_huffman_finished = true; ++ goto label__outer__break; + } +- wuffs_base__io_writer__limited_copy_u32_from_slice( +- &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); +- if (v_length == 0u) { +- goto label__loop__continue; ++ if (self->private_impl.f_decode_huffman_run_shift >= 23u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); ++ goto exit; + } +- if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); ++ v_run = ((((uint32_t)(v_child)) & 3u) << self->private_impl.f_decode_huffman_run_shift); ++ self->private_impl.f_decode_huffman_run_shift += 1u; ++ v_i = self->private_impl.f_block_size; ++ v_j = (v_run + self->private_impl.f_block_size); ++ if (v_j > self->private_impl.f_max_incl_block_size) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } ++ self->private_impl.f_block_size = v_j; ++ v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u])); ++ self->private_data.f_letter_counts[v_mtft0] += v_run; ++ while (v_i < v_j) { ++ self->private_data.f_bwt[v_i] = v_mtft0; ++ v_i += 1u; ++ } ++ break; + } +- if ((v_dist_minus_1 + 1u) >= 8u) { +- wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } else if ((v_dist_minus_1 + 1u) == 1u) { +- wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } else { +- wuffs_base__io_writer__limited_copy_u32_from_history_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } +- } while (0); +- } +- if (v_n_bits > 63u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } +- while (v_n_bits >= 8u) { +- v_n_bits -= 8u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); +- goto exit; + } +- } +- self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u)))); +- self->private_impl.f_n_bits = v_n_bits; +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ label__outer__break:; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_huffman_slow = 0; + goto exit; + } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_huffman_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_huffman_slow.v_node_index = v_node_index; ++ + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -36081,40 +35686,229 @@ wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( + return status; + } + +-// -------- func deflate.decoder.decode_huffman_slow ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_cbor__error__bad_input[] = "#cbor: bad input"; ++const char wuffs_cbor__error__unsupported_recursion_depth[] = "#cbor: unsupported recursion depth"; ++const char wuffs_cbor__error__internal_error_inconsistent_i_o[] = "#cbor: internal error: inconsistent I/O"; ++const char wuffs_cbor__error__internal_error_inconsistent_token_length[] = "#cbor: internal error: inconsistent token length"; ++ ++// ---------------- Private Consts ++ ++static const uint32_t ++WUFFS_CBOR__LITERALS[4] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 8388612u, 8388616u, 8388610u, 8388609u, ++}; ++ ++static const uint8_t ++WUFFS_CBOR__TOKEN_LENGTHS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, ++ 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, ++ 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, ++ 2u, 3u, 5u, 9u, 0u, 0u, 0u, 1u, ++}; ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++// ---------------- VTables ++ ++const wuffs_base__token_decoder__func_ptrs ++wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__token_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_cbor__decoder__decode_tokens), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_cbor__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_cbor__decoder__set_quirk), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_cbor__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_cbor__decoder__initialize( ++ wuffs_cbor__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name = ++ wuffs_base__token_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers = ++ (const void*)(&wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_cbor__decoder* ++wuffs_cbor__decoder__alloc(void) { ++ wuffs_cbor__decoder* x = ++ (wuffs_cbor__decoder*)(calloc(1, sizeof(wuffs_cbor__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_cbor__decoder__initialize( ++ x, sizeof(wuffs_cbor__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_cbor__decoder(void) { ++ return sizeof(wuffs_cbor__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func cbor.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_slow( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_cbor__decoder__get_quirk( ++ const wuffs_cbor__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func cbor.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_cbor__decoder__set_quirk( ++ wuffs_cbor__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func cbor.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_cbor__decoder__workbuf_len( ++ const wuffs_cbor__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__empty_range_ii_u64(); ++} ++ ++// -------- func cbor.decoder.decode_tokens ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_cbor__decoder__decode_tokens( ++ wuffs_cbor__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_table_entry = 0; +- uint32_t v_table_entry_n_bits = 0; +- uint32_t v_lmask = 0; +- uint32_t v_dmask = 0; +- uint32_t v_b0 = 0; +- uint32_t v_redir_top = 0; +- uint32_t v_redir_mask = 0; +- uint32_t v_b1 = 0; +- uint32_t v_length = 0; +- uint32_t v_b2 = 0; +- uint32_t v_b3 = 0; +- uint32_t v_b4 = 0; +- uint32_t v_dist_minus_1 = 0; +- uint32_t v_b5 = 0; +- uint32_t v_n_copied = 0; +- uint32_t v_hlen = 0; +- uint32_t v_hdist = 0; ++ uint64_t v_string_length = 0; ++ uint64_t v_n64 = 0; ++ uint32_t v_depth = 0; ++ uint32_t v_stack_byte = 0; ++ uint32_t v_stack_bit = 0; ++ uint32_t v_stack_val = 0; ++ uint32_t v_token_length = 0; ++ uint32_t v_vminor = 0; ++ uint32_t v_vminor_alt = 0; ++ uint32_t v_continued = 0; ++ uint8_t v_c8 = 0; ++ uint8_t v_c_major = 0; ++ uint8_t v_c_minor = 0; ++ bool v_tagged = false; ++ uint8_t v_indefinite_string_major_type = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; +@@ -36135,269 +35929,513 @@ wuffs_deflate__decoder__decode_huffman_slow( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_tokens; + if (coro_susp_point) { +- v_bits = self->private_data.s_decode_huffman_slow[0].v_bits; +- v_n_bits = self->private_data.s_decode_huffman_slow[0].v_n_bits; +- v_table_entry_n_bits = self->private_data.s_decode_huffman_slow[0].v_table_entry_n_bits; +- v_lmask = self->private_data.s_decode_huffman_slow[0].v_lmask; +- v_dmask = self->private_data.s_decode_huffman_slow[0].v_dmask; +- v_redir_top = self->private_data.s_decode_huffman_slow[0].v_redir_top; +- v_redir_mask = self->private_data.s_decode_huffman_slow[0].v_redir_mask; +- v_length = self->private_data.s_decode_huffman_slow[0].v_length; +- v_dist_minus_1 = self->private_data.s_decode_huffman_slow[0].v_dist_minus_1; ++ v_string_length = self->private_data.s_decode_tokens.v_string_length; ++ v_depth = self->private_data.s_decode_tokens.v_depth; ++ v_tagged = self->private_data.s_decode_tokens.v_tagged; ++ v_indefinite_string_major_type = self->private_data.s_decode_tokens.v_indefinite_string_major_type; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; ++ if (self->private_impl.f_end_of_data) { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } +- v_bits = self->private_impl.f_bits; +- v_n_bits = self->private_impl.f_n_bits; +- v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); +- v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); +- label__loop__continue:; +- while ( ! (self->private_impl.p_decode_huffman_slow[0] != 0)) { ++ label__outer__continue:; ++ while (true) { + while (true) { +- v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- if (v_n_bits >= v_table_entry_n_bits) { +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- break; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ do { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ goto label__outer__continue; + } +- uint32_t t_0 = *iop_a_src++; +- v_b0 = t_0; +- } +- v_bits |= (v_b0 << v_n_bits); +- v_n_bits += 8u; +- } +- if ((v_table_entry >> 31u) != 0u) { +- self->private_data.s_decode_huffman_slow[0].scratch = ((uint8_t)((v_table_entry >> 8u))); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (iop_a_dst == io2_a_dst) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- goto suspend; +- } +- *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow[0].scratch)); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- while (true) { +- v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- if (v_n_bits >= v_table_entry_n_bits) { +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- break; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ goto label__outer__continue; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if ((v_indefinite_string_major_type != 0u) && (v_indefinite_string_major_type != ((uint8_t)(v_c8 >> 5u)))) { ++ if (v_c8 != 255u) { ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ goto exit; + } +- uint32_t t_1 = *iop_a_src++; +- v_b1 = t_1; ++ v_vminor = 4194560u; ++ if (v_indefinite_string_major_type == 3u) { ++ v_vminor |= 19u; ++ } ++ v_indefinite_string_major_type = 0u; ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; + } +- v_bits |= (v_b1 << v_n_bits); +- v_n_bits += 8u; +- } +- if ((v_table_entry >> 31u) != 0u) { +- self->private_data.s_decode_huffman_slow[0].scratch = ((uint8_t)((v_table_entry >> 8u))); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (iop_a_dst == io2_a_dst) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- goto suspend; ++ iop_a_src += 1u; ++ v_c_major = ((uint8_t)(((uint8_t)(v_c8 >> 5u)))); ++ v_c_minor = ((uint8_t)(v_c8 & 31u)); ++ if (v_c_minor < 24u) { ++ v_string_length = ((uint64_t)(v_c_minor)); ++ } else { ++ while (true) { ++ if (v_c_minor == 24u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 1u) { ++ v_string_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); ++ iop_a_src += 1u; ++ break; ++ } ++ } else if (v_c_minor == 25u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 2u) { ++ v_string_length = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2u; ++ break; ++ } ++ } else if (v_c_minor == 26u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { ++ v_string_length = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4u; ++ break; ++ } ++ } else if (v_c_minor == 27u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 8u) { ++ v_string_length = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8u; ++ break; ++ } ++ } else { ++ v_string_length = 0u; ++ break; ++ } ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ goto label__outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } + } +- *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow[0].scratch)); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ if (v_c_major == 0u) { ++ if (v_c_minor < 26u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((14680064u | ((uint32_t)((v_string_length & 65535u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor < 28u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((14680064u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ *iop_a_dst++ = wuffs_base__make_token( ++ (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ } else if (v_c_major == 1u) { ++ if (v_c_minor < 26u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length & 65535u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor < 28u) { ++ if (v_string_length < 9223372036854775808u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length >> 46u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ *iop_a_dst++ = wuffs_base__make_token( ++ (~((18446744073709551615u - v_string_length) & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } else { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | ++ (((uint64_t)(16777216u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ } else if (v_c_major == 2u) { ++ if (v_c_minor < 28u) { ++ if (v_string_length == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } else if (v_c_minor == 31u) { ++ if (v_indefinite_string_major_type != 0u) { ++ break; ++ } ++ v_indefinite_string_major_type = 2u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__outer__continue; ++ } else { ++ break; ++ } ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ continue; ++ } ++ v_n64 = wuffs_base__u64__min(v_string_length, ((uint64_t)(io2_a_src - iop_a_src))); ++ v_token_length = ((uint32_t)((v_n64 & 65535u))); ++ if (v_n64 > 65535u) { ++ v_token_length = 65535u; ++ } else if (v_token_length <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ continue; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) { ++ status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length); ++ goto exit; ++ } ++ v_string_length -= ((uint64_t)(v_token_length)); ++ v_continued = 0u; ++ if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) { ++ v_continued = 1u; ++ } ++ iop_a_src += v_token_length; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194816u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (v_string_length > 0u) { ++ continue; ++ } else if (v_indefinite_string_major_type > 0u) { ++ goto label__outer__continue; ++ } ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ } else if (v_c_major == 3u) { ++ if (v_c_minor < 28u) { ++ if (v_string_length == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } else if (v_c_minor == 31u) { ++ if (v_indefinite_string_major_type != 0u) { ++ break; ++ } ++ v_indefinite_string_major_type = 3u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__outer__continue; ++ } else { ++ break; ++ } ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ continue; ++ } ++ v_n64 = wuffs_base__u64__min(v_string_length, 65535u); ++ v_n64 = ((uint64_t)(wuffs_base__utf_8__longest_valid_prefix(iop_a_src, ++ ((size_t)(wuffs_base__u64__min(((uint64_t)(io2_a_src - iop_a_src)), v_n64)))))); ++ v_token_length = ((uint32_t)((v_n64 & 65535u))); ++ if (v_token_length <= 0u) { ++ if ((a_src && a_src->meta.closed) || (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ continue; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) { ++ status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length); ++ goto exit; ++ } ++ v_string_length -= ((uint64_t)(v_token_length)); ++ v_continued = 0u; ++ if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) { ++ v_continued = 1u; ++ } ++ iop_a_src += v_token_length; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (v_string_length > 0u) { ++ continue; ++ } else if (v_indefinite_string_major_type > 0u) { ++ goto label__outer__continue; ++ } ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ } else if (v_c_major == 4u) { ++ if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) { ++ break; ++ } else if (v_depth >= 1024u) { ++ v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])); ++ while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) { ++ iop_a_src--; ++ v_token_length -= 1u; ++ } ++ status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth); ++ goto exit; ++ } ++ v_vminor = 2105361u; ++ v_vminor_alt = 2101282u; ++ if (v_depth > 0u) { ++ v_stack_byte = ((v_depth - 1u) / 16u); ++ v_stack_bit = (((v_depth - 1u) & 15u) * 2u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ v_vminor = 2105377u; ++ v_vminor_alt = 2105378u; ++ } else { ++ v_vminor = 2105409u; ++ v_vminor_alt = 2113570u; ++ } ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (v_c_minor == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ v_stack_byte = (v_depth / 16u); ++ v_stack_bit = ((v_depth & 15u) * 2u); ++ self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(3u)) << v_stack_bit)); ++ self->private_data.f_container_num_remaining[v_depth] = v_string_length; ++ v_depth += 1u; ++ v_tagged = false; ++ goto label__outer__continue; ++ } else if (v_c_major == 5u) { ++ if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) { ++ break; ++ } else if (v_depth >= 1024u) { ++ v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])); ++ while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) { ++ iop_a_src--; ++ v_token_length -= 1u; ++ } ++ status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth); ++ goto exit; ++ } ++ v_vminor = 2113553u; ++ v_vminor_alt = 2101314u; ++ if (v_depth > 0u) { ++ v_stack_byte = ((v_depth - 1u) / 16u); ++ v_stack_bit = (((v_depth - 1u) & 15u) * 2u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ v_vminor = 2113569u; ++ v_vminor_alt = 2105410u; ++ } else { ++ v_vminor = 2113601u; ++ v_vminor_alt = 2113602u; ++ } ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (v_c_minor == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ v_stack_byte = (v_depth / 16u); ++ v_stack_bit = ((v_depth & 15u) * 2u); ++ self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(3u)) << v_stack_bit); ++ self->private_data.f_container_num_remaining[v_depth] = v_string_length; ++ v_depth += 1u; ++ v_tagged = false; ++ goto label__outer__continue; ++ } else if (v_c_major == 6u) { ++ if (v_c_minor >= 28u) { ++ break; ++ } ++ if (v_string_length < 262144u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | ++ (((uint64_t)((4194304u | ((uint32_t)(v_string_length))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } else { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | ++ (((uint64_t)((4194304u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ *iop_a_dst++ = wuffs_base__make_token( ++ (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ v_tagged = true; ++ goto label__outer__continue; ++ } else if (v_c_major == 7u) { ++ if (v_c_minor < 20u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | ++ (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor < 24u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(WUFFS_CBOR__LITERALS[((uint8_t)(v_c_minor & 3u))])) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor == 24u) { ++ if (v_string_length < 24u) { ++ if ( ! (iop_a_src > io1_a_src)) { ++ status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ iop_a_src--; ++ break; ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | ++ (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor < 28u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(10490113u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor == 31u) { ++ if (v_tagged || (v_depth <= 0u)) { ++ break; ++ } ++ v_depth -= 1u; ++ if (self->private_data.f_container_num_remaining[v_depth] != 0u) { ++ break; ++ } ++ v_stack_byte = (v_depth / 16u); ++ v_stack_bit = ((v_depth & 15u) * 2u); ++ v_stack_val = (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit)); ++ if (v_stack_val == 1u) { ++ break; ++ } ++ if (v_stack_val != 3u) { ++ v_vminor_alt = 2097186u; ++ } else { ++ v_vminor_alt = 2097218u; ++ } ++ if (v_depth <= 0u) { ++ v_vminor_alt |= 4096u; ++ } else { ++ v_stack_byte = ((v_depth - 1u) / 16u); ++ v_stack_bit = (((v_depth - 1u) & 15u) * 2u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ v_vminor_alt |= 8192u; ++ } else { ++ v_vminor_alt |= 16384u; ++ } ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ } ++ } while (0); ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); + goto exit; + } +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); + goto exit; + } +- v_length = (((v_table_entry >> 8u) & 255u) + 3u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_table_entry_n_bits > 0u) { +- while (v_n_bits < v_table_entry_n_bits) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint32_t t_2 = *iop_a_src++; +- v_b2 = t_2; +- } +- v_bits |= (v_b2 << v_n_bits); +- v_n_bits += 8u; ++ label__goto_parsed_a_leaf_value__break:; ++ v_tagged = false; ++ while (v_depth > 0u) { ++ v_stack_byte = ((v_depth - 1u) / 16u); ++ v_stack_bit = (((v_depth - 1u) & 15u) * 2u); ++ self->private_data.f_stack[v_stack_byte] ^= (((uint32_t)(1u)) << (v_stack_bit + 1u)); ++ if (1u == (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit))) { ++ goto label__outer__continue; + } +- v_length = (((v_length + 253u + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- while (true) { +- v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- if (v_n_bits >= v_table_entry_n_bits) { +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- break; ++ if (self->private_data.f_container_num_remaining[(v_depth - 1u)] <= 0u) { ++ goto label__outer__continue; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint32_t t_3 = *iop_a_src++; +- v_b3 = t_3; +- } +- v_bits |= (v_b3 << v_n_bits); +- v_n_bits += 8u; +- } +- if ((v_table_entry >> 28u) == 1u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- while (true) { +- v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- if (v_n_bits >= v_table_entry_n_bits) { +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- break; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint32_t t_4 = *iop_a_src++; +- v_b4 = t_4; +- } +- v_bits |= (v_b4 << v_n_bits); +- v_n_bits += 8u; ++ self->private_data.f_container_num_remaining[(v_depth - 1u)] -= 1u; ++ if (self->private_data.f_container_num_remaining[(v_depth - 1u)] > 0u) { ++ goto label__outer__continue; + } +- } +- if ((v_table_entry >> 24u) != 64u) { +- if ((v_table_entry >> 24u) == 8u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ continue; + } +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_table_entry_n_bits > 0u) { +- while (v_n_bits < v_table_entry_n_bits) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint32_t t_5 = *iop_a_src++; +- v_b5 = t_5; +- } +- v_bits |= (v_b5 << v_n_bits); +- v_n_bits += 8u; ++ v_depth -= 1u; ++ v_stack_byte = (v_depth / 16u); ++ v_stack_bit = ((v_depth & 15u) * 2u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ v_vminor_alt = 2097186u; ++ } else { ++ v_vminor_alt = 2097218u; + } +- v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- while (true) { +- if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { +- v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); +- if (v_hdist < v_length) { +- v_hlen = v_hdist; ++ if (v_depth <= 0u) { ++ v_vminor_alt |= 4096u; ++ } else { ++ v_stack_byte = ((v_depth - 1u) / 16u); ++ v_stack_bit = (((v_depth - 1u) & 15u) * 2u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ v_vminor_alt |= 8192u; + } else { +- v_hlen = v_length; +- } +- v_hdist += ((uint32_t)(((uint64_t)(self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u))))); +- if (self->private_impl.f_history_index < v_hdist) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); +- goto exit; +- } +- v_n_copied = wuffs_base__io_writer__limited_copy_u32_from_slice( +- &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); +- if (v_n_copied < v_hlen) { +- v_length -= v_n_copied; +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); +- continue; +- } +- v_length -= v_hlen; +- if (v_length == 0u) { +- goto label__loop__continue; ++ v_vminor_alt |= 16384u; + } + } +- v_n_copied = wuffs_base__io_writer__limited_copy_u32_from_history( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- if (v_length <= v_n_copied) { +- goto label__loop__continue; +- } +- v_length -= v_n_copied; +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + } ++ break; + } +- self->private_impl.f_bits = v_bits; +- self->private_impl.f_n_bits = v_n_bits; +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } ++ self->private_impl.f_end_of_data = true; + + ok: +- self->private_impl.p_decode_huffman_slow[0] = 0; ++ self->private_impl.p_decode_tokens = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_huffman_slow[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_huffman_slow[0].v_bits = v_bits; +- self->private_data.s_decode_huffman_slow[0].v_n_bits = v_n_bits; +- self->private_data.s_decode_huffman_slow[0].v_table_entry_n_bits = v_table_entry_n_bits; +- self->private_data.s_decode_huffman_slow[0].v_lmask = v_lmask; +- self->private_data.s_decode_huffman_slow[0].v_dmask = v_dmask; +- self->private_data.s_decode_huffman_slow[0].v_redir_top = v_redir_top; +- self->private_data.s_decode_huffman_slow[0].v_redir_mask = v_redir_mask; +- self->private_data.s_decode_huffman_slow[0].v_length = v_length; +- self->private_data.s_decode_huffman_slow[0].v_dist_minus_1 = v_dist_minus_1; ++ self->private_impl.p_decode_tokens = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_data.s_decode_tokens.v_string_length = v_string_length; ++ self->private_data.s_decode_tokens.v_depth = v_depth; ++ self->private_data.s_decode_tokens.v_tagged = v_tagged; ++ self->private_data.s_decode_tokens.v_indefinite_string_major_type = v_indefinite_string_major_type; + + goto exit; + exit: +@@ -36408,243 +36446,607 @@ wuffs_deflate__decoder__decode_huffman_slow( + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } + return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) + + // ---------------- Status Codes Implementations + +-const char wuffs_gif__error__bad_lzw_code[] = "#gif: bad LZW code"; +-const char wuffs_gif__error__bad_extension_label[] = "#gif: bad extension label"; +-const char wuffs_gif__error__bad_frame_size[] = "#gif: bad frame size"; +-const char wuffs_gif__error__bad_graphic_control[] = "#gif: bad graphic control"; +-const char wuffs_gif__error__bad_header[] = "#gif: bad header"; +-const char wuffs_gif__error__bad_literal_width[] = "#gif: bad literal width"; +-const char wuffs_gif__error__bad_palette[] = "#gif: bad palette"; +-const char wuffs_gif__error__truncated_input[] = "#gif: truncated input"; +-const char wuffs_gif__error__internal_error_inconsistent_i_o[] = "#gif: internal error: inconsistent I/O"; +- + // ---------------- Private Consts + + static const uint32_t +-WUFFS_GIF__INTERLACE_START[5] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 4294967295, 1, 2, 4, 0, +-}; +- +-static const uint8_t +-WUFFS_GIF__INTERLACE_DELTA[5] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1, 2, 4, 8, 8, +-}; +- +-static const uint8_t +-WUFFS_GIF__INTERLACE_COUNT[5] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 1, 2, 4, 8, +-}; +- +-static const uint8_t +-WUFFS_GIF__ANIMEXTS1DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 65, 78, 73, 77, 69, 88, 84, 83, +- 49, 46, 48, +-}; +- +-static const uint8_t +-WUFFS_GIF__NETSCAPE2DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 78, 69, 84, 83, 67, 65, 80, 69, +- 50, 46, 48, +-}; +- +-static const uint8_t +-WUFFS_GIF__ICCRGBG1012[11] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 73, 67, 67, 82, 71, 66, 71, 49, +- 48, 49, 50, +-}; +- +-static const uint8_t +-WUFFS_GIF__XMPDATAXMP[11] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 88, 77, 80, 32, 68, 97, 116, 97, +- 88, 77, 80, ++WUFFS_CRC32__IEEE_TABLE[16][256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ { ++ 0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u, ++ 249268274u, 2044508324u, 3772115230u, 2547177864u, 162941995u, 2125561021u, 3887607047u, 2428444049u, ++ 498536548u, 1789927666u, 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u, ++ 325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u, 4195302755u, 2366115317u, ++ 997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u, ++ 901097722u, 1119000684u, 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u, ++ 651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u, 3485111705u, 3099436303u, ++ 671266974u, 1594198024u, 3322730930u, 2970347812u, 795835527u, 1483230225u, 3244367275u, 3060149565u, ++ 1994146192u, 31158534u, 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u, ++ 2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u, 2439277719u, 3865271297u, ++ 1802195444u, 476864866u, 2238001368u, 4066508878u, 1812370925u, 453092731u, 2181625025u, 4111451223u, ++ 1706088902u, 314042704u, 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u, ++ 1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u, ++ 1131014506u, 879679996u, 2909243462u, 3663771856u, 1141124467u, 855842277u, 2852801631u, 3708648649u, ++ 1342533948u, 654459306u, 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u, ++ 1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u, 3082640443u, 3233442989u, ++ 3988292384u, 2596254646u, 62317068u, 1957810842u, 3939845945u, 2647816111u, 81470997u, 1943803523u, ++ 3814918930u, 2489596804u, 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u, ++ 4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u, 426522225u, 1852507879u, ++ 4275313526u, 2312317920u, 282753626u, 1742555852u, 4189708143u, 2394877945u, 397917763u, 1622183637u, ++ 3604390888u, 2714866558u, 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u, ++ 3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u, 829329135u, 1181335161u, ++ 3412177804u, 3160834842u, 628085408u, 1382605366u, 3423369109u, 3138078467u, 570562233u, 1426400815u, ++ 3317316542u, 2998733608u, 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u, ++ 2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u, 1913087877u, 83908371u, ++ 2512341634u, 3803740692u, 2075208622u, 213261112u, 2463272603u, 3855990285u, 2094854071u, 198958881u, ++ 2262029012u, 4057260610u, 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u, ++ 2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u, 1634467795u, 376229701u, ++ 2685067896u, 3608007406u, 1308918612u, 956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u, ++ 2932959818u, 3654703836u, 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u, ++ 3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u, 1423857449u, 601450431u, ++ 3009837614u, 3294710456u, 1567103746u, 711928724u, 3020668471u, 3272380065u, 1510334235u, 755167117u, ++ }, { ++ 0u, 421212481u, 842424962u, 724390851u, 1684849924u, 2105013317u, 1448781702u, 1329698503u, ++ 3369699848u, 3519200073u, 4210026634u, 3824474571u, 2897563404u, 3048111693u, 2659397006u, 2274893007u, ++ 1254232657u, 1406739216u, 2029285587u, 1643069842u, 783210325u, 934667796u, 479770071u, 92505238u, ++ 2182846553u, 2600511768u, 2955803355u, 2838940570u, 3866582365u, 4285295644u, 3561045983u, 3445231262u, ++ 2508465314u, 2359236067u, 2813478432u, 3198777185u, 4058571174u, 3908292839u, 3286139684u, 3670389349u, ++ 1566420650u, 1145479147u, 1869335592u, 1987116393u, 959540142u, 539646703u, 185010476u, 303839341u, ++ 3745920755u, 3327985586u, 3983561841u, 4100678960u, 3140154359u, 2721170102u, 2300350837u, 2416418868u, ++ 396344571u, 243568058u, 631889529u, 1018359608u, 1945336319u, 1793607870u, 1103436669u, 1490954812u, ++ 4034481925u, 3915546180u, 3259968903u, 3679722694u, 2484439553u, 2366552896u, 2787371139u, 3208174018u, ++ 950060301u, 565965900u, 177645455u, 328046286u, 1556873225u, 1171730760u, 1861902987u, 2011255754u, ++ 3132841300u, 2745199637u, 2290958294u, 2442530455u, 3738671184u, 3352078609u, 3974232786u, 4126854035u, ++ 1919080284u, 1803150877u, 1079293406u, 1498383519u, 370020952u, 253043481u, 607678682u, 1025720731u, ++ 1711106983u, 2095471334u, 1472923941u, 1322268772u, 26324643u, 411738082u, 866634785u, 717028704u, ++ 2904875439u, 3024081134u, 2668790573u, 2248782444u, 3376948395u, 3495106026u, 4219356713u, 3798300520u, ++ 792689142u, 908347575u, 487136116u, 68299317u, 1263779058u, 1380486579u, 2036719216u, 1618931505u, ++ 3890672638u, 4278043327u, 3587215740u, 3435896893u, 2206873338u, 2593195963u, 2981909624u, 2829542713u, ++ 998479947u, 580430090u, 162921161u, 279890824u, 1609522511u, 1190423566u, 1842954189u, 1958874764u, ++ 4082766403u, 3930137346u, 3245109441u, 3631694208u, 2536953671u, 2385372678u, 2768287173u, 3155920004u, ++ 1900120602u, 1750776667u, 1131931800u, 1517083097u, 355290910u, 204897887u, 656092572u, 1040194781u, ++ 3113746450u, 2692952403u, 2343461520u, 2461357009u, 3723805974u, 3304059991u, 4022511508u, 4141455061u, ++ 2919742697u, 3072101800u, 2620513899u, 2234183466u, 3396041197u, 3547351212u, 4166851439u, 3779471918u, ++ 1725839073u, 2143618976u, 1424512099u, 1307796770u, 45282277u, 464110244u, 813994343u, 698327078u, ++ 3838160568u, 4259225593u, 3606301754u, 3488152955u, 2158586812u, 2578602749u, 2996767038u, 2877569151u, ++ 740041904u, 889656817u, 506086962u, 120682355u, 1215357364u, 1366020341u, 2051441462u, 1667084919u, ++ 3422213966u, 3538019855u, 4190942668u, 3772220557u, 2945847882u, 3062702859u, 2644537544u, 2226864521u, ++ 52649286u, 439905287u, 823476164u, 672009861u, 1733269570u, 2119477507u, 1434057408u, 1281543041u, ++ 2167981343u, 2552493150u, 3004082077u, 2853541596u, 3847487515u, 4233048410u, 3613549209u, 3464057816u, ++ 1239502615u, 1358593622u, 2077699477u, 1657543892u, 764250643u, 882293586u, 532408465u, 111204816u, ++ 1585378284u, 1197851309u, 1816695150u, 1968414767u, 974272232u, 587794345u, 136598634u, 289367339u, ++ 2527558116u, 2411481253u, 2760973158u, 3179948583u, 4073438432u, 3956313505u, 3237863010u, 3655790371u, ++ 347922877u, 229101820u, 646611775u, 1066513022u, 1892689081u, 1774917112u, 1122387515u, 1543337850u, ++ 3697634229u, 3313392372u, 3998419255u, 4148705398u, 3087642289u, 2702352368u, 2319436851u, 2468674930u, ++ }, { ++ 0u, 29518391u, 59036782u, 38190681u, 118073564u, 114017003u, 76381362u, 89069189u, ++ 236147128u, 265370511u, 228034006u, 206958561u, 152762724u, 148411219u, 178138378u, 190596925u, ++ 472294256u, 501532999u, 530741022u, 509615401u, 456068012u, 451764635u, 413917122u, 426358261u, ++ 305525448u, 334993663u, 296822438u, 275991697u, 356276756u, 352202787u, 381193850u, 393929805u, ++ 944588512u, 965684439u, 1003065998u, 973863097u, 1061482044u, 1049003019u, 1019230802u, 1023561829u, ++ 912136024u, 933002607u, 903529270u, 874031361u, 827834244u, 815125939u, 852716522u, 856752605u, ++ 611050896u, 631869351u, 669987326u, 640506825u, 593644876u, 580921211u, 551983394u, 556069653u, ++ 712553512u, 733666847u, 704405574u, 675154545u, 762387700u, 749958851u, 787859610u, 792175277u, ++ 1889177024u, 1901651959u, 1931368878u, 1927033753u, 2006131996u, 1985040171u, 1947726194u, 1976933189u, ++ 2122964088u, 2135668303u, 2098006038u, 2093965857u, 2038461604u, 2017599123u, 2047123658u, 2076625661u, ++ 1824272048u, 1836991623u, 1866005214u, 1861914857u, 1807058540u, 1786244187u, 1748062722u, 1777547317u, ++ 1655668488u, 1668093247u, 1630251878u, 1625932113u, 1705433044u, 1684323811u, 1713505210u, 1742760333u, ++ 1222101792u, 1226154263u, 1263738702u, 1251046777u, 1339974652u, 1310460363u, 1281013650u, 1301863845u, ++ 1187289752u, 1191637167u, 1161842422u, 1149379777u, 1103966788u, 1074747507u, 1112139306u, 1133218845u, ++ 1425107024u, 1429406311u, 1467333694u, 1454888457u, 1408811148u, 1379576507u, 1350309090u, 1371438805u, ++ 1524775400u, 1528845279u, 1499917702u, 1487177649u, 1575719220u, 1546255107u, 1584350554u, 1605185389u, ++ 3778354048u, 3774312887u, 3803303918u, 3816007129u, 3862737756u, 3892238699u, 3854067506u, 3833203973u, ++ 4012263992u, 4007927823u, 3970080342u, 3982554209u, 3895452388u, 3924658387u, 3953866378u, 3932773565u, ++ 4245928176u, 4241609415u, 4271336606u, 4283762345u, 4196012076u, 4225268251u, 4187931714u, 4166823541u, ++ 4076923208u, 4072833919u, 4035198246u, 4047918865u, 4094247316u, 4123732899u, 4153251322u, 4132437965u, ++ 3648544096u, 3636082519u, 3673983246u, 3678331705u, 3732010428u, 3753090955u, 3723829714u, 3694611429u, ++ 3614117080u, 3601426159u, 3572488374u, 3576541825u, 3496125444u, 3516976691u, 3555094634u, 3525581405u, ++ 3311336976u, 3298595879u, 3336186494u, 3340255305u, 3260503756u, 3281337595u, 3251864226u, 3222399125u, ++ 3410866088u, 3398419871u, 3368647622u, 3372945905u, 3427010420u, 3448139075u, 3485520666u, 3456284973u, ++ 2444203584u, 2423127159u, 2452308526u, 2481530905u, 2527477404u, 2539934891u, 2502093554u, 2497740997u, ++ 2679949304u, 2659102159u, 2620920726u, 2650438049u, 2562027300u, 2574714131u, 2603727690u, 2599670141u, ++ 2374579504u, 2353749767u, 2383274334u, 2412743529u, 2323684844u, 2336421851u, 2298759554u, 2294686645u, ++ 2207933576u, 2186809023u, 2149495014u, 2178734801u, 2224278612u, 2236720739u, 2266437690u, 2262135309u, ++ 2850214048u, 2820717207u, 2858812622u, 2879680249u, 2934667388u, 2938704459u, 2909776914u, 2897069605u, ++ 2817622296u, 2788420399u, 2759153014u, 2780249921u, 2700618180u, 2704950259u, 2742877610u, 2730399645u, ++ 3049550800u, 3020298727u, 3057690558u, 3078802825u, 2999835404u, 3004150075u, 2974355298u, 2961925461u, ++ 3151438440u, 3121956959u, 3092510214u, 3113327665u, 3168701108u, 3172786307u, 3210370778u, 3197646061u, ++ }, { ++ 0u, 3099354981u, 2852767883u, 313896942u, 2405603159u, 937357362u, 627793884u, 2648127673u, ++ 3316918511u, 2097696650u, 1874714724u, 3607201537u, 1255587768u, 4067088605u, 3772741427u, 1482887254u, ++ 1343838111u, 3903140090u, 4195393300u, 1118632049u, 3749429448u, 1741137837u, 1970407491u, 3452858150u, ++ 2511175536u, 756094997u, 1067759611u, 2266550430u, 449832999u, 2725482306u, 2965774508u, 142231497u, ++ 2687676222u, 412010587u, 171665333u, 2995192016u, 793786473u, 2548850444u, 2237264098u, 1038456711u, ++ 1703315409u, 3711623348u, 3482275674u, 1999841343u, 3940814982u, 1381529571u, 1089329165u, 4166106984u, ++ 4029413537u, 1217896388u, 1512189994u, 3802027855u, 2135519222u, 3354724499u, 3577784189u, 1845280792u, ++ 899665998u, 2367928107u, 2677414085u, 657096608u, 3137160985u, 37822588u, 284462994u, 2823350519u, ++ 2601801789u, 598228824u, 824021174u, 2309093331u, 343330666u, 2898962447u, 3195996129u, 113467524u, ++ 1587572946u, 3860600759u, 4104763481u, 1276501820u, 3519211397u, 1769898208u, 2076913422u, 3279374443u, ++ 3406630818u, 1941006535u, 1627703081u, 3652755532u, 1148164341u, 4241751952u, 3999682686u, 1457141531u, ++ 247015245u, 3053797416u, 2763059142u, 470583459u, 2178658330u, 963106687u, 735213713u, 2473467892u, ++ 992409347u, 2207944806u, 2435792776u, 697522413u, 3024379988u, 217581361u, 508405983u, 2800865210u, ++ 4271038444u, 1177467017u, 1419450215u, 3962007554u, 1911572667u, 3377213406u, 3690561584u, 1665525589u, ++ 1799331996u, 3548628985u, 3241568279u, 2039091058u, 3831314379u, 1558270126u, 1314193216u, 4142438437u, ++ 2928380019u, 372764438u, 75645176u, 3158189981u, 568925988u, 2572515393u, 2346768303u, 861712586u, ++ 3982079547u, 1441124702u, 1196457648u, 4293663189u, 1648042348u, 3666298377u, 3358779879u, 1888390786u, ++ 686661332u, 2421291441u, 2196002399u, 978858298u, 2811169155u, 523464422u, 226935048u, 3040519789u, ++ 3175145892u, 100435649u, 390670639u, 2952089162u, 841119475u, 2325614998u, 2553003640u, 546822429u, ++ 2029308235u, 3225988654u, 3539796416u, 1782671013u, 4153826844u, 1328167289u, 1570739863u, 3844338162u, ++ 1298864389u, 4124540512u, 3882013070u, 1608431339u, 3255406162u, 2058742071u, 1744848601u, 3501990332u, ++ 2296328682u, 811816591u, 584513889u, 2590678532u, 129869501u, 3204563416u, 2914283062u, 352848211u, ++ 494030490u, 2781751807u, 3078325777u, 264757620u, 2450577869u, 715964072u, 941166918u, 2158327331u, ++ 3636881013u, 1618608400u, 1926213374u, 3396585883u, 1470427426u, 4011365959u, 4255988137u, 1158766284u, ++ 1984818694u, 3471935843u, 3695453837u, 1693991400u, 4180638033u, 1100160564u, 1395044826u, 3952793279u, ++ 3019491049u, 189112716u, 435162722u, 2706139399u, 1016811966u, 2217162459u, 2526189877u, 774831696u, ++ 643086745u, 2666061564u, 2354934034u, 887166583u, 2838900430u, 294275499u, 54519365u, 3145957664u, ++ 3823145334u, 1532818963u, 1240029693u, 4048895640u, 1820460577u, 3560857924u, 3331051178u, 2117577167u, ++ 3598663992u, 1858283101u, 2088143283u, 3301633750u, 1495127663u, 3785470218u, 4078182116u, 1269332353u, ++ 332098007u, 2876706482u, 3116540252u, 25085497u, 2628386432u, 605395429u, 916469259u, 2384220526u, ++ 2254837415u, 1054503362u, 745528876u, 2496903497u, 151290352u, 2981684885u, 2735556987u, 464596510u, ++ 1137851976u, 4218313005u, 3923506883u, 1365741990u, 3434129695u, 1946996346u, 1723425172u, 3724871409u, ++ }, { ++ 0u, 1029712304u, 2059424608u, 1201699536u, 4118849216u, 3370159984u, 2403399072u, 2988497936u, ++ 812665793u, 219177585u, 1253054625u, 2010132753u, 3320900865u, 4170237105u, 3207642721u, 2186319825u, ++ 1625331586u, 1568718386u, 438355170u, 658566482u, 2506109250u, 2818578674u, 4020265506u, 3535817618u, ++ 1351670851u, 1844508147u, 709922595u, 389064339u, 2769320579u, 2557498163u, 3754961379u, 3803185235u, ++ 3250663172u, 4238411444u, 3137436772u, 2254525908u, 876710340u, 153198708u, 1317132964u, 1944187668u, ++ 4054934725u, 3436268917u, 2339452837u, 3054575125u, 70369797u, 961670069u, 2129760613u, 1133623509u, ++ 2703341702u, 2621542710u, 3689016294u, 3867263574u, 1419845190u, 1774270454u, 778128678u, 318858390u, ++ 2438067015u, 2888948471u, 3952189479u, 3606153623u, 1691440519u, 1504803895u, 504432359u, 594620247u, ++ 1492342857u, 1704161785u, 573770537u, 525542041u, 2910060169u, 2417219385u, 3618876905u, 3939730521u, ++ 1753420680u, 1440954936u, 306397416u, 790849880u, 2634265928u, 2690882808u, 3888375336u, 3668168600u, ++ 940822475u, 91481723u, 1121164459u, 2142483739u, 3448989963u, 4042473659u, 3075684971u, 2318603227u, ++ 140739594u, 889433530u, 1923340138u, 1338244826u, 4259521226u, 3229813626u, 2267247018u, 3124975642u, ++ 2570221389u, 2756861693u, 3824297005u, 3734113693u, 1823658381u, 1372780605u, 376603373u, 722643805u, ++ 2839690380u, 2485261628u, 3548540908u, 4007806556u, 1556257356u, 1638052860u, 637716780u, 459464860u, ++ 4191346895u, 3300051327u, 2199040943u, 3195181599u, 206718479u, 825388991u, 1989285231u, 1274166495u, ++ 3382881038u, 4106388158u, 3009607790u, 2382549470u, 1008864718u, 21111934u, 1189240494u, 2072147742u, ++ 2984685714u, 2357631266u, 3408323570u, 4131834434u, 1147541074u, 2030452706u, 1051084082u, 63335554u, ++ 2174155603u, 3170292451u, 4216760371u, 3325460867u, 1947622803u, 1232499747u, 248909555u, 867575619u, ++ 3506841360u, 3966111392u, 2881909872u, 2527485376u, 612794832u, 434546784u, 1581699760u, 1663499008u, ++ 3782634705u, 3692447073u, 2612412337u, 2799048193u, 351717905u, 697754529u, 1849071985u, 1398190273u, ++ 1881644950u, 1296545318u, 182963446u, 931652934u, 2242328918u, 3100053734u, 4284967478u, 3255255942u, ++ 1079497815u, 2100821479u, 983009079u, 133672583u, 3050795671u, 2293717799u, 3474399735u, 4067887175u, ++ 281479188u, 765927844u, 1778867060u, 1466397380u, 3846680276u, 3626469220u, 2676489652u, 2733102084u, ++ 548881365u, 500656741u, 1517752501u, 1729575173u, 3577210133u, 3898068133u, 2952246901u, 2459410373u, ++ 3910527195u, 3564487019u, 2480257979u, 2931134987u, 479546907u, 569730987u, 1716854139u, 1530213579u, ++ 3647316762u, 3825568426u, 2745561210u, 2663766474u, 753206746u, 293940330u, 1445287610u, 1799716618u, ++ 2314567513u, 3029685993u, 4080348217u, 3461678473u, 2088098201u, 1091956777u, 112560889u, 1003856713u, ++ 3112514712u, 2229607720u, 3276105720u, 4263857736u, 1275433560u, 1902492648u, 918929720u, 195422344u, ++ 685033439u, 364179055u, 1377080511u, 1869921551u, 3713294623u, 3761522863u, 2811507327u, 2599689167u, ++ 413436958u, 633644462u, 1650777982u, 1594160846u, 3978570462u, 3494118254u, 2548332990u, 2860797966u, ++ 1211387997u, 1968470509u, 854852413u, 261368461u, 3182753437u, 2161434413u, 3346310653u, 4195650637u, ++ 2017729436u, 1160000044u, 42223868u, 1071931724u, 2378480988u, 2963576044u, 4144295484u, 3395602316u, ++ }, { ++ 0u, 3411858341u, 1304994059u, 2257875630u, 2609988118u, 1355649459u, 3596215069u, 486879416u, ++ 3964895853u, 655315400u, 2711298918u, 1791488195u, 2009251963u, 3164476382u, 973758832u, 4048990933u, ++ 64357019u, 3364540734u, 1310630800u, 2235723829u, 2554806413u, 1394316072u, 3582976390u, 517157411u, ++ 4018503926u, 618222419u, 2722963965u, 1762783832u, 1947517664u, 3209171269u, 970744811u, 4068520014u, ++ 128714038u, 3438335635u, 1248109629u, 2167961496u, 2621261600u, 1466012805u, 3522553387u, 447296910u, ++ 3959392091u, 547575038u, 2788632144u, 1835791861u, 1886307661u, 3140622056u, 1034314822u, 4143626211u, ++ 75106221u, 3475428360u, 1236444838u, 2196665603u, 2682996155u, 1421317662u, 3525567664u, 427767573u, ++ 3895035328u, 594892389u, 2782995659u, 1857943406u, 1941489622u, 3101955187u, 1047553757u, 4113347960u, ++ 257428076u, 3288652233u, 1116777319u, 2311878850u, 2496219258u, 1603640287u, 3640781169u, 308099796u, ++ 3809183745u, 676813732u, 2932025610u, 1704983215u, 2023410199u, 3016104370u, 894593820u, 4262377657u, ++ 210634999u, 3352484690u, 1095150076u, 2316991065u, 2535410401u, 1547934020u, 3671583722u, 294336591u, ++ 3772615322u, 729897279u, 2903845777u, 1716123700u, 2068629644u, 2953845545u, 914647431u, 4258839074u, ++ 150212442u, 3282623743u, 1161604689u, 2388688372u, 2472889676u, 1480171241u, 3735940167u, 368132066u, ++ 3836185911u, 805002898u, 2842635324u, 1647574937u, 2134298401u, 3026852996u, 855535146u, 4188192143u, ++ 186781121u, 3229539940u, 1189784778u, 2377547631u, 2427670487u, 1542429810u, 3715886812u, 371670393u, ++ 3882979244u, 741170185u, 2864262823u, 1642462466u, 2095107514u, 3082559007u, 824732849u, 4201955092u, ++ 514856152u, 3589064573u, 1400419795u, 2552522358u, 2233554638u, 1316849003u, 3370776517u, 62202976u, ++ 4075001525u, 968836368u, 3207280574u, 1954014235u, 1769133219u, 2720925446u, 616199592u, 4024870413u, ++ 493229635u, 3594175974u, 1353627464u, 2616354029u, 2264355925u, 1303087088u, 3409966430u, 6498043u, ++ 4046820398u, 979978123u, 3170710821u, 2007099008u, 1789187640u, 2717386141u, 661419827u, 3962610838u, ++ 421269998u, 3527459403u, 1423225061u, 2676515648u, 2190300152u, 1238466653u, 3477467891u, 68755798u, ++ 4115633027u, 1041448998u, 3095868040u, 1943789869u, 1860096405u, 2776760880u, 588673182u, 3897205563u, ++ 449450869u, 3516317904u, 1459794558u, 2623431131u, 2170245475u, 1242006214u, 3432247400u, 131015629u, ++ 4137259288u, 1036337853u, 3142660115u, 1879958454u, 1829294862u, 2790523051u, 549483013u, 3952910752u, ++ 300424884u, 3669282065u, 1545650111u, 2541513754u, 2323209378u, 1092980487u, 3350330793u, 216870412u, ++ 4256931033u, 921128828u, 2960342482u, 2066738807u, 1714085583u, 2910195050u, 736264132u, 3770592353u, ++ 306060335u, 3647131530u, 1610005796u, 2494197377u, 2309971513u, 1123257756u, 3295149874u, 255536279u, ++ 4268596802u, 892423655u, 3013951305u, 2029645036u, 1711070292u, 2929725425u, 674528607u, 3815288570u, ++ 373562242u, 3709388839u, 1535949449u, 2429577516u, 2379569556u, 1183418929u, 3223189663u, 188820282u, ++ 4195850735u, 827017802u, 3084859620u, 2089020225u, 1636228089u, 2866415708u, 743340786u, 3876759895u, ++ 361896217u, 3738094268u, 1482340370u, 2466671543u, 2382584591u, 1163888810u, 3284924932u, 144124321u, ++ 4190215028u, 849168593u, 3020503679u, 2136336858u, 1649465698u, 2836138695u, 798521449u, 3838094284u, ++ }, { ++ 0u, 2792819636u, 2543784233u, 837294749u, 4098827283u, 1379413927u, 1674589498u, 3316072078u, ++ 871321191u, 2509784531u, 2758827854u, 34034938u, 3349178996u, 1641505216u, 1346337629u, 4131942633u, ++ 1742642382u, 3249117050u, 4030828007u, 1446413907u, 2475800797u, 904311657u, 68069876u, 2725880384u, ++ 1412551337u, 4064729373u, 3283010432u, 1708771380u, 2692675258u, 101317902u, 937551763u, 2442587175u, ++ 3485284764u, 1774858792u, 1478633653u, 4266992385u, 1005723023u, 2642744891u, 2892827814u, 169477906u, ++ 4233263099u, 1512406095u, 1808623314u, 3451546982u, 136139752u, 2926205020u, 2676114113u, 972376437u, ++ 2825102674u, 236236518u, 1073525883u, 2576072655u, 1546420545u, 4200303349u, 3417542760u, 1841601500u, ++ 2609703733u, 1039917185u, 202635804u, 2858742184u, 1875103526u, 3384067218u, 4166835727u, 1579931067u, ++ 1141601657u, 3799809741u, 3549717584u, 1977839588u, 2957267306u, 372464350u, 668680259u, 2175552503u, ++ 2011446046u, 3516084394u, 3766168119u, 1175200131u, 2209029901u, 635180217u, 338955812u, 2990736784u, ++ 601221559u, 2242044419u, 3024812190u, 306049834u, 3617246628u, 1911408144u, 1074125965u, 3866285881u, ++ 272279504u, 3058543716u, 2275784441u, 567459149u, 3832906691u, 1107462263u, 1944752874u, 3583875422u, ++ 2343980261u, 767641425u, 472473036u, 3126744696u, 2147051766u, 3649987394u, 3899029983u, 1309766251u, ++ 3092841090u, 506333494u, 801510315u, 2310084639u, 1276520081u, 3932237093u, 3683203000u, 2113813516u, ++ 3966292011u, 1243601823u, 2079834370u, 3716205238u, 405271608u, 3192979340u, 2411259153u, 701492901u, ++ 3750207052u, 2045810168u, 1209569125u, 4000285905u, 734575199u, 2378150379u, 3159862134u, 438345922u, ++ 2283203314u, 778166598u, 529136603u, 3120492655u, 2086260449u, 3660498261u, 3955679176u, 1303499900u, ++ 3153699989u, 495890209u, 744928700u, 2316418568u, 1337360518u, 3921775410u, 3626602927u, 2120129051u, ++ 4022892092u, 1237286280u, 2018993941u, 3726666913u, 461853231u, 3186645403u, 2350400262u, 711936178u, ++ 3693557851u, 2052076527u, 1270360434u, 3989775046u, 677911624u, 2384402428u, 3220639073u, 427820757u, ++ 1202443118u, 3789347034u, 3493118535u, 1984154099u, 3018127229u, 362020041u, 612099668u, 2181885408u, ++ 1950653705u, 3526596285u, 3822816288u, 1168934804u, 2148251930u, 645706414u, 395618355u, 2984485767u, ++ 544559008u, 2248295444u, 3085590153u, 295523645u, 3560598451u, 1917673479u, 1134918298u, 3855773998u, ++ 328860103u, 3052210803u, 2214924526u, 577903450u, 3889505748u, 1101147744u, 1883911421u, 3594338121u, ++ 3424493451u, 1785369663u, 1535282850u, 4260726038u, 944946072u, 2653270060u, 2949491377u, 163225861u, ++ 4294103532u, 1501944408u, 1752023237u, 3457862513u, 196998655u, 2915761739u, 2619532502u, 978710370u, ++ 2881684293u, 229902577u, 1012666988u, 2586515928u, 1603020630u, 4193987810u, 3356702335u, 1852063179u, ++ 2553040162u, 1046169238u, 263412747u, 2848217023u, 1818454321u, 3390333573u, 4227627032u, 1569420204u, ++ 60859927u, 2782375331u, 2487203646u, 843627658u, 4159668740u, 1368951216u, 1617990445u, 3322386585u, ++ 810543216u, 2520310724u, 2815490393u, 27783917u, 3288386659u, 1652017111u, 1402985802u, 4125677310u, ++ 1685994201u, 3255382381u, 4091620336u, 1435902020u, 2419138250u, 910562686u, 128847843u, 2715354199u, ++ 1469150398u, 4058414858u, 3222168983u, 1719234083u, 2749255853u, 94984985u, 876691844u, 2453031472u, ++ }, { ++ 0u, 3433693342u, 1109723005u, 2391738339u, 2219446010u, 1222643300u, 3329165703u, 180685081u, ++ 3555007413u, 525277995u, 2445286600u, 1567235158u, 1471092047u, 2600801745u, 361370162u, 3642757804u, ++ 2092642603u, 2953916853u, 1050555990u, 4063508168u, 4176560081u, 878395215u, 3134470316u, 1987983410u, ++ 2942184094u, 1676945920u, 3984272867u, 567356797u, 722740324u, 3887998202u, 1764827929u, 2778407815u, ++ 4185285206u, 903635656u, 3142804779u, 2012833205u, 2101111980u, 2979425330u, 1058630609u, 4088621903u, ++ 714308067u, 3862526333u, 1756790430u, 2753330688u, 2933487385u, 1651734407u, 3975966820u, 542535930u, ++ 2244825981u, 1231508451u, 3353891840u, 188896414u, 25648519u, 3442302233u, 1134713594u, 2399689316u, ++ 1445480648u, 2592229462u, 336416693u, 3634843435u, 3529655858u, 516441772u, 2420588879u, 1559052753u, ++ 698204909u, 3845636723u, 1807271312u, 2803025166u, 2916600855u, 1635634313u, 4025666410u, 593021940u, ++ 4202223960u, 919787974u, 3093159461u, 1962401467u, 2117261218u, 2996361020u, 1008193759u, 4038971457u, ++ 1428616134u, 2576151384u, 386135227u, 3685348389u, 3513580860u, 499580322u, 2471098945u, 1608776415u, ++ 2260985971u, 1248454893u, 3303468814u, 139259792u, 42591881u, 3458459159u, 1085071860u, 2349261162u, ++ 3505103035u, 474062885u, 2463016902u, 1583654744u, 1419882049u, 2550902495u, 377792828u, 3660491170u, ++ 51297038u, 3483679632u, 1093385331u, 2374089965u, 2269427188u, 1273935210u, 3311514249u, 164344343u, ++ 2890961296u, 1627033870u, 4000683757u, 585078387u, 672833386u, 3836780532u, 1782552599u, 2794821769u, ++ 2142603813u, 3005188795u, 1032883544u, 4047146438u, 4227826911u, 928351297u, 3118105506u, 1970307900u, ++ 1396409818u, 2677114180u, 287212199u, 3719594553u, 3614542624u, 467372990u, 2505346141u, 1509854403u, ++ 2162073199u, 1282711281u, 3271268626u, 240228748u, 76845205u, 3359543307u, 1186043880u, 2317064054u, ++ 796964081u, 3811226735u, 1839575948u, 2702160658u, 2882189835u, 1734392469u, 3924802934u, 625327592u, ++ 4234522436u, 818917338u, 3191908409u, 1927981223u, 2016387518u, 3028656416u, 973776579u, 4137723485u, ++ 2857232268u, 1726474002u, 3899187441u, 616751215u, 772270454u, 3803048424u, 1814228491u, 2693328533u, ++ 2041117753u, 3036871847u, 999160644u, 4146592730u, 4259508931u, 826864221u, 3217552830u, 1936586016u, ++ 3606501031u, 442291769u, 2496909786u, 1484378436u, 1388107869u, 2652297411u, 278519584u, 3694387134u, ++ 85183762u, 3384397196u, 1194773103u, 2342308593u, 2170143720u, 1307820918u, 3279733909u, 265733131u, ++ 2057717559u, 3054258089u, 948125770u, 4096344276u, 4276898253u, 843467091u, 3167309488u, 1885556270u, ++ 2839764098u, 1709792284u, 3949353983u, 667704161u, 755585656u, 3785577190u, 1865176325u, 2743489947u, ++ 102594076u, 3401021058u, 1144549729u, 2291298815u, 2186770662u, 1325234296u, 3228729243u, 215514885u, ++ 3589828009u, 424832311u, 2547870420u, 1534552650u, 1370645331u, 2635621325u, 328688686u, 3745342640u, ++ 2211456353u, 1333405183u, 3254067740u, 224338562u, 127544219u, 3408931589u, 1170156774u, 2299866232u, ++ 1345666772u, 2627681866u, 303053225u, 3736746295u, 3565105198u, 416624816u, 2522494803u, 1525692365u, ++ 4285207626u, 868291796u, 3176010551u, 1910772649u, 2065767088u, 3079346734u, 956571085u, 4121828691u, ++ 747507711u, 3760459617u, 1856702594u, 2717976604u, 2831417605u, 1684930971u, 3940615800u, 642451174u, ++ }, ++ { ++ 0u, 393942083u, 787884166u, 965557445u, 1575768332u, 1251427663u, 1931114890u, 1684106697u, ++ 3151536664u, 2896410203u, 2502855326u, 2186649309u, 3862229780u, 4048545623u, 3368213394u, 3753496529u, ++ 2898281073u, 3149616690u, 2184604407u, 2504883892u, 4046197629u, 3864463166u, 3755621371u, 3366006712u, ++ 387506281u, 6550570u, 971950319u, 781573292u, 1257550181u, 1569695014u, 1677892067u, 1937345952u, ++ 2196865699u, 2508887776u, 2886183461u, 3145514598u, 3743273903u, 3362179052u, 4058774313u, 3868258154u, ++ 958996667u, 777139448u, 400492605u, 10755198u, 1690661303u, 1941857780u, 1244879153u, 1565019506u, ++ 775012562u, 961205393u, 13101140u, 398261271u, 1943900638u, 1688634781u, 1563146584u, 1246801179u, ++ 2515100362u, 2190636681u, 3139390028u, 2892258831u, 3355784134u, 3749586821u, 3874691904u, 4052225795u, ++ 3734110983u, 3387496260u, 4033096577u, 3877584834u, 2206093835u, 2483373640u, 2911402637u, 3136515790u, ++ 1699389727u, 1915860316u, 1270647193u, 1556585946u, 950464531u, 803071056u, 374397077u, 19647702u, ++ 1917993334u, 1697207605u, 1554278896u, 1272937907u, 800985210u, 952435769u, 21510396u, 372452543u, ++ 3381322606u, 3740399405u, 3883715560u, 4027047851u, 2489758306u, 2199758369u, 3130039012u, 2917895847u, ++ 1550025124u, 1259902439u, 1922410786u, 1710144865u, 26202280u, 385139947u, 796522542u, 939715693u, ++ 3887801276u, 4039129087u, 3377269562u, 3728088953u, 3126293168u, 2905368307u, 2493602358u, 2212122229u, ++ 4037264341u, 3889747862u, 3730172755u, 3375300368u, 2907673305u, 3124004506u, 2209987167u, 2495786524u, ++ 1266377165u, 1543533966u, 1703758155u, 1928748296u, 379007169u, 32253058u, 945887303u, 790236164u, ++ 1716846671u, 1898845196u, 1218652361u, 1608006794u, 1002000707u, 750929152u, 357530053u, 36990342u, ++ 3717046871u, 3405166100u, 4084959953u, 3825245842u, 2153902939u, 2535122712u, 2929187805u, 3119304606u, ++ 3398779454u, 3723384445u, 3831720632u, 4078468859u, 2541294386u, 2147616625u, 3113171892u, 2935238647u, ++ 1900929062u, 1714877541u, 1606142112u, 1220599011u, 748794154u, 1004184937u, 39295404u, 355241455u, ++ 3835986668u, 4091516591u, 3394415210u, 3710500393u, 3108557792u, 2922629027u, 2545875814u, 2160455461u, ++ 1601970420u, 1208431799u, 1904871538u, 1727077425u, 43020792u, 367748539u, 744905086u, 991776061u, ++ 1214562461u, 1595921630u, 1720903707u, 1911159896u, 361271697u, 49513938u, 998160663u, 738569556u, ++ 4089209477u, 3838277318u, 3712633347u, 3392233024u, 2924491657u, 3106613194u, 2158369551u, 2547846988u, ++ 3100050248u, 2948339467u, 2519804878u, 2169126797u, 3844821572u, 4065347079u, 3420289730u, 3701894785u, ++ 52404560u, 342144275u, 770279894u, 982687125u, 1593045084u, 1233708063u, 1879431386u, 1736363161u, ++ 336019769u, 58479994u, 988899775u, 764050940u, 1240141877u, 1586496630u, 1729968307u, 1885744368u, ++ 2950685473u, 3097818978u, 2166999975u, 2522013668u, 4063474221u, 3846743662u, 3703937707u, 3418263272u, ++ 976650731u, 760059304u, 348170605u, 62635310u, 1742393575u, 1889649828u, 1227683937u, 1582820386u, ++ 2179867635u, 2526361520u, 2937588597u, 3093503798u, 3691148031u, 3413731004u, 4076100217u, 3851374138u, ++ 2532754330u, 2173556697u, 3087067932u, 2944139103u, 3407516310u, 3697379029u, 3857496592u, 4070026835u, ++ 758014338u, 978679233u, 64506116u, 346250567u, 1891774606u, 1740186829u, 1580472328u, 1229917259u, ++ }, { ++ 0u, 4022496062u, 83218493u, 3946298115u, 166436986u, 3861498692u, 220098631u, 3806075769u, ++ 332873972u, 4229245898u, 388141257u, 4175494135u, 440197262u, 4127099824u, 516501683u, 4044053389u, ++ 665747944u, 3362581206u, 593187285u, 3432594155u, 776282514u, 3246869164u, 716239279u, 3312622225u, ++ 880394524u, 3686509090u, 814485793u, 3746462239u, 1033003366u, 3528460888u, 963096923u, 3601193573u, ++ 1331495888u, 2694801646u, 1269355501u, 2758457555u, 1186374570u, 2843003028u, 1111716759u, 2910918825u, ++ 1552565028u, 3007850522u, 1484755737u, 3082680359u, 1432478558u, 3131279456u, 1368666979u, 3193329757u, ++ 1760789048u, 2268195078u, 1812353541u, 2210675003u, 1628971586u, 2396670332u, 1710092927u, 2318375233u, ++ 2066006732u, 2498144754u, 2144408305u, 2417195471u, 1926193846u, 2634877320u, 1983558283u, 2583222709u, ++ 2662991776u, 1903717534u, 2588923805u, 1972223139u, 2538711002u, 2022952164u, 2477029351u, 2087066841u, ++ 2372749140u, 1655647338u, 2308478825u, 1717238871u, 2223433518u, 1799654416u, 2155034387u, 1873894445u, ++ 3105130056u, 1456926070u, 3185661557u, 1378041163u, 2969511474u, 1597852940u, 3020617231u, 1539874097u, ++ 2864957116u, 1157737858u, 2922780289u, 1106542015u, 2737333958u, 1290407416u, 2816325371u, 1210047941u, ++ 3521578096u, 1042640718u, 3574781005u, 986759027u, 3624707082u, 936300340u, 3707335735u, 859512585u, ++ 3257943172u, 770846650u, 3334837433u, 688390023u, 3420185854u, 605654976u, 3475911875u, 552361981u, ++ 4132013464u, 428600998u, 4072428965u, 494812827u, 4288816610u, 274747100u, 4216845791u, 345349857u, ++ 3852387692u, 173846098u, 3781891409u, 245988975u, 3967116566u, 62328360u, 3900749099u, 121822741u, ++ 3859089665u, 164061759u, 3807435068u, 221426178u, 4025395579u, 2933317u, 3944446278u, 81334904u, ++ 4124199413u, 437265099u, 4045904328u, 518386422u, 4231653775u, 335250097u, 4174133682u, 386814604u, ++ 3249244393u, 778691543u, 3311294676u, 714879978u, 3359647891u, 662848429u, 3434477742u, 595039120u, ++ 3531393053u, 1035903779u, 3599308832u, 961245982u, 3684132967u, 877986649u, 3747788890u, 815846244u, ++ 2841119441u, 1184522735u, 2913852140u, 1114616274u, 2696129195u, 1332855189u, 2756082326u, 1266946472u, ++ 3129952805u, 1431118107u, 3195705880u, 1371074854u, 3009735263u, 1554415969u, 3079748194u, 1481855324u, ++ 2398522169u, 1630855175u, 2315475716u, 1707159610u, 2266835779u, 1759461501u, 2213084030u, 1814728768u, ++ 2636237773u, 1927520499u, 2580814832u, 1981182158u, 2496293815u, 2064121993u, 2420095882u, 2147340468u, ++ 2025787041u, 2541577631u, 2085281436u, 2475210146u, 1901375195u, 2660681189u, 1973518054u, 2590184920u, ++ 1801997909u, 2225743211u, 1872600680u, 2153772374u, 1652813359u, 2369881361u, 1719025170u, 2310296876u, ++ 1594986313u, 2966676599u, 1541693300u, 3022402634u, 1459236659u, 3107472397u, 1376780046u, 3184366640u, ++ 1288097725u, 2734990467u, 1211309952u, 2817619134u, 1160605639u, 2867791097u, 1104723962u, 2920993988u, ++ 937561457u, 3626001999u, 857201996u, 3704993394u, 1040821515u, 3519792693u, 989625654u, 3577615880u, ++ 607473029u, 3421972155u, 549494200u, 3473077894u, 769584639u, 3256649409u, 690699714u, 3337180924u, ++ 273452185u, 4287555495u, 347692196u, 4219156378u, 430386403u, 4133832669u, 491977950u, 4069562336u, ++ 60542061u, 3965298515u, 124656720u, 3903616878u, 175139863u, 3853649705u, 243645482u, 3779581716u, ++ }, { ++ 0u, 3247366080u, 1483520449u, 2581751297u, 2967040898u, 1901571138u, 3904227907u, 691737987u, ++ 3133399365u, 2068659845u, 3803142276u, 589399876u, 169513671u, 3415493895u, 1383475974u, 2482566342u, ++ 2935407819u, 1870142219u, 4137319690u, 924099274u, 506443593u, 3751897225u, 1178799752u, 2278412616u, ++ 339027342u, 3585866318u, 1280941135u, 2379694991u, 2766951948u, 1700956620u, 4236308429u, 1024339981u, ++ 2258407383u, 1192382487u, 3740284438u, 528411094u, 910556245u, 4157285269u, 1848198548u, 2946996820u, ++ 1012887186u, 4258378066u, 1681119059u, 2780629139u, 2357599504u, 1292419792u, 3572147409u, 358906641u, ++ 678054684u, 3924071644u, 1879503581u, 2978491677u, 2561882270u, 1497229150u, 3235873119u, 22109855u, ++ 2460592729u, 1395094937u, 3401913240u, 189516888u, 577821147u, 3825075739u, 2048679962u, 3146956762u, ++ 3595049455u, 398902831u, 2384764974u, 1336573934u, 1720805997u, 2803873197u, 1056822188u, 4285729900u, ++ 1821112490u, 2902796138u, 887570795u, 4117339819u, 3696397096u, 500978920u, 2218668777u, 1169222953u, ++ 2025774372u, 3106931428u, 550659301u, 3780950821u, 3362238118u, 166293862u, 2416645991u, 1367722151u, ++ 3262987361u, 66315169u, 2584839584u, 1537170016u, 1923370979u, 3005911075u, 717813282u, 3947244002u, ++ 1356109368u, 2438613496u, 146288633u, 3375820857u, 3759007162u, 562248314u, 3093388411u, 2045739963u, ++ 3927406461u, 731490493u, 2994458300u, 1945440636u, 1523451135u, 2604718911u, 44219710u, 3274466046u, ++ 4263662323u, 1068272947u, 2790189874u, 1740649714u, 1325080945u, 2406874801u, 379033776u, 3608758128u, ++ 1155642294u, 2238671990u, 479005303u, 3708016055u, 4097359924u, 901128180u, 2891217397u, 1843045941u, ++ 2011248031u, 3060787807u, 797805662u, 3993195422u, 3342353949u, 112630237u, 2673147868u, 1591353372u, ++ 3441611994u, 212601626u, 2504944923u, 1421914843u, 2113644376u, 3161815192u, 630660761u, 3826893145u, ++ 3642224980u, 412692116u, 2172340373u, 1089836885u, 1775141590u, 2822790422u, 832715543u, 4029474007u, ++ 1674842129u, 2723860433u, 1001957840u, 4197873168u, 3540870035u, 310623315u, 2338445906u, 1257178514u, ++ 4051548744u, 821257608u, 2836464521u, 1755307081u, 1101318602u, 2150241802u, 432566283u, 3628511179u, ++ 1270766349u, 2318435533u, 332587724u, 3529260300u, 4217841807u, 988411727u, 2735444302u, 1652903566u, ++ 1602977411u, 2651169091u, 132630338u, 3328776322u, 4015131905u, 786223809u, 3074340032u, 1991273216u, ++ 3846741958u, 616972294u, 3173262855u, 2091579847u, 1435626564u, 2485072772u, 234706309u, 3430124101u, ++ 2712218736u, 1613231024u, 4190475697u, 944458353u, 292577266u, 3506339890u, 1226630707u, 2291284467u, ++ 459984181u, 3672380149u, 1124496628u, 2189994804u, 2880683703u, 1782407543u, 4091479926u, 844224694u, ++ 257943739u, 3469817723u, 1462980986u, 2529005242u, 3213269817u, 2114471161u, 3890881272u, 644152632u, ++ 3046902270u, 1947391550u, 3991973951u, 746483711u, 88439420u, 3301680572u, 1563018173u, 2628197501u, ++ 657826727u, 3871046759u, 2136545894u, 3201811878u, 2548879397u, 1449267173u, 3481299428u, 235845156u, ++ 2650161890u, 1551408418u, 3315268387u, 68429027u, 758067552u, 3970035360u, 1967360161u, 3033356129u, ++ 2311284588u, 1213053100u, 3517963949u, 270598509u, 958010606u, 4170500910u, 1635167535u, 2700636911u, ++ 855672361u, 4069415401u, 1802256360u, 2866995240u, 2212099499u, 1113008747u, 3686091882u, 440112042u, ++ }, { ++ 0u, 2611301487u, 3963330207u, 2006897392u, 50740095u, 2560849680u, 4013794784u, 1956178319u, ++ 101480190u, 2645113489u, 3929532513u, 1905435662u, 84561281u, 2662269422u, 3912356638u, 1922342769u, ++ 202960380u, 2545787283u, 3760419683u, 2072395532u, 253679235u, 2495322860u, 3810871324u, 2021655667u, ++ 169122562u, 2444351341u, 3861841309u, 2106214898u, 152215677u, 2461527058u, 3844685538u, 2123133581u, ++ 405920760u, 2207553431u, 4094313831u, 1873742088u, 456646791u, 2157096168u, 4144791064u, 1823027831u, ++ 507358470u, 2241388905u, 4060492697u, 1772322806u, 490444409u, 2258557462u, 4043311334u, 1789215881u, ++ 338245124u, 2408348267u, 4161972379u, 1672996084u, 388959611u, 2357870868u, 4212429796u, 1622269835u, ++ 304431354u, 2306870421u, 4263435877u, 1706791434u, 287538053u, 2324051946u, 4246267162u, 1723705717u, ++ 811841520u, 2881944479u, 3696765295u, 1207788800u, 862293135u, 2831204576u, 3747484176u, 1157324415u, ++ 913293582u, 2915732833u, 3662962577u, 1106318334u, 896137841u, 2932651550u, 3646055662u, 1123494017u, ++ 1014716940u, 2816349795u, 3493905555u, 1273334012u, 1065181555u, 2765630748u, 3544645612u, 1222882179u, ++ 980888818u, 2714919069u, 3595350637u, 1307180546u, 963712909u, 2731826146u, 3578431762u, 1324336509u, ++ 676490248u, 3019317351u, 3295277719u, 1607253752u, 726947703u, 2968591128u, 3345992168u, 1556776327u, ++ 777919222u, 3053147801u, 3261432937u, 1505806342u, 760750473u, 3070062054u, 3244539670u, 1522987897u, ++ 608862708u, 3220163995u, 3362856811u, 1406423812u, 659339915u, 3169449700u, 3413582868u, 1355966587u, ++ 575076106u, 3118709605u, 3464325525u, 1440228858u, 557894773u, 3135602714u, 3447411434u, 1457397381u, ++ 1623683040u, 4217512847u, 2365387135u, 391757072u, 1673614495u, 4167309552u, 2415577600u, 341804655u, ++ 1724586270u, 4251866481u, 2331019137u, 290835438u, 1707942497u, 4268256782u, 2314648830u, 307490961u, ++ 1826587164u, 4152020595u, 2162433155u, 457265388u, 1876539747u, 4101829900u, 2212636668u, 407333779u, ++ 1792275682u, 4051089549u, 2263378557u, 491595282u, 1775619997u, 4067460082u, 2246988034u, 508239213u, ++ 2029433880u, 3813931127u, 2496473735u, 258500328u, 2079362919u, 3763716872u, 2546668024u, 208559511u, ++ 2130363110u, 3848244873u, 2462145657u, 157552662u, 2113730969u, 3864638966u, 2445764358u, 174205801u, ++ 1961777636u, 4014675339u, 2564147067u, 57707284u, 2011718299u, 3964481268u, 2614361092u, 7778411u, ++ 1927425818u, 3913769845u, 2665066885u, 92077546u, 1910772837u, 3930150922u, 2648673018u, 108709525u, ++ 1352980496u, 3405878399u, 3164554895u, 658115296u, 1403183983u, 3355946752u, 3214507504u, 607924639u, ++ 1453895406u, 3440239233u, 3130208369u, 557218846u, 1437504913u, 3456883198u, 3113552654u, 573589345u, ++ 1555838444u, 3340335491u, 2961681267u, 723707676u, 1606028947u, 3290383100u, 3011612684u, 673504355u, ++ 1521500946u, 3239382909u, 3062619533u, 758026722u, 1505130605u, 3256038402u, 3045975794u, 774417053u, ++ 1217725416u, 3543158663u, 2762906999u, 1057739032u, 1267939479u, 3493229816u, 2812847624u, 1007544935u, ++ 1318679830u, 3577493881u, 2728586121u, 956803046u, 1302285929u, 3594125830u, 2711933174u, 973184153u, ++ 1150152212u, 3743982203u, 2830528651u, 856898788u, 1200346475u, 3694041348u, 2880457716u, 806684571u, ++ 1115789546u, 3643069573u, 2931426933u, 891243034u, 1099408277u, 3659722746u, 2914794762u, 907637093u, ++ }, { ++ 0u, 3717650821u, 1616688459u, 3184159950u, 3233376918u, 489665299u, 2699419613u, 2104690264u, ++ 1510200173u, 2274691816u, 979330598u, 3888758691u, 2595928571u, 1194090622u, 4209380528u, 661706037u, ++ 3020400346u, 1771143007u, 3562738577u, 164481556u, 1958661196u, 2837976521u, 350386439u, 3379863682u, ++ 3993269687u, 865250354u, 2388181244u, 1406015865u, 784146209u, 4079732388u, 1323412074u, 2474079215u, ++ 3011398645u, 1860735600u, 3542286014u, 246687547u, 1942430051u, 2924607718u, 328963112u, 3456978349u, ++ 3917322392u, 887832861u, 2300653011u, 1421341782u, 700772878u, 4099025803u, 1234716485u, 2483986112u, ++ 125431087u, 3673109674u, 1730500708u, 3132326369u, 3351283641u, 441867836u, 2812031730u, 2047535991u, ++ 1568292418u, 2163009479u, 1025936137u, 3769651852u, 2646824148u, 1079348561u, 4255113631u, 537475098u, ++ 3180171691u, 1612400686u, 3721471200u, 4717925u, 2100624189u, 2694980280u, 493375094u, 3237910515u, ++ 3884860102u, 974691139u, 2278750093u, 1514417672u, 657926224u, 4204917205u, 1198234907u, 2600289438u, ++ 160053105u, 3558665972u, 1775665722u, 3024116671u, 3375586791u, 346391650u, 2842683564u, 1962488105u, ++ 1401545756u, 2384412057u, 869618007u, 3997403346u, 2469432970u, 1319524111u, 4083956673u, 788193860u, ++ 250862174u, 3546612699u, 1856990997u, 3006903952u, 3461001416u, 333211981u, 2920678787u, 1937824774u, ++ 1425017139u, 2305216694u, 883735672u, 3912918525u, 2487837605u, 1239398944u, 4095071982u, 696455019u, ++ 3136584836u, 1734518017u, 3668494799u, 121507914u, 2051872274u, 2816200599u, 437363545u, 3347544796u, ++ 3774328809u, 1029797484u, 2158697122u, 1564328743u, 542033279u, 4258798842u, 1074950196u, 2642717105u, ++ 2691310871u, 2113731730u, 3224801372u, 497043929u, 1624461185u, 3175454212u, 9435850u, 3709412175u, ++ 4201248378u, 671035391u, 2587181873u, 1201904308u, 986750188u, 3880142185u, 1519135143u, 2266689570u, ++ 342721485u, 3388693064u, 1949382278u, 2846355203u, 3570723163u, 155332830u, 3028835344u, 1763607957u, ++ 1315852448u, 2482538789u, 775087595u, 4087626862u, 2396469814u, 1396827059u, 4002123645u, 857560824u, ++ 320106210u, 3464673127u, 1934154665u, 2933785132u, 3551331444u, 238804465u, 3018961215u, 1852270778u, ++ 1226292623u, 2491507722u, 692783300u, 4108177729u, 2309936921u, 1412959900u, 3924976210u, 879016919u, ++ 2803091512u, 2055541181u, 3343875443u, 450471158u, 1739236014u, 3124525867u, 133568485u, 3663777376u, ++ 4245691221u, 545702608u, 2639048222u, 1088059291u, 1034514883u, 3762268230u, 1576387720u, 2153979149u, ++ 501724348u, 3228659001u, 2109407735u, 2687359090u, 3713981994u, 13109167u, 3171052385u, 1620357860u, ++ 1206151121u, 2591211092u, 666423962u, 4197321503u, 2271022407u, 1523307714u, 3875649548u, 982999433u, ++ 2850034278u, 1953942499u, 3384583981u, 338329256u, 1767471344u, 3033506165u, 151375291u, 3566408766u, ++ 4091789579u, 779425934u, 2478797888u, 1311354309u, 861580189u, 4006375960u, 1392910038u, 2391852883u, ++ 2929327945u, 1930372812u, 3469036034u, 324244359u, 1847629279u, 3015068762u, 243015828u, 3555391761u, ++ 4103744548u, 688715169u, 2496043375u, 1229996266u, 874727090u, 3920994103u, 1417671673u, 2313759356u, ++ 446585235u, 3339223062u, 2059594968u, 2807313757u, 3660002053u, 129100416u, 3128657486u, 1743609803u, ++ 1084066558u, 2634765179u, 549535669u, 4250396208u, 2149900392u, 1571961325u, 3765982499u, 1039043750u, ++ }, { ++ 0u, 2635063670u, 3782132909u, 2086741467u, 430739227u, 2225303149u, 4173482934u, 1707977408u, ++ 861478454u, 2924937024u, 3526875803u, 1329085421u, 720736557u, 3086643291u, 3415954816u, 1452586230u, ++ 1722956908u, 4223524122u, 2279405761u, 450042295u, 2132718455u, 3792785921u, 2658170842u, 58693292u, ++ 1441473114u, 3370435372u, 3028674295u, 696911745u, 1279765825u, 3511176247u, 2905172460u, 807831706u, ++ 3445913816u, 1349228974u, 738901109u, 2969918723u, 3569940419u, 1237784245u, 900084590u, 2829701656u, ++ 4265436910u, 1664255896u, 525574723u, 2187084597u, 3885099509u, 2057177219u, 117386584u, 2616249390u, ++ 2882946228u, 920233410u, 1253605401u, 3619119471u, 2994391983u, 796207833u, 1393823490u, 3457937012u, ++ 2559531650u, 92322804u, 2044829231u, 3840835417u, 2166609305u, 472659183u, 1615663412u, 4249022530u, ++ 1102706673u, 3702920839u, 2698457948u, 1037619754u, 1477802218u, 3306854812u, 3111894087u, 611605809u, ++ 1927342535u, 4025419953u, 2475568490u, 243387420u, 1800169180u, 4131620778u, 2317525617u, 388842247u, ++ 655084445u, 3120835307u, 3328511792u, 1533734470u, 1051149446u, 2745738736u, 3754524715u, 1120297309u, ++ 340972971u, 2304586973u, 4114354438u, 1748234352u, 234773168u, 2431761350u, 3968900637u, 1906278251u, ++ 2363330345u, 299003487u, 1840466820u, 4038896370u, 2507210802u, 142532932u, 1948239007u, 3910149609u, ++ 3213136159u, 579563625u, 1592415666u, 3286611140u, 2787646980u, 992477042u, 1195825833u, 3662232543u, ++ 3933188933u, 2002801203u, 184645608u, 2517538462u, 4089658462u, 1858919720u, 313391347u, 2409765253u, ++ 3644239219u, 1144605701u, 945318366u, 2773977256u, 3231326824u, 1570095902u, 569697989u, 3170568115u, ++ 2205413346u, 511446676u, 1646078799u, 4279421497u, 2598330617u, 131105167u, 2075239508u, 3871229218u, ++ 2955604436u, 757403810u, 1363424633u, 3427521551u, 2844163791u, 881434553u, 1223211618u, 3588709140u, ++ 3854685070u, 2026779384u, 78583587u, 2577462869u, 4235025557u, 1633861091u, 486774840u, 2148301134u, ++ 3600338360u, 1268198606u, 938871061u, 2868504675u, 3476308643u, 1379640277u, 777684494u, 3008718712u, ++ 1310168890u, 3541595724u, 2943964055u, 846639841u, 1471879201u, 3400857943u, 3067468940u, 735723002u, ++ 2102298892u, 3762382970u, 2619362721u, 19901655u, 1692534295u, 4193118049u, 2240594618u, 411247564u, ++ 681945942u, 3047836192u, 3385552891u, 1422167693u, 822682701u, 2886124859u, 3496468704u, 1298661782u, ++ 469546336u, 2264093718u, 4203901389u, 1738379451u, 38812283u, 2673859341u, 3812556502u, 2117148576u, ++ 3268024339u, 1606809957u, 598006974u, 3198893512u, 3680933640u, 1181316734u, 973624229u, 2802299603u, ++ 4052944421u, 1822222163u, 285065864u, 2381456382u, 3896478014u, 1966106696u, 156323219u, 2489232613u, ++ 2759337087u, 964150537u, 1159127250u, 3625517476u, 3184831332u, 551242258u, 1555722185u, 3249901247u, ++ 2535537225u, 170842943u, 1984954084u, 3946848146u, 2391651666u, 327308324u, 1877176831u, 4075589769u, ++ 263086283u, 2460058045u, 4005602406u, 1942963472u, 369291216u, 2332888742u, 4151061373u, 1784924683u, ++ 1022852861u, 2717425547u, 3717839440u, 1083595558u, 626782694u, 3092517008u, 3291821387u, 1497027645u, ++ 1763466407u, 4094934481u, 2289211402u, 360544636u, 1890636732u, 3988730570u, 2447251217u, 215086695u, ++ 1514488465u, 3343557607u, 3140191804u, 639919946u, 1139395978u, 3739626748u, 2726758695u, 1065936977u, ++ }, { ++ 0u, 3120290792u, 2827399569u, 293431929u, 2323408227u, 864534155u, 586863858u, 2600537882u, ++ 3481914503u, 1987188591u, 1729068310u, 3740575486u, 1173727716u, 4228805132u, 3983743093u, 1418249117u, ++ 1147313999u, 4254680231u, 3974377182u, 1428157750u, 3458136620u, 2011505092u, 1721256893u, 3747844181u, ++ 2347455432u, 839944224u, 594403929u, 2593536433u, 26687147u, 3094146371u, 2836498234u, 283794642u, ++ 2294627998u, 826205558u, 541298447u, 2578994407u, 45702141u, 3141697557u, 2856315500u, 331624836u, ++ 1196225049u, 4273416689u, 4023010184u, 1446090848u, 3442513786u, 1959480466u, 1706436331u, 3696098563u, ++ 3433538001u, 1968994873u, 1679888448u, 3722103720u, 1188807858u, 4280295258u, 3999102243u, 1470541515u, ++ 53374294u, 3134568126u, 2879970503u, 307431215u, 2303854645u, 816436189u, 567589284u, 2553242188u, ++ 3405478781u, 1929420949u, 1652411116u, 3682996484u, 1082596894u, 4185703926u, 3892424591u, 1375368295u, ++ 91404282u, 3163122706u, 2918450795u, 336584067u, 2400113305u, 922028401u, 663249672u, 2658384096u, ++ 2392450098u, 929185754u, 639587747u, 2682555979u, 82149713u, 3172883129u, 2892181696u, 362343208u, ++ 1091578037u, 4176212829u, 3918960932u, 1349337804u, 3412872662u, 1922537022u, 1676344391u, 3658557359u, ++ 1111377379u, 4224032267u, 3937989746u, 1396912026u, 3359776896u, 1908013928u, 1623494929u, 3644803833u, ++ 2377615716u, 877417100u, 623982837u, 2630542109u, 130804743u, 3190831087u, 2941083030u, 381060734u, ++ 106748588u, 3215393092u, 2933549885u, 388083925u, 2350956495u, 903570471u, 614862430u, 2640172470u, ++ 3386185259u, 1882115523u, 1632872378u, 3634920530u, 1135178568u, 4199721120u, 3945775833u, 1389631793u, ++ 1317531835u, 4152109907u, 3858841898u, 1610259138u, 3304822232u, 2097172016u, 1820140617u, 3582394273u, ++ 2165193788u, 955639764u, 696815021u, 2423477829u, 192043359u, 2995356343u, 2750736590u, 437203750u, ++ 182808564u, 3005133852u, 2724453989u, 462947725u, 2157513367u, 962777471u, 673168134u, 2447663342u, ++ 3312231283u, 2090301595u, 1844056802u, 3557935370u, 1326499344u, 4142603768u, 3885397889u, 1584245865u, ++ 3326266917u, 2142836173u, 1858371508u, 3611272284u, 1279175494u, 4123357358u, 3837270743u, 1564721471u, ++ 164299426u, 2955991370u, 2706223923u, 414607579u, 2209834945u, 978107433u, 724686416u, 2462715320u, ++ 2183156074u, 1004243586u, 715579643u, 2472360723u, 140260361u, 2980573153u, 2698675608u, 421617264u, ++ 1302961645u, 4099032581u, 3845074044u, 1557460884u, 3352688782u, 2116952934u, 1867729183u, 3601371895u, ++ 2222754758u, 1032278062u, 754596439u, 2499928511u, 234942117u, 3086693709u, 2793824052u, 528319708u, ++ 1274365761u, 4061043881u, 3816027856u, 1518873912u, 3246989858u, 2020800970u, 1762628531u, 3505670235u, ++ 3223196809u, 2045103969u, 1754834200u, 3512958704u, 1247965674u, 4086934018u, 3806642299u, 1528765331u, ++ 261609486u, 3060532198u, 2802936223u, 518697591u, 2246819181u, 1007707781u, 762121468u, 2492913428u, ++ 213497176u, 3041029808u, 2755593417u, 499441441u, 2261110843u, 1061030867u, 776167850u, 2545465922u, ++ 3274734047u, 2060165687u, 1807140942u, 3528266662u, 1229724860u, 4038575956u, 3788156205u, 1479636677u, ++ 1222322711u, 4045468159u, 3764231046u, 1504067694u, 3265744756u, 2069664924u, 1780612837u, 3554288909u, ++ 2270357136u, 1051278712u, 802445057u, 2519698665u, 221152243u, 3033880603u, 2779263586u, 475261322u, ++ }, { ++ 0u, 2926088593u, 2275419491u, 701019378u, 3560000647u, 2052709654u, 1402038756u, 4261017717u, ++ 1930665807u, 3715829470u, 4105419308u, 1524313021u, 2804077512u, 155861593u, 545453739u, 2397726522u, ++ 3861331614u, 1213181711u, 1636244477u, 3488582252u, 840331801u, 2625561480u, 3048626042u, 467584747u, ++ 2503254481u, 995897408u, 311723186u, 3170637091u, 1090907478u, 4016929991u, 3332753461u, 1758288292u, ++ 390036349u, 3109546732u, 2426363422u, 1056427919u, 3272488954u, 1835443819u, 1152258713u, 3938878216u, ++ 1680663602u, 3393484195u, 3817652561u, 1306808512u, 2954733749u, 510998820u, 935169494u, 2580880455u, ++ 4044899811u, 1601229938u, 1991794816u, 3637571857u, 623446372u, 2336332021u, 2726898695u, 216120726u, ++ 2181814956u, 744704829u, 95158223u, 2881711710u, 1446680107u, 4166125498u, 3516576584u, 2146575065u, ++ 780072698u, 2148951915u, 2849952665u, 129384968u, 4199529085u, 1411853292u, 2112855838u, 3548843663u, ++ 1567451573u, 4077254692u, 3670887638u, 1957027143u, 2304517426u, 657765539u, 251396177u, 2694091200u, ++ 3361327204u, 1714510325u, 1341779207u, 3784408214u, 476611811u, 2986349938u, 2613617024u, 899690513u, ++ 3142211371u, 354600634u, 1021997640u, 2458051545u, 1870338988u, 3239283261u, 3906682575u, 1186180958u, ++ 960597383u, 2536053782u, 3202459876u, 277428597u, 3983589632u, 1125666961u, 1792074851u, 3300423154u, ++ 1246892744u, 3829039961u, 3455203243u, 1671079482u, 2657312335u, 806080478u, 432241452u, 3081497277u, ++ 3748049689u, 1896751752u, 1489409658u, 4138600427u, 190316446u, 2772397583u, 2365053693u, 580864876u, ++ 2893360214u, 35503559u, 735381813u, 2243795108u, 2017747153u, 3593269568u, 4293150130u, 1368183843u, ++ 1560145396u, 4069882981u, 3680356503u, 1966430470u, 2295112051u, 648294626u, 258769936u, 2701399425u, ++ 804156091u, 2173100842u, 2823706584u, 103204425u, 4225711676u, 1438101421u, 2088704863u, 3524758222u, ++ 3134903146u, 347226875u, 1031468553u, 2467456920u, 1860935661u, 3229814396u, 3914054286u, 1193487135u, ++ 3385412645u, 1738661300u, 1315531078u, 3758225623u, 502792354u, 3012596019u, 2589468097u, 875607120u, ++ 1271043721u, 3853125400u, 3429020650u, 1644831355u, 2683558414u, 832261023u, 408158061u, 3057348348u, ++ 953223622u, 2528745559u, 3211865253u, 286899508u, 3974120769u, 1116263632u, 1799381026u, 3307794867u, ++ 2917509143u, 59586950u, 709201268u, 2217549029u, 2043995280u, 3619452161u, 4269064691u, 1344032866u, ++ 3740677976u, 1889445577u, 1498812987u, 4148069290u, 180845535u, 2762992206u, 2372361916u, 588238637u, ++ 1921194766u, 3706423967u, 4112727661u, 1531686908u, 2796705673u, 148555288u, 554857194u, 2407195515u, ++ 26248257u, 2952271312u, 2251333922u, 676868275u, 3584149702u, 2076793175u, 1375858085u, 4234771508u, ++ 2493785488u, 986493953u, 319029491u, 3178008930u, 1083533591u, 4009621638u, 3342158964u, 1767759333u, ++ 3887577823u, 1239362382u, 1612160956u, 3464433197u, 864482904u, 2649647049u, 3022443323u, 441336490u, ++ 1706844275u, 3419730402u, 3793503504u, 1282724993u, 2978819316u, 535149925u, 908921239u, 2554697734u, ++ 380632892u, 3100077741u, 2433735263u, 1063734222u, 3265180603u, 1828069930u, 1161729752u, 3948283721u, ++ 2207997677u, 770953084u, 71007118u, 2857626143u, 1470763626u, 4190274555u, 3490330377u, 2120394392u, ++ 4035494306u, 1591758899u, 1999168705u, 3644880208u, 616140069u, 2328960180u, 2736367686u, 225524183u, ++ }, + }; + +-#define WUFFS_GIF__QUIRKS_BASE 1041635328 +- +-#define WUFFS_GIF__QUIRKS_COUNT 7 +- + // ---------------- Private Initializer Prototypes + + // ---------------- Private Function Prototypes + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_decode_image_config( +- wuffs_gif__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_tell_me_more( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_decode_frame_config( +- wuffs_gif__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__skip_frame( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_decode_frame( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); +- + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_gif__decoder__reset_gc( +- wuffs_gif__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_up_to_id_part1( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_header( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_lsd( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_extension( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__skip_blocks( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_ae( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_gc( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_id_part0( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_id_part1( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_id_part2( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); ++wuffs_crc32__ieee_hasher__up( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x); + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__copy_to_image_buffer( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_pb, +- wuffs_base__slice_u8 a_src); ++static wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__up__choosy_default( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x); + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_gif__decoder__lzw_init( +- wuffs_gif__decoder* self); ++wuffs_crc32__ieee_hasher__up_arm_crc32( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_gif__decoder__lzw_read_from( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); ++wuffs_crc32__ieee_hasher__up_x86_sse42( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + + // ---------------- VTables + +-const wuffs_base__image_decoder__func_ptrs +-wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_gif__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_gif__decoder__frame_dirty_rect), ++const wuffs_base__hasher_u32__func_ptrs ++wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32 = { ++ (uint32_t(*)(const void*))(&wuffs_crc32__ieee_hasher__checksum_u32), + (uint64_t(*)(const void*, +- uint32_t))(&wuffs_gif__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_gif__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_gif__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_gif__decoder__restart_frame), ++ uint32_t))(&wuffs_crc32__ieee_hasher__get_quirk), + (wuffs_base__status(*)(void*, + uint32_t, +- uint64_t))(&wuffs_gif__decoder__set_quirk), ++ uint64_t))(&wuffs_crc32__ieee_hasher__set_quirk), + (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_gif__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_gif__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gif__decoder__workbuf_len), ++ wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update), ++ (uint32_t(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update_u32), + }; + + // ---------------- Initializer Implementations + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_gif__decoder__initialize( +- wuffs_gif__decoder* self, ++wuffs_crc32__ieee_hasher__initialize( ++ wuffs_crc32__ieee_hasher* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ +@@ -36681,23 +37083,25 @@ wuffs_gif__decoder__initialize( + } + } + ++ self->private_impl.choosy_up = &wuffs_crc32__ieee_hasher__up__choosy_default; ++ + self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = ++ wuffs_base__hasher_u32__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = ++ (const void*)(&wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32); + return wuffs_base__make_status(NULL); + } + +-wuffs_gif__decoder* +-wuffs_gif__decoder__alloc(void) { +- wuffs_gif__decoder* x = +- (wuffs_gif__decoder*)(calloc(sizeof(wuffs_gif__decoder), 1)); ++wuffs_crc32__ieee_hasher* ++wuffs_crc32__ieee_hasher__alloc(void) { ++ wuffs_crc32__ieee_hasher* x = ++ (wuffs_crc32__ieee_hasher*)(calloc(1, sizeof(wuffs_crc32__ieee_hasher))); + if (!x) { + return NULL; + } +- if (wuffs_gif__decoder__initialize( +- x, sizeof(wuffs_gif__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ if (wuffs_crc32__ieee_hasher__initialize( ++ x, sizeof(wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } +@@ -36705,18 +37109,18 @@ wuffs_gif__decoder__alloc(void) { + } + + size_t +-sizeof__wuffs_gif__decoder(void) { +- return sizeof(wuffs_gif__decoder); ++sizeof__wuffs_crc32__ieee_hasher(void) { ++ return sizeof(wuffs_crc32__ieee_hasher); + } + + // ---------------- Function Implementations + +-// -------- func gif.decoder.get_quirk ++// -------- func crc32.ieee_hasher.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gif__decoder__get_quirk( +- const wuffs_gif__decoder* self, ++wuffs_crc32__ieee_hasher__get_quirk( ++ const wuffs_crc32__ieee_hasher* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -36726,25 +37130,15 @@ wuffs_gif__decoder__get_quirk( + return 0; + } + +- uint32_t v_key = 0; +- +- if (a_key >= 1041635328u) { +- v_key = (a_key - 1041635328u); +- if (v_key < 7u) { +- if (self->private_impl.f_quirks[v_key]) { +- return 1u; +- } +- } +- } + return 0u; + } + +-// -------- func gif.decoder.set_quirk ++// -------- func crc32.ieee_hasher.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__set_quirk( +- wuffs_gif__decoder* self, ++wuffs_crc32__ieee_hasher__set_quirk( ++ wuffs_crc32__ieee_hasher* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -36757,377 +37151,812 @@ wuffs_gif__decoder__set_quirk( + : wuffs_base__error__initialize_not_called); + } + +- if ((self->private_impl.f_call_sequence == 0u) && (a_key >= 1041635328u)) { +- a_key -= 1041635328u; +- if (a_key < 7u) { +- self->private_impl.f_quirks[a_key] = (a_value > 0u); +- return wuffs_base__make_status(NULL); +- } +- } + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func gif.decoder.decode_image_config ++// -------- func crc32.ieee_hasher.update + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__decode_image_config( +- wuffs_gif__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__update( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ return wuffs_base__make_empty_struct(); + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_gif__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } + +- ok: +- self->private_impl.p_decode_image_config[0] = 0; +- goto exit; ++ if (self->private_impl.f_state == 0u) { ++ self->private_impl.choosy_up = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) ++ wuffs_base__cpu_arch__have_arm_crc32() ? &wuffs_crc32__ieee_hasher__up_arm_crc32 : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc32__ieee_hasher__up_x86_sse42 : ++#endif ++ self->private_impl.choosy_up); + } ++ wuffs_crc32__ieee_hasher__up(self, a_x); ++ return wuffs_base__make_empty_struct(); ++} + +- goto suspend; +- suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++// -------- func crc32.ieee_hasher.update_u32 + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_crc32__ieee_hasher__update_u32( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return 0; + } +- return status; ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return 0; ++ } ++ ++ wuffs_crc32__ieee_hasher__update(self, a_x); ++ return self->private_impl.f_state; + } + +-// -------- func gif.decoder.do_decode_image_config ++// -------- func crc32.ieee_hasher.up + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_decode_image_config( +- wuffs_gif__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- bool v_ffio = false; ++static wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__up( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ return (*self->private_impl.choosy_up)(self, a_x); ++} + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__up__choosy_default( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_s = 0; ++ wuffs_base__slice_u8 v_p = {0}; + +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if ( ! self->private_impl.f_seen_header) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_gif__decoder__decode_header(self, a_src); +- if (status.repr) { +- goto suspend; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_gif__decoder__decode_lsd(self, a_src); +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_header = true; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); +- if (status.repr) { +- goto suspend; +- } +- v_ffio = ! self->private_impl.f_gc_has_transparent_index; +- if ( ! self->private_impl.f_quirks[2u]) { +- v_ffio = (v_ffio && +- (self->private_impl.f_frame_rect_x0 == 0u) && +- (self->private_impl.f_frame_rect_y0 == 0u) && +- (self->private_impl.f_frame_rect_x1 == self->private_impl.f_width) && +- (self->private_impl.f_frame_rect_y1 == self->private_impl.f_height)); +- } else if (v_ffio) { +- self->private_impl.f_black_color_u32_argb_premul = 4278190080u; +- } +- if (self->private_impl.f_background_color_u32_argb_premul == 77u) { +- self->private_impl.f_background_color_u32_argb_premul = self->private_impl.f_black_color_u32_argb_premul; ++ v_s = (4294967295u ^ self->private_impl.f_state); ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 16; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32)); ++ while (v_p.ptr < i_end0_p) { ++ v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | ++ (((uint32_t)(v_p.ptr[1u])) << 8u) | ++ (((uint32_t)(v_p.ptr[2u])) << 16u) | ++ (((uint32_t)(v_p.ptr[3u])) << 24u)); ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); ++ v_p.ptr += 16; ++ v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | ++ (((uint32_t)(v_p.ptr[1u])) << 8u) | ++ (((uint32_t)(v_p.ptr[2u])) << 16u) | ++ (((uint32_t)(v_p.ptr[3u])) << 24u)); ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); ++ v_p.ptr += 16; + } +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- 2198077448u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- v_ffio); ++ v_p.len = 16; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16)); ++ while (v_p.ptr < i_end1_p) { ++ v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | ++ (((uint32_t)(v_p.ptr[1u])) << 8u) | ++ (((uint32_t)(v_p.ptr[2u])) << 16u) | ++ (((uint32_t)(v_p.ptr[3u])) << 24u)); ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); ++ v_p.ptr += 16; + } +- if (self->private_impl.f_call_sequence == 0u) { +- self->private_impl.f_call_sequence = 32u; ++ v_p.len = 1; ++ const uint8_t* i_end2_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end2_p) { ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u)); ++ v_p.ptr += 1; + } +- +- goto ok; +- ok: +- self->private_impl.p_do_decode_image_config[0] = 0; +- goto exit; ++ v_p.len = 0; + } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- return status; ++ self->private_impl.f_state = (4294967295u ^ v_s); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func gif.decoder.set_report_metadata ++// -------- func crc32.ieee_hasher.checksum_u32 + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_gif__decoder__set_report_metadata( +- wuffs_gif__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_crc32__ieee_hasher__checksum_u32( ++ const wuffs_crc32__ieee_hasher* self) { + if (!self) { +- return wuffs_base__make_empty_struct(); ++ return 0; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- if (a_fourcc == 1229144912u) { +- self->private_impl.f_report_metadata_iccp = a_report; +- } else if (a_fourcc == 1481461792u) { +- self->private_impl.f_report_metadata_xmp = a_report; ++ return self->private_impl.f_state; ++} ++ ++// ‼ WUFFS MULTI-FILE SECTION +arm_crc32 ++// -------- func crc32.ieee_hasher.up_arm_crc32 ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__up_arm_crc32( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ wuffs_base__slice_u8 v_p = {0}; ++ uint32_t v_s = 0; ++ ++ v_s = (4294967295u ^ self->private_impl.f_state); ++ while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { ++ v_s = __crc32b(v_s, a_x.ptr[0u]); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); ++ } ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 8; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 128) * 128)); ++ while (v_p.ptr < i_end0_p) { ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ } ++ v_p.len = 8; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8)); ++ while (v_p.ptr < i_end1_p) { ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ } ++ v_p.len = 1; ++ const uint8_t* i_end2_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end2_p) { ++ v_s = __crc32b(v_s, v_p.ptr[0u]); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; + } ++ self->private_impl.f_state = (4294967295u ^ v_s); + return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) ++// ‼ WUFFS MULTI-FILE SECTION -arm_crc32 + +-// -------- func gif.decoder.tell_me_more ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func crc32.ieee_hasher.up_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__tell_me_more( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++static wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__up_x86_sse42( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_s = 0; ++ __m128i v_kk = {0}; ++ __m128i v_x0 = {0}; ++ __m128i v_x1 = {0}; ++ __m128i v_x2 = {0}; ++ __m128i v_x3 = {0}; ++ __m128i v_x4 = {0}; ++ __m128i v_x5 = {0}; ++ __m128i v_x6 = {0}; ++ __m128i v_x7 = {0}; ++ __m128i v_y0 = {0}; ++ __m128i v_y1 = {0}; ++ __m128i v_y2 = {0}; ++ __m128i v_y3 = {0}; ++ __m128i v_y4 = {0}; ++ __m128i v_y5 = {0}; ++ __m128i v_y6 = {0}; ++ __m128i v_y7 = {0}; ++ ++ v_s = (4294967295u ^ self->private_impl.f_state); ++ while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); + } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ if (((uint64_t)(a_x.len)) >= 128u) { ++ v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)); ++ v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); ++ v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)); ++ v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)); ++ v_x4 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u)); ++ v_x5 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u)); ++ v_x6 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u)); ++ v_x7 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u)); ++ v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(2433674945u), (int32_t)(0u), (int32_t)(872412467u)); ++ v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u); ++ while (((uint64_t)(a_x.len)) >= 128u) { ++ v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u)); ++ v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u)); ++ v_y1 = _mm_clmulepi64_si128(v_x1, v_kk, (int32_t)(0u)); ++ v_x1 = _mm_clmulepi64_si128(v_x1, v_kk, (int32_t)(17u)); ++ v_y2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(0u)); ++ v_x2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(17u)); ++ v_y3 = _mm_clmulepi64_si128(v_x3, v_kk, (int32_t)(0u)); ++ v_x3 = _mm_clmulepi64_si128(v_x3, v_kk, (int32_t)(17u)); ++ v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u)); ++ v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u)); ++ v_y5 = _mm_clmulepi64_si128(v_x5, v_kk, (int32_t)(0u)); ++ v_x5 = _mm_clmulepi64_si128(v_x5, v_kk, (int32_t)(17u)); ++ v_y6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(0u)); ++ v_x6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(17u)); ++ v_y7 = _mm_clmulepi64_si128(v_x7, v_kk, (int32_t)(0u)); ++ v_x7 = _mm_clmulepi64_si128(v_x7, v_kk, (int32_t)(17u)); ++ v_y0 = _mm_xor_si128(v_y0, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u))); ++ v_x0 = _mm_xor_si128(v_x0, v_y0); ++ v_y1 = _mm_xor_si128(v_y1, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u))); ++ v_x1 = _mm_xor_si128(v_x1, v_y1); ++ v_y2 = _mm_xor_si128(v_y2, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u))); ++ v_x2 = _mm_xor_si128(v_x2, v_y2); ++ v_y3 = _mm_xor_si128(v_y3, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u))); ++ v_x3 = _mm_xor_si128(v_x3, v_y3); ++ v_y4 = _mm_xor_si128(v_y4, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u))); ++ v_x4 = _mm_xor_si128(v_x4, v_y4); ++ v_y5 = _mm_xor_si128(v_y5, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u))); ++ v_x5 = _mm_xor_si128(v_x5, v_y5); ++ v_y6 = _mm_xor_si128(v_y6, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u))); ++ v_x6 = _mm_xor_si128(v_x6, v_y6); ++ v_y7 = _mm_xor_si128(v_y7, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u))); ++ v_x7 = _mm_xor_si128(v_x7, v_y7); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u); ++ } ++ v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(3433693342u), (int32_t)(0u), (int32_t)(2926088593u)); ++ v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u)); ++ v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u)); ++ v_y2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(0u)); ++ v_x2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(17u)); ++ v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u)); ++ v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u)); ++ v_y6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(0u)); ++ v_x6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(17u)); ++ v_y0 = _mm_xor_si128(v_y0, v_x1); ++ v_x0 = _mm_xor_si128(v_x0, v_y0); ++ v_y2 = _mm_xor_si128(v_y2, v_x3); ++ v_x2 = _mm_xor_si128(v_x2, v_y2); ++ v_y4 = _mm_xor_si128(v_y4, v_x5); ++ v_x4 = _mm_xor_si128(v_x4, v_y4); ++ v_y6 = _mm_xor_si128(v_y6, v_x7); ++ v_x6 = _mm_xor_si128(v_x6, v_y6); ++ v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(2166711591u), (int32_t)(0u), (int32_t)(4057597354u)); ++ v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u)); ++ v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u)); ++ v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u)); ++ v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u)); ++ v_y0 = _mm_xor_si128(v_y0, v_x2); ++ v_x0 = _mm_xor_si128(v_x0, v_y0); ++ v_y4 = _mm_xor_si128(v_y4, v_x6); ++ v_x4 = _mm_xor_si128(v_x4, v_y4); ++ v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(496309207u), (int32_t)(0u), (int32_t)(2402626965u)); ++ v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u)); ++ v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u)); ++ v_y0 = _mm_xor_si128(v_y0, v_x4); ++ v_x0 = _mm_xor_si128(v_x0, v_y0); ++ v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u)); ++ v_s = ((uint32_t)(_mm_extract_epi32(_mm_clmulepi64_si128(_mm_clmulepi64_si128(_mm_cvtsi64_si128((int64_t)(((uint64_t)(_mm_extract_epi64(v_x0, (int32_t)(0u)))))), v_kk, (int32_t)(0u)), v_kk, (int32_t)(16u)), (int32_t)(2u)))); ++ v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u)); ++ v_s = ((uint32_t)(_mm_extract_epi32(_mm_clmulepi64_si128(_mm_clmulepi64_si128(_mm_cvtsi64_si128((int64_t)((((uint64_t)(_mm_extract_epi64(v_x0, (int32_t)(1u)))) ^ ((uint64_t)(v_s))))), v_kk, (int32_t)(0u)), v_kk, (int32_t)(16u)), (int32_t)(2u)))); ++ } ++ while (((uint64_t)(a_x.len)) >= 8u) { ++ v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u)); ++ v_s = ((uint32_t)(_mm_extract_epi32(_mm_clmulepi64_si128(_mm_clmulepi64_si128(_mm_cvtsi64_si128((int64_t)((wuffs_base__peek_u64le__no_bounds_check(a_x.ptr) ^ ((uint64_t)(v_s))))), v_kk, (int32_t)(0u)), v_kk, (int32_t)(16u)), (int32_t)(2u)))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 8u); + } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ while (((uint64_t)(a_x.len)) > 0u) { ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ self->private_impl.f_state = (4294967295u ^ v_s); ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) + +- uint32_t coro_susp_point = self->private_impl.p_tell_me_more[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_gif__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_gif__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++// ---------------- Status Codes Implementations + +- ok: +- self->private_impl.p_tell_me_more[0] = 0; +- goto exit; +- } ++// ---------------- Private Consts + +- goto suspend; +- suspend: +- self->private_impl.p_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++static const uint64_t ++WUFFS_CRC64__ECMA_TABLE[8][256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ { ++ 0u, 12911341560706588527u, 17619267392293085275u, 5164075066763771700u, 8921845837811637811u, 14483170935171449180u, 10328150133527543400u, 4357999468653093127u, ++ 17843691675623275622u, 4940391307328217865u, 226782375002905661u, 12685511915359257426u, 10119945210068853333u, 4566377562367245626u, 8715998937306186254u, 14689403211693301089u, ++ 9051005139383707209u, 14895072503764629798u, 9880782614656435730u, 4193374422961527165u, 453564750005811322u, 13070904082541799189u, 17496296445768931361u, 4747102235666401102u, ++ 9960315520700766767u, 4113029525020509504u, 9132755124734491252u, 14812441257301386523u, 17431997874612372508u, 4811156168024382323u, 391483189436228679u, 13132671735097031464u, ++ 18102010278767414418u, 5195199925788447741u, 1131375642422963401u, 13591081480414639014u, 9288535643022529185u, 3731739485546663374u, 8386748845923054330u, 14361410892855143829u, ++ 907129500011622644u, 13814943346342178715u, 17875617253995106479u, 5421418680781082560u, 8594564625313771207u, 14152643483341451688u, 9494204471332802204u, 3525329033817543155u, ++ 9704381199536204507u, 3855837706121835956u, 8226059050041019008u, 13908973417437222383u, 18265510249468982504u, 5643692520190618503u, 718348998302913715u, 13463047253836762076u, ++ 8146277531524994749u, 13989069943491807698u, 9622312336048764646u, 3938150108875254153u, 782966378872457358u, 13399312233903888353u, 18327840216347633877u, 5582173445676054458u, ++ 7257036000092981153u, 15535280666427316430u, 10390399851576895482u, 2529986302517213333u, 2262751284845926802u, 12414353723947190013u, 16997392145760156105u, 6398650419759490726u, ++ 10599130201908394951u, 2322133910755632296u, 7463478971093326748u, 15329644185724306675u, 16773497691846108660u, 6622864283287239323u, 2036569382881248687u, 12640783567252986560u, ++ 1814259000023245288u, 12250853444207230599u, 17125426475222188467u, 6811676960462675676u, 7132938157145702363u, 15119434731753103540u, 10842837361562165120u, 2690676064372932847u, ++ 17189129250627542414u, 6747026957542163169u, 1875814858707893717u, 12188560364711551674u, 10762704257491731389u, 2770420489343360210u, 7050658067635086310u, 15201536148867841161u, ++ 11493583972846619443u, 3219832958944941148u, 7711675412243671912u, 15576564987190227975u, 16452118100082038016u, 6305011443818121839u, 1213047649942025563u, 11816267669673208372u, ++ 7503259434831574869u, 15784731923736995898u, 11287385040381237006u, 3425713581329221729u, 1436697996605827430u, 11591809733187859977u, 16677985422973077821u, 6078267261889762898u, ++ 16292555063049989498u, 5851447209550246421u, 1630020308903038241u, 11939238787801010766u, 11081681957373440841u, 3090674103720225830u, 7876300217750508306u, 16023932746787097725u, ++ 1565932757744914716u, 12003503911822413427u, 16230825569204842823u, 5913566482019610152u, 7956607163135676207u, 15944361922680361024u, 11164346891352108916u, 3008957496780927003u, ++ 14514072000185962306u, 8809633696146542637u, 4460922918905818905u, 10287960411460399222u, 12879331835779764593u, 113391187501452830u, 5059972605034426666u, 17660565739912801861u, ++ 4525502569691853604u, 10224187249629523019u, 14576435430675780479u, 8748148222884465680u, 4980157760350383383u, 17740628527280140920u, 12797300839518981452u, 195741594718114339u, ++ 13040162471224305931u, 565687821211481700u, 4644267821511264592u, 17536326748496696895u, 14926957942186653496u, 8937808626997553239u, 4297282312656885603u, 9839608450464401420u, ++ 4852190599768102253u, 17327666750234135042u, 13245728566574478646u, 359174499151456857u, 4073138765762497374u, 10063573324157604913u, 14700457781105076997u, 9163920108173816938u, ++ 3628518000046490576u, 9328460452529085631u, 14330211790445699979u, 8498696072880078052u, 5299565100954197475u, 18061012165519327884u, 13623353920925351352u, 1018284691440624343u, ++ 14265876314291404726u, 8562713237611094233u, 3566469078572851181u, 9390260331795218562u, 13702854325316886917u, 937907429353946858u, 5381352128745865694u, 17978417549248290481u, ++ 5746791986423309721u, 18225777846762470134u, 13494053915084326338u, 606523824971012781u, 3751629717415787434u, 9745292510640121029u, 13876787882151992305u, 8338992711486538910u, ++ 13285957365033343487u, 815010154451519120u, 5540840978686720420u, 18431906428167644875u, 14101316135270172620u, 8115412784602421411u, 3978303581567838103u, 9519354766961195256u, ++ 12527462061959317731u, 2230461459452909452u, 6439665917889882296u, 16893009583564617687u, 15423350824487343824u, 7288217715337890239u, 2490078880175191691u, 10493603952060017124u, ++ 6520081235612152965u, 16813546994155744234u, 12610022887636243678u, 2148641156328442801u, 2426095299884051126u, 10557972909709735385u, 15361512820870335213u, 7350228890552538498u, ++ 15006518869663149738u, 7165105895222849989u, 2649782550477098737u, 10947027550912647582u, 12362696414880903321u, 1783234539286425590u, 6851427162658443458u, 17022309211647725485u, ++ 2873395993211654860u, 10722532847870938531u, 15232418832718623383u, 6938393941075996152u, 6642978682516671743u, 17230443782969840528u, 12156534523779525796u, 1989151790783919051u, ++ 6263731030979658865u, 16556202624882645790u, 11702894419100492842u, 1245039440087595845u, 3260040617806076482u, 11390642587947386157u, 15688795063501830681u, 7680756410435167606u, ++ 11622868312827688983u, 1324891275238549368u, 6181348207440451660u, 16638201170595874595u, 15752600435501016612u, 7616209416359311691u, 3321489341258335871u, 11328242235714328848u, ++ 3131865515489829432u, 10977756817953029463u, 16137146508898304611u, 7844397531750915340u, 5811434156413844491u, 16395372229761246052u, 11827132964039220304u, 1660744670629167935u, ++ 15913214326271352414u, 8068573254449152305u, 2905717078206922245u, 11204220263579804010u, 12035829987123708013u, 1452858539103461122u, 6017914993561854006u, 16189773752444600153u, ++ }, { ++ 0u, 6118555238288912653u, 12237110476577825306u, 18247330833359770391u, 13942380710360636081u, 10778293617712507836u, 7543452712389327019u, 4343374206906190246u, ++ 1162559746622204903u, 4957131115480832746u, 13398436261328603645u, 17084888254066768112u, 15086905424778654038u, 9634902877839851611u, 8686748413812380492u, 3198961161184305729u, ++ 2325119493244409806u, 8407378615347160771u, 9914262230961665492u, 15960741045388068057u, 16229058527915052415u, 13101053971319389298u, 5254506258681524069u, 2018377927885299304u, ++ 3487552142959377449u, 7246080283574668580u, 11075676491871100467u, 14798208821638459198u, 17373496827624760984u, 11957750539307177877u, 6397922322368611458u, 873845550624159119u, ++ 4650238986488819612u, 1468611264581623441u, 16814757230694321542u, 13669406796222545035u, 9364600845881799981u, 15356367945216001056u, 2893367039927949111u, 8993183146101597754u, ++ 5812680741028562043u, 307286854339917174u, 17976181078471403105u, 12506848973898782572u, 10509012517363048138u, 14213073068277772231u, 4036755855770598608u, 7848658706446142941u, ++ 6975104285918754898u, 3757679901787621727u, 14492160567149337160u, 11382574084698991429u, 11651310343450272483u, 17679087685142107118u, 604386294999662841u, 6668229816820511220u, ++ 8137636784695169973u, 2596263716583940792u, 15653459723670892975u, 10220140060479144098u, 12795844644737222916u, 16535671346696648713u, 1747691101248318238u, 5523790692630174227u, ++ 9300477972977639224u, 15418239225476001333u, 2937222529163246882u, 8947075512310451247u, 4642267913777087881u, 1478833794519692420u, 16842993350473770899u, 13643422681269376670u, ++ 10462937938231096543u, 14256895642581861842u, 4098594218943518405u, 7784568886045304776u, 5786734079855898222u, 335485660068962147u, 17986366292203195508u, 12498915352811683193u, ++ 11625361482057124086u, 17707288688936286715u, 614573708679834348u, 6660293997941431265u, 6929031904881267271u, 3801500275841901386u, 14553996732492558429u, 11318486464284246352u, ++ 12787875770090627857u, 16545891676414235164u, 1775925023235784971u, 5497808777625382918u, 8073511711541197216u, 2658137194938402989u, 15697317412892285882u, 10174030228858301111u, ++ 13950208571837509796u, 10768213751408296361u, 7515359803575243454u, 4369215658492879795u, 64266086328445461u, 6056541296517372696u, 12193111774187735055u, 18293581128395077890u, ++ 15112713823828466499u, 9606842886146402894u, 8676701462472931673u, 3206755967968430164u, 1208772589999325682u, 4913169729330573567u, 13336459633641022440u, 17149116886581154533u, ++ 16275273569390339946u, 13057090384914568807u, 5192527433167881584u, 2082608760381092989u, 2350925692077440475u, 8379320821714095318u, 9904217479574233025u, 15968533654375526092u, ++ 17437760713698643085u, 11895738795633802624u, 6353925819959930519u, 920093647833407386u, 3495382202496636476u, 7235998217053677361u, 11047581385260348454u, 14824052473177163051u, ++ 10447068876609200373u, 14128364157388739064u, 4118967294799201007u, 7908597456515216354u, 5874445058326493764u, 391603411424480073u, 17894151024620902494u, 12447300791057279315u, ++ 9284535827554175762u, 15289779793358354975u, 2957667589039384840u, 9071030930460645381u, 4729911307347480995u, 1535020299074674862u, 16750846767572792249u, 13591740465559749300u, ++ 12735909365018523451u, 16453465302197274166u, 1832394617641637153u, 5585730863000118316u, 8197188437887036810u, 2678299164963691655u, 15569137772090609552u, 10158372272797335197u, ++ 11573468159711796444u, 17614790262716542417u, 670971320137924294u, 6748289234561093579u, 7052776217202099821u, 3821593491595032416u, 14425748405936874615u, 11302896163253294458u, ++ 15020497008676966249u, 9555230900528283236u, 8764415362900159859u, 3262871967819308158u, 1229147417359668696u, 5037195377843840213u, 13320587995882862530u, 17020586948957226703u, ++ 13858063809762534542u, 10716528681989657987u, 7603000551683802772u, 4425403642365261721u, 84709666887204415u, 6180499360129388338u, 12177172482473303077u, 18165119875451415848u, ++ 17309582619392432295u, 11880078264510294442u, 6477599625422879421u, 940257368289594288u, 3551850046471569942u, 7323923223311315739u, 10995617555250765836u, 14731624552464748801u, ++ 16147023423082394432u, 13041502936518885965u, 5316274389876805978u, 2102700497890566231u, 2407324781779167729u, 8467313413945678076u, 9852321304593615851u, 15876037047908055782u, ++ 1291018766690942925u, 4973072573440528064u, 13274480430592564695u, 17064442507263798490u, 15030719607150486908u, 9547259896855319665u, 8738431316985759590u, 3291108156134209131u, ++ 128532172656890922u, 6134424711959717159u, 12113082593034745392u, 18226958170089932605u, 13886262546419256987u, 10690581952315096982u, 7595066862094806145u, 4435588787024731532u, ++ 3580050981226981379u, 7297974293382715662u, 10987681667836234265u, 14741811897106152212u, 17353402924945863346u, 11834005814401532863u, 6413511935936860328u, 1002093465131966885u, ++ 2417545179998651364u, 8459344608371405545u, 9826339458661147134u, 15904271038397419763u, 16208896970474576213u, 12977377931899316312u, 5270164626790366031u, 2146558256149678658u, ++ 5864365122984562769u, 399431204366950748u, 17919992407673188939u, 12419207813205476166u, 10385054866335763168u, 14192630174644861933u, 4165217520762185978u, 7864598685623228919u, ++ 4701851384154880950u, 1560828767195761339u, 16758641643428190636u, 13581693582721149089u, 9240574510442684679u, 15335992705270927370u, 3021896290089222941u, 9009054371811832336u, ++ 8153224920554538911u, 2724514274940876434u, 15633368673088300421u, 10096393516356015240u, 12707851639919861038u, 16479271570068024355u, 1840187295666814772u, 5575686180147088953u, ++ 6990764404993272952u, 3885857308630146421u, 14471996434107354722u, 11258899592309161839u, 11563386024119531209u, 17622620253752952772u, 696814903175779539u, 6720194058879067614u, ++ }, { ++ 0u, 4542972359516777931u, 9085944719033555862u, 4691664355513513565u, 18171889438067111724u, 14061474303606774503u, 9383328711027027130u, 13633424072306524529u, ++ 7676286055365832925u, 6164376987427609878u, 1481798532234586955u, 3142253189322229376u, 10855962452864321521u, 12223826156538735162u, 16771372852738792551u, 15543052108730888620u, ++ 15352572110731665850u, 16862791698018765937u, 12328753974855219756u, 10669987536837040103u, 2963597064469173910u, 1597421751597874013u, 6284506378644458752u, 7511137813735006411u, ++ 13801544397233820007u, 9260261528098962604u, 13951919735851666161u, 18344511890033026874u, 4874982405016790603u, 8983709158270585728u, 4445237816650825181u, 196831773885239318u, ++ 4091022007653359089u, 562346998784700474u, 5103132815620245095u, 8780357948041161644u, 14189083196432476893u, 18150173592266475286u, 13474345022262784331u, 9652793049543924864u, ++ 5927194128938347820u, 7875246409875505383u, 3194843503195748026u, 1395478681687169905u, 12569012757288917504u, 10477056948030502859u, 15022275627470012822u, 17253916197967211613u, ++ 17134349580696108107u, 15186860751721288064u, 10655150290339489757u, 12453952663903504918u, 1289987737384422247u, 3381381201708377772u, 8066289525279445233u, 5835212509754572090u, ++ 9749964810033581206u, 13278076374523191645u, 17967418316541171456u, 14290755639648123595u, 8890475633301650362u, 4929947589851190897u, 393663547770478636u, 4214651972966108647u, ++ 8182044015306718178u, 5658655167774316073u, 1124693997569400948u, 3499391957275839935u, 10206265631240490190u, 12873559114121502981u, 17560715896082323288u, 14753743294414502547u, ++ 1948880861322201919u, 2594127930539943668u, 7285718382500778153u, 6491924633276939618u, 16655531858934856723u, 15577868310755742168u, 11039333611388512133u, 11977453108914408014u, ++ 11854388257876695640u, 11207451878732806035u, 15750492819751010766u, 16545974958769302533u, 6389687006391496052u, 7469038772501250239u, 2790957363374339810u, 1851148384058628905u, ++ 14845159798643632773u, 17370237963685480270u, 12687582131971748115u, 10311195790054169816u, 3615017233668480425u, 946035540305899618u, 5493509258033841727u, 8302171348940565492u, ++ 5281120895271462419u, 8521283507583323096u, 3989500891288354181u, 600787064567550030u, 13071075951463747903u, 9974957613568212212u, 14659789384177486505u, 17616368207971182434u, ++ 2579975474768844494u, 2073357103652371205u, 6762762403416755544u, 7120694423275413651u, 16132579050558890466u, 16206641305794825257u, 11670425019509144180u, 11456679111066785727u, ++ 11260412520859862953u, 11767594448091671138u, 16308316081471249471u, 15949821717821010420u, 6947506857025941637u, 6872882154850049358u, 2196985003345963795u, 2411294364755134168u, ++ 17780951266603300724u, 14540225107906894527u, 9859895179702381794u, 13249171359945539881u, 787327095540957272u, 3884007889973030291u, 8429303945932217294u, 5472161678768272901u, ++ 16364088030613436356u, 15858029804260760079u, 11317310335548632146u, 11674676600264311193u, 2249387995138801896u, 2322888996435045667u, 6998783914551679870u, 6785602652076537525u, ++ 9916730820443375385u, 13156333278251739858u, 17836661041797717135u, 14448512960480194884u, 8480501340405739573u, 5384944246861192702u, 839650424281590691u, 3795664592519366248u, ++ 3897761722644403838u, 656471011406904245u, 5188255861079887336u, 8578093388688728099u, 14571436765001556306u, 17668683201823263897u, 12983849266553879236u, 10026146741872662287u, ++ 6669836397870376611u, 7177582867921406824u, 2488175334770097461u, 2129119614032302334u, 11583119667977343375u, 11507929313807383620u, 16044147764761037337u, 16259017374083049426u, ++ 15843330937415051829u, 16489139217633298430u, 11946100509993103779u, 11151742071862860904u, 2878174689517968665u, 1799951022334374098u, 6478030266801178255u, 7416715545229372228u, ++ 12779374012782992104u, 10255423946675697443u, 14938077545002500478u, 17313340186040954037u, 5581914726748679620u, 8249768321177223183u, 3702296768117257810u, 894758378090191769u, ++ 1067805515879173007u, 3592318064290702916u, 8126281399163064345u, 5750455340522077650u, 17509465798031703203u, 14841048614271029608u, 10153889598922762037u, 12961990299524614910u, ++ 7230034467336960850u, 6583663697231173273u, 1892071080611799236u, 2686992928761285903u, 10987018516067683454u, 12065805765134311861u, 16604342697881130984u, 15665095101429070371u, ++ 10562241790542924838u, 12510858718452294125u, 17042567015166646192u, 15242640940723501691u, 7979001782576708362u, 5886480219318720193u, 1201574129135100060u, 3433774845539634519u, ++ 17875696825445760251u, 14346457162030502192u, 9657117384671061869u, 13334903762452155046u, 305328503063841751u, 4266984645440464412u, 8803266454141587521u, 4981154328058445194u, ++ 5159950949537688988u, 8687502257518297175u, 4146714207304742410u, 470617173809470401u, 13525524806833511088u, 9565558111887030139u, 14241388846550827302u, 18061812720343526637u, ++ 3250597773715660097u, 1303669193657626762u, 5984074333724313303u, 7782311056298339100u, 15074661043719826029u, 17165493152098584486u, 12620272307991097851u, 10389759836427934768u, ++ 12273052416502600151u, 10761709128327461916u, 15295744618112993857u, 16955639155056813962u, 6232173811933554427u, 7599472825692375856u, 2912390363305901421u, 1684630829289181350u, ++ 13895013714051883274u, 18437420284065877185u, 13745764309700098716u, 9352044056584181591u, 4393970006691927590u, 284119552558480365u, 4822588729510268336u, 9072122871209877627u, ++ 9177754244107333741u, 4635909983525117350u, 92935459340889083u, 4486092121981797936u, 9471751652205676353u, 13581038687731985034u, 18259186513699183831u, 14010214853299335452u, ++ 1574654191081914544u, 3085435160094502267u, 7768015779946060582u, 6108684823746459373u, 16858607891864434588u, 15491872287116188247u, 10944323357536545802u, 12171520400656925121u, ++ }, { ++ 0u, 2156813408461955548u, 4313626816923911096u, 2752718492472304228u, 8627253633847822192u, 7661928252530632364u, 5505436984944608456u, 5875429064940414228u, ++ 17254507267695644384u, 17481523150583344956u, 15323856505061264728u, 14503785508944014468u, 11010873969889216912u, 9592933115173218380u, 11750858129880828456u, 13762408288327199732u, ++ 5489899806547772229u, 5899293950881604249u, 8641596751236382973u, 7639112309309301025u, 4290280838231655477u, 2766522915734824425u, 24548853041579917u, 2141951263632483921u, ++ 11764625126767791525u, 13739024951972572281u, 10995904098661322269u, 9617374173086412737u, 15347829100153899733u, 14488356108428585737u, 17231728733602892141u, 17495903608387299505u, ++ 10979799613095544458u, 9623805157521532758u, 11798587901763208498u, 13714458609834648814u, 17283193502472765946u, 17452775347443867686u, 15278224618618602050u, 14549338234851124126u, ++ 8580561676463310954u, 7708699370463537590u, 5533045831469648850u, 5847881786764880398u, 49097706083159834u, 2107935609010204358u, 4283902527264967842u, 2782645096555375998u, ++ 15298762408106657231u, 14537220494637179923u, 17261466032775972471u, 17465946411177207723u, 11811312492909331135u, 13692276008895521635u, 10968273481005252871u, 9644925621600215259u, ++ 4261616546501692207u, 2795266376586341107u, 70185227798988951u, 2096376465831291211u, 5520961050865536095u, 5868452604588535171u, 8593836137267777511u, 7687075229128879675u, ++ 11680230827506930577u, 13832259058284016205u, 11080421551794245673u, 9523735455073038837u, 15394057194608301281u, 14432953972299937085u, 17185658977434064729u, 17550865948466574981u, ++ 5579070418531851633u, 5801301123735731373u, 8552830750928559817u, 7736981982542757653u, 4239857041646656001u, 2826138345940532189u, 75412445699561913u, 2082177495183685733u, ++ 17161123352926621908u, 17565732457015587080u, 15417398740927075180u, 14419136389292487344u, 11066091662939297700u, 9546555762013386360u, 11695763573529760796u, 13808381012597372352u, ++ 98195412166319668u, 2067810197125185512u, 4215871218020408716u, 2841563382736944208u, 8567805054529935684u, 7712554084374493336u, 5565290193110751996u, 5824680096370817824u, ++ 4213277561403610395u, 2852497928146826439u, 118647349622822563u, 2038740285422565247u, 5603244184571253355u, 5777048188553278391u, 8511711324634206675u, 7778039831901335567u, ++ 15351860113773370363u, 14475212630091872807u, 17208772955998935107u, 17527831139023518111u, 11724816064851319947u, 13787876126790335831u, 11055209722282565427u, 9549167182608629487u, ++ 8523233093003384414u, 7756906139291137922u, 5590532753172682214u, 5799235221864313914u, 140370455597977902u, 2025555993157185778u, 4192752931662582422u, 2864620100732154698u, ++ 11041922101731072190u, 9570786891571902818u, 11736905209177070342u, 13767318537498720986u, 17187672274535555022u, 17539385849830522386u, 15374150458257759350u, 14462604578592423338u, ++ 15486092620961298855u, 14629711868178897019u, 17092483903335922207u, 17355247692313779139u, 11624791503456485079u, 13600030943165030155u, 11137009302703308143u, 9754815117126884531u, ++ 4151744643171039047u, 2626583331457439387u, 162377516962444543u, 2282879863086044451u, 5631712546292871223u, 6037452326221451755u, 8501327171535303567u, 7499692239708246611u, ++ 11158140837063703266u, 9743299917872012094u, 11602602247471462746u, 13612749016692676742u, 17105661501857119634u, 17333526894853233742u, 15473963965085515306u, 14650238604571402230u, ++ 8479714083293312002u, 7512977616177960414u, 5652276691881064378u, 6025361010828170854u, 150824891399123826u, 2303974039851176622u, 4164354990367371466u, 2604286280411140374u, ++ 5659250822143950637u, 6009834889821986545u, 8454565055791594645u, 7546392787102457161u, 4121809449076176989u, 2656298618920900993u, 211263906290727909u, 2233791159333640761u, ++ 11672732454520566221u, 13552292306546298897u, 11106145987650286197u, 9785898338790069161u, 15440531030182573757u, 14675335027319969633u, 17121240571213837573u, 17326570184971408601u, ++ 196390824332639336u, 2258328937796115892u, 4135620394250371024u, 2632959299571932684u, 8431742436040817432u, 7560729365405768388u, 5683126765473888416u, 5994308631384381820u, ++ 17135610109059871368u, 17303780593489122132u, 15425108168748986672u, 14699314298944934124u, 11130580386221503992u, 9770921945649714212u, 11649360192741635648u, 13566070240564762524u, ++ 8426555122807220790u, 7574959341548112874u, 5704995856293652878u, 5963537623700588626u, 237294699245645126u, 2208312048661695642u, 4077480570845130494u, 2700071425513574178u, ++ 11206488369142506710u, 9686112028953249034u, 11554096377106556782u, 13670376701660284594u, 17023422649268413350u, 17424940338905547386u, 15556079663802671134u, 14559229772221530562u, ++ 4089596066908350835u, 2679540256679954607u, 224121464376355531u, 2230046074588744471u, 5727171952466636291u, 5950815117732351967u, 8405427952099257787u, 7586487769270013031u, ++ 15543464952953907091u, 14581513594800801359u, 17034988434643772459u, 17403850594581005815u, 11533527867866456291u, 13682454788587061567u, 11228114617197060955u, 9672831084924650119u, ++ 17046466186006768828u, 17401835225210195296u, 15513812278582275844u, 14601417988320120536u, 11181065506345364428u, 9711332585899690512u, 11598470443728627828u, 13625782737014311336u, ++ 280740911195955804u, 2165085734748128128u, 4051111986314371556u, 2726642315882184760u, 8385505863325164844u, 7616087770173211888u, 5729240201464309396u, 5939354855465699144u, ++ 11574598932837183481u, 13641322155266051621u, 11203874897631210561u, 9696991643941850525u, 15500005765847099529u, 14624770467483748693u, 17061326039500450609u, 17377293083093715693u, ++ 5752625691707646233u, 5925581285101240517u, 8361067032314929825u, 7631051003498906493u, 4066548076212889193u, 2702667407911749557u, 266366940911429073u, 2187862166416278541u, ++ }, { ++ 0u, 6642096280510406750u, 13284192561020813500u, 16462795876764246242u, 16315823105410768893u, 13708963636559134627u, 6500836570635362113u, 439922346977066783u, ++ 6197597939812213119u, 733872460607717665u, 17174658310779658691u, 12859417258165748125u, 13001673141270724226u, 16736026809386770140u, 879844693954133566u, 5771540452186644064u, ++ 12395195879624426238u, 17305613297699152544u, 1467744921215435330u, 5220531075568771612u, 5650300446275329283u, 1316336633116425565u, 17740532779662220735u, 12258375912742239713u, ++ 18016332033719362433u, 11973850846087693279u, 4781749989466252093u, 2193612730179060579u, 1759689387908267132u, 4919860766213921826u, 11543080904373288128u, 18166453874549300382u, ++ 14614610554166352761u, 10879836598703668007u, 8253805222095936453u, 3361408799105547163u, 2935489842430870660u, 8399638907315561690u, 10441062151137543224u, 14757009366268798054u, ++ 11300600892550658566u, 13906759146888600152u, 2632673266232851130u, 8693166652788693732u, 9132946036408395259u, 2491556468171146661u, 14331668736193815879u, 11153489555886392601u, ++ 7409848711186274695u, 4249257595424012761u, 16037314857127418171u, 9413239572791867749u, 9563499978932504186u, 15606406401646028324u, 4387225460358121158u, 6976068332272625304u, ++ 3519378775816534264u, 7852640824571713702u, 9839721532427843652u, 15321459211647031322u, 15184496315767285509u, 10274783960564057947u, 7701371084599273401u, 3949009615571978215u, ++ 539203352115488887u, 6581683165424715817u, 13772373076031531211u, 16360516657443457173u, 16507610444191872906u, 13347445937900984276u, 6722817598211094326u, 99441604310980456u, ++ 5870979684861741320u, 960568039155968342u, 16799277814631123380u, 13046489736199563754u, 12904108438562707189u, 17238069777753355947u, 814716683761407561u, 6296880972452001303u, ++ 12357655745765665417u, 17821378201246059223u, 1379747099228580405u, 5694995023857257067u, 5265346532465702260u, 1530999186474390826u, 17386333305577387464u, 12494636173022434710u, ++ 18265892072816790518u, 11623803214076996520u, 4983112936342293322u, 1804507146630605588u, 2238305212630619147u, 4845162757404030037u, 12054694172541097143u, 18115614168568345833u, ++ 14819697422372549390u, 10486441695742104400u, 8498515190848025522u, 3016776137306395628u, 3442815973027425523u, 8352525304506551469u, 10925090729870978127u, 14677459070913039377u, ++ 11216336045685248625u, 14376925237369287215u, 2590274523633996493u, 9214355580338500243u, 8774450920716242316u, 2731551919773330898u, 13952136664545250608u, 11363291318662491502u, ++ 7038757551633068528u, 4432606169309893038u, 15705281649143427404u, 9644785238863483154u, 9494645848386137613u, 16136034042300943955u, 4294513027018469041u, 7472698529450626799u, ++ 4011857131457007759u, 7746628612951437521u, 10373500843358195763u, 15265904688119197805u, 15402742169198546802u, 9938598876682809132u, 7898019231143956430u, 3582070091934478224u, ++ 1078406704230977774u, 5970139571501035696u, 13163366330849431634u, 16897748309796073484u, 17049000381336047379u, 12733717820530814797u, 6107119981172920239u, 643361792051163121u, ++ 6410046491609887121u, 349161128571523535u, 16190407203032477997u, 13583585392940618099u, 13445635196422188652u, 16624205252526067250u, 198883208621960912u, 6840937431151644302u, ++ 11741959369723482640u, 18365299631022420558u, 1921136078311936684u, 5081265949533565682u, 4656338829252136429u, 2068229881835728307u, 17925537898651110737u, 11883093821164285199u, ++ 17650059563187254127u, 12167860639460954929u, 5524638460789093331u, 1190641388963713933u, 1629433367522815122u, 5382257181810330828u, 12593761944904002606u, 17504208224571739248u, ++ 14134199920450915223u, 10956049054195313609u, 8970094247992396587u, 2328741787718953845u, 2759494198457160810u, 8819954874021999668u, 11389990047714514134u, 13996106797082358920u, ++ 10530693064931404520u, 14846677937748691638u, 3061998372948781652u, 8526176301674629642u, 8091274350704555285u, 3198835872954668363u, 14416890915810522537u, 10682083699634542071u, ++ 7503655637611612521u, 3751252662574033207u, 15021960841764981205u, 10112215774463453579u, 9966225872684586644u, 15448000658827392714u, 3609014293261211176u, 7942304654960916086u, ++ 4476610425261238294u, 7065420035288041544u, 9690325514808060074u, 15733189881789008116u, 15874467260079749099u, 9250420838410950581u, 7212375292832610135u, 4051821833783301897u, ++ 688179623118076057u, 6170372224719608007u, 12814440204992854053u, 17148438651140642939u, 16997030381696051044u, 13244209591132604218u, 6033552274612791256u, 1123099122930255750u, ++ 6885631946054851046u, 262293608834169272u, 16705050609013102938u, 13544914965422553348u, 13683025758949262875u, 16271127284595091013u, 412415468322195111u, 6454862019777308409u, ++ 11927910341603441255u, 17988788832627006009u, 2148953154424896219u, 4755777988240824965u, 5180549047267992986u, 2001980365486523844u, 18428711160677000486u, 11786650616022549880u, ++ 17548901841432484632u, 12657171448130714438u, 5463103839546661796u, 1728714438829439994u, 1290082918514197733u, 5605359706950509755u, 12231113943998710873u, 17694874057198724103u, ++ 14077515103266137056u, 11488706867561743294u, 8865212338619786076u, 2822341649514070786u, 2391433177253116957u, 9015472726907116611u, 11054926469989481633u, 14215482952762858751u, ++ 10763369033251996319u, 14515766235920655041u, 3244216653174833699u, 8153963644554617469u, 8589026054036938082u, 3107253741862419772u, 14945397058901253598u, 10612099275430968704u, ++ 8023714262914015518u, 3707732413820797248u, 15493257225902875042u, 10029072425162228220u, 10174906129304731363u, 15067338284929851069u, 3850131242430201439u, 7584939832928591361u, ++ 4133108057121652833u, 7311251501606674495u, 9295800309597257949u, 15937155243838988419u, 15796038462287912860u, 9735579710801330114u, 7164140183868956448u, 4558017662132191102u, ++ }, { ++ 0u, 7026975924517234630u, 14053951849034469260u, 11713158812725061706u, 1498566550037692829u, 8453026741656872539u, 15547077823203331601u, 13134332388348864983u, ++ 2997133100075385658u, 5193532126013515004u, 16906053483313745078u, 10023477084983765872u, 4421425403924087463u, 6690338751863514465u, 18326734871926164779u, 11516110084014746349u, ++ 5994266200150771316u, 3651077923391955378u, 10387064252027030008u, 17411644826573123134u, 5180286430728521705u, 2765428220391841839u, 9578516152858789989u, 16530863678517358499u, ++ 8842850807848174926u, 1962664170658947720u, 13380677503727028930u, 15579466327313067268u, 7958959654645957843u, 1150444288916906773u, 12500388506175163231u, 14771411239789669529u, ++ 11988532400301542632u, 14401112944851970862u, 7302155846783910756u, 347530691846251682u, 12867955000885349749u, 15208934917731379891u, 8186843028093092601u, 1160054057126929727u, ++ 10360572861457043410u, 17171366937719040020u, 5530856440783683678u, 3262112454209283992u, 11170013709381963343u, 18052407625221859721u, 6344013830343901635u, 4147432248901248517u, ++ 17685701615696349852u, 10733466276663946586u, 3925328341317895440u, 6340298665266291414u, 16265807495604570881u, 9241127928571882695u, 2500178400086410381u, 4843267757373072203u, ++ 15917919309291915686u, 13646779991004769888u, 2300888577833813546u, 9109287431904666092u, 14423962049646856251u, 12225267820500938749u, 803223682168014775u, 7683504840782913649u, ++ 16025789128531904341u, 13827140552201887891u, 2120809441137969369u, 9001136188144267039u, 14604311693567821512u, 12333148557000565006u, 695061383692503364u, 7503436758785666690u, ++ 17866059964468495471u, 10841338299774886825u, 3817174930229677027u, 6160221704524114981u, 16373686056186185202u, 9421479739856314932u, 2320108114253859454u, 4735107671358188984u, ++ 10180636633891078433u, 17063072784830850791u, 5638869205660782253u, 3442330069771397483u, 11061712881567367356u, 17872478072565786490u, 6524224908418567984u, 4255451551249279222u, ++ 11880240423364919835u, 14221174549956093405u, 7482375666214882711u, 455541244296276561u, 12688027660687803270u, 15100631886079386688u, 8294864497802497034u, 1340262959281482700u, ++ 8662912472460168125u, 1854372134182743163u, 13488687978245964849u, 15759686224643400695u, 7850656682635790880u, 970516889046347238u, 12680597330532582828u, 14879432787265004138u, ++ 5885971969496909959u, 3471141773623390017u, 10567281927262422795u, 17519657531808653517u, 5000356800172820762u, 2657127470508076764u, 9686535514746144406u, 16711074697083887952u, ++ 3105005063510429129u, 5373890534425651727u, 16725976600334615109u, 9915323596096578947u, 4601777155667627092u, 6798217371950640018u, 18218574863809332184u, 11336039720248747038u, ++ 180360639130832627u, 7134845665859430709u, 13945800545768817023u, 11533079735570376377u, 1606447364336029550u, 8633376307814525096u, 15367009681565827298u, 13026170149548992292u, ++ 3321048140255203375u, 5733767250183223273u, 17086394267351834531u, 10131907641284540517u, 4241618882275938738u, 6582455852881933940u, 18002272376288534078u, 10975340495589554680u, ++ 540800415553098517u, 7351451582082282707u, 14161821513074465945u, 11892934580260027231u, 1390122767385006728u, 8272655212095272270u, 15006873517571333380u, 12810430501506267842u, ++ 9023334491325470299u, 2070960623556915613u, 13704726720259086807u, 16119558478964112913u, 7634349860459354054u, 609813203025260544u, 12320443409048229962u, 14663675712440713100u, ++ 6101997361665611105u, 3831000989484282535u, 10927717295939115757u, 17736259059608567083u, 4640216228507718908u, 2441383434118427450u, 9470215342716377968u, 16350357972595129526u, ++ 9820495924665654471u, 16847328885758262017u, 5422549171225416523u, 3081613207998608525u, 11277738411321564506u, 18232337151134792348u, 6884660139542794966u, 4472053216375158032u, ++ 11663933463862517757u, 13860471001487472699u, 7122221882022416497u, 239784031886489527u, 13048449816837135968u, 15317220237859158438u, 8510903102498558444u, 1700135351162517034u, ++ 15809464669166377651u, 13466419319190748533u, 1760673139591009599u, 8785396677427507961u, 14964751332429765422u, 12549754610540477672u, 911082488592553122u, 7863291466191287140u, ++ 17505901828360837513u, 10625576643111779919u, 3600872305391818245u, 5799522617425244611u, 16589728995604994068u, 9781356593166352338u, 2680525918562965400u, 4951691578960654430u, ++ 17325824944920336250u, 10517423154702741692u, 3708744268365486326u, 5979881026315534128u, 16481568986909349607u, 9601286230029496609u, 2860877669727689067u, 5059570199676927661u, ++ 15701313365271581760u, 13286340242614875014u, 1941033778092694476u, 8893266419348519946u, 14784683190314112477u, 12441592372201976347u, 1018963302412737105u, 8043641032810315159u, ++ 11771943938993819918u, 14040690898222216904u, 6942283547246780034u, 131491994814691652u, 13228658641689481363u, 15425241784889898837u, 8402600130983321375u, 1520207950847359193u, ++ 10000713600345641524u, 16955341590498866674u, 5314254941016153528u, 2901677057735113342u, 11385757773804508073u, 18412548169088955503u, 6704730509582687269u, 4363752465879022563u, ++ 6210010127020858258u, 4011218604585024596u, 10747781068851303454u, 17627964906259002328u, 4820427307211528719u, 2549402735887646153u, 9361914515530929539u, 16170428419360240197u, ++ 9203554311335254184u, 2178971175377796974u, 13596434743901280036u, 15939620083439087842u, 7742371330630129973u, 790022104701665011u, 12140516069312059065u, 14555372680310567295u, ++ 360721278261665254u, 7243300338934250016u, 14269691331718861418u, 12073295142069515692u, 1281960468464901243u, 8092587130592951229u, 15187223161047700471u, 12918311238500824113u, ++ 3212894728672059100u, 5553690289885640986u, 17266752615629050192u, 10239779664840078998u, 4061548595831021377u, 6474295767462639751u, 18110150936257777869u, 11155692307469580043u, ++ }, { ++ 0u, 2517245393515406572u, 5034490787030813144u, 7435750759411199284u, 10068981574061626288u, 12201157653998401372u, 14871501518822398568u, 17045318164640841348u, ++ 9628913577918544357u, 12056075433989135625u, 13870769438669140029u, 16326061061730899153u, 1016952077871524437u, 3239211695253081785u, 5459183210385793933u, 7578968205522831201u, ++ 11067918171351838031u, 13508029996328618403u, 15872723984458359959u, 18349972777811820667u, 1307470557354262271u, 3515654148887976467u, 6339673239971903271u, 8436375012170683339u, ++ 2033904155743048874u, 4528066323082129478u, 6478423390506163570u, 8865607338129291678u, 10918366420771587866u, 13072499669943034870u, 15157936411045662402u, 17344703028974807598u, ++ 11667391723826758683u, 9441211325989495031u, 16444045520167767491u, 14329311757255665967u, 3050858413050517419u, 628778578755597127u, 8036894684654706291u, 5577642697640442527u, ++ 2614941114708524542u, 478839856218937618u, 7031308297775952934u, 4862538486186004682u, 12679346479943806542u, 10167187506301176482u, 16872750024341366678u, 14467534086004917114u, ++ 4067808311486097748u, 1917635425212288440u, 9056132646164258956u, 6864284009665987680u, 12956846781012327140u, 10457633378212404744u, 17731214676258583356u, 15347951510183778256u, ++ 13678285260964991153u, 11474057634298917981u, 17873974704293108073u, 15772186515461651845u, 3922409453435093761u, 1477250791027468269u, 8336488571297909465u, 5863164957556321845u, ++ 15063804914172139187u, 17573731408537121375u, 10724047561790938987u, 13131499433903012743u, 6535100908406441219u, 8673469987586793967u, 2265113888856263899u, 4431612735036172343u, ++ 6101716826101034838u, 8521560882533092282u, 1257557157511194254u, 3719041779816530530u, 16073789369309412582u, 18302240886422657034u, 11155285395280885054u, 13267751491267498450u, ++ 5229882229417049084u, 7672809353916620560u, 957679712437875236u, 3433240205686757064u, 14062616595551905868u, 16269110787469675680u, 9725076972372009364u, 11824592944582215032u, ++ 14786588404820918809u, 17283564772171425525u, 9865866699426761665u, 12251361247433944877u, 5082513026899726761u, 7234957975966594373u, 240568853608110193u, 2430150771060047005u, ++ 8135616622972195496u, 5911125624750880324u, 3835270850424576880u, 1717722887501053852u, 18112265292328517912u, 15687370158510810612u, 13728568019331975360u, 11271004332422294572u, ++ 17674167644946721613u, 15539754686561718177u, 12725302718847165077u, 10553717607734429305u, 9150035367232403709u, 6635062193578351633u, 4261933579054297381u, 1858407040333796809u, ++ 16825062113507622887u, 14668696227990231819u, 12439147139764057663u, 10254616302904316627u, 7116415003206659159u, 4624520499557157051u, 2818284765131990415u, 428829699325493603u, ++ 7844818906870187522u, 5634399380472423150u, 2954501582054936538u, 860032292373900086u, 16672977142595818930u, 14235136279826723166u, 11726329915112643690u, 9246813302127474822u, ++ 3513487962258617315u, 1309817375275636495u, 8438743075148003899u, 6337546835477044951u, 13510341259434958931u, 11065716548023207103u, 18347741267953084811u, 15874986514718330215u, ++ 13070201816812882438u, 10920562880461237994u, 17346939975173587934u, 15155660198108440370u, 4530227777712527798u, 2031571415669472602u, 8863225470072344686u, 6480554254231811202u, ++ 12203433652202069676u, 10066744842596399680u, 17043121765066184564u, 14873799311837557656u, 2515114315022388508u, 2382082824317424u, 7438083559633061060u, 5032329272252129320u, ++ 3241337884980569929u, 1014584229661574053u, 7576621447749742225u, 5461349336866867837u, 12053812688995611897u, 9631145302510833685u, 16328262745174523169u, 13868458115447806413u, ++ 10459764458834098168u, 12954464700354433812u, 15345618707833241120u, 17733376188870843084u, 1915359424875750472u, 4070045040789094564u, 6866480411373514128u, 9053834855311329660u, ++ 1479513538183220765u, 3920177730975673073u, 5860963271950469061u, 8338799892386374441u, 11471931442405006765u, 13680653107046267201u, 15774533275401163893u, 17871808579940708505u, ++ 626467317811485367u, 3053060038512016987u, 5579874205336949615u, 8034632152261867395u, 9443377510452431111u, 11665044903776710123u, 14326943696444768479u, 16446171926791300147u, ++ 10165026053799453522u, 12681679222183806910u, 14469915951933188746u, 16870619158449294950u, 481137707216220386u, 2612744652856644622u, 4860301542120094010u, 7033584512875404758u, ++ 16271233245944390992u, 14060243759811248572u, 11822251249501760648u, 9727246909562751076u, 7670541700849153760u, 5232109988680716812u, 3435445775002107704u, 955373222128557012u, ++ 7237229143405862069u, 5080272407415421017u, 2427958334666397037u, 242871556844564865u, 17281429885116092165u, 14788965422804986857u, 12253699033039161053u, 9863708918048465457u, ++ 8671167069616523295u, 6537293559533907187u, 4433853414635209159u, 2262842661302265131u, 17575888975148309423u, 15061467343334031171u, 13129122476067492471u, 10726182388697724571u, ++ 18300070734464807418u, 16076131279156974870u, 13270124387156703266u, 11153162876657622222u, 8523867158108594762u, 6099511471519499942u, 3716814080667593618u, 1259824750463930238u, ++ 4622362935074513227u, 7118752576211060135u, 431206655032469651u, 2816149936058911871u, 14670999143827763963u, 16822869460218058263u, 10252375625438018339u, 12441418369480155087u, ++ 14232830006413318318u, 16675182499310091330u, 9249040999114314102u, 11724062320027170202u, 5636569530263980830u, 7842476994894082034u, 857659398650987206u, 2956624102806742570u, ++ 15689637813740375044u, 18110037535197587688u, 11268798760944846300u, 13730874507508556080u, 5909003164109873076u, 8137989456584309592u, 1720064584747800172u, 3833100915362378368u, ++ 6637197082762229217u, 9147658351414628621u, 1856069252600036409u, 4264091358266300629u, 15537483516989711953u, 17676408262268928701u, 10555910046260817801u, 12723000017772809061u, ++ }, { ++ 0u, 15762200328042667840u, 2856835172924432389u, 18238190752146915141u, 5713670345848864778u, 10805715811487326026u, 7561135427655163919u, 12848797446532677455u, ++ 11427340691697729556u, 4911321075843194708u, 13345174655120580625u, 7173389830452510545u, 15122270855310327838u, 820654137405644638u, 17760118084036943899u, 3226275954771115867u, ++ 12678913378224905901u, 8451595299172663789u, 9822642151686389416u, 5976168202979041768u, 16194808345499688615u, 4179641502022828519u, 14346779660905021090u, 2135996745225445858u, ++ 3558579666237890233u, 16995468946051088889u, 1641308274811289276u, 14733962144962732540u, 9090961916423626419u, 11859948271085519347u, 6452551909542231734u, 9453764156601606646u, ++ 14785799433083167711u, 1697614691135618207u, 16903190598345327578u, 3470771065211313306u, 9402037001392841685u, 6396285171454065813u, 11952336405958083536u, 9178809987380452496u, ++ 6027971268800324555u, 9878982515431963787u, 8359283004045657038u, 12591138999497481358u, 2084233168694272961u, 14290549069261356161u, 4271993490450891716u, 16282692837778922628u, ++ 7117159332475780466u, 13293411258189767218u, 4999205320339463543u, 11519692655715205687u, 3282616549622578552u, 17811921192019632696u, 732879648334208381u, 15029958398333780541u, ++ 18181923832847252838u, 2805107922438644262u, 15850048426093911395u, 92388385340408355u, 12905103819084463468u, 7612972483059622444u, 10717907374994120041u, 5621392111171994153u, ++ 629311348378851643u, 15133597752622646907u, 3395229382271236414u, 17699378041462564478u, 5183867188229904689u, 11335100742646646385u, 6941542130422626612u, 13469099241846138484u, ++ 10821536956051937583u, 5517832210058282607u, 12792570342908131626u, 7725577015716947562u, 15665448522205731109u, 277059068684322405u, 18357619974760904992u, 2629481737494357600u, ++ 12055942537600649110u, 9075274912216783062u, 9289461107078326163u, 6508930745710590163u, 16718566008091314076u, 3655465612432595164u, 14961454118931310489u, 1522030784741112025u, ++ 4168466337388545922u, 16386289672930760898u, 2196870928291817351u, 14177982363995224263u, 8543986980901783432u, 12406505804242475208u, 5852377756745475981u, 10054645982306597069u, ++ 14234318664951560932u, 2248669261341992356u, 16298510681658284769u, 4076149859246245281u, 9998410640678927086u, 5800610134637962670u, 12494386096293518059u, 8636334373997692331u, ++ 6565233099245157104u, 9341293662428177840u, 8987461698644630261u, 11963660006880118197u, 1465759296668416762u, 14909722918146729402u, 3743309483160705791u, 16810949547632248255u, ++ 7673845564465570889u, 12736298827739970313u, 5610215844877288524u, 10909381007990496012u, 2681314179816367171u, 18413922163761052419u, 184776770680816710u, 15577635352405072646u, ++ 17647610443766686813u, 3338994288425483037u, 15225944966119244888u, 717191546761911064u, 13520897736746902615u, 6997878541721926423u, 11242784222343988306u, 5096087965850491666u, ++ 1258622696757703286u, 14684288965200833846u, 3950222953022231155u, 17036158029906267443u, 6790458764542472828u, 9548224856613104956u, 8762045755503235705u, 11756540858562383161u, ++ 10367734376459809378u, 6151638724996853026u, 12124837022850257511u, 8285082520580115751u, 13883084260845253224u, 1879138195689975080u, 16649556998353834605u, 4445490780332133677u, ++ 13727827248377474267u, 7223104792207356827u, 11035664420116565214u, 4870673773980832670u, 17422178244240010449u, 3131857036752565137u, 15451154031433895124u, 924103331921597332u, ++ 2311784730144877775u, 18062687245331231631u, 554118137368644810u, 15928680121837474698u, 8024872609708797125u, 13105623011270275973u, 5258963474988715200u, 10539833548380279680u, ++ 15872427342139003305u, 502333042764009193u, 18150549824433566124u, 2404114375865757420u, 10596187595637903779u, 5310779519913856739u, 13017861491421180326u, 7932573568563556070u, ++ 4814384572959953341u, 10983915471956430589u, 7310931224865190328u, 13820193315420761848u, 980423156880069047u, 15503004023780282103u, 3044061569482224050u, 17329913425393921778u, ++ 8336932674777091844u, 12181156958151692356u, 6059373863990406913u, 10279938678082531393u, 4393741856583634702u, 16593268045114871886u, 1971504083133951755u, 13970910599835103307u, ++ 17087973961803566864u, 4006576835745435728u, 14591990156772618005u, 1170861220680101973u, 11704755513490951962u, 8705792948709298266u, 9640554597612056351u, 6878321524855255135u, ++ 1858937689852799821u, 14083548048513152013u, 4497338522683984712u, 16489741062169236488u, 6235036951360285511u, 10104345546597921799u, 8152299718492490562u, 12365860697102636034u, ++ 9753200483853429593u, 6765745319621112857u, 11601220269275925340u, 8809399250468705308u, 14416405870873226067u, 1346516287098352659u, 17272668747995384662u, 3821952007586370582u, ++ 13130466198490314208u, 7820039919040899744u, 10492627387899532773u, 5414409408661555877u, 17974923397289260522u, 2579810761044912810u, 16057098401758057967u, 317732763665910447u, ++ 2931518593336833524u, 17442526084696124084u, 1084062204544407025u, 15399436031514938033u, 7486618966321411582u, 13644576356632980158u, 4629793036166665723u, 11168576964637084347u, ++ 15347691128931141778u, 1027777753507534802u, 17534896747071563927u, 3019349226222860247u, 11220431689754577048u, 4686116923914377176u, 13552315720802183325u, 7398828111596124125u, ++ 5362628359632734342u, 10436379358185592774u, 7912374160093407363u, 13218332977821366211u, 369553541361633420u, 16113456511805446092u, 2487515902914439305u, 17887166489985742793u, ++ 8865757316743550527u, 11653040814255671679u, 6677988576850966074u, 9660905738751846778u, 3765703796660934197u, 17220887603689539957u, 1434383093523822128u, 14508740362393577840u, ++ 16546065181022836267u, 4549193289962883435u, 13995757083443852846u, 1766676892172462446u, 12309576339732698657u, 8100554995509053793u, 10192175931700983332u, 6327407589325138276u, ++ }, ++}; + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} ++static const uint8_t ++WUFFS_CRC64__ECMA_X86_SSE42_FOLD1[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 228u, 58u, 57u, 202u, 151u, 212u, 93u, 224u, ++ 64u, 95u, 135u, 199u, 175u, 149u, 190u, 218u, ++}; + +-// -------- func gif.decoder.do_tell_me_more ++static const uint8_t ++WUFFS_CRC64__ECMA_X86_SSE42_FOLD2[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 68u, 250u, 158u, 138u, 0u, 91u, 9u, 96u, ++ 81u, 175u, 225u, 15u, 163u, 83u, 230u, 59u, ++}; ++ ++static const uint8_t ++WUFFS_CRC64__ECMA_X86_SSE42_FOLD4[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 243u, 65u, 212u, 157u, 187u, 239u, 227u, 106u, ++ 244u, 45u, 132u, 167u, 84u, 96u, 31u, 8u, ++}; ++ ++static const uint8_t ++WUFFS_CRC64__ECMA_X86_SSE42_FOLD8[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 16u, 204u, 79u, 29u, 215u, 87u, 135u, ++ 64u, 231u, 61u, 247u, 42u, 107u, 216u, 215u, ++}; ++ ++static const uint8_t ++WUFFS_CRC64__ECMA_X86_SSE42_MUPX[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 213u, 99u, 41u, 23u, 108u, 70u, 62u, 156u, ++ 133u, 30u, 14u, 175u, 43u, 175u, 216u, 146u, ++}; ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_tell_me_more( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); + +- uint64_t v_chunk_length = 0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up__choosy_default( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up_x86_sse42( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + +- uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// ---------------- VTables + +- if ((self->private_impl.f_call_sequence & 16u) == 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } +- if (self->private_impl.f_metadata_fourcc == 0u) { +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; +- } +- while (true) { +- while (true) { +- if (wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_io_position) { +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- 2u, +- 0u, +- self->private_impl.f_metadata_io_position, +- 0u, +- 0u); +- } +- status = wuffs_base__make_status(wuffs_base__suspension__mispositioned_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- 0u, +- 0u, +- 0u, +- 0u, +- 0u); +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- continue; +- } +- break; +- } +- v_chunk_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); +- if (v_chunk_length <= 0u) { +- iop_a_src += 1u; +- break; +- } +- if (self->private_impl.f_metadata_fourcc == 1481461792u) { +- v_chunk_length += 1u; +- } else { +- iop_a_src += 1u; +- } +- self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add(wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))), v_chunk_length); +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- 3u, +- self->private_impl.f_metadata_fourcc, +- 0u, +- wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))), +- self->private_impl.f_metadata_io_position); +- } +- status = wuffs_base__make_status(wuffs_base__suspension__even_more_information); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++const wuffs_base__hasher_u64__func_ptrs ++wuffs_crc64__ecma_hasher__func_ptrs_for__wuffs_base__hasher_u64 = { ++ (uint64_t(*)(const void*))(&wuffs_crc64__ecma_hasher__checksum_u64), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_crc64__ecma_hasher__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_crc64__ecma_hasher__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_crc64__ecma_hasher__update), ++ (uint64_t(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_crc64__ecma_hasher__update_u64), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_crc64__ecma_hasher__initialize( ++ wuffs_crc64__ecma_hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- 3u, +- self->private_impl.f_metadata_fourcc, +- 0u, +- self->private_impl.f_metadata_io_position, +- self->private_impl.f_metadata_io_position); ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } +- self->private_impl.f_call_sequence &= 239u; +- self->private_impl.f_metadata_fourcc = 0u; +- self->private_impl.f_metadata_io_position = 0u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- +- ok: +- self->private_impl.p_do_tell_me_more[0] = 0; +- goto exit; + } + +- goto suspend; +- suspend: +- self->private_impl.p_do_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.choosy_up = &wuffs_crc64__ecma_hasher__up__choosy_default; + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__hasher_u64.vtable_name = ++ wuffs_base__hasher_u64__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_u64.function_pointers = ++ (const void*)(&wuffs_crc64__ecma_hasher__func_ptrs_for__wuffs_base__hasher_u64); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_crc64__ecma_hasher* ++wuffs_crc64__ecma_hasher__alloc(void) { ++ wuffs_crc64__ecma_hasher* x = ++ (wuffs_crc64__ecma_hasher*)(calloc(1, sizeof(wuffs_crc64__ecma_hasher))); ++ if (!x) { ++ return NULL; + } ++ if (wuffs_crc64__ecma_hasher__initialize( ++ x, sizeof(wuffs_crc64__ecma_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} + +- return status; ++size_t ++sizeof__wuffs_crc64__ecma_hasher(void) { ++ return sizeof(wuffs_crc64__ecma_hasher); + } + +-// -------- func gif.decoder.num_animation_loops ++// ---------------- Function Implementations ++ ++// -------- func crc64.ecma_hasher.get_quirk + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_gif__decoder__num_animation_loops( +- const wuffs_gif__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_crc64__ecma_hasher__get_quirk( ++ const wuffs_crc64__ecma_hasher* self, ++ uint32_t a_key) { + if (!self) { + return 0; + } +@@ -37136,38 +37965,134 @@ wuffs_gif__decoder__num_animation_loops( + return 0; + } + +- if (self->private_impl.f_seen_num_animation_loops_value) { +- return self->private_impl.f_num_animation_loops_value; +- } +- if (self->private_impl.f_num_decoded_frame_configs_value > 1u) { +- return 1u; +- } + return 0u; + } + +-// -------- func gif.decoder.num_decoded_frame_configs ++// -------- func crc64.ecma_hasher.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_crc64__ecma_hasher__set_quirk( ++ wuffs_crc64__ecma_hasher* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func crc64.ecma_hasher.update ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__update( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } ++ ++ if (self->private_impl.f_state == 0u) { ++ self->private_impl.choosy_up = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc64__ecma_hasher__up_x86_sse42 : ++#endif ++ self->private_impl.choosy_up); ++ } ++ wuffs_crc64__ecma_hasher__up(self, a_x); ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func crc64.ecma_hasher.update_u64 + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gif__decoder__num_decoded_frame_configs( +- const wuffs_gif__decoder* self) { ++wuffs_crc64__ecma_hasher__update_u64( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { + return 0; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return 0; + } + +- return self->private_impl.f_num_decoded_frame_configs_value; ++ wuffs_crc64__ecma_hasher__update(self, a_x); ++ return wuffs_crc64__ecma_hasher__checksum_u64(self); + } + +-// -------- func gif.decoder.num_decoded_frames ++// -------- func crc64.ecma_hasher.up ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ return (*self->private_impl.choosy_up)(self, a_x); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up__choosy_default( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint64_t v_s = 0; ++ wuffs_base__slice_u8 v_p = {0}; ++ ++ v_s = (18446744073709551615u ^ self->private_impl.f_state); ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 8; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8)); ++ while (v_p.ptr < i_end0_p) { ++ v_s ^= ((((uint64_t)(v_p.ptr[0u])) << 0u) | ++ (((uint64_t)(v_p.ptr[1u])) << 8u) | ++ (((uint64_t)(v_p.ptr[2u])) << 16u) | ++ (((uint64_t)(v_p.ptr[3u])) << 24u) | ++ (((uint64_t)(v_p.ptr[4u])) << 32u) | ++ (((uint64_t)(v_p.ptr[5u])) << 40u) | ++ (((uint64_t)(v_p.ptr[6u])) << 48u) | ++ (((uint64_t)(v_p.ptr[7u])) << 56u)); ++ v_s = (WUFFS_CRC64__ECMA_TABLE[0u][(255u & (v_s >> 56u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[1u][(255u & (v_s >> 48u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[2u][(255u & (v_s >> 40u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[3u][(255u & (v_s >> 32u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[4u][(255u & (v_s >> 24u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[5u][(255u & (v_s >> 16u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[6u][(255u & (v_s >> 8u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[7u][(255u & (v_s >> 0u))]); ++ v_p.ptr += 8; ++ } ++ v_p.len = 1; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end1_p) { ++ v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u)); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; ++ } ++ self->private_impl.f_state = (18446744073709551615u ^ v_s); ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func crc64.ecma_hasher.checksum_u64 + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gif__decoder__num_decoded_frames( +- const wuffs_gif__decoder* self) { ++wuffs_crc64__ecma_hasher__checksum_u64( ++ const wuffs_crc64__ecma_hasher* self) { + if (!self) { + return 0; + } +@@ -37176,72 +38101,473 @@ wuffs_gif__decoder__num_decoded_frames( + return 0; + } + +- return self->private_impl.f_num_decoded_frames_value; ++ return self->private_impl.f_state; + } + +-// -------- func gif.decoder.frame_dirty_rect ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func crc64.ecma_hasher.up_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_gif__decoder__frame_dirty_rect( +- const wuffs_gif__decoder* self) { ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up_x86_sse42( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint64_t v_s = 0; ++ wuffs_base__slice_u8 v_p = {0}; ++ uint8_t v_buf[48] = {0}; ++ __m128i v_xa = {0}; ++ __m128i v_xb = {0}; ++ __m128i v_xc = {0}; ++ __m128i v_xd = {0}; ++ __m128i v_xe = {0}; ++ __m128i v_xf = {0}; ++ __m128i v_xg = {0}; ++ __m128i v_xh = {0}; ++ __m128i v_mu1 = {0}; ++ __m128i v_mu2 = {0}; ++ __m128i v_mu4 = {0}; ++ __m128i v_mu8 = {0}; ++ __m128i v_mupx = {0}; ++ ++ v_s = (18446744073709551615u ^ self->private_impl.f_state); ++ while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { ++ v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); ++ } ++ do { ++ do { ++ if (((uint64_t)(a_x.len)) >= 128u) { ++ } else if (((uint64_t)(a_x.len)) >= 64u) { ++ v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s))); ++ v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); ++ v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)); ++ v_xd = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 64u); ++ break; ++ } else if (((uint64_t)(a_x.len)) >= 32u) { ++ v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s))); ++ v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 32u); ++ goto label__chain2__break; ++ } else { ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 1; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end0_p) { ++ v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u)); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; ++ } ++ self->private_impl.f_state = (18446744073709551615u ^ v_s); ++ return wuffs_base__make_empty_struct(); ++ } ++ v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s))); ++ v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); ++ v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)); ++ v_xd = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)); ++ v_xe = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u)); ++ v_xf = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u)); ++ v_xg = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u)); ++ v_xh = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u); ++ v_mu8 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD8)); ++ while (((uint64_t)(a_x.len)) >= 128u) { ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u))); ++ v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u))); ++ v_xc = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xc, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xc, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u))); ++ v_xd = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xd, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xd, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u))); ++ v_xe = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xe, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xe, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u))); ++ v_xf = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xf, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xf, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u))); ++ v_xg = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xg, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xg, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u))); ++ v_xh = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xh, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xh, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u); ++ } ++ v_mu4 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD4)); ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu4, (int32_t)(17u))), v_xe); ++ v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu4, (int32_t)(17u))), v_xf); ++ v_xc = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xc, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xc, v_mu4, (int32_t)(17u))), v_xg); ++ v_xd = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xd, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xd, v_mu4, (int32_t)(17u))), v_xh); ++ if (((uint64_t)(a_x.len)) > 64u) { ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu4, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u))); ++ v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu4, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u))); ++ v_xc = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xc, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xc, v_mu4, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u))); ++ v_xd = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xd, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xd, v_mu4, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 64u); ++ } ++ } while (0); ++ v_mu2 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD2)); ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(17u))), v_xc); ++ v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu2, (int32_t)(17u))), v_xd); ++ if (((uint64_t)(a_x.len)) > 32u) { ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u))); ++ v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu2, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 32u); ++ } ++ } while (0); ++ label__chain2__break:; ++ v_mu1 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD1)); ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu1, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu1, (int32_t)(17u))), v_xb); ++ if (((uint64_t)(a_x.len)) > 24u) { ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu1, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu1, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 16u); ++ if (((uint64_t)(a_x.len)) > 24u) { ++ return wuffs_base__make_empty_struct(); ++ } ++ } ++ _mm_storeu_si128((__m128i*)(void*)(v_buf + (24u - ((uint64_t)(a_x.len)))), v_xa); ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(v_buf, ((24u - ((uint64_t)(a_x.len))) + 16u), 48), a_x); ++ v_mu2 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD2)); ++ v_xa = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 0u)); ++ v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 16u)); ++ v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 32u)); ++ v_xd = _mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(17u))); ++ v_xe = _mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu1, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu1, (int32_t)(17u))); ++ v_xa = _mm_xor_si128(v_xd, _mm_xor_si128(v_xe, v_xc)); ++ v_mupx = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_MUPX)); ++ v_xb = _mm_clmulepi64_si128(v_xa, v_mupx, (int32_t)(0u)); ++ v_xc = _mm_clmulepi64_si128(v_xb, v_mupx, (int32_t)(16u)); ++ v_s = ((uint64_t)(_mm_extract_epi64(_mm_xor_si128(_mm_xor_si128(v_xc, _mm_slli_si128(v_xb, (int32_t)(8u))), v_xa), (int32_t)(1u)))); ++ self->private_impl.f_state = (18446744073709551615u ^ v_s); ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_deflate__error__bad_huffman_code_over_subscribed[] = "#deflate: bad Huffman code (over-subscribed)"; ++const char wuffs_deflate__error__bad_huffman_code_under_subscribed[] = "#deflate: bad Huffman code (under-subscribed)"; ++const char wuffs_deflate__error__bad_huffman_code_length_count[] = "#deflate: bad Huffman code length count"; ++const char wuffs_deflate__error__bad_huffman_code_length_repetition[] = "#deflate: bad Huffman code length repetition"; ++const char wuffs_deflate__error__bad_huffman_code[] = "#deflate: bad Huffman code"; ++const char wuffs_deflate__error__bad_huffman_minimum_code_length[] = "#deflate: bad Huffman minimum code length"; ++const char wuffs_deflate__error__bad_block[] = "#deflate: bad block"; ++const char wuffs_deflate__error__bad_distance[] = "#deflate: bad distance"; ++const char wuffs_deflate__error__bad_distance_code_count[] = "#deflate: bad distance code count"; ++const char wuffs_deflate__error__bad_literal_length_code_count[] = "#deflate: bad literal/length code count"; ++const char wuffs_deflate__error__inconsistent_stored_block_length[] = "#deflate: inconsistent stored block length"; ++const char wuffs_deflate__error__missing_end_of_block_code[] = "#deflate: missing end-of-block code"; ++const char wuffs_deflate__error__no_huffman_codes[] = "#deflate: no Huffman codes"; ++const char wuffs_deflate__error__truncated_input[] = "#deflate: truncated input"; ++const char wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state[] = "#deflate: internal error: inconsistent Huffman decoder state"; ++const char wuffs_deflate__error__internal_error_inconsistent_i_o[] = "#deflate: internal error: inconsistent I/O"; ++const char wuffs_deflate__error__internal_error_inconsistent_distance[] = "#deflate: internal error: inconsistent distance"; ++const char wuffs_deflate__error__internal_error_inconsistent_n_bits[] = "#deflate: internal error: inconsistent n_bits"; ++ ++// ---------------- Private Consts ++ ++static const uint8_t ++WUFFS_DEFLATE__CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 16u, 17u, 18u, 0u, 8u, 7u, 9u, 6u, ++ 10u, 5u, 11u, 4u, 12u, 3u, 13u, 2u, ++ 14u, 1u, 15u, ++}; ++ ++static const uint8_t ++WUFFS_DEFLATE__REVERSE8[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 128u, 64u, 192u, 32u, 160u, 96u, 224u, ++ 16u, 144u, 80u, 208u, 48u, 176u, 112u, 240u, ++ 8u, 136u, 72u, 200u, 40u, 168u, 104u, 232u, ++ 24u, 152u, 88u, 216u, 56u, 184u, 120u, 248u, ++ 4u, 132u, 68u, 196u, 36u, 164u, 100u, 228u, ++ 20u, 148u, 84u, 212u, 52u, 180u, 116u, 244u, ++ 12u, 140u, 76u, 204u, 44u, 172u, 108u, 236u, ++ 28u, 156u, 92u, 220u, 60u, 188u, 124u, 252u, ++ 2u, 130u, 66u, 194u, 34u, 162u, 98u, 226u, ++ 18u, 146u, 82u, 210u, 50u, 178u, 114u, 242u, ++ 10u, 138u, 74u, 202u, 42u, 170u, 106u, 234u, ++ 26u, 154u, 90u, 218u, 58u, 186u, 122u, 250u, ++ 6u, 134u, 70u, 198u, 38u, 166u, 102u, 230u, ++ 22u, 150u, 86u, 214u, 54u, 182u, 118u, 246u, ++ 14u, 142u, 78u, 206u, 46u, 174u, 110u, 238u, ++ 30u, 158u, 94u, 222u, 62u, 190u, 126u, 254u, ++ 1u, 129u, 65u, 193u, 33u, 161u, 97u, 225u, ++ 17u, 145u, 81u, 209u, 49u, 177u, 113u, 241u, ++ 9u, 137u, 73u, 201u, 41u, 169u, 105u, 233u, ++ 25u, 153u, 89u, 217u, 57u, 185u, 121u, 249u, ++ 5u, 133u, 69u, 197u, 37u, 165u, 101u, 229u, ++ 21u, 149u, 85u, 213u, 53u, 181u, 117u, 245u, ++ 13u, 141u, 77u, 205u, 45u, 173u, 109u, 237u, ++ 29u, 157u, 93u, 221u, 61u, 189u, 125u, 253u, ++ 3u, 131u, 67u, 195u, 35u, 163u, 99u, 227u, ++ 19u, 147u, 83u, 211u, 51u, 179u, 115u, 243u, ++ 11u, 139u, 75u, 203u, 43u, 171u, 107u, 235u, ++ 27u, 155u, 91u, 219u, 59u, 187u, 123u, 251u, ++ 7u, 135u, 71u, 199u, 39u, 167u, 103u, 231u, ++ 23u, 151u, 87u, 215u, 55u, 183u, 119u, 247u, ++ 15u, 143u, 79u, 207u, 47u, 175u, 111u, 239u, ++ 31u, 159u, 95u, 223u, 63u, 191u, 127u, 255u, ++}; ++ ++static const uint32_t ++WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1073741824u, 1073742080u, 1073742336u, 1073742592u, 1073742848u, 1073743104u, 1073743360u, 1073743616u, ++ 1073743888u, 1073744400u, 1073744912u, 1073745424u, 1073745952u, 1073746976u, 1073748000u, 1073749024u, ++ 1073750064u, 1073752112u, 1073754160u, 1073756208u, 1073758272u, 1073762368u, 1073766464u, 1073770560u, ++ 1073774672u, 1073782864u, 1073791056u, 1073799248u, 1073807104u, 134217728u, 134217728u, 134217728u, ++}; ++ ++static const uint32_t ++WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1073741824u, 1073742080u, 1073742336u, 1073742592u, 1073742864u, 1073743376u, 1073743904u, 1073744928u, ++ 1073745968u, 1073748016u, 1073750080u, 1073754176u, 1073758288u, 1073766480u, 1073774688u, 1073791072u, ++ 1073807472u, 1073840240u, 1073873024u, 1073938560u, 1074004112u, 1074135184u, 1074266272u, 1074528416u, ++ 1074790576u, 1075314864u, 1075839168u, 1076887744u, 1077936336u, 1080033488u, 134217728u, 134217728u, ++}; ++ ++#define WUFFS_DEFLATE__HUFFS_TABLE_SIZE 1024u ++ ++#define WUFFS_DEFLATE__HUFFS_TABLE_MASK 1023u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__do_transform_io( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_blocks( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_uncompressed( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__init_fixed_huffman( ++ wuffs_deflate__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__init_dynamic_huffman( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__init_huff( ++ wuffs_deflate__decoder* self, ++ uint32_t a_which, ++ uint32_t a_n_codes0, ++ uint32_t a_n_codes1, ++ uint32_t a_base_symbol); ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_bmi2( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_fast32( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_fast64( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_slow( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_deflate__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_deflate__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_deflate__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_deflate__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_deflate__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_deflate__decoder__initialize( ++ wuffs_deflate__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ + if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + +- return wuffs_base__utility__make_rect_ie_u32( +- wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width), +- wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height), +- wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width), +- wuffs_base__u32__min(self->private_impl.f_dirty_max_excl_y, self->private_impl.f_height)); ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.choosy_decode_huffman_fast64 = &wuffs_deflate__decoder__decode_huffman_fast64__choosy_default; ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_deflate__decoder* ++wuffs_deflate__decoder__alloc(void) { ++ wuffs_deflate__decoder* x = ++ (wuffs_deflate__decoder*)(calloc(1, sizeof(wuffs_deflate__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_deflate__decoder__initialize( ++ x, sizeof(wuffs_deflate__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_deflate__decoder(void) { ++ return sizeof(wuffs_deflate__decoder); + } + +-// -------- func gif.decoder.history_retain_length ++// ---------------- Function Implementations ++ ++// -------- func deflate.decoder.add_history + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gif__decoder__history_retain_length( +- const wuffs_gif__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_deflate__decoder__add_history( ++ wuffs_deflate__decoder* self, ++ wuffs_base__slice_u8 a_hist) { + if (!self) { +- return 0; ++ return wuffs_base__make_empty_struct(); + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); + } + +- return 0u; ++ wuffs_base__slice_u8 v_s = {0}; ++ uint64_t v_n_copied = 0; ++ uint32_t v_already_full = 0; ++ ++ v_s = a_hist; ++ if (((uint64_t)(v_s.len)) >= 32768u) { ++ v_s = wuffs_private_impl__slice_u8__suffix(v_s, 32768u); ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s); ++ self->private_impl.f_history_index = 32768u; ++ } else { ++ v_n_copied = wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, (self->private_impl.f_history_index & 32767u), 32768), v_s); ++ if (v_n_copied < ((uint64_t)(v_s.len))) { ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, v_n_copied); ++ v_n_copied = wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s); ++ self->private_impl.f_history_index = (((uint32_t)((v_n_copied & 32767u))) + 32768u); ++ } else { ++ v_already_full = 0u; ++ if (self->private_impl.f_history_index >= 32768u) { ++ v_already_full = 32768u; ++ } ++ self->private_impl.f_history_index = ((self->private_impl.f_history_index & 32767u) + ((uint32_t)((v_n_copied & 32767u))) + v_already_full); ++ } ++ } ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, 32768, 33025), wuffs_base__make_slice_u8(self->private_data.f_history, 33025)); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func gif.decoder.workbuf_len ++// -------- func deflate.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_gif__decoder__workbuf_len( +- const wuffs_gif__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_deflate__decoder__get_quirk( ++ const wuffs_deflate__decoder* self, ++ uint32_t a_key) { + if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ return 0; + } + +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ return 0u; + } + +-// -------- func gif.decoder.restart_frame ++// -------- func deflate.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__restart_frame( +- wuffs_gif__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { ++wuffs_deflate__decoder__set_quirk( ++ wuffs_deflate__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -37252,28 +38578,52 @@ wuffs_gif__decoder__restart_frame( + : wuffs_base__error__initialize_not_called); + } + +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } else if (a_io_position == 0u) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func deflate.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_deflate__decoder__dst_history_retain_length( ++ const wuffs_deflate__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); + } +- self->private_impl.f_delayed_num_decoded_frames = false; +- self->private_impl.f_frame_config_io_position = a_io_position; +- self->private_impl.f_num_decoded_frame_configs_value = a_index; +- self->private_impl.f_num_decoded_frames_value = a_index; +- wuffs_gif__decoder__reset_gc(self); +- self->private_impl.f_call_sequence = 40u; +- return wuffs_base__make_status(NULL); ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_base__utility__make_optional_u63(true, 0u); + } + +-// -------- func gif.decoder.decode_frame_config ++// -------- func deflate.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_deflate__decoder__workbuf_len( ++ const wuffs_deflate__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++} ++ ++// -------- func deflate.decoder.transform_io + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__decode_frame_config( +- wuffs_gif__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++wuffs_deflate__decoder__transform_io( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -37283,12 +38633,12 @@ wuffs_gif__decoder__decode_frame_config( + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } +- if (!a_src) { ++ if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { ++ (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -37297,17 +38647,17 @@ wuffs_gif__decoder__decode_frame_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame_config(self, a_dst, a_src); ++ wuffs_base__status t_0 = wuffs_deflate__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_gif__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_deflate__error__truncated_input); + goto exit; + } + status = v_status; +@@ -37315,14 +38665,14 @@ wuffs_gif__decoder__decode_frame_config( + } + + ok: +- self->private_impl.p_decode_frame_config[0] = 0; ++ self->private_impl.p_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: +@@ -37332,403 +38682,103 @@ wuffs_gif__decoder__decode_frame_config( + return status; + } + +-// -------- func gif.decoder.do_decode_frame_config ++// -------- func deflate.decoder.do_transform_io + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__do_decode_frame_config( +- wuffs_gif__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++wuffs_deflate__decoder__do_transform_io( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_background_color = 0; +- uint8_t v_flags = 0; ++ uint64_t v_mark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; +- if (coro_susp_point) { +- v_background_color = self->private_data.s_do_decode_frame_config[0].v_background_color; +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- self->private_impl.f_dirty_max_excl_y = 0u; +- if ((self->private_impl.f_call_sequence & 16u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ self->private_impl.choosy_decode_huffman_fast64 = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++ wuffs_base__cpu_arch__have_x86_bmi2() ? &wuffs_deflate__decoder__decode_huffman_bmi2 : ++#endif ++ self->private_impl.choosy_decode_huffman_fast64); ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ wuffs_base__status t_0 = wuffs_deflate__decoder__decode_blocks(self, a_dst, a_src); ++ v_status = t_0; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_gif__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; +- } +- } else if (self->private_impl.f_call_sequence == 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_gif__decoder__skip_frame(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_call_sequence >= 96u) { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- if ((self->private_impl.f_num_decoded_frame_configs_value > 0u) || (self->private_impl.f_call_sequence == 40u)) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_call_sequence >= 96u) { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- } +- v_background_color = self->private_impl.f_black_color_u32_argb_premul; +- if ( ! self->private_impl.f_gc_has_transparent_index) { +- v_background_color = self->private_impl.f_background_color_u32_argb_premul; +- if (self->private_impl.f_quirks[1u] && (self->private_impl.f_num_decoded_frame_configs_value == 0u)) { +- while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- } +- v_flags = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if ((v_flags & 128u) != 0u) { +- v_background_color = self->private_impl.f_black_color_u32_argb_premul; ++ if ( ! wuffs_base__status__is_suspension(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; + } ++ goto ok; + } +- } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width), +- wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height), +- wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width), +- wuffs_base__u32__min(self->private_impl.f_frame_rect_y1, self->private_impl.f_height)), +- ((wuffs_base__flicks)(self->private_impl.f_gc_duration)), +- self->private_impl.f_num_decoded_frame_configs_value, +- self->private_impl.f_frame_config_io_position, +- self->private_impl.f_gc_disposal, +- ! self->private_impl.f_gc_has_transparent_index, +- false, +- v_background_color); +- } +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u); +- self->private_impl.f_call_sequence = 64u; +- +- ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_frame_config[0].v_background_color = v_background_color; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func gif.decoder.skip_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__skip_frame( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_flags = 0; +- uint8_t v_lw = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_skip_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_flags = t_0; +- } +- if ((v_flags & 128u) != 0u) { +- self->private_data.s_skip_frame[0].scratch = (((uint32_t)(3u)) << (1u + (v_flags & 7u))); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_skip_frame[0].scratch; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_lw = t_1; +- } +- if (v_lw > 8u) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- status = wuffs_gif__decoder__skip_blocks(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_quirks[0u]) { +- self->private_impl.f_delayed_num_decoded_frames = true; +- } else { +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); +- } +- wuffs_gif__decoder__reset_gc(self); +- self->private_impl.f_call_sequence = 32u; +- +- goto ok; +- ok: +- self->private_impl.p_skip_frame[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_skip_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func gif.decoder.decode_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__decode_frame( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_gif__error__truncated_input); +- goto exit; +- } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_transformed_history_count, wuffs_private_impl__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)))); ++ wuffs_deflate__decoder__add_history(self, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: +- self->private_impl.p_decode_frame[0] = 0; ++ self->private_impl.p_do_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} +- +-// -------- func gif.decoder.do_decode_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_decode_frame( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_gif__decoder__do_decode_frame_config(self, NULL, a_src); +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- if (self->private_impl.f_quirks[5u] && ((self->private_impl.f_frame_rect_x0 == self->private_impl.f_frame_rect_x1) || (self->private_impl.f_frame_rect_y0 == self->private_impl.f_frame_rect_y1))) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_frame_size); +- goto exit; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_gif__decoder__decode_id_part1(self, a_dst, a_src, a_blend); +- if (status.repr) { +- goto suspend; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_gif__decoder__decode_id_part2(self, a_dst, a_src, a_workbuf); +- if (status.repr) { +- goto suspend; +- } +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); +- wuffs_gif__decoder__reset_gc(self); +- self->private_impl.f_call_sequence = 32u; +- +- ok: +- self->private_impl.p_do_decode_frame[0] = 0; +- goto exit; ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: + return status; + } + +-// -------- func gif.decoder.reset_gc +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_gif__decoder__reset_gc( +- wuffs_gif__decoder* self) { +- self->private_impl.f_gc_has_transparent_index = false; +- self->private_impl.f_gc_transparent_index = 0u; +- self->private_impl.f_gc_disposal = 0u; +- self->private_impl.f_gc_duration = 0u; +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func gif.decoder.decode_up_to_id_part1 ++// -------- func deflate.decoder.decode_blocks + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_up_to_id_part1( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__decode_blocks( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_block_type = 0; ++ uint32_t v_final = 0; ++ uint32_t v_b0 = 0; ++ uint32_t v_type = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -37741,71 +38791,125 @@ wuffs_gif__decoder__decode_up_to_id_part1( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_up_to_id_part1[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_blocks; ++ if (coro_susp_point) { ++ v_final = self->private_data.s_decode_blocks.v_final; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_frame_config_io_position == 0u) || (self->private_impl.f_num_decoded_frame_configs_value > 0u)) { +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ label__outer__continue:; ++ while (v_final == 0u) { ++ while (self->private_impl.f_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_0 = *iop_a_src++; ++ v_b0 = t_0; + } +- uint8_t t_0 = *iop_a_src++; +- v_block_type = t_0; ++ self->private_impl.f_bits |= (v_b0 << (self->private_impl.f_n_bits & 3u)); ++ self->private_impl.f_n_bits = ((self->private_impl.f_n_bits & 3u) + 8u); + } +- if (v_block_type == 33u) { ++ v_final = (self->private_impl.f_bits & 1u); ++ v_type = ((self->private_impl.f_bits >> 1u) & 3u); ++ self->private_impl.f_bits >>= 3u; ++ self->private_impl.f_n_bits -= 3u; ++ if (v_type == 0u) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_gif__decoder__decode_extension(self, a_src); ++ status = wuffs_deflate__decoder__decode_uncompressed(self, a_dst, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } +- } else if (v_block_type == 44u) { +- if (self->private_impl.f_delayed_num_decoded_frames) { +- self->private_impl.f_delayed_num_decoded_frames = false; +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ continue; ++ } else if (v_type == 1u) { ++ v_status = wuffs_deflate__decoder__init_fixed_huffman(self); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; + } ++ } else if (v_type == 2u) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_gif__decoder__decode_id_part0(self, a_src); ++ status = wuffs_deflate__decoder__init_dynamic_huffman(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } +- break; + } else { +- if (self->private_impl.f_delayed_num_decoded_frames) { +- self->private_impl.f_delayed_num_decoded_frames = false; +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_block); ++ goto exit; ++ } ++ self->private_impl.f_end_of_block = false; ++ while (true) { ++ if (sizeof(void*) == 4u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_deflate__decoder__decode_huffman_fast32(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } else { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_deflate__decoder__decode_huffman_fast64(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; ++ } ++ if (self->private_impl.f_end_of_block) { ++ goto label__outer__continue; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_deflate__decoder__decode_huffman_slow(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_end_of_block) { ++ goto label__outer__continue; + } +- self->private_impl.f_call_sequence = 96u; +- break; + } + } + +- goto ok; + ok: +- self->private_impl.p_decode_up_to_id_part1[0] = 0; ++ self->private_impl.p_decode_blocks = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_up_to_id_part1[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_blocks = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_blocks.v_final = v_final; + + goto exit; + exit: +@@ -37816,18 +38920,32 @@ wuffs_gif__decoder__decode_up_to_id_part1( + return status; + } + +-// -------- func gif.decoder.decode_header ++// -------- func deflate.decoder.decode_uncompressed + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_header( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__decode_uncompressed( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c[6] = {0}; +- uint32_t v_i = 0; ++ uint32_t v_length = 0; ++ uint32_t v_n_copied = 0; + ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -37839,50 +38957,85 @@ wuffs_gif__decoder__decode_header( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_header[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_uncompressed; + if (coro_susp_point) { +- memcpy(v_c, self->private_data.s_decode_header[0].v_c, sizeof(v_c)); +- v_i = self->private_data.s_decode_header[0].v_i; ++ v_length = self->private_data.s_decode_uncompressed.v_length; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- while (v_i < 6u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_n_bits = 0u; ++ self->private_impl.f_bits = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_uncompressed.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_uncompressed.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; + } +- uint8_t t_0 = *iop_a_src++; +- v_c[v_i] = t_0; + } +- v_i += 1u; ++ v_length = t_0; + } +- if ((v_c[0u] != 71u) || +- (v_c[1u] != 73u) || +- (v_c[2u] != 70u) || +- (v_c[3u] != 56u) || +- ((v_c[4u] != 55u) && (v_c[4u] != 57u)) || +- (v_c[5u] != 97u)) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_header); ++ if ((((v_length) & 0xFFFFu) + ((v_length) >> (32u - 16u))) != 65535u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__inconsistent_stored_block_length); + goto exit; + } ++ v_length = ((v_length) & 0xFFFFu); ++ while (true) { ++ v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_reader( ++ &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src); ++ if (v_length <= v_n_copied) { ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ v_length -= v_n_copied; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ } else { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ } ++ } + +- goto ok; + ok: +- self->private_impl.p_decode_header[0] = 0; ++ self->private_impl.p_decode_uncompressed = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_header[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- memcpy(self->private_data.s_decode_header[0].v_c, v_c, sizeof(v_c)); +- self->private_data.s_decode_header[0].v_i = v_i; ++ self->private_impl.p_decode_uncompressed = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_uncompressed.v_length = v_length; + + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -37890,21 +39043,80 @@ wuffs_gif__decoder__decode_header( + return status; + } + +-// -------- func gif.decoder.decode_lsd ++// -------- func deflate.decoder.init_fixed_huffman + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_lsd( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__init_fixed_huffman( ++ wuffs_deflate__decoder* self) { ++ uint32_t v_i = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ while (v_i < 144u) { ++ self->private_data.f_code_lengths[v_i] = 8u; ++ v_i += 1u; ++ } ++ while (v_i < 256u) { ++ self->private_data.f_code_lengths[v_i] = 9u; ++ v_i += 1u; ++ } ++ while (v_i < 280u) { ++ self->private_data.f_code_lengths[v_i] = 7u; ++ v_i += 1u; ++ } ++ while (v_i < 288u) { ++ self->private_data.f_code_lengths[v_i] = 8u; ++ v_i += 1u; ++ } ++ while (v_i < 320u) { ++ self->private_data.f_code_lengths[v_i] = 5u; ++ v_i += 1u; ++ } ++ v_status = wuffs_deflate__decoder__init_huff(self, ++ 0u, ++ 0u, ++ 288u, ++ 257u); ++ if (wuffs_base__status__is_error(&v_status)) { ++ return v_status; ++ } ++ v_status = wuffs_deflate__decoder__init_huff(self, ++ 1u, ++ 288u, ++ 320u, ++ 0u); ++ if (wuffs_base__status__is_error(&v_status)) { ++ return v_status; ++ } ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func deflate.decoder.init_dynamic_huffman ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__init_dynamic_huffman( ++ wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_flags = 0; +- uint8_t v_background_color_index = 0; +- uint32_t v_num_palette_entries = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_b0 = 0; ++ uint32_t v_n_lit = 0; ++ uint32_t v_n_dist = 0; ++ uint32_t v_n_clen = 0; + uint32_t v_i = 0; +- uint32_t v_j = 0; +- uint32_t v_argb = 0; ++ uint32_t v_b1 = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_mask = 0; ++ uint32_t v_table_entry = 0; ++ uint32_t v_table_entry_n_bits = 0; ++ uint32_t v_b2 = 0; ++ uint32_t v_n_extra_bits = 0; ++ uint8_t v_rep_symbol = 0; ++ uint32_t v_rep_count = 0; ++ uint32_t v_b3 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -37917,172 +39129,215 @@ wuffs_gif__decoder__decode_lsd( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_lsd[0]; ++ uint32_t coro_susp_point = self->private_impl.p_init_dynamic_huffman; + if (coro_susp_point) { +- v_flags = self->private_data.s_decode_lsd[0].v_flags; +- v_background_color_index = self->private_data.s_decode_lsd[0].v_background_color_index; +- v_num_palette_entries = self->private_data.s_decode_lsd[0].v_num_palette_entries; +- v_i = self->private_data.s_decode_lsd[0].v_i; ++ v_bits = self->private_data.s_init_dynamic_huffman.v_bits; ++ v_n_bits = self->private_data.s_init_dynamic_huffman.v_n_bits; ++ v_n_lit = self->private_data.s_init_dynamic_huffman.v_n_lit; ++ v_n_dist = self->private_data.s_init_dynamic_huffman.v_n_dist; ++ v_n_clen = self->private_data.s_init_dynamic_huffman.v_n_clen; ++ v_i = self->private_data.s_init_dynamic_huffman.v_i; ++ v_mask = self->private_data.s_init_dynamic_huffman.v_mask; ++ v_n_extra_bits = self->private_data.s_init_dynamic_huffman.v_n_extra_bits; ++ v_rep_symbol = self->private_data.s_init_dynamic_huffman.v_rep_symbol; ++ v_rep_count = self->private_data.s_init_dynamic_huffman.v_rep_count; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_lsd[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { ++ v_bits = self->private_impl.f_bits; ++ v_n_bits = self->private_impl.f_n_bits; ++ while (v_n_bits < 14u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_0 = *iop_a_src++; ++ v_b0 = t_0; ++ } ++ v_bits |= (v_b0 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ v_n_lit = (((v_bits) & 0x1Fu) + 257u); ++ if (v_n_lit > 286u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_literal_length_code_count); ++ goto exit; ++ } ++ v_bits >>= 5u; ++ v_n_dist = (((v_bits) & 0x1Fu) + 1u); ++ if (v_n_dist > 30u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance_code_count); ++ goto exit; ++ } ++ v_bits >>= 5u; ++ v_n_clen = (((v_bits) & 0xFu) + 4u); ++ v_bits >>= 4u; ++ v_n_bits -= 14u; ++ v_i = 0u; ++ while (v_i < v_n_clen) { ++ while (v_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_lsd[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 8) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ uint32_t t_1 = *iop_a_src++; ++ v_b1 = t_1; + } ++ v_bits |= (v_b1 << v_n_bits); ++ v_n_bits += 8u; + } +- self->private_impl.f_width = t_0; ++ self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = ((uint8_t)((v_bits & 7u))); ++ v_bits >>= 3u; ++ v_n_bits -= 3u; ++ v_i += 1u; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_lsd[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { ++ while (v_i < 19u) { ++ self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = 0u; ++ v_i += 1u; ++ } ++ v_status = wuffs_deflate__decoder__init_huff(self, ++ 0u, ++ 0u, ++ 19u, ++ 4095u); ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; ++ } ++ v_mask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); ++ v_i = 0u; ++ while (v_i < (v_n_lit + v_n_dist)) { ++ while (true) { ++ v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_mask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ if (v_n_bits >= v_table_entry_n_bits) { ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_lsd[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 8) { +- t_1 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ uint32_t t_2 = *iop_a_src++; ++ v_b2 = t_2; + } ++ v_bits |= (v_b2 << v_n_bits); ++ v_n_bits += 8u; + } +- self->private_impl.f_height = t_1; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if ((v_table_entry >> 24u) != 128u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- uint8_t t_2 = *iop_a_src++; +- v_flags = t_2; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_table_entry = ((v_table_entry >> 8u) & 255u); ++ if (v_table_entry < 16u) { ++ self->private_data.f_code_lengths[v_i] = ((uint8_t)(v_table_entry)); ++ v_i += 1u; ++ continue; + } +- uint8_t t_3 = *iop_a_src++; +- v_background_color_index = t_3; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src++; +- v_i = 0u; +- self->private_impl.f_has_global_palette = ((v_flags & 128u) != 0u); +- if (self->private_impl.f_has_global_palette) { +- v_num_palette_entries = (((uint32_t)(1u)) << (1u + (v_flags & 7u))); +- while (v_i < v_num_palette_entries) { ++ v_n_extra_bits = 0u; ++ v_rep_symbol = 0u; ++ v_rep_count = 0u; ++ if (v_table_entry == 16u) { ++ v_n_extra_bits = 2u; ++ if (v_i <= 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_repetition); ++ goto exit; ++ } ++ v_rep_symbol = ((uint8_t)(self->private_data.f_code_lengths[(v_i - 1u)] & 15u)); ++ v_rep_count = 3u; ++ } else if (v_table_entry == 17u) { ++ v_n_extra_bits = 3u; ++ v_rep_symbol = 0u; ++ v_rep_count = 3u; ++ } else if (v_table_entry == 18u) { ++ v_n_extra_bits = 7u; ++ v_rep_symbol = 0u; ++ v_rep_count = 11u; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } ++ while (v_n_bits < v_n_extra_bits) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { +- t_4 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); +- iop_a_src += 3; +- } else { +- self->private_data.s_decode_lsd[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_lsd[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); +- if (num_bits_4 == 16) { +- t_4 = ((uint32_t)(*scratch >> 40)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)); +- } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_argb = t_4; ++ uint32_t t_3 = *iop_a_src++; ++ v_b3 = t_3; + } +- v_argb |= 4278190080u; +- self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); +- self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); +- self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); +- self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); +- v_i += 1u; ++ v_bits |= (v_b3 << v_n_bits); ++ v_n_bits += 8u; + } +- if (self->private_impl.f_quirks[2u]) { +- if ((v_background_color_index != 0u) && (((uint32_t)(v_background_color_index)) < v_num_palette_entries)) { +- v_j = (4u * ((uint32_t)(v_background_color_index))); +- self->private_impl.f_background_color_u32_argb_premul = ((((uint32_t)(self->private_data.f_palettes[0u][(v_j + 0u)])) << 0u) | +- (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 1u)])) << 8u) | +- (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 2u)])) << 16u) | +- (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 3u)])) << 24u)); +- } else { +- self->private_impl.f_background_color_u32_argb_premul = 77u; ++ v_rep_count += ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_n_extra_bits)); ++ v_bits >>= v_n_extra_bits; ++ v_n_bits -= v_n_extra_bits; ++ while (v_rep_count > 0u) { ++ if (v_i >= (v_n_lit + v_n_dist)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count); ++ goto exit; + } ++ self->private_data.f_code_lengths[v_i] = v_rep_symbol; ++ v_i += 1u; ++ v_rep_count -= 1u; + } + } +- while (v_i < 256u) { +- self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = 0u; +- self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = 0u; +- self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = 0u; +- self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = 255u; +- v_i += 1u; ++ if (v_i != (v_n_lit + v_n_dist)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count); ++ goto exit; ++ } ++ if (self->private_data.f_code_lengths[256u] == 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__missing_end_of_block_code); ++ goto exit; ++ } ++ v_status = wuffs_deflate__decoder__init_huff(self, ++ 0u, ++ 0u, ++ v_n_lit, ++ 257u); ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; ++ } ++ v_status = wuffs_deflate__decoder__init_huff(self, ++ 1u, ++ v_n_lit, ++ (v_n_lit + v_n_dist), ++ 0u); ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; + } ++ self->private_impl.f_bits = v_bits; ++ self->private_impl.f_n_bits = v_n_bits; + + goto ok; + ok: +- self->private_impl.p_decode_lsd[0] = 0; ++ self->private_impl.p_init_dynamic_huffman = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_lsd[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_lsd[0].v_flags = v_flags; +- self->private_data.s_decode_lsd[0].v_background_color_index = v_background_color_index; +- self->private_data.s_decode_lsd[0].v_num_palette_entries = v_num_palette_entries; +- self->private_data.s_decode_lsd[0].v_i = v_i; ++ self->private_impl.p_init_dynamic_huffman = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_init_dynamic_huffman.v_bits = v_bits; ++ self->private_data.s_init_dynamic_huffman.v_n_bits = v_n_bits; ++ self->private_data.s_init_dynamic_huffman.v_n_lit = v_n_lit; ++ self->private_data.s_init_dynamic_huffman.v_n_dist = v_n_dist; ++ self->private_data.s_init_dynamic_huffman.v_n_clen = v_n_clen; ++ self->private_data.s_init_dynamic_huffman.v_i = v_i; ++ self->private_data.s_init_dynamic_huffman.v_mask = v_mask; ++ self->private_data.s_init_dynamic_huffman.v_n_extra_bits = v_n_extra_bits; ++ self->private_data.s_init_dynamic_huffman.v_rep_symbol = v_rep_symbol; ++ self->private_data.s_init_dynamic_huffman.v_rep_count = v_rep_count; + + goto exit; + exit: +@@ -38093,185 +39348,299 @@ wuffs_gif__decoder__decode_lsd( + return status; + } + +-// -------- func gif.decoder.decode_extension ++// -------- func deflate.decoder.init_huff + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_extension( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_label = 0; ++wuffs_deflate__decoder__init_huff( ++ wuffs_deflate__decoder* self, ++ uint32_t a_which, ++ uint32_t a_n_codes0, ++ uint32_t a_n_codes1, ++ uint32_t a_base_symbol) { ++ uint16_t v_counts[16] = {0}; ++ uint32_t v_i = 0; ++ uint32_t v_remaining = 0; ++ uint16_t v_offsets[16] = {0}; ++ uint32_t v_n_symbols = 0; ++ uint32_t v_count = 0; ++ uint16_t v_symbols[320] = {0}; ++ uint32_t v_min_cl = 0; ++ uint32_t v_max_cl = 0; ++ uint32_t v_initial_high_bits = 0; ++ uint32_t v_prev_cl = 0; ++ uint32_t v_prev_redirect_key = 0; ++ uint32_t v_top = 0; ++ uint32_t v_next_top = 0; ++ uint32_t v_code = 0; ++ uint32_t v_key = 0; ++ uint32_t v_value = 0; ++ uint32_t v_cl = 0; ++ uint32_t v_redirect_key = 0; ++ uint32_t v_j = 0; ++ uint32_t v_reversed_key = 0; ++ uint32_t v_symbol = 0; ++ uint32_t v_high_bits = 0; ++ uint32_t v_delta = 0; + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ v_i = a_n_codes0; ++ while (v_i < a_n_codes1) { ++ if (v_counts[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] >= 320u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_counts[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_i += 1u; + } +- +- uint32_t coro_susp_point = self->private_impl.p_decode_extension[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_label = t_0; ++ if ((((uint32_t)(v_counts[0u])) + a_n_codes0) == a_n_codes1) { ++ return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes); ++ } ++ v_remaining = 1u; ++ v_i = 1u; ++ while (v_i <= 15u) { ++ if (v_remaining > 1073741824u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +- if (v_label == 249u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_gif__decoder__decode_gc(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- status = wuffs_base__make_status(NULL); +- goto ok; +- } else if (v_label == 255u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_gif__decoder__decode_ae(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; ++ v_remaining <<= 1u; ++ if (v_remaining < ((uint32_t)(v_counts[v_i]))) { ++ return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_over_subscribed); ++ } ++ v_remaining -= ((uint32_t)(v_counts[v_i])); ++ v_i += 1u; ++ } ++ if (v_remaining != 0u) { ++ if ((a_which == 1u) && (v_counts[1u] == 1u) && ((((uint32_t)(v_counts[0u])) + a_n_codes0 + 1u) == a_n_codes1)) { ++ v_i = 0u; ++ while (v_i <= 29u) { ++ if (self->private_data.f_code_lengths[(a_n_codes0 + v_i)] == 1u) { ++ self->private_impl.f_n_huffs_bits[1u] = 1u; ++ self->private_data.f_huffs[1u][0u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[v_i] | 1u); ++ self->private_data.f_huffs[1u][1u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[31u] | 1u); ++ return wuffs_base__make_status(NULL); ++ } ++ v_i += 1u; + } +- status = wuffs_base__make_status(NULL); +- goto ok; + } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_under_subscribed); ++ } ++ v_i = 1u; ++ while (v_i <= 15u) { ++ v_offsets[v_i] = ((uint16_t)(v_n_symbols)); ++ v_count = ((uint32_t)(v_counts[v_i])); ++ if (v_n_symbols > (320u - v_count)) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- status = wuffs_gif__decoder__skip_blocks(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ v_n_symbols = (v_n_symbols + v_count); ++ v_i += 1u; ++ } ++ if (v_n_symbols > 288u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_i = a_n_codes0; ++ while (v_i < a_n_codes1) { ++ if (v_i < a_n_codes0) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +- if (status.repr) { +- goto suspend; ++ if (self->private_data.f_code_lengths[v_i] != 0u) { ++ if (v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] >= 320u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_symbols[v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))]] = ((uint16_t)((v_i - a_n_codes0))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif + } +- +- ok: +- self->private_impl.p_decode_extension[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_extension[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ v_i += 1u; + } +- +- return status; +-} +- +-// -------- func gif.decoder.skip_blocks +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__skip_blocks( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_block_size = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ v_min_cl = 1u; ++ while (true) { ++ if (v_counts[v_min_cl] != 0u) { ++ break; ++ } ++ if (v_min_cl >= 9u) { ++ return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_minimum_code_length); ++ } ++ v_min_cl += 1u; + } +- +- uint32_t coro_susp_point = self->private_impl.p_skip_blocks[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_max_cl = 15u; ++ while (true) { ++ if (v_counts[v_max_cl] != 0u) { ++ break; ++ } ++ if (v_max_cl <= 1u) { ++ return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes); ++ } ++ v_max_cl -= 1u; ++ } ++ if (v_max_cl <= 9u) { ++ self->private_impl.f_n_huffs_bits[a_which] = v_max_cl; ++ } else { ++ self->private_impl.f_n_huffs_bits[a_which] = 9u; ++ } ++ v_i = 0u; ++ if ((v_n_symbols != ((uint32_t)(v_offsets[v_max_cl]))) || (v_n_symbols != ((uint32_t)(v_offsets[15u])))) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ if ((a_n_codes0 + ((uint32_t)(v_symbols[0u]))) >= 320u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_initial_high_bits = 512u; ++ if (v_max_cl < 9u) { ++ v_initial_high_bits = (((uint32_t)(1u)) << v_max_cl); ++ } ++ v_prev_cl = ((uint32_t)(((uint8_t)(self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[0u])))] & 15u)))); ++ v_prev_redirect_key = 4294967295u; ++ v_top = 0u; ++ v_next_top = 512u; ++ v_code = 0u; ++ v_key = 0u; ++ v_value = 0u; ++ while (true) { ++ if ((a_n_codes0 + ((uint32_t)(v_symbols[v_i]))) >= 320u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_cl = ((uint32_t)(((uint8_t)(self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[v_i])))] & 15u)))); ++ if (v_cl > v_prev_cl) { ++ v_code <<= (v_cl - v_prev_cl); ++ if (v_code >= 32768u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ } ++ v_prev_cl = v_cl; ++ v_key = v_code; ++ if (v_cl > 9u) { ++ v_cl -= 9u; ++ v_redirect_key = ((v_key >> v_cl) & 511u); ++ v_key = ((v_key) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_cl)); ++ if (v_prev_redirect_key != v_redirect_key) { ++ v_prev_redirect_key = v_redirect_key; ++ v_remaining = (((uint32_t)(1u)) << v_cl); ++ v_j = v_prev_cl; ++ while (v_j <= 15u) { ++ if (v_remaining <= ((uint32_t)(v_counts[v_j]))) { ++ break; ++ } ++ v_remaining -= ((uint32_t)(v_counts[v_j])); ++ if (v_remaining > 1073741824u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_remaining <<= 1u; ++ v_j += 1u; + } +- uint8_t t_0 = *iop_a_src++; +- v_block_size = t_0; ++ if ((v_j <= 9u) || (15u < v_j)) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_j -= 9u; ++ v_initial_high_bits = (((uint32_t)(1u)) << v_j); ++ v_top = v_next_top; ++ if ((v_top + (((uint32_t)(1u)) << v_j)) > 1024u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_next_top = (v_top + (((uint32_t)(1u)) << v_j)); ++ v_redirect_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_redirect_key >> 1u)])) | ((v_redirect_key & 1u) << 8u)); ++ self->private_data.f_huffs[a_which][v_redirect_key] = (268435465u | (v_top << 8u) | (v_j << 4u)); + } +- if (v_block_size == 0u) { +- status = wuffs_base__make_status(NULL); +- goto ok; ++ } ++ if ((v_key >= 512u) || (v_counts[v_prev_cl] <= 0u)) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_counts[v_prev_cl] -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_reversed_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_key >> 1u)])) | ((v_key & 1u) << 8u)); ++ v_reversed_key >>= (9u - v_cl); ++ v_symbol = ((uint32_t)(v_symbols[v_i])); ++ if (v_symbol == 256u) { ++ v_value = (536870912u | v_cl); ++ } else if ((v_symbol < 256u) && (a_which == 0u)) { ++ v_value = (2147483648u | (v_symbol << 8u) | v_cl); ++ } else if (v_symbol >= a_base_symbol) { ++ v_symbol -= a_base_symbol; ++ if (a_which == 0u) { ++ v_value = (WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl); ++ } else { ++ v_value = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl); + } +- self->private_data.s_skip_blocks[0].scratch = ((uint32_t)(v_block_size)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (self->private_data.s_skip_blocks[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_skip_blocks[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ } else { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_high_bits = v_initial_high_bits; ++ v_delta = (((uint32_t)(1u)) << v_cl); ++ while (v_high_bits >= v_delta) { ++ v_high_bits -= v_delta; ++ if ((v_top + ((v_high_bits | v_reversed_key) & 511u)) >= 1024u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +- iop_a_src += self->private_data.s_skip_blocks[0].scratch; ++ self->private_data.f_huffs[a_which][(v_top + ((v_high_bits | v_reversed_key) & 511u))] = v_value; ++ } ++ v_i += 1u; ++ if (v_i >= v_n_symbols) { ++ break; ++ } ++ v_code += 1u; ++ if (v_code >= 32768u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +- +- ok: +- self->private_impl.p_skip_blocks[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_skip_blocks[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- +- return status; ++ return wuffs_base__make_status(NULL); + } + +-// -------- func gif.decoder.decode_ae ++// ‼ WUFFS MULTI-FILE SECTION +x86_bmi2 ++// -------- func deflate.decoder.decode_huffman_bmi2 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("bmi2") + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_ae( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__decode_huffman_bmi2( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_block_size = 0; +- bool v_is_animexts = false; +- bool v_is_netscape = false; +- bool v_is_iccp = false; +- bool v_is_xmp = false; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_table_entry = 0; ++ uint32_t v_table_entry_n_bits = 0; ++ uint64_t v_lmask = 0; ++ uint64_t v_dmask = 0; ++ uint32_t v_redir_top = 0; ++ uint32_t v_redir_mask = 0; ++ uint32_t v_length = 0; ++ uint32_t v_dist_minus_1 = 0; ++ uint32_t v_hlen = 0; ++ uint32_t v_hdist = 0; ++ uint32_t v_hdist_adjustment = 0; + ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -38283,214 +39652,206 @@ wuffs_gif__decoder__decode_ae( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_ae[0]; +- if (coro_susp_point) { +- v_block_size = self->private_data.s_decode_ae[0].v_block_size; +- v_is_animexts = self->private_data.s_decode_ae[0].v_is_animexts; +- v_is_netscape = self->private_data.s_decode_ae[0].v_is_netscape; +- v_is_iccp = self->private_data.s_decode_ae[0].v_is_iccp; +- v_is_xmp = self->private_data.s_decode_ae[0].v_is_xmp; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- do { +- if (self->private_impl.f_metadata_fourcc != 0u) { +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_block_size = t_0; +- } +- if (v_block_size == 0u) { +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- if (v_block_size != 11u) { +- self->private_data.s_decode_ae[0].scratch = ((uint32_t)(v_block_size)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (self->private_data.s_decode_ae[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_ae[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_ae[0].scratch; ++ v_bits = ((uint64_t)(self->private_impl.f_bits)); ++ v_n_bits = self->private_impl.f_n_bits; ++ v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); ++ v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); ++ if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); ++ goto exit; ++ } ++ v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); ++ label__loop__continue:; ++ while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) { ++ v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u))); ++ iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; + break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- v_is_animexts = true; +- v_is_netscape = true; +- v_is_iccp = true; +- v_is_xmp = true; +- v_block_size = 0u; +- while (v_block_size < 11u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- v_is_animexts = (v_is_animexts && (v_c == WUFFS_GIF__ANIMEXTS1DOT0[v_block_size])); +- v_is_netscape = (v_is_netscape && (v_c == WUFFS_GIF__NETSCAPE2DOT0[v_block_size])); +- v_is_iccp = (v_is_iccp && (v_c == WUFFS_GIF__ICCRGBG1012[v_block_size])); +- v_is_xmp = (v_is_xmp && (v_c == WUFFS_GIF__XMPDATAXMP[v_block_size])); +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_block_size += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } ++ v_length = (((v_table_entry >> 8u) & 255u) + 3u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_table_entry_n_bits > 0u) { ++ v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } ++ v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 28u) == 1u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } ++ if ((v_table_entry >> 24u) != 64u) { ++ if ((v_table_entry >> 24u) == 8u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; + } +- if (v_is_animexts || v_is_netscape) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- v_block_size = t_2; +- } +- if (v_block_size != 3u) { +- self->private_data.s_decode_ae[0].scratch = ((uint32_t)(v_block_size)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (self->private_data.s_decode_ae[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_ae[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_ae[0].scratch; +- break; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } ++ v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ do { ++ if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_hlen = 0u; ++ v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_length > v_hdist) { ++ v_length -= v_hdist; ++ v_hlen = v_hdist; ++ } else { ++ v_hlen = v_length; ++ v_length = 0u; + } +- if (v_c != 1u) { +- self->private_data.s_decode_ae[0].scratch = 2u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (self->private_data.s_decode_ae[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_ae[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_ae[0].scratch; +- break; ++ v_hdist += v_hdist_adjustment; ++ if (self->private_impl.f_history_index < v_hdist) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); ++ goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_ae[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_ae[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 8) { +- t_4 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; +- } +- } +- self->private_impl.f_num_animation_loops_value = t_4; ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); ++ if (v_length == 0u) { ++ goto label__loop__continue; + } +- self->private_impl.f_seen_num_animation_loops_value = true; +- if ((0u < self->private_impl.f_num_animation_loops_value) && (self->private_impl.f_num_animation_loops_value <= 65535u)) { +- self->private_impl.f_num_animation_loops_value += 1u; ++ if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); ++ goto exit; + } +- } else if (self->private_impl.f_call_sequence >= 32u) { +- } else if (v_is_iccp && self->private_impl.f_report_metadata_iccp) { +- self->private_impl.f_metadata_fourcc = 1229144912u; +- self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- self->private_impl.f_call_sequence = 16u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; +- } else if (v_is_xmp && self->private_impl.f_report_metadata_xmp) { +- self->private_impl.f_metadata_fourcc = 1481461792u; +- self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- self->private_impl.f_call_sequence = 16u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; ++ } ++ if ((v_dist_minus_1 + 1u) >= 8u) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } else if ((v_dist_minus_1 + 1u) == 1u) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } else { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); + } + } while (0); +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- status = wuffs_gif__decoder__skip_blocks(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; ++ } ++ if (v_n_bits > 63u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ while (v_n_bits >= 8u) { ++ v_n_bits -= 8u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); ++ goto exit; + } +- +- ok: +- self->private_impl.p_decode_ae[0] = 0; ++ } ++ self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u)))); ++ self->private_impl.f_n_bits = v_n_bits; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_ae[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_ae[0].v_block_size = v_block_size; +- self->private_data.s_decode_ae[0].v_is_animexts = v_is_animexts; +- self->private_data.s_decode_ae[0].v_is_netscape = v_is_netscape; +- self->private_data.s_decode_ae[0].v_is_iccp = v_is_iccp; +- self->private_data.s_decode_ae[0].v_is_xmp = v_is_xmp; +- + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++// ‼ WUFFS MULTI-FILE SECTION -x86_bmi2 + +-// -------- func gif.decoder.decode_gc ++// -------- func deflate.decoder.decode_huffman_fast32 + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_gc( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__decode_huffman_fast32( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_flags = 0; +- uint16_t v_gc_duration_centiseconds = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_table_entry = 0; ++ uint32_t v_table_entry_n_bits = 0; ++ uint32_t v_lmask = 0; ++ uint32_t v_dmask = 0; ++ uint32_t v_redir_top = 0; ++ uint32_t v_redir_mask = 0; ++ uint32_t v_length = 0; ++ uint32_t v_dist_minus_1 = 0; ++ uint32_t v_hlen = 0; ++ uint32_t v_hdist = 0; ++ uint32_t v_hdist_adjustment = 0; + ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -38502,106 +39863,205 @@ wuffs_gif__decoder__decode_gc( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_gc[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ v_bits = self->private_impl.f_bits; ++ v_n_bits = self->private_impl.f_n_bits; ++ v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); ++ v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); ++ if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); ++ goto exit; ++ } ++ v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); ++ label__loop__continue:; ++ while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 12u)) { ++ if (v_n_bits < 15u) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ } else { + } +- if (v_c != 4u) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control); ++ v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ if (v_n_bits < 15u) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ } else { ++ } ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_length = (((v_table_entry >> 8u) & 255u) + 3u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_table_entry_n_bits > 0u) { ++ if (v_n_bits < 15u) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ } else { + } +- uint8_t t_1 = *iop_a_src++; +- v_flags = t_1; ++ v_length = (((v_length + 253u + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } else { + } +- self->private_impl.f_gc_has_transparent_index = ((v_flags & 1u) != 0u); +- v_flags = ((v_flags >> 2u) & 7u); +- if (v_flags == 2u) { +- self->private_impl.f_gc_disposal = 1u; +- } else if ((v_flags == 3u) || (v_flags == 4u)) { +- self->private_impl.f_gc_disposal = 2u; ++ if (v_n_bits < 15u) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; + } else { +- self->private_impl.f_gc_disposal = 0u; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint16_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- iop_a_src += 2; ++ v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 28u) == 1u) { ++ if (v_n_bits < 15u) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; + } else { +- self->private_data.s_decode_gc[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_gc[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; +- if (num_bits_2 == 8) { +- t_2 = ((uint16_t)(*scratch)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; +- } + } +- v_gc_duration_centiseconds = t_2; ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } else { + } +- self->private_impl.f_gc_duration = (((uint64_t)(v_gc_duration_centiseconds)) * 7056000u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if ((v_table_entry >> 24u) != 64u) { ++ if ((v_table_entry >> 24u) == 8u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; + } +- uint8_t t_3 = *iop_a_src++; +- self->private_impl.f_gc_transparent_index = t_3; ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; ++ v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_n_bits < v_table_entry_n_bits) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; + } +- if (v_c != 0u) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control); ++ v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ do { ++ if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_hlen = 0u; ++ v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_length > v_hdist) { ++ v_length -= v_hdist; ++ v_hlen = v_hdist; ++ } else { ++ v_hlen = v_length; ++ v_length = 0u; ++ } ++ v_hdist += v_hdist_adjustment; ++ if (self->private_impl.f_history_index < v_hdist) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); ++ goto exit; ++ } ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); ++ if (v_length == 0u) { ++ goto label__loop__continue; ++ } ++ if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); ++ goto exit; ++ } ++ } ++ if ((v_dist_minus_1 + 1u) >= 8u) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } else { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } ++ } while (0); ++ } ++ while (v_n_bits >= 8u) { ++ v_n_bits -= 8u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); + goto exit; + } +- +- goto ok; +- ok: +- self->private_impl.p_decode_gc[0] = 0; ++ } ++ self->private_impl.f_bits = (v_bits & ((((uint32_t)(1u)) << v_n_bits) - 1u)); ++ self->private_impl.f_n_bits = v_n_bits; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_gc[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -38609,15 +40069,52 @@ wuffs_gif__decoder__decode_gc( + return status; + } + +-// -------- func gif.decoder.decode_id_part0 ++// -------- func deflate.decoder.decode_huffman_fast64 + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_id_part0( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__decode_huffman_fast64( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return (*self->private_impl.choosy_decode_huffman_fast64)(self, a_dst, a_src); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_table_entry = 0; ++ uint32_t v_table_entry_n_bits = 0; ++ uint64_t v_lmask = 0; ++ uint64_t v_dmask = 0; ++ uint32_t v_redir_top = 0; ++ uint32_t v_redir_mask = 0; ++ uint32_t v_length = 0; ++ uint32_t v_dist_minus_1 = 0; ++ uint32_t v_hlen = 0; ++ uint32_t v_hdist = 0; ++ uint32_t v_hdist_adjustment = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -38629,147 +40126,160 @@ wuffs_gif__decoder__decode_id_part0( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_id_part0[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ v_bits = ((uint64_t)(self->private_impl.f_bits)); ++ v_n_bits = self->private_impl.f_n_bits; ++ v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); ++ v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); ++ if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); ++ goto exit; ++ } ++ v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); ++ label__loop__continue:; ++ while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) { ++ v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u))); ++ iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; + } else { +- self->private_data.s_decode_id_part0[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 8) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; +- } ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- self->private_impl.f_frame_rect_x0 = t_0; ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_id_part0[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 8) { +- t_1 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; +- } +- } +- self->private_impl.f_frame_rect_y0 = t_1; ++ v_length = (((v_table_entry >> 8u) & 255u) + 3u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_table_entry_n_bits > 0u) { ++ v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_2 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_id_part0[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; +- if (num_bits_2 == 8) { +- t_2 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; +- } ++ v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 28u) == 1u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } ++ if ((v_table_entry >> 24u) != 64u) { ++ if ((v_table_entry >> 24u) == 8u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; + } +- self->private_impl.f_frame_rect_x1 = t_2; ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- self->private_impl.f_frame_rect_x1 += self->private_impl.f_frame_rect_x0; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_id_part0[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; +- if (num_bits_3 == 8) { +- t_3 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ do { ++ if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_hlen = 0u; ++ v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_length > v_hdist) { ++ v_length -= v_hdist; ++ v_hlen = v_hdist; ++ } else { ++ v_hlen = v_length; ++ v_length = 0u; ++ } ++ v_hdist += v_hdist_adjustment; ++ if (self->private_impl.f_history_index < v_hdist) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); ++ goto exit; ++ } ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); ++ if (v_length == 0u) { ++ goto label__loop__continue; ++ } ++ if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); ++ goto exit; + } + } +- self->private_impl.f_frame_rect_y1 = t_3; +- } +- self->private_impl.f_frame_rect_y1 += self->private_impl.f_frame_rect_y0; +- self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; +- self->private_impl.f_dst_y = self->private_impl.f_frame_rect_y0; +- if ((self->private_impl.f_num_decoded_frame_configs_value == 0u) && ! self->private_impl.f_quirks[4u]) { +- self->private_impl.f_width = wuffs_base__u32__max(self->private_impl.f_width, self->private_impl.f_frame_rect_x1); +- self->private_impl.f_height = wuffs_base__u32__max(self->private_impl.f_height, self->private_impl.f_frame_rect_y1); ++ if ((v_dist_minus_1 + 1u) >= 8u) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } else if ((v_dist_minus_1 + 1u) == 1u) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } else { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } ++ } while (0); ++ } ++ if (v_n_bits > 63u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ while (v_n_bits >= 8u) { ++ v_n_bits -= 8u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); ++ goto exit; + } +- +- goto ok; +- ok: +- self->private_impl.p_decode_id_part0[0] = 0; ++ } ++ self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u)))); ++ self->private_impl.f_n_bits = v_n_bits; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_id_part0[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -38777,25 +40287,49 @@ wuffs_gif__decoder__decode_id_part0( + return status; + } + +-// -------- func gif.decoder.decode_id_part1 ++// -------- func deflate.decoder.decode_huffman_slow + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_id_part1( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend) { ++wuffs_deflate__decoder__decode_huffman_slow( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_flags = 0; +- uint8_t v_which_palette = 0; +- uint32_t v_num_palette_entries = 0; +- uint32_t v_i = 0; +- uint32_t v_argb = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint8_t v_lw = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_table_entry = 0; ++ uint32_t v_table_entry_n_bits = 0; ++ uint32_t v_lmask = 0; ++ uint32_t v_dmask = 0; ++ uint32_t v_b0 = 0; ++ uint32_t v_redir_top = 0; ++ uint32_t v_redir_mask = 0; ++ uint32_t v_b1 = 0; ++ uint32_t v_length = 0; ++ uint32_t v_b2 = 0; ++ uint32_t v_b3 = 0; ++ uint32_t v_b4 = 0; ++ uint32_t v_dist_minus_1 = 0; ++ uint32_t v_b5 = 0; ++ uint32_t v_n_copied = 0; ++ uint32_t v_hlen = 0; ++ uint32_t v_hdist = 0; + ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -38807,139 +40341,275 @@ wuffs_gif__decoder__decode_id_part1( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_id_part1[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow; + if (coro_susp_point) { +- v_which_palette = self->private_data.s_decode_id_part1[0].v_which_palette; +- v_num_palette_entries = self->private_data.s_decode_id_part1[0].v_num_palette_entries; +- v_i = self->private_data.s_decode_id_part1[0].v_i; ++ v_bits = self->private_data.s_decode_huffman_slow.v_bits; ++ v_n_bits = self->private_data.s_decode_huffman_slow.v_n_bits; ++ v_table_entry_n_bits = self->private_data.s_decode_huffman_slow.v_table_entry_n_bits; ++ v_lmask = self->private_data.s_decode_huffman_slow.v_lmask; ++ v_dmask = self->private_data.s_decode_huffman_slow.v_dmask; ++ v_redir_top = self->private_data.s_decode_huffman_slow.v_redir_top; ++ v_redir_mask = self->private_data.s_decode_huffman_slow.v_redir_mask; ++ v_length = self->private_data.s_decode_huffman_slow.v_length; ++ v_dist_minus_1 = self->private_data.s_decode_huffman_slow.v_dist_minus_1; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_flags = t_0; +- } +- if ((v_flags & 64u) != 0u) { +- self->private_impl.f_interlace = 4u; +- } else { +- self->private_impl.f_interlace = 0u; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; + } +- v_which_palette = 1u; +- if ((v_flags & 128u) != 0u) { +- v_num_palette_entries = (((uint32_t)(1u)) << (1u + (v_flags & 7u))); +- v_i = 0u; +- while (v_i < v_num_palette_entries) { ++ v_bits = self->private_impl.f_bits; ++ v_n_bits = self->private_impl.f_n_bits; ++ v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); ++ v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); ++ label__loop__continue:; ++ while ( ! (self->private_impl.p_decode_huffman_slow != 0)) { ++ while (true) { ++ v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ if (v_n_bits >= v_table_entry_n_bits) { ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ break; ++ } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { +- t_1 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); +- iop_a_src += 3; +- } else { +- self->private_data.s_decode_id_part1[0].scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_0 = *iop_a_src++; ++ v_b0 = t_0; ++ } ++ v_bits |= (v_b0 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ if ((v_table_entry >> 31u) != 0u) { ++ self->private_data.s_decode_huffman_slow.scratch = ((uint8_t)((v_table_entry >> 8u))); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (iop_a_dst == io2_a_dst) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ goto suspend; ++ } ++ *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow.scratch)); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ while (true) { ++ v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ if (v_n_bits >= v_table_entry_n_bits) { ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ break; ++ } ++ { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_id_part1[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 16) { +- t_1 = ((uint32_t)(*scratch >> 40)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint32_t t_1 = *iop_a_src++; ++ v_b1 = t_1; + } +- v_argb = t_1; ++ v_bits |= (v_b1 << v_n_bits); ++ v_n_bits += 8u; + } +- v_argb |= 4278190080u; +- self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); +- self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); +- self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); +- self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); +- v_i += 1u; ++ if ((v_table_entry >> 31u) != 0u) { ++ self->private_data.s_decode_huffman_slow.scratch = ((uint8_t)((v_table_entry >> 8u))); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (iop_a_dst == io2_a_dst) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ goto suspend; ++ } ++ *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow.scratch)); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- while (v_i < 256u) { +- self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = 0u; +- self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = 0u; +- self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = 0u; +- self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = 255u; +- v_i += 1u; ++ v_length = (((v_table_entry >> 8u) & 255u) + 3u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_table_entry_n_bits > 0u) { ++ while (v_n_bits < v_table_entry_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_2 = *iop_a_src++; ++ v_b2 = t_2; ++ } ++ v_bits |= (v_b2 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ v_length = (((v_length + 253u + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; + } +- } else if (self->private_impl.f_quirks[6u] && ! self->private_impl.f_has_global_palette) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_palette); +- goto exit; +- } else if (self->private_impl.f_gc_has_transparent_index) { +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_palettes[1u], 1024), wuffs_base__make_slice_u8(self->private_data.f_palettes[0u], 1024)); +- } else { +- v_which_palette = 0u; +- } +- if (self->private_impl.f_gc_has_transparent_index) { +- self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 0u)] = 0u; +- self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 1u)] = 0u; +- self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 2u)] = 0u; +- self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 3u)] = 0u; +- } +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), +- wuffs_base__utility__make_pixel_format(2198077448u), +- wuffs_base__make_slice_u8(self->private_data.f_palettes[v_which_palette], 1024), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ while (true) { ++ v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ if (v_n_bits >= v_table_entry_n_bits) { ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_3 = *iop_a_src++; ++ v_b3 = t_3; ++ } ++ v_bits |= (v_b3 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ if ((v_table_entry >> 28u) == 1u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ while (true) { ++ v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ if (v_n_bits >= v_table_entry_n_bits) { ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_4 = *iop_a_src++; ++ v_b4 = t_4; ++ } ++ v_bits |= (v_b4 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ } ++ if ((v_table_entry >> 24u) != 64u) { ++ if ((v_table_entry >> 24u) == 8u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } +- goto ok; +- } +- if (self->private_impl.f_ignored_but_affects_benchmarks) { +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_table_entry_n_bits > 0u) { ++ while (v_n_bits < v_table_entry_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_5 = *iop_a_src++; ++ v_b5 = t_5; ++ } ++ v_bits |= (v_b5 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } ++ while (true) { ++ if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_hdist < v_length) { ++ v_hlen = v_hdist; ++ } else { ++ v_hlen = v_length; ++ } ++ v_hdist += ((uint32_t)(((uint64_t)(self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u))))); ++ if (self->private_impl.f_history_index < v_hdist) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); ++ goto exit; ++ } ++ v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); ++ if (v_n_copied < v_hlen) { ++ v_length -= v_n_copied; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ continue; ++ } ++ v_length -= v_hlen; ++ if (v_length == 0u) { ++ goto label__loop__continue; ++ } ++ } ++ v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_history( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ if (v_length <= v_n_copied) { ++ goto label__loop__continue; ++ } ++ v_length -= v_n_copied; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); + } +- uint8_t t_2 = *iop_a_src++; +- v_lw = t_2; + } +- if (v_lw > 8u) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width); ++ self->private_impl.f_bits = v_bits; ++ self->private_impl.f_n_bits = v_n_bits; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } +- self->private_impl.f_lzw_pending_literal_width_plus_one = ((uint32_t)((1u + v_lw))); +- self->private_impl.f_ignored_but_affects_benchmarks = true; + + ok: +- self->private_impl.p_decode_id_part1[0] = 0; ++ self->private_impl.p_decode_huffman_slow = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_id_part1[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_id_part1[0].v_which_palette = v_which_palette; +- self->private_data.s_decode_id_part1[0].v_num_palette_entries = v_num_palette_entries; +- self->private_data.s_decode_id_part1[0].v_i = v_i; ++ self->private_impl.p_decode_huffman_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_huffman_slow.v_bits = v_bits; ++ self->private_data.s_decode_huffman_slow.v_n_bits = v_n_bits; ++ self->private_data.s_decode_huffman_slow.v_table_entry_n_bits = v_table_entry_n_bits; ++ self->private_data.s_decode_huffman_slow.v_lmask = v_lmask; ++ self->private_data.s_decode_huffman_slow.v_dmask = v_dmask; ++ self->private_data.s_decode_huffman_slow.v_redir_top = v_redir_top; ++ self->private_data.s_decode_huffman_slow.v_redir_mask = v_redir_mask; ++ self->private_data.s_decode_huffman_slow.v_length = v_length; ++ self->private_data.s_decode_huffman_slow.v_dist_minus_1 = v_dist_minus_1; + + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -38947,782 +40617,538 @@ wuffs_gif__decoder__decode_id_part1( + return status; + } + +-// -------- func gif.decoder.decode_id_part2 ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_gif__error__bad_lzw_code[] = "#gif: bad LZW code"; ++const char wuffs_gif__error__bad_extension_label[] = "#gif: bad extension label"; ++const char wuffs_gif__error__bad_frame_size[] = "#gif: bad frame size"; ++const char wuffs_gif__error__bad_graphic_control[] = "#gif: bad graphic control"; ++const char wuffs_gif__error__bad_header[] = "#gif: bad header"; ++const char wuffs_gif__error__bad_literal_width[] = "#gif: bad literal width"; ++const char wuffs_gif__error__bad_palette[] = "#gif: bad palette"; ++const char wuffs_gif__error__truncated_input[] = "#gif: truncated input"; ++const char wuffs_gif__error__internal_error_inconsistent_i_o[] = "#gif: internal error: inconsistent I/O"; ++ ++// ---------------- Private Consts ++ ++static const uint32_t ++WUFFS_GIF__INTERLACE_START[5] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 4294967295u, 1u, 2u, 4u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__INTERLACE_DELTA[5] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1u, 2u, 4u, 8u, 8u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__INTERLACE_COUNT[5] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 1u, 2u, 4u, 8u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__ANIMEXTS1DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 65u, 78u, 73u, 77u, 69u, 88u, 84u, 83u, ++ 49u, 46u, 48u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__NETSCAPE2DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 78u, 69u, 84u, 83u, 67u, 65u, 80u, 69u, ++ 50u, 46u, 48u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__ICCRGBG1012[11] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 73u, 67u, 67u, 82u, 71u, 66u, 71u, 49u, ++ 48u, 49u, 50u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__XMPDATAXMP[11] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 88u, 77u, 80u, 32u, 68u, 97u, 116u, 97u, ++ 88u, 77u, 80u, ++}; ++ ++#define WUFFS_GIF__QUIRKS_BASE 1041635328u ++ ++#define WUFFS_GIF__QUIRKS_COUNT 7u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_id_part2( ++wuffs_gif__decoder__do_decode_image_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__do_tell_me_more( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__do_decode_frame_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__skip_frame( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__do_decode_frame( + wuffs_gif__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint64_t v_block_size = 0; +- bool v_need_block_size = false; +- uint32_t v_n_copied = 0; +- uint64_t v_n_compressed = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint64_t v_mark = 0; +- wuffs_base__status v_copy_status = wuffs_base__make_status(NULL); ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_gif__decoder__reset_gc( ++ wuffs_gif__decoder* self); + +- uint32_t coro_susp_point = self->private_impl.p_decode_id_part2[0]; +- if (coro_susp_point) { +- v_block_size = self->private_data.s_decode_id_part2[0].v_block_size; +- v_need_block_size = self->private_data.s_decode_id_part2[0].v_need_block_size; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_up_to_id_part1( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- wuffs_gif__decoder__lzw_init(self); +- v_need_block_size = true; +- label__outer__continue:; +- while (true) { +- if (v_need_block_size) { +- v_need_block_size = false; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t t_0 = *iop_a_src++; +- v_block_size = t_0; +- } +- } +- if (v_block_size == 0u) { +- break; +- } +- while (((uint64_t)(io2_a_src - iop_a_src)) == 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- } +- if (self->private_impl.f_compressed_ri == self->private_impl.f_compressed_wi) { +- self->private_impl.f_compressed_ri = 0u; +- self->private_impl.f_compressed_wi = 0u; +- } +- while (self->private_impl.f_compressed_wi <= 3841u) { +- v_n_compressed = wuffs_base__u64__min(v_block_size, ((uint64_t)(io2_a_src - iop_a_src))); +- if (v_n_compressed <= 0u) { +- break; +- } +- v_n_copied = wuffs_base__io_reader__limited_copy_u32_to_slice( +- &iop_a_src, io2_a_src,((uint32_t)(v_n_compressed)), wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, self->private_impl.f_compressed_wi, 4096)); +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_compressed_wi, ((uint64_t)(v_n_copied))); +- wuffs_base__u64__sat_sub_indirect(&v_block_size, ((uint64_t)(v_n_copied))); +- if (v_block_size > 0u) { +- break; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- v_need_block_size = true; +- break; +- } +- v_block_size = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); +- iop_a_src += 1u; +- } +- while (true) { +- if ((self->private_impl.f_compressed_ri > self->private_impl.f_compressed_wi) || (self->private_impl.f_compressed_wi > 4096u)) { +- status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, +- self->private_impl.f_compressed_ri, +- self->private_impl.f_compressed_wi), +- 0u); +- v_mark = ((uint64_t)(iop_v_r - io0_v_r)); +- u_r.meta.ri = ((size_t)(iop_v_r - u_r.data.ptr)); +- wuffs_gif__decoder__lzw_read_from(self, v_r); +- iop_v_r = u_r.data.ptr + u_r.meta.ri; +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_compressed_ri, wuffs_base__io__count_since(v_mark, ((uint64_t)(iop_v_r - io0_v_r)))); +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; +- } +- if (self->private_impl.f_lzw_output_ri < self->private_impl.f_lzw_output_wi) { +- v_copy_status = wuffs_gif__decoder__copy_to_image_buffer(self, a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_lzw_output, +- self->private_impl.f_lzw_output_ri, +- self->private_impl.f_lzw_output_wi)); +- if (wuffs_base__status__is_error(&v_copy_status)) { +- status = v_copy_status; +- goto exit; +- } +- self->private_impl.f_lzw_output_ri = 0u; +- self->private_impl.f_lzw_output_wi = 0u; +- } +- if (self->private_impl.f_lzw_read_from_return_value == 0u) { +- self->private_impl.f_ignored_but_affects_benchmarks = false; +- if (v_need_block_size || (v_block_size > 0u)) { +- self->private_data.s_decode_id_part2[0].scratch = ((uint32_t)(v_block_size)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (self->private_data.s_decode_id_part2[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_id_part2[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_id_part2[0].scratch; +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- status = wuffs_gif__decoder__skip_blocks(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } +- goto label__outer__break; +- } else if (self->private_impl.f_lzw_read_from_return_value == 1u) { +- continue; +- } else if (self->private_impl.f_lzw_read_from_return_value == 2u) { +- goto label__outer__continue; +- } else if (self->private_impl.f_quirks[3u] && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) && (self->private_impl.f_interlace == 0u)) { +- if (v_need_block_size || (v_block_size > 0u)) { +- self->private_data.s_decode_id_part2[0].scratch = ((uint32_t)(v_block_size)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (self->private_data.s_decode_id_part2[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_id_part2[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_id_part2[0].scratch; +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- status = wuffs_gif__decoder__skip_blocks(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } +- goto label__outer__break; +- } else if (self->private_impl.f_lzw_read_from_return_value == 3u) { +- status = wuffs_base__make_status(wuffs_gif__error__truncated_input); +- goto exit; +- } else if (self->private_impl.f_lzw_read_from_return_value == 4u) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_lzw_code); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- } +- label__outer__break:; +- self->private_impl.f_compressed_ri = 0u; +- self->private_impl.f_compressed_wi = 0u; +- if ((self->private_impl.f_dst_y < self->private_impl.f_frame_rect_y1) && (self->private_impl.f_frame_rect_x0 != self->private_impl.f_frame_rect_x1) && (self->private_impl.f_frame_rect_y0 != self->private_impl.f_frame_rect_y1)) { +- status = wuffs_base__make_status(wuffs_base__error__not_enough_data); +- goto exit; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_header( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- ok: +- self->private_impl.p_decode_id_part2[0] = 0; +- goto exit; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_lsd( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- goto suspend; +- suspend: +- self->private_impl.p_decode_id_part2[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_id_part2[0].v_block_size = v_block_size; +- self->private_data.s_decode_id_part2[0].v_need_block_size = v_need_block_size; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_extension( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__skip_blocks( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- return status; +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_ae( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +-// -------- func gif.decoder.copy_to_image_buffer ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_gc( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_id_part0( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_id_part1( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_id_part2( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status + wuffs_gif__decoder__copy_to_image_buffer( + wuffs_gif__decoder* self, + wuffs_base__pixel_buffer* a_pb, +- wuffs_base__slice_u8 a_src) { +- wuffs_base__slice_u8 v_dst = {0}; +- wuffs_base__slice_u8 v_src = {0}; +- uint64_t v_width_in_bytes = 0; +- uint64_t v_n = 0; +- uint64_t v_src_ri = 0; +- wuffs_base__pixel_format v_pixfmt = {0}; +- uint32_t v_bytes_per_pixel = 0; +- uint32_t v_bits_per_pixel = 0; +- wuffs_base__table_u8 v_tab = {0}; +- uint64_t v_i = 0; +- uint64_t v_j = 0; +- uint32_t v_replicate_y0 = 0; +- uint32_t v_replicate_y1 = 0; +- wuffs_base__slice_u8 v_replicate_dst = {0}; +- wuffs_base__slice_u8 v_replicate_src = {0}; ++ wuffs_base__slice_u8 a_src); + +- v_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_pb); +- v_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_pixfmt); +- if ((v_bits_per_pixel & 7u) != 0u) { +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_gif__decoder__lzw_init( ++ wuffs_gif__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_gif__decoder__lzw_read_from( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_gif__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_gif__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_gif__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_gif__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_gif__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_gif__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_gif__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_gif__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gif__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_gif__decoder__initialize( ++ wuffs_gif__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- v_bytes_per_pixel = (v_bits_per_pixel >> 3u); +- v_width_in_bytes = ((uint64_t)((self->private_impl.f_width * v_bytes_per_pixel))); +- v_tab = wuffs_base__pixel_buffer__plane(a_pb, 0u); +- while (v_src_ri < ((uint64_t)(a_src.len))) { +- v_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_ri); +- if (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) { +- if (self->private_impl.f_quirks[3u]) { +- return wuffs_base__make_status(NULL); +- } +- return wuffs_base__make_status(wuffs_base__error__too_much_data); +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, 0u); +- } else if (v_width_in_bytes < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_width_in_bytes); +- } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_bytes_per_pixel))); +- if (v_i < ((uint64_t)(v_dst.len))) { +- v_j = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * ((uint64_t)(v_bytes_per_pixel))); +- if ((v_i <= v_j) && (v_j <= ((uint64_t)(v_dst.len)))) { +- v_dst = wuffs_base__slice_u8__subslice_ij(v_dst, v_i, v_j); +- } else { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i); +- } +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024), v_src); +- wuffs_base__u64__sat_add_indirect(&v_src_ri, v_n); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1u)); +- } +- if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) { +- self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; +- if (self->private_impl.f_interlace == 0u) { +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_y, 1u); +- continue; +- } +- if ((self->private_impl.f_num_decoded_frames_value == 0u) && ! self->private_impl.f_gc_has_transparent_index && (self->private_impl.f_interlace > 1u)) { +- v_replicate_src = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- v_replicate_y0 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1u); +- v_replicate_y1 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_COUNT[self->private_impl.f_interlace]))); +- v_replicate_y1 = wuffs_base__u32__min(v_replicate_y1, self->private_impl.f_frame_rect_y1); +- while (v_replicate_y0 < v_replicate_y1) { +- v_replicate_dst = wuffs_base__table_u8__row_u32(v_tab, v_replicate_y0); +- wuffs_base__slice_u8__copy_from_slice(v_replicate_dst, v_replicate_src); +- v_replicate_y0 += 1u; +- } +- self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, v_replicate_y1); +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace]))); +- while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) { +-#if defined(__GNUC__) ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) + #pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_interlace -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" + #endif +- self->private_impl.f_dst_y = wuffs_base__u32__sat_add(self->private_impl.f_frame_rect_y0, WUFFS_GIF__INTERLACE_START[self->private_impl.f_interlace]); +- } +- continue; +- } +- if (((uint64_t)(a_src.len)) == v_src_ri) { +- break; +- } else if (((uint64_t)(a_src.len)) < v_src_ri) { +- return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +- v_n = ((uint64_t)((self->private_impl.f_frame_rect_x1 - self->private_impl.f_dst_x))); +- v_n = wuffs_base__u64__min(v_n, (((uint64_t)(a_src.len)) - v_src_ri)); +- wuffs_base__u64__sat_add_indirect(&v_src_ri, v_n); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) { +- self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace]))); +- while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_interlace -= 1u; +-#if defined(__GNUC__) ++#if !defined(__clang__) && defined(__GNUC__) + #pragma GCC diagnostic pop + #endif +- self->private_impl.f_dst_y = wuffs_base__u32__sat_add(self->private_impl.f_frame_rect_y0, WUFFS_GIF__INTERLACE_START[self->private_impl.f_interlace]); +- } +- continue; +- } +- if (v_src_ri != ((uint64_t)(a_src.len))) { +- return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } +- break; + } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder); + return wuffs_base__make_status(NULL); + } + +-// -------- func gif.decoder.lzw_init ++wuffs_gif__decoder* ++wuffs_gif__decoder__alloc(void) { ++ wuffs_gif__decoder* x = ++ (wuffs_gif__decoder*)(calloc(1, sizeof(wuffs_gif__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_gif__decoder__initialize( ++ x, sizeof(wuffs_gif__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_gif__decoder__lzw_init( +- wuffs_gif__decoder* self) { +- uint32_t v_i = 0; ++size_t ++sizeof__wuffs_gif__decoder(void) { ++ return sizeof(wuffs_gif__decoder); ++} + +- self->private_impl.f_lzw_literal_width = 8u; +- if (self->private_impl.f_lzw_pending_literal_width_plus_one > 0u) { +- self->private_impl.f_lzw_literal_width = (self->private_impl.f_lzw_pending_literal_width_plus_one - 1u); ++// ---------------- Function Implementations ++ ++// -------- func gif.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_gif__decoder__get_quirk( ++ const wuffs_gif__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; + } +- self->private_impl.f_lzw_clear_code = (((uint32_t)(1u)) << self->private_impl.f_lzw_literal_width); +- self->private_impl.f_lzw_end_code = (self->private_impl.f_lzw_clear_code + 1u); +- self->private_impl.f_lzw_save_code = self->private_impl.f_lzw_end_code; +- self->private_impl.f_lzw_prev_code = self->private_impl.f_lzw_end_code; +- self->private_impl.f_lzw_width = (self->private_impl.f_lzw_literal_width + 1u); +- self->private_impl.f_lzw_bits = 0u; +- self->private_impl.f_lzw_n_bits = 0u; +- self->private_impl.f_lzw_output_ri = 0u; +- self->private_impl.f_lzw_output_wi = 0u; +- v_i = 0u; +- while (v_i < self->private_impl.f_lzw_clear_code) { +- self->private_data.f_lzw_lm1s[v_i] = 0u; +- self->private_data.f_lzw_suffixes[v_i][0u] = ((uint8_t)(v_i)); +- v_i += 1u; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } +- return wuffs_base__make_empty_struct(); ++ ++ uint32_t v_key = 0; ++ ++ if (a_key >= 1041635328u) { ++ v_key = (a_key - 1041635328u); ++ if (v_key < 7u) { ++ if (self->private_impl.f_quirks[v_key]) { ++ return 1u; ++ } ++ } ++ } ++ return 0u; + } + +-// -------- func gif.decoder.lzw_read_from ++// -------- func gif.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_gif__decoder__lzw_read_from( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gif__decoder__set_quirk( + wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src) { +- uint32_t v_clear_code = 0; +- uint32_t v_end_code = 0; +- uint32_t v_save_code = 0; +- uint32_t v_prev_code = 0; +- uint32_t v_width = 0; +- uint32_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_output_wi = 0; +- uint32_t v_code = 0; +- uint32_t v_c = 0; +- uint32_t v_o = 0; +- uint32_t v_steps = 0; +- uint8_t v_first_byte = 0; +- uint16_t v_lm1_b = 0; +- uint16_t v_lm1_a = 0; ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ if ((self->private_impl.f_call_sequence == 0u) && (a_key >= 1041635328u)) { ++ a_key -= 1041635328u; ++ if (a_key < 7u) { ++ self->private_impl.f_quirks[a_key] = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } + } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} + +- v_clear_code = self->private_impl.f_lzw_clear_code; +- v_end_code = self->private_impl.f_lzw_end_code; +- v_save_code = self->private_impl.f_lzw_save_code; +- v_prev_code = self->private_impl.f_lzw_prev_code; +- v_width = self->private_impl.f_lzw_width; +- v_bits = self->private_impl.f_lzw_bits; +- v_n_bits = self->private_impl.f_lzw_n_bits; +- v_output_wi = self->private_impl.f_lzw_output_wi; +- while (true) { +- if (v_n_bits < v_width) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { +- v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits)); +- iop_a_src += ((31u - v_n_bits) >> 3u); +- v_n_bits |= 24u; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- self->private_impl.f_lzw_read_from_return_value = 3u; +- } else { +- self->private_impl.f_lzw_read_from_return_value = 2u; +- } +- break; +- } else { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- if (v_n_bits >= v_width) { +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- self->private_impl.f_lzw_read_from_return_value = 3u; +- } else { +- self->private_impl.f_lzw_read_from_return_value = 2u; +- } +- break; +- } else { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- if (v_n_bits < v_width) { +- self->private_impl.f_lzw_read_from_return_value = 5u; +- break; +- } +- } +- } +- } +- v_code = ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_width)); +- v_bits >>= v_width; +- v_n_bits -= v_width; +- if (v_code < v_clear_code) { +- self->private_data.f_lzw_output[v_output_wi] = ((uint8_t)(v_code)); +- v_output_wi = ((v_output_wi + 1u) & 8191u); +- if (v_save_code <= 4095u) { +- v_lm1_a = (((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u); +- self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_a; +- if ((v_lm1_a % 8u) != 0u) { +- self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code]; +- memcpy(self->private_data.f_lzw_suffixes[v_save_code],self->private_data.f_lzw_suffixes[v_prev_code], sizeof(self->private_data.f_lzw_suffixes[v_save_code])); +- self->private_data.f_lzw_suffixes[v_save_code][(v_lm1_a % 8u)] = ((uint8_t)(v_code)); +- } else { +- self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); +- self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_code)); +- } +- v_save_code += 1u; +- if (v_width < 12u) { +- v_width += (1u & (v_save_code >> v_width)); +- } +- v_prev_code = v_code; +- } +- } else if (v_code <= v_end_code) { +- if (v_code == v_end_code) { +- self->private_impl.f_lzw_read_from_return_value = 0u; +- break; +- } +- v_save_code = v_end_code; +- v_prev_code = v_end_code; +- v_width = (self->private_impl.f_lzw_literal_width + 1u); +- } else if (v_code <= v_save_code) { +- v_c = v_code; +- if (v_code == v_save_code) { +- v_c = v_prev_code; +- } +- v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) & 4294967288u)) & 8191u); +- v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lzw_lm1s[v_c]))) & 8191u); +- v_steps = (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) >> 3u); +- while (true) { +- memcpy((self->private_data.f_lzw_output)+(v_o), (self->private_data.f_lzw_suffixes[v_c]), 8u); +- if (v_steps <= 0u) { +- break; +- } +- v_steps -= 1u; +- v_o = (((uint32_t)(v_o - 8u)) & 8191u); +- v_c = ((uint32_t)(self->private_impl.f_lzw_prefixes[v_c])); +- } +- v_first_byte = self->private_data.f_lzw_suffixes[v_c][0u]; +- if (v_code == v_save_code) { +- self->private_data.f_lzw_output[v_output_wi] = v_first_byte; +- v_output_wi = ((v_output_wi + 1u) & 8191u); +- } +- if (v_save_code <= 4095u) { +- v_lm1_b = (((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u); +- self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_b; +- if ((v_lm1_b % 8u) != 0u) { +- self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code]; +- memcpy(self->private_data.f_lzw_suffixes[v_save_code],self->private_data.f_lzw_suffixes[v_prev_code], sizeof(self->private_data.f_lzw_suffixes[v_save_code])); +- self->private_data.f_lzw_suffixes[v_save_code][(v_lm1_b % 8u)] = v_first_byte; +- } else { +- self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); +- self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte)); +- } +- v_save_code += 1u; +- if (v_width < 12u) { +- v_width += (1u & (v_save_code >> v_width)); +- } +- v_prev_code = v_code; +- } +- } else { +- self->private_impl.f_lzw_read_from_return_value = 4u; +- break; +- } +- if (v_output_wi > 4095u) { +- self->private_impl.f_lzw_read_from_return_value = 1u; +- break; +- } ++// -------- func gif.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gif__decoder__decode_image_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if (self->private_impl.f_lzw_read_from_return_value != 2u) { +- while (v_n_bits >= 8u) { +- v_n_bits -= 8u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- self->private_impl.f_lzw_read_from_return_value = 5u; +- break; +- } +- } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } +- self->private_impl.f_lzw_save_code = v_save_code; +- self->private_impl.f_lzw_prev_code = v_prev_code; +- self->private_impl.f_lzw_width = v_width; +- self->private_impl.f_lzw_bits = v_bits; +- self->private_impl.f_lzw_n_bits = v_n_bits; +- self->private_impl.f_lzw_output_wi = v_output_wi; +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- return wuffs_base__make_empty_struct(); +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-// ---------------- Status Codes Implementations ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_gif__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } + +-const char wuffs_gzip__error__bad_checksum[] = "#gzip: bad checksum"; +-const char wuffs_gzip__error__bad_compression_method[] = "#gzip: bad compression method"; +-const char wuffs_gzip__error__bad_encoding_flags[] = "#gzip: bad encoding flags"; +-const char wuffs_gzip__error__bad_header[] = "#gzip: bad header"; +-const char wuffs_gzip__error__truncated_input[] = "#gzip: truncated input"; ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } + +-// ---------------- Private Consts ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + +-// ---------------- Private Initializer Prototypes ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} + +-// ---------------- Private Function Prototypes ++// -------- func gif.decoder.do_decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gzip__decoder__do_transform_io( +- wuffs_gzip__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); +- +-// ---------------- VTables +- +-const wuffs_base__io_transformer__func_ptrs +-wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer = { +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_gzip__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_gzip__decoder__history_retain_length), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_gzip__decoder__set_quirk), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_gzip__decoder__transform_io), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gzip__decoder__workbuf_len), +-}; ++wuffs_gif__decoder__do_decode_image_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// ---------------- Initializer Implementations ++ bool v_ffio = false; + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_gzip__decoder__initialize( +- wuffs_gzip__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if ( ! self->private_impl.f_seen_header) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_gif__decoder__decode_header(self, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_gif__decoder__decode_lsd(self, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_header = true; + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); ++ if (status.repr) { ++ goto suspend; + } +- } +- +- { +- wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( +- &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options); +- if (z.repr) { +- return z; ++ v_ffio = ! self->private_impl.f_gc_has_transparent_index; ++ if ( ! self->private_impl.f_quirks[2u]) { ++ v_ffio = (v_ffio && ++ (self->private_impl.f_frame_rect_x0 == 0u) && ++ (self->private_impl.f_frame_rect_y0 == 0u) && ++ (self->private_impl.f_frame_rect_x1 == self->private_impl.f_width) && ++ (self->private_impl.f_frame_rect_y1 == self->private_impl.f_height)); ++ } else if (v_ffio) { ++ self->private_impl.f_black_color_u32_argb_premul = 4278190080u; + } +- } +- { +- wuffs_base__status z = wuffs_deflate__decoder__initialize( +- &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options); +- if (z.repr) { +- return z; ++ if (self->private_impl.f_background_color_u32_argb_premul == 77u) { ++ self->private_impl.f_background_color_u32_argb_premul = self->private_impl.f_black_color_u32_argb_premul; ++ } ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ 2198077448u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ v_ffio); ++ } ++ if (self->private_impl.f_call_sequence == 0u) { ++ self->private_impl.f_call_sequence = 32u; + } +- } +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = +- wuffs_base__io_transformer__vtable_name; +- self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = +- (const void*)(&wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer); +- return wuffs_base__make_status(NULL); +-} + +-wuffs_gzip__decoder* +-wuffs_gzip__decoder__alloc(void) { +- wuffs_gzip__decoder* x = +- (wuffs_gzip__decoder*)(calloc(sizeof(wuffs_gzip__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_gzip__decoder__initialize( +- x, sizeof(wuffs_gzip__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; + } +- return x; +-} +- +-size_t +-sizeof__wuffs_gzip__decoder(void) { +- return sizeof(wuffs_gzip__decoder); +-} + +-// ---------------- Function Implementations +- +-// -------- func gzip.decoder.get_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gzip__decoder__get_quirk( +- const wuffs_gzip__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +- if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { +- return 1u; +- } +- return 0u; ++ goto exit; ++ exit: ++ return status; + } + +-// -------- func gzip.decoder.set_quirk ++// -------- func gif.decoder.set_report_metadata + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gzip__decoder__set_quirk( +- wuffs_gzip__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_gif__decoder__set_report_metadata( ++ wuffs_gif__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- if (a_key == 1u) { +- self->private_impl.f_ignore_checksum = (a_value > 0u); +- return wuffs_base__make_status(NULL); +- } +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +-} +- +-// -------- func gzip.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gzip__decoder__history_retain_length( +- const wuffs_gzip__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ return wuffs_base__make_empty_struct(); + } + +- return 0u; +-} +- +-// -------- func gzip.decoder.workbuf_len +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_gzip__decoder__workbuf_len( +- const wuffs_gzip__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ if (a_fourcc == 1229144912u) { ++ self->private_impl.f_report_metadata_iccp = a_report; ++ } else if (a_fourcc == 1481461792u) { ++ self->private_impl.f_report_metadata_xmp = a_report; + } +- +- return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func gzip.decoder.transform_io ++// -------- func gif.decoder.tell_me_more + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gzip__decoder__transform_io( +- wuffs_gzip__decoder* self, ++wuffs_gif__decoder__tell_me_more( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -39737,7 +41163,7 @@ wuffs_gzip__decoder__transform_io( + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { ++ (self->private_impl.active_coroutine != 2)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -39746,17 +41172,17 @@ wuffs_gzip__decoder__transform_io( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; ++ uint32_t coro_susp_point = self->private_impl.p_tell_me_more; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_gzip__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ wuffs_base__status t_0 = wuffs_gif__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_gzip__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_gif__error__truncated_input); + goto exit; + } + status = v_status; +@@ -39764,14 +41190,14 @@ wuffs_gzip__decoder__transform_io( + } + + ok: +- self->private_impl.p_transform_io[0] = 0; ++ self->private_impl.p_tell_me_more = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + + goto exit; + exit: +@@ -39781,40 +41207,19 @@ wuffs_gzip__decoder__transform_io( + return status; + } + +-// -------- func gzip.decoder.do_transform_io ++// -------- func gif.decoder.do_tell_me_more + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gzip__decoder__do_transform_io( +- wuffs_gzip__decoder* self, ++wuffs_gif__decoder__do_tell_me_more( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_flags = 0; +- uint16_t v_xlen = 0; +- uint64_t v_mark = 0; +- uint32_t v_checksum_got = 0; +- uint32_t v_decoded_length_got = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint32_t v_checksum_want = 0; +- uint32_t v_decoded_length_want = 0; ++ uint64_t v_chunk_length = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -39826,269 +41231,95 @@ wuffs_gzip__decoder__do_transform_io( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0]; +- if (coro_susp_point) { +- v_flags = self->private_data.s_do_transform_io[0].v_flags; +- v_checksum_got = self->private_data.s_do_transform_io[0].v_checksum_got; +- v_decoded_length_got = self->private_data.s_do_transform_io[0].v_decoded_length_got; +- v_checksum_want = self->private_data.s_do_transform_io[0].v_checksum_want; +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c != 31u) { +- status = wuffs_base__make_status(wuffs_gzip__error__bad_header); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- if (v_c != 139u) { +- status = wuffs_base__make_status(wuffs_gzip__error__bad_header); ++ if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) == 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; +- } +- if (v_c != 8u) { +- status = wuffs_base__make_status(wuffs_gzip__error__bad_compression_method); ++ if (self->private_impl.f_metadata_fourcc == 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); + goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_flags = t_3; +- } +- self->private_data.s_do_transform_io[0].scratch = 6u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (self->private_data.s_do_transform_io[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_transform_io[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_transform_io[0].scratch; +- if ((v_flags & 4u) != 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint16_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_transform_io[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 8) { +- t_4 = ((uint16_t)(*scratch)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; +- } +- } +- v_xlen = t_4; +- } +- self->private_data.s_do_transform_io[0].scratch = ((uint32_t)(v_xlen)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (self->private_data.s_do_transform_io[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_transform_io[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_transform_io[0].scratch; +- } +- if ((v_flags & 8u) != 0u) { ++ while (true) { + while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if (wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_io_position) { ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ 2u, ++ 0u, ++ self->private_impl.f_metadata_io_position, ++ 0u, ++ 0u); + } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; +- } +- if (v_c == 0u) { +- break; ++ status = wuffs_base__make_status(wuffs_base__suspension__mispositioned_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; + } +- } +- } +- if ((v_flags & 16u) != 0u) { +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ 0u, ++ 0u, ++ 0u, ++ 0u, ++ 0u); + } +- uint8_t t_6 = *iop_a_src++; +- v_c = t_6; +- } +- if (v_c == 0u) { +- break; +- } +- } +- } +- if ((v_flags & 2u) != 0u) { +- self->private_data.s_do_transform_io[0].scratch = 2u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- if (self->private_data.s_do_transform_io[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_transform_io[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_transform_io[0].scratch; +- } +- if ((v_flags & 224u) != 0u) { +- status = wuffs_base__make_status(wuffs_gzip__error__bad_encoding_flags); +- goto exit; +- } +- while (true) { +- v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); +- { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_7 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf); +- v_status = t_7; +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ continue; + } ++ break; + } +- if ( ! self->private_impl.f_ignore_checksum) { +- v_checksum_got = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_checksum, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); +- v_decoded_length_got += ((uint32_t)(wuffs_base__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst))))); +- } +- if (wuffs_base__status__is_ok(&v_status)) { ++ v_chunk_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); ++ if (v_chunk_length <= 0u) { ++ iop_a_src += 1u; + break; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12); +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); +- uint32_t t_8; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; ++ if (self->private_impl.f_metadata_fourcc == 1481461792u) { ++ v_chunk_length += 1u; + } else { +- self->private_data.s_do_transform_io[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; +- uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; +- if (num_bits_8 == 24) { +- t_8 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_8 += 8u; +- *scratch |= ((uint64_t)(num_bits_8)) << 56; +- } ++ iop_a_src += 1u; + } +- v_checksum_want = t_8; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); +- uint32_t t_9; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_9 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_transform_io[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; +- uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9; +- if (num_bits_9 == 24) { +- t_9 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_9 += 8u; +- *scratch |= ((uint64_t)(num_bits_9)) << 56; +- } ++ self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add(wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))), v_chunk_length); ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ 3u, ++ self->private_impl.f_metadata_fourcc, ++ 0u, ++ wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))), ++ self->private_impl.f_metadata_io_position); + } +- v_decoded_length_want = t_9; ++ status = wuffs_base__make_status(wuffs_base__suspension__even_more_information); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); + } +- if ( ! self->private_impl.f_ignore_checksum && ((v_checksum_got != v_checksum_want) || (v_decoded_length_got != v_decoded_length_want))) { +- status = wuffs_base__make_status(wuffs_gzip__error__bad_checksum); +- goto exit; ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ 3u, ++ self->private_impl.f_metadata_fourcc, ++ 0u, ++ self->private_impl.f_metadata_io_position, ++ self->private_impl.f_metadata_io_position); + } ++ self->private_impl.f_call_sequence &= 239u; ++ self->private_impl.f_metadata_fourcc = 0u; ++ self->private_impl.f_metadata_io_position = 0u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; + + ok: +- self->private_impl.p_do_transform_io[0] = 0; ++ self->private_impl.p_do_tell_me_more = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_transform_io[0].v_flags = v_flags; +- self->private_data.s_do_transform_io[0].v_checksum_got = v_checksum_got; +- self->private_data.s_do_transform_io[0].v_decoded_length_got = v_decoded_length_got; +- self->private_data.s_do_transform_io[0].v_checksum_want = v_checksum_want; ++ self->private_impl.p_do_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -40096,2260 +41327,1143 @@ wuffs_gzip__decoder__do_transform_io( + return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) ++// -------- func gif.decoder.num_animation_loops + +-// ---------------- Status Codes Implementations ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_gif__decoder__num_animation_loops( ++ const wuffs_gif__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-const char wuffs_jpeg__error__bad_dht_marker[] = "#jpeg: bad DHT marker"; +-const char wuffs_jpeg__error__bad_dqt_marker[] = "#jpeg: bad DQT marker"; +-const char wuffs_jpeg__error__bad_dri_marker[] = "#jpeg: bad DRI marker"; +-const char wuffs_jpeg__error__bad_sof_marker[] = "#jpeg: bad SOF marker"; +-const char wuffs_jpeg__error__bad_sos_marker[] = "#jpeg: bad SOS marker"; +-const char wuffs_jpeg__error__bad_header[] = "#jpeg: bad header"; +-const char wuffs_jpeg__error__bad_marker[] = "#jpeg: bad marker"; +-const char wuffs_jpeg__error__missing_huffman_table[] = "#jpeg: missing Huffman table"; +-const char wuffs_jpeg__error__missing_quantization_table[] = "#jpeg: missing Quantization table"; +-const char wuffs_jpeg__error__truncated_input[] = "#jpeg: truncated input"; +-const char wuffs_jpeg__error__unsupported_arithmetic_coding[] = "#jpeg: unsupported arithmetic coding"; +-const char wuffs_jpeg__error__unsupported_color_model[] = "#jpeg: unsupported color model"; +-const char wuffs_jpeg__error__unsupported_fractional_sampling[] = "#jpeg: unsupported fractional sampling"; +-const char wuffs_jpeg__error__unsupported_hierarchical_coding[] = "#jpeg: unsupported hierarchical coding"; +-const char wuffs_jpeg__error__unsupported_implicit_height[] = "#jpeg: unsupported implicit height"; +-const char wuffs_jpeg__error__unsupported_lossless_coding[] = "#jpeg: unsupported lossless coding"; +-const char wuffs_jpeg__error__unsupported_marker[] = "#jpeg: unsupported marker"; +-const char wuffs_jpeg__error__unsupported_precision_12_bits[] = "#jpeg: unsupported precision (12 bits)"; +-const char wuffs_jpeg__error__unsupported_precision_16_bits[] = "#jpeg: unsupported precision (16 bits)"; +-const char wuffs_jpeg__error__unsupported_precision[] = "#jpeg: unsupported precision"; +-const char wuffs_jpeg__error__unsupported_scan_count[] = "#jpeg: unsupported scan count"; +-const char wuffs_jpeg__error__internal_error_inconsistent_decoder_state[] = "#jpeg: internal error: inconsistent decoder state"; ++ if (self->private_impl.f_seen_num_animation_loops_value) { ++ return self->private_impl.f_num_animation_loops_value; ++ } ++ if (self->private_impl.f_num_decoded_frame_configs_value > 1u) { ++ return 1u; ++ } ++ return 0u; ++} + +-// ---------------- Private Consts ++// -------- func gif.decoder.num_decoded_frame_configs + +-static const uint8_t +-WUFFS_JPEG__UNZIG[80] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 0, 1, 8, 16, 9, 2, 3, +- 10, 17, 24, 32, 25, 18, 11, 4, +- 5, 12, 19, 26, 33, 40, 48, 41, +- 34, 27, 20, 13, 6, 7, 14, 21, +- 28, 35, 42, 49, 56, 57, 50, 43, +- 36, 29, 22, 15, 23, 30, 37, 44, +- 51, 58, 59, 52, 45, 38, 31, 39, +- 46, 53, 60, 61, 54, 47, 55, 62, +- 63, 63, 63, 63, 63, 63, 63, 63, +- 63, 63, 63, 63, 63, 63, 63, 63, +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_gif__decoder__num_decoded_frame_configs( ++ const wuffs_gif__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-static const uint8_t +-WUFFS_JPEG__BIAS_AND_CLAMP[1024] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 128, 129, 130, 131, 132, 133, 134, 135, +- 136, 137, 138, 139, 140, 141, 142, 143, +- 144, 145, 146, 147, 148, 149, 150, 151, +- 152, 153, 154, 155, 156, 157, 158, 159, +- 160, 161, 162, 163, 164, 165, 166, 167, +- 168, 169, 170, 171, 172, 173, 174, 175, +- 176, 177, 178, 179, 180, 181, 182, 183, +- 184, 185, 186, 187, 188, 189, 190, 191, +- 192, 193, 194, 195, 196, 197, 198, 199, +- 200, 201, 202, 203, 204, 205, 206, 207, +- 208, 209, 210, 211, 212, 213, 214, 215, +- 216, 217, 218, 219, 220, 221, 222, 223, +- 224, 225, 226, 227, 228, 229, 230, 231, +- 232, 233, 234, 235, 236, 237, 238, 239, +- 240, 241, 242, 243, 244, 245, 246, 247, +- 248, 249, 250, 251, 252, 253, 254, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 1, 2, 3, 4, 5, 6, 7, +- 8, 9, 10, 11, 12, 13, 14, 15, +- 16, 17, 18, 19, 20, 21, 22, 23, +- 24, 25, 26, 27, 28, 29, 30, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, +- 40, 41, 42, 43, 44, 45, 46, 47, +- 48, 49, 50, 51, 52, 53, 54, 55, +- 56, 57, 58, 59, 60, 61, 62, 63, +- 64, 65, 66, 67, 68, 69, 70, 71, +- 72, 73, 74, 75, 76, 77, 78, 79, +- 80, 81, 82, 83, 84, 85, 86, 87, +- 88, 89, 90, 91, 92, 93, 94, 95, +- 96, 97, 98, 99, 100, 101, 102, 103, +- 104, 105, 106, 107, 108, 109, 110, 111, +- 112, 113, 114, 115, 116, 117, 118, 119, +- 120, 121, 122, 123, 124, 125, 126, 127, +-}; ++ return self->private_impl.f_num_decoded_frame_configs_value; ++} + +-static const uint16_t +-WUFFS_JPEG__EXTEND[16] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 65535, 65533, 65529, 65521, 65505, 65473, 65409, +- 65281, 65025, 64513, 63489, 61441, 57345, 49153, 32769, +-}; ++// -------- func gif.decoder.num_decoded_frames + +-static const uint8_t +-WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 0, 1, 5, 1, 1, 1, 1, +- 1, 1, 0, 0, 0, 0, 0, 0, +- 0, 0, 1, 2, 3, 4, 5, 6, +- 7, 8, 9, 10, 11, +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_gif__decoder__num_decoded_frames( ++ const wuffs_gif__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-static const uint8_t +-WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1, 0, 3, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 0, 0, 0, 0, +- 0, 0, 1, 2, 3, 4, 5, 6, +- 7, 8, 9, 10, 11, +-}; ++ return self->private_impl.f_num_decoded_frames_value; ++} + +-static const uint8_t +-WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 16, 0, 2, 1, 3, 3, 2, 4, +- 3, 5, 5, 4, 4, 0, 0, 1, +- 125, 1, 2, 3, 0, 4, 17, 5, +- 18, 33, 49, 65, 6, 19, 81, 97, +- 7, 34, 113, 20, 50, 129, 145, 161, +- 8, 35, 66, 177, 193, 21, 82, 209, +- 240, 36, 51, 98, 114, 130, 9, 10, +- 22, 23, 24, 25, 26, 37, 38, 39, +- 40, 41, 42, 52, 53, 54, 55, 56, +- 57, 58, 67, 68, 69, 70, 71, 72, +- 73, 74, 83, 84, 85, 86, 87, 88, +- 89, 90, 99, 100, 101, 102, 103, 104, +- 105, 106, 115, 116, 117, 118, 119, 120, +- 121, 122, 131, 132, 133, 134, 135, 136, +- 137, 138, 146, 147, 148, 149, 150, 151, +- 152, 153, 154, 162, 163, 164, 165, 166, +- 167, 168, 169, 170, 178, 179, 180, 181, +- 182, 183, 184, 185, 186, 194, 195, 196, +- 197, 198, 199, 200, 201, 202, 210, 211, +- 212, 213, 214, 215, 216, 217, 218, 225, +- 226, 227, 228, 229, 230, 231, 232, 233, +- 234, 241, 242, 243, 244, 245, 246, 247, +- 248, 249, 250, +-}; ++// -------- func gif.decoder.frame_dirty_rect + +-static const uint8_t +-WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 17, 0, 2, 1, 2, 4, 4, 3, +- 4, 7, 5, 4, 4, 0, 1, 2, +- 119, 0, 1, 2, 3, 17, 4, 5, +- 33, 49, 6, 18, 65, 81, 7, 97, +- 113, 19, 34, 50, 129, 8, 20, 66, +- 145, 161, 177, 193, 9, 35, 51, 82, +- 240, 21, 98, 114, 209, 10, 22, 36, +- 52, 225, 37, 241, 23, 24, 25, 26, +- 38, 39, 40, 41, 42, 53, 54, 55, +- 56, 57, 58, 67, 68, 69, 70, 71, +- 72, 73, 74, 83, 84, 85, 86, 87, +- 88, 89, 90, 99, 100, 101, 102, 103, +- 104, 105, 106, 115, 116, 117, 118, 119, +- 120, 121, 122, 130, 131, 132, 133, 134, +- 135, 136, 137, 138, 146, 147, 148, 149, +- 150, 151, 152, 153, 154, 162, 163, 164, +- 165, 166, 167, 168, 169, 170, 178, 179, +- 180, 181, 182, 183, 184, 185, 186, 194, +- 195, 196, 197, 198, 199, 200, 201, 202, +- 210, 211, 212, 213, 214, 215, 216, 217, +- 218, 226, 227, 228, 229, 230, 231, 232, +- 233, 234, 242, 243, 244, 245, 246, 247, +- 248, 249, 250, +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_gif__decoder__frame_dirty_rect( ++ const wuffs_gif__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } + +-// ---------------- Private Initializer Prototypes ++ return wuffs_base__utility__make_rect_ie_u32( ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width), ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height), ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width), ++ wuffs_base__u32__min(self->private_impl.f_dirty_max_excl_y, self->private_impl.f_height)); ++} + +-// ---------------- Private Function Prototypes ++// -------- func gif.decoder.workbuf_len + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_gif__decoder__workbuf_len( ++ const wuffs_gif__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct__choosy_default( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q); ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct_x86_avx2( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) ++// -------- func gif.decoder.restart_frame + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_image_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gif__decoder__restart_frame( ++ wuffs_gif__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_dqt( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } else if (a_io_position == 0u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_delayed_num_decoded_frames = false; ++ self->private_impl.f_frame_config_io_position = a_io_position; ++ self->private_impl.f_num_decoded_frame_configs_value = a_index; ++ self->private_impl.f_num_decoded_frames_value = a_index; ++ wuffs_gif__decoder__reset_gc(self); ++ self->private_impl.f_call_sequence = 40u; ++ return wuffs_base__make_status(NULL); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_dri( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++// -------- func gif.decoder.decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_appn( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src, +- uint8_t a_marker); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gif__decoder__decode_frame_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_sof( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__quantize_dimension( +- const wuffs_jpeg__decoder* self, +- uint32_t a_width, +- uint8_t a_h, +- uint8_t a_max_incl_h); ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_frame_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_gif__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_frame( +- wuffs_jpeg__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_dht( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; + +-WUFFS_BASE__GENERATED_C_CODE +-static bool +-wuffs_jpeg__decoder__calculate_huff_tables( +- wuffs_jpeg__decoder* self, +- uint8_t a_tc4_th, +- uint32_t a_total_count); ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_sos( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); ++// -------- func gif.decoder.do_decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__prepare_scan( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++wuffs_gif__decoder__do_decode_frame_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__use_default_huffman_table( +- wuffs_jpeg__decoder* self, +- uint8_t a_tc4_th); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__calculate_single_component_scan_fields( +- wuffs_jpeg__decoder* self); ++ uint32_t v_background_color = 0; ++ uint8_t v_flags = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-static bool +-wuffs_jpeg__decoder__calculate_multiple_component_scan_fields( +- wuffs_jpeg__decoder* self); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__fill_bitstream( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ if (coro_susp_point) { ++ v_background_color = self->private_data.s_do_decode_frame_config.v_background_color; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__load_mcu_blocks_for_single_component( +- wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel); ++ self->private_impl.f_dirty_max_excl_y = 0u; ++ if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_gif__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_gif__decoder__skip_frame(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_call_sequence >= 96u) { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if ((self->private_impl.f_num_decoded_frame_configs_value > 0u) || (self->private_impl.f_call_sequence == 40u)) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_call_sequence >= 96u) { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ } ++ v_background_color = self->private_impl.f_black_color_u32_argb_premul; ++ if ( ! self->private_impl.f_gc_has_transparent_index) { ++ v_background_color = self->private_impl.f_background_color_u32_argb_premul; ++ if (self->private_impl.f_quirks[1u] && (self->private_impl.f_num_decoded_frame_configs_value == 0u)) { ++ while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ } ++ v_flags = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (((uint8_t)(v_flags & 128u)) != 0u) { ++ v_background_color = self->private_impl.f_black_color_u32_argb_premul; ++ } ++ } ++ } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width), ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height), ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width), ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_y1, self->private_impl.f_height)), ++ ((wuffs_base__flicks)(self->private_impl.f_gc_duration)), ++ self->private_impl.f_num_decoded_frame_configs_value, ++ self->private_impl.f_frame_config_io_position, ++ self->private_impl.f_gc_disposal, ++ ! self->private_impl.f_gc_has_transparent_index, ++ false, ++ v_background_color); ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u); ++ self->private_impl.f_call_sequence = 64u; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default( +- wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel); ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__load_mcu_blocks( +- wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf); ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_frame_config.v_background_color = v_background_color; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__save_mcu_blocks( +- wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__skip_past_the_next_restart_marker( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++ return status; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__apply_progressive_idct( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf); ++// -------- func gif.decoder.skip_frame + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__swizzle_gray( +- wuffs_jpeg__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf); ++wuffs_gif__decoder__skip_frame( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__swizzle_colorful( +- wuffs_jpeg__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf); ++ uint8_t v_flags = 0; ++ uint8_t v_lw = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-static bool +-wuffs_jpeg__decoder__top_left_quants_has_zero( +- const wuffs_jpeg__decoder* self, +- uint32_t a_q); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth( +- wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel); ++ uint32_t coro_susp_point = self->private_impl.p_skip_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_flags = t_0; ++ } ++ if (((uint8_t)(v_flags & 128u)) != 0u) { ++ self->private_data.s_skip_frame.scratch = (((uint32_t)(3u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u))))); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_skip_frame.scratch; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_lw = t_1; ++ } ++ if (v_lw > 8u) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_gif__decoder__skip_blocks(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_quirks[0u]) { ++ self->private_impl.f_delayed_num_decoded_frames = true; ++ } else { ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ } ++ wuffs_gif__decoder__reset_gc(self); ++ self->private_impl.f_call_sequence = 32u; + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu__choosy_default( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); ++ goto ok; ++ ok: ++ self->private_impl.p_skip_frame = 0; ++ goto exit; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); ++ goto suspend; ++ suspend: ++ self->private_impl.p_skip_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); ++ return status; ++} ++ ++// -------- func gif.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit( +- wuffs_jpeg__decoder* self, ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gif__decoder__decode_frame( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); +- +-// ---------------- VTables +- +-const wuffs_base__image_decoder__func_ptrs +-wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_jpeg__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_jpeg__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_jpeg__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_jpeg__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_jpeg__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_jpeg__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_jpeg__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_jpeg__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_jpeg__decoder__initialize( +- wuffs_jpeg__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ ++ wuffs_base__decode_frame_options* a_opts) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } +- +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- self->private_impl.choosy_decode_idct = &wuffs_jpeg__decoder__decode_idct__choosy_default; +- self->private_impl.choosy_load_mcu_blocks_for_single_component = &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default; +- self->private_impl.choosy_decode_mcu = &wuffs_jpeg__decoder__decode_mcu__choosy_default; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); +-} ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-wuffs_jpeg__decoder* +-wuffs_jpeg__decoder__alloc(void) { +- wuffs_jpeg__decoder* x = +- (wuffs_jpeg__decoder*)(calloc(sizeof(wuffs_jpeg__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_jpeg__decoder__initialize( +- x, sizeof(wuffs_jpeg__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_gif__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; + } +- return x; +-} + +-size_t +-sizeof__wuffs_jpeg__decoder(void) { +- return sizeof(wuffs_jpeg__decoder); +-} ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; + +-// ---------------- Function Implementations ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} + +-// -------- func jpeg.decoder.decode_idct ++// -------- func gif.decoder.do_decode_frame + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q) { +- return (*self->private_impl.choosy_decode_idct)(self, a_dst_buffer, a_dst_stride, a_q); +-} ++static wuffs_base__status ++wuffs_gif__decoder__do_decode_frame( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct__choosy_default( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q) { +- uint32_t v_bq0 = 0; +- uint32_t v_bq2 = 0; +- uint32_t v_bq4 = 0; +- uint32_t v_bq6 = 0; +- uint32_t v_ca = 0; +- uint32_t v_cb2 = 0; +- uint32_t v_cb6 = 0; +- uint32_t v_ccp = 0; +- uint32_t v_ccm = 0; +- uint32_t v_cd0 = 0; +- uint32_t v_cd1 = 0; +- uint32_t v_cd2 = 0; +- uint32_t v_cd3 = 0; +- uint32_t v_bq1 = 0; +- uint32_t v_bq3 = 0; +- uint32_t v_bq5 = 0; +- uint32_t v_bq7 = 0; +- uint32_t v_ci51 = 0; +- uint32_t v_ci53 = 0; +- uint32_t v_ci71 = 0; +- uint32_t v_ci73 = 0; +- uint32_t v_cj = 0; +- uint32_t v_ck1 = 0; +- uint32_t v_ck3 = 0; +- uint32_t v_ck5 = 0; +- uint32_t v_ck7 = 0; +- uint32_t v_cl51 = 0; +- uint32_t v_cl73 = 0; +- uint32_t v_in0 = 0; +- uint32_t v_in2 = 0; +- uint32_t v_in4 = 0; +- uint32_t v_in6 = 0; +- uint32_t v_ra = 0; +- uint32_t v_rb2 = 0; +- uint32_t v_rb6 = 0; +- uint32_t v_rcp = 0; +- uint32_t v_rcm = 0; +- uint32_t v_rd0 = 0; +- uint32_t v_rd1 = 0; +- uint32_t v_rd2 = 0; +- uint32_t v_rd3 = 0; +- uint32_t v_in1 = 0; +- uint32_t v_in3 = 0; +- uint32_t v_in5 = 0; +- uint32_t v_in7 = 0; +- uint32_t v_ri51 = 0; +- uint32_t v_ri53 = 0; +- uint32_t v_ri71 = 0; +- uint32_t v_ri73 = 0; +- uint32_t v_rj = 0; +- uint32_t v_rk1 = 0; +- uint32_t v_rk3 = 0; +- uint32_t v_rk5 = 0; +- uint32_t v_rk7 = 0; +- uint32_t v_rl51 = 0; +- uint32_t v_rl73 = 0; +- uint32_t v_intermediate[64] = {0}; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (8u > a_dst_stride) { +- return wuffs_base__make_empty_struct(); +- } +- if (0u == (self->private_data.f_mcu_blocks[0u][8u] | +- self->private_data.f_mcu_blocks[0u][16u] | +- self->private_data.f_mcu_blocks[0u][24u] | +- self->private_data.f_mcu_blocks[0u][32u] | +- self->private_data.f_mcu_blocks[0u][40u] | +- self->private_data.f_mcu_blocks[0u][48u] | +- self->private_data.f_mcu_blocks[0u][56u])) { +- v_intermediate[0u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][0u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][0u])))) << 2u)); +- v_intermediate[8u] = v_intermediate[0u]; +- v_intermediate[16u] = v_intermediate[0u]; +- v_intermediate[24u] = v_intermediate[0u]; +- v_intermediate[32u] = v_intermediate[0u]; +- v_intermediate[40u] = v_intermediate[0u]; +- v_intermediate[48u] = v_intermediate[0u]; +- v_intermediate[56u] = v_intermediate[0u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][16u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][16u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][48u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][48u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][0u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][0u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][32u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][32u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][8u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][8u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][24u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][24u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][40u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][40u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][56u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][56u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[0u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[56u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[8u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[48u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[16u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[40u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[24u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[32u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_gif__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (self->private_impl.f_quirks[5u] && ((self->private_impl.f_frame_rect_x0 == self->private_impl.f_frame_rect_x1) || (self->private_impl.f_frame_rect_y0 == self->private_impl.f_frame_rect_y1))) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_frame_size); ++ goto exit; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_gif__decoder__decode_id_part1(self, a_dst, a_src, a_blend); ++ if (status.repr) { ++ goto suspend; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_gif__decoder__decode_id_part2(self, a_dst, a_src, a_workbuf); ++ if (status.repr) { ++ goto suspend; ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ wuffs_gif__decoder__reset_gc(self); ++ self->private_impl.f_call_sequence = 32u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; + } +- if (0u == (self->private_data.f_mcu_blocks[0u][9u] | +- self->private_data.f_mcu_blocks[0u][17u] | +- self->private_data.f_mcu_blocks[0u][25u] | +- self->private_data.f_mcu_blocks[0u][33u] | +- self->private_data.f_mcu_blocks[0u][41u] | +- self->private_data.f_mcu_blocks[0u][49u] | +- self->private_data.f_mcu_blocks[0u][57u])) { +- v_intermediate[1u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][1u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][1u])))) << 2u)); +- v_intermediate[9u] = v_intermediate[1u]; +- v_intermediate[17u] = v_intermediate[1u]; +- v_intermediate[25u] = v_intermediate[1u]; +- v_intermediate[33u] = v_intermediate[1u]; +- v_intermediate[41u] = v_intermediate[1u]; +- v_intermediate[49u] = v_intermediate[1u]; +- v_intermediate[57u] = v_intermediate[1u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][17u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][17u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][49u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][49u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][1u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][1u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][33u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][33u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][9u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][9u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][25u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][25u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][41u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][41u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][57u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][57u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[1u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[57u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[9u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[49u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[17u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[41u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[25u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[33u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func gif.decoder.reset_gc ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_gif__decoder__reset_gc( ++ wuffs_gif__decoder* self) { ++ self->private_impl.f_gc_has_transparent_index = false; ++ self->private_impl.f_gc_transparent_index = 0u; ++ self->private_impl.f_gc_disposal = 0u; ++ self->private_impl.f_gc_duration = 0u; ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func gif.decoder.decode_up_to_id_part1 ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_up_to_id_part1( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_block_type = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (0u == (self->private_data.f_mcu_blocks[0u][10u] | +- self->private_data.f_mcu_blocks[0u][18u] | +- self->private_data.f_mcu_blocks[0u][26u] | +- self->private_data.f_mcu_blocks[0u][34u] | +- self->private_data.f_mcu_blocks[0u][42u] | +- self->private_data.f_mcu_blocks[0u][50u] | +- self->private_data.f_mcu_blocks[0u][58u])) { +- v_intermediate[2u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][2u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][2u])))) << 2u)); +- v_intermediate[10u] = v_intermediate[2u]; +- v_intermediate[18u] = v_intermediate[2u]; +- v_intermediate[26u] = v_intermediate[2u]; +- v_intermediate[34u] = v_intermediate[2u]; +- v_intermediate[42u] = v_intermediate[2u]; +- v_intermediate[50u] = v_intermediate[2u]; +- v_intermediate[58u] = v_intermediate[2u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][18u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][18u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][50u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][50u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][2u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][2u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][34u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][34u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][10u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][10u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][26u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][26u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][42u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][42u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][58u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][58u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[2u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[58u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[10u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[50u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[18u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[42u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[26u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[34u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_up_to_id_part1; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if ((self->private_impl.f_frame_config_io_position == 0u) || (self->private_impl.f_num_decoded_frame_configs_value > 0u)) { ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_block_type = t_0; ++ } ++ if (v_block_type == 33u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_gif__decoder__decode_extension(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (v_block_type == 44u) { ++ if (self->private_impl.f_delayed_num_decoded_frames) { ++ self->private_impl.f_delayed_num_decoded_frames = false; ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_gif__decoder__decode_id_part0(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ break; ++ } else { ++ if (self->private_impl.f_delayed_num_decoded_frames) { ++ self->private_impl.f_delayed_num_decoded_frames = false; ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ } ++ self->private_impl.f_call_sequence = 96u; ++ break; ++ } ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_up_to_id_part1 = 0; ++ goto exit; + } +- if (0u == (self->private_data.f_mcu_blocks[0u][11u] | +- self->private_data.f_mcu_blocks[0u][19u] | +- self->private_data.f_mcu_blocks[0u][27u] | +- self->private_data.f_mcu_blocks[0u][35u] | +- self->private_data.f_mcu_blocks[0u][43u] | +- self->private_data.f_mcu_blocks[0u][51u] | +- self->private_data.f_mcu_blocks[0u][59u])) { +- v_intermediate[3u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][3u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][3u])))) << 2u)); +- v_intermediate[11u] = v_intermediate[3u]; +- v_intermediate[19u] = v_intermediate[3u]; +- v_intermediate[27u] = v_intermediate[3u]; +- v_intermediate[35u] = v_intermediate[3u]; +- v_intermediate[43u] = v_intermediate[3u]; +- v_intermediate[51u] = v_intermediate[3u]; +- v_intermediate[59u] = v_intermediate[3u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][19u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][19u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][51u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][51u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][3u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][3u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][35u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][35u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][11u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][11u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][27u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][27u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][43u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][43u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][59u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][59u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[3u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[59u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[11u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[51u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[19u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[43u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[27u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[35u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_up_to_id_part1 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (0u == (self->private_data.f_mcu_blocks[0u][12u] | +- self->private_data.f_mcu_blocks[0u][20u] | +- self->private_data.f_mcu_blocks[0u][28u] | +- self->private_data.f_mcu_blocks[0u][36u] | +- self->private_data.f_mcu_blocks[0u][44u] | +- self->private_data.f_mcu_blocks[0u][52u] | +- self->private_data.f_mcu_blocks[0u][60u])) { +- v_intermediate[4u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][4u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][4u])))) << 2u)); +- v_intermediate[12u] = v_intermediate[4u]; +- v_intermediate[20u] = v_intermediate[4u]; +- v_intermediate[28u] = v_intermediate[4u]; +- v_intermediate[36u] = v_intermediate[4u]; +- v_intermediate[44u] = v_intermediate[4u]; +- v_intermediate[52u] = v_intermediate[4u]; +- v_intermediate[60u] = v_intermediate[4u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][20u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][20u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][52u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][52u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][4u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][4u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][36u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][36u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][12u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][12u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][28u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][28u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][44u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][44u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][60u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][60u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[4u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[60u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[12u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[52u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[20u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[44u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[28u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[36u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ return status; ++} ++ ++// -------- func gif.decoder.decode_header ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_header( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint64_t v_c48 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (0u == (self->private_data.f_mcu_blocks[0u][13u] | +- self->private_data.f_mcu_blocks[0u][21u] | +- self->private_data.f_mcu_blocks[0u][29u] | +- self->private_data.f_mcu_blocks[0u][37u] | +- self->private_data.f_mcu_blocks[0u][45u] | +- self->private_data.f_mcu_blocks[0u][53u] | +- self->private_data.f_mcu_blocks[0u][61u])) { +- v_intermediate[5u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][5u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][5u])))) << 2u)); +- v_intermediate[13u] = v_intermediate[5u]; +- v_intermediate[21u] = v_intermediate[5u]; +- v_intermediate[29u] = v_intermediate[5u]; +- v_intermediate[37u] = v_intermediate[5u]; +- v_intermediate[45u] = v_intermediate[5u]; +- v_intermediate[53u] = v_intermediate[5u]; +- v_intermediate[61u] = v_intermediate[5u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][21u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][21u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][53u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][53u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][5u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][5u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][37u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][37u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][13u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][13u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][29u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][29u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][45u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][45u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][61u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][61u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[5u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[61u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[13u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[53u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[21u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[45u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[29u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[37u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_header; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))); ++ iop_a_src += 6; ++ } else { ++ self->private_data.s_decode_header.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_header.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 40) { ++ t_0 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_c48 = t_0; ++ } ++ if ((v_c48 != 106889795225927u) && (v_c48 != 106898385160519u)) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_header); ++ goto exit; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_header = 0; ++ goto exit; + } +- if (0u == (self->private_data.f_mcu_blocks[0u][14u] | +- self->private_data.f_mcu_blocks[0u][22u] | +- self->private_data.f_mcu_blocks[0u][30u] | +- self->private_data.f_mcu_blocks[0u][38u] | +- self->private_data.f_mcu_blocks[0u][46u] | +- self->private_data.f_mcu_blocks[0u][54u] | +- self->private_data.f_mcu_blocks[0u][62u])) { +- v_intermediate[6u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][6u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][6u])))) << 2u)); +- v_intermediate[14u] = v_intermediate[6u]; +- v_intermediate[22u] = v_intermediate[6u]; +- v_intermediate[30u] = v_intermediate[6u]; +- v_intermediate[38u] = v_intermediate[6u]; +- v_intermediate[46u] = v_intermediate[6u]; +- v_intermediate[54u] = v_intermediate[6u]; +- v_intermediate[62u] = v_intermediate[6u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][22u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][22u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][54u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][54u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][6u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][6u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][38u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][38u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][14u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][14u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][30u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][30u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][46u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][46u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][62u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][62u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[6u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[62u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[14u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[54u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[22u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[46u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[30u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[38u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_header = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (0u == (self->private_data.f_mcu_blocks[0u][15u] | +- self->private_data.f_mcu_blocks[0u][23u] | +- self->private_data.f_mcu_blocks[0u][31u] | +- self->private_data.f_mcu_blocks[0u][39u] | +- self->private_data.f_mcu_blocks[0u][47u] | +- self->private_data.f_mcu_blocks[0u][55u] | +- self->private_data.f_mcu_blocks[0u][63u])) { +- v_intermediate[7u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][7u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][7u])))) << 2u)); +- v_intermediate[15u] = v_intermediate[7u]; +- v_intermediate[23u] = v_intermediate[7u]; +- v_intermediate[31u] = v_intermediate[7u]; +- v_intermediate[39u] = v_intermediate[7u]; +- v_intermediate[47u] = v_intermediate[7u]; +- v_intermediate[55u] = v_intermediate[7u]; +- v_intermediate[63u] = v_intermediate[7u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][23u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][23u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][55u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][55u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][7u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][7u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][39u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][39u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][15u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][15u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][31u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][31u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][47u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][47u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][63u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][63u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[7u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[63u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[15u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[55u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[23u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[47u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[31u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[39u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ return status; ++} ++ ++// -------- func gif.decoder.decode_lsd ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_lsd( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_flags = 0; ++ uint8_t v_background_color_index = 0; ++ uint32_t v_num_palette_entries = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ uint32_t v_argb = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (0u == (v_intermediate[1u] | +- v_intermediate[2u] | +- v_intermediate[3u] | +- v_intermediate[4u] | +- v_intermediate[5u] | +- v_intermediate[6u] | +- v_intermediate[7u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[0u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[2u]; +- v_in6 = v_intermediate[6u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[0u]; +- v_in4 = v_intermediate[4u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[1u]; +- v_in3 = v_intermediate[3u]; +- v_in5 = v_intermediate[5u]; +- v_in7 = v_intermediate[7u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_lsd; ++ if (coro_susp_point) { ++ v_flags = self->private_data.s_decode_lsd.v_flags; ++ v_background_color_index = self->private_data.s_decode_lsd.v_background_color_index; ++ v_num_palette_entries = self->private_data.s_decode_lsd.v_num_palette_entries; ++ v_i = self->private_data.s_decode_lsd.v_i; + } +- if (0u == (v_intermediate[9u] | +- v_intermediate[10u] | +- v_intermediate[11u] | +- v_intermediate[12u] | +- v_intermediate[13u] | +- v_intermediate[14u] | +- v_intermediate[15u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_lsd.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_lsd.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 8) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ self->private_impl.f_width = t_0; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[8u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[10u]; +- v_in6 = v_intermediate[14u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[8u]; +- v_in4 = v_intermediate[12u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[9u]; +- v_in3 = v_intermediate[11u]; +- v_in5 = v_intermediate[13u]; +- v_in7 = v_intermediate[15u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_lsd.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_lsd.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 8) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ self->private_impl.f_height = t_1; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } +- if (0u == (v_intermediate[17u] | +- v_intermediate[18u] | +- v_intermediate[19u] | +- v_intermediate[20u] | +- v_intermediate[21u] | +- v_intermediate[22u] | +- v_intermediate[23u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_flags = t_2; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[16u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[18u]; +- v_in6 = v_intermediate[22u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[16u]; +- v_in4 = v_intermediate[20u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[17u]; +- v_in3 = v_intermediate[19u]; +- v_in5 = v_intermediate[21u]; +- v_in7 = v_intermediate[23u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_background_color_index = t_3; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } +- if (0u == (v_intermediate[25u] | +- v_intermediate[26u] | +- v_intermediate[27u] | +- v_intermediate[28u] | +- v_intermediate[29u] | +- v_intermediate[30u] | +- v_intermediate[31u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[24u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[26u]; +- v_in6 = v_intermediate[30u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[24u]; +- v_in4 = v_intermediate[28u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[25u]; +- v_in3 = v_intermediate[27u]; +- v_in5 = v_intermediate[29u]; +- v_in7 = v_intermediate[31u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } +- if (0u == (v_intermediate[33u] | +- v_intermediate[34u] | +- v_intermediate[35u] | +- v_intermediate[36u] | +- v_intermediate[37u] | +- v_intermediate[38u] | +- v_intermediate[39u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ iop_a_src++; ++ v_i = 0u; ++ self->private_impl.f_has_global_palette = (((uint8_t)(v_flags & 128u)) != 0u); ++ if (self->private_impl.f_has_global_palette) { ++ v_num_palette_entries = (((uint32_t)(1u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u))))); ++ while (v_i < v_num_palette_entries) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { ++ t_4 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); ++ iop_a_src += 3; ++ } else { ++ self->private_data.s_decode_lsd.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_lsd.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ if (num_bits_4 == 16) { ++ t_4 = ((uint32_t)(*scratch >> 40)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)); ++ } ++ } ++ v_argb = t_4; ++ } ++ v_argb |= 4278190080u; ++ self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); ++ self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); ++ self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); ++ self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); ++ v_i += 1u; ++ } ++ if (self->private_impl.f_quirks[2u]) { ++ if ((v_background_color_index != 0u) && (((uint32_t)(v_background_color_index)) < v_num_palette_entries)) { ++ v_j = (4u * ((uint32_t)(v_background_color_index))); ++ self->private_impl.f_background_color_u32_argb_premul = ((((uint32_t)(self->private_data.f_palettes[0u][(v_j + 0u)])) << 0u) | ++ (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 1u)])) << 8u) | ++ (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 2u)])) << 16u) | ++ (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 3u)])) << 24u)); ++ } else { ++ self->private_impl.f_background_color_u32_argb_premul = 77u; ++ } ++ } + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[32u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[34u]; +- v_in6 = v_intermediate[38u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[32u]; +- v_in4 = v_intermediate[36u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[33u]; +- v_in3 = v_intermediate[35u]; +- v_in5 = v_intermediate[37u]; +- v_in7 = v_intermediate[39u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ while (v_i < 256u) { ++ self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = 0u; ++ self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = 0u; ++ self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = 0u; ++ self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = 255u; ++ v_i += 1u; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_lsd = 0; ++ goto exit; + } +- if (0u == (v_intermediate[41u] | +- v_intermediate[42u] | +- v_intermediate[43u] | +- v_intermediate[44u] | +- v_intermediate[45u] | +- v_intermediate[46u] | +- v_intermediate[47u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[40u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[42u]; +- v_in6 = v_intermediate[46u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[40u]; +- v_in4 = v_intermediate[44u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[41u]; +- v_in3 = v_intermediate[43u]; +- v_in5 = v_intermediate[45u]; +- v_in7 = v_intermediate[47u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_lsd = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_lsd.v_flags = v_flags; ++ self->private_data.s_decode_lsd.v_background_color_index = v_background_color_index; ++ self->private_data.s_decode_lsd.v_num_palette_entries = v_num_palette_entries; ++ self->private_data.s_decode_lsd.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (0u == (v_intermediate[49u] | +- v_intermediate[50u] | +- v_intermediate[51u] | +- v_intermediate[52u] | +- v_intermediate[53u] | +- v_intermediate[54u] | +- v_intermediate[55u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ ++ return status; ++} ++ ++// -------- func gif.decoder.decode_extension ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_extension( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_label = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_extension; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_label = t_0; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[48u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[50u]; +- v_in6 = v_intermediate[54u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[48u]; +- v_in4 = v_intermediate[52u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[49u]; +- v_in3 = v_intermediate[51u]; +- v_in5 = v_intermediate[53u]; +- v_in7 = v_intermediate[55u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ if (v_label == 249u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_gif__decoder__decode_gc(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } else if (v_label == 255u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_gif__decoder__decode_ae(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } +- if (0u == (v_intermediate[57u] | +- v_intermediate[58u] | +- v_intermediate[59u] | +- v_intermediate[60u] | +- v_intermediate[61u] | +- v_intermediate[62u] | +- v_intermediate[63u])) { +- if (8u > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[56u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- } else { +- v_in2 = v_intermediate[58u]; +- v_in6 = v_intermediate[62u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[56u]; +- v_in4 = v_intermediate[60u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[57u]; +- v_in3 = v_intermediate[59u]; +- v_in5 = v_intermediate[61u]; +- v_in7 = v_intermediate[63u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (8u > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_gif__decoder__skip_blocks(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ if (status.repr) { ++ goto suspend; ++ } ++ ++ ok: ++ self->private_impl.p_decode_extension = 0; ++ goto exit; + } +- return wuffs_base__make_empty_struct(); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_extension = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; + } + +-// ‼ WUFFS MULTI-FILE SECTION +x86_avx2 +-// -------- func jpeg.decoder.decode_idct_x86_avx2 ++// -------- func gif.decoder.skip_blocks + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct_x86_avx2( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q) { +- __m256i v_k_0000 = {0}; +- __m256i v_k_8080 = {0}; +- __m256i v_k_0000_0002 = {0}; +- __m256i v_k_0001_FFFF = {0}; +- __m256i v_k_0400_0000 = {0}; +- __m256i v_k_29CF_1151_D630_1151 = {0}; +- __m256i v_k_E333_133E_ADFD_1051 = {0}; +- __m256i v_k_E6DC_25A1_1925_25A1 = {0}; +- __m256i v_k_ECC1_E333_EFB0_ADFD = {0}; +- __m128i v_az_coeffs = {0}; +- __m256i v_az_ah00 = {0}; +- __m256i v_az_ad00 = {0}; +- __m256i v_az_eh00 = {0}; +- __m256i v_az_adeh = {0}; +- __m256i v_rows01 = {0}; +- __m256i v_rows23 = {0}; +- __m256i v_rows45 = {0}; +- __m256i v_rows67 = {0}; +- __m256i v_quants01 = {0}; +- __m256i v_quants23 = {0}; +- __m256i v_quants45 = {0}; +- __m256i v_quants67 = {0}; +- __m256i v_rows04 = {0}; +- __m256i v_rows31 = {0}; +- __m256i v_rows26 = {0}; +- __m256i v_rows75 = {0}; +- __m256i v_fp_rows62 = {0}; +- __m256i v_fp_bq2662ad = {0}; +- __m256i v_fp_bq2662eh = {0}; +- __m256i v_fp_cb26ad = {0}; +- __m256i v_fp_cb26eh = {0}; +- __m256i v_fp_rows40pos = {0}; +- __m256i v_fp_rows04neg = {0}; +- __m256i v_fp_rows0pm4 = {0}; +- __m256i v_fp_ccpmad = {0}; +- __m256i v_fp_ccpmeh = {0}; +- __m256i v_fp_cd01ad = {0}; +- __m256i v_fp_cd01eh = {0}; +- __m256i v_fp_cd32ad = {0}; +- __m256i v_fp_cd32eh = {0}; +- __m256i v_fp_sums7351 = {0}; +- __m256i v_fp_sums5173 = {0}; +- __m256i v_fp_ci73515173ad = {0}; +- __m256i v_fp_ci73515173eh = {0}; +- __m256i v_fp_cl7351ad = {0}; +- __m256i v_fp_cl7351eh = {0}; +- __m256i v_fp_rows13 = {0}; +- __m256i v_fp_bq7153ad = {0}; +- __m256i v_fp_bq7153eh = {0}; +- __m256i v_fp_ck75ad = {0}; +- __m256i v_fp_ck75eh = {0}; +- __m256i v_fp_cl5173ad = {0}; +- __m256i v_fp_cl5173eh = {0}; +- __m256i v_fp_ck13ad = {0}; +- __m256i v_fp_ck13eh = {0}; +- __m256i v_intermediate01ad = {0}; +- __m256i v_intermediate01eh = {0}; +- __m256i v_intermediate01 = {0}; +- __m256i v_intermediate32ad = {0}; +- __m256i v_intermediate32eh = {0}; +- __m256i v_intermediate32 = {0}; +- __m256i v_intermediate45ad = {0}; +- __m256i v_intermediate45eh = {0}; +- __m256i v_intermediate45 = {0}; +- __m256i v_intermediate76ad = {0}; +- __m256i v_intermediate76eh = {0}; +- __m256i v_intermediate76 = {0}; +- __m256i v_ita0a1e0e1 = {0}; +- __m256i v_ita2a3e2e3 = {0}; +- __m256i v_ita4a5e4e5 = {0}; +- __m256i v_ita6a7e6e7 = {0}; +- __m256i v_ita0c0e0g0 = {0}; +- __m256i v_ita1c1e1g1 = {0}; +- __m256i v_ita4c4e4g4 = {0}; +- __m256i v_ita5c5e5g5 = {0}; +- __m256i v_ita0b0e0f0 = {0}; +- __m256i v_ita4b4e4f4 = {0}; +- __m256i v_itc0d0g0h0 = {0}; +- __m256i v_itc4d4g4h4 = {0}; +- __m256i v_intermediateae = {0}; +- __m256i v_intermediatebf = {0}; +- __m256i v_intermediatecg = {0}; +- __m256i v_intermediatedh = {0}; +- __m256i v_intermediatedb = {0}; +- __m256i v_intermediatehf = {0}; +- __m256i v_sp_cols62 = {0}; +- __m256i v_sp_bq2662ad = {0}; +- __m256i v_sp_bq2662eh = {0}; +- __m256i v_sp_rb26ad = {0}; +- __m256i v_sp_rb26eh = {0}; +- __m256i v_sp_cols40pos = {0}; +- __m256i v_sp_cols04neg = {0}; +- __m256i v_sp_cols0pm4 = {0}; +- __m256i v_sp_rcpmad = {0}; +- __m256i v_sp_rcpmeh = {0}; +- __m256i v_sp_rd01ad = {0}; +- __m256i v_sp_rd01eh = {0}; +- __m256i v_sp_rd32ad = {0}; +- __m256i v_sp_rd32eh = {0}; +- __m256i v_sp_sums7351 = {0}; +- __m256i v_sp_sums5173 = {0}; +- __m256i v_sp_ri73515173ad = {0}; +- __m256i v_sp_ri73515173eh = {0}; +- __m256i v_sp_rl7351ad = {0}; +- __m256i v_sp_rl7351eh = {0}; +- __m256i v_sp_cols13 = {0}; +- __m256i v_sp_bq7153ad = {0}; +- __m256i v_sp_bq7153eh = {0}; +- __m256i v_sp_rk75ad = {0}; +- __m256i v_sp_rk75eh = {0}; +- __m256i v_sp_rl5173ad = {0}; +- __m256i v_sp_rl5173eh = {0}; +- __m256i v_sp_rk13ad = {0}; +- __m256i v_sp_rk13eh = {0}; +- __m256i v_final01ad = {0}; +- __m256i v_final01eh = {0}; +- __m256i v_final01 = {0}; +- __m256i v_final32ad = {0}; +- __m256i v_final32eh = {0}; +- __m256i v_final32 = {0}; +- __m256i v_final45ad = {0}; +- __m256i v_final45eh = {0}; +- __m256i v_final45 = {0}; +- __m256i v_final76ad = {0}; +- __m256i v_final76eh = {0}; +- __m256i v_final76 = {0}; +- __m256i v_fta0a1e0e1 = {0}; +- __m256i v_fta2a3e2e3 = {0}; +- __m256i v_fta4a5e4e5 = {0}; +- __m256i v_fta6a7e6e7 = {0}; +- __m256i v_fta0c0e0g0 = {0}; +- __m256i v_fta1c1e1g1 = {0}; +- __m256i v_fta4c4e4g4 = {0}; +- __m256i v_fta5c5e5g5 = {0}; +- __m256i v_fta0b0e0f0 = {0}; +- __m256i v_ftc0d0g0h0 = {0}; +- __m256i v_fta4b4e4f4 = {0}; +- __m256i v_ftc4d4g4h4 = {0}; +- __m256i v_finalae = {0}; +- __m256i v_finalbf = {0}; +- __m256i v_finalcg = {0}; +- __m256i v_finaldh = {0}; +- __m256i v_final0145 = {0}; +- __m256i v_final2367 = {0}; +- uint64_t v_final0 = 0; +- uint64_t v_final1 = 0; +- uint64_t v_final2 = 0; +- uint64_t v_final3 = 0; +- uint64_t v_final4 = 0; +- uint64_t v_final5 = 0; +- uint64_t v_final6 = 0; +- uint64_t v_final7 = 0; +- wuffs_base__slice_u8 v_remaining = {0}; +- +- if (8u > a_dst_stride) { +- return wuffs_base__make_empty_struct(); +- } +- v_k_0000 = _mm256_set_epi16((int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u)); +- v_k_8080 = _mm256_set_epi16((int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u)); +- v_k_0000_0002 = _mm256_set_epi16((int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u)); +- v_k_0001_FFFF = _mm256_set_epi16((int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u)); +- v_k_0400_0000 = _mm256_set_epi16((int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u)); +- v_k_29CF_1151_D630_1151 = _mm256_set_epi16((int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u)); +- v_k_E333_133E_ADFD_1051 = _mm256_set_epi16((int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u)); +- v_k_E6DC_25A1_1925_25A1 = _mm256_set_epi16((int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u)); +- v_k_ECC1_E333_EFB0_ADFD = _mm256_set_epi16((int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u)); +- do { +- if (0u == (wuffs_base__peek_u64le__no_bounds_check((const uint8_t*)(const void*)(self->private_data.f_mcu_blocks[0u] + 8u)) | wuffs_base__peek_u64le__no_bounds_check((const uint8_t*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u)))) { +- v_az_coeffs = _mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 8u)), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 24u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 32u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 40u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 48u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 56u))); +- if (0u == ((uint64_t)(_mm_cvtsi128_si64(_mm_packs_epi16(v_az_coeffs, v_az_coeffs))))) { +- v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u)); +- v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u)); +- v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01); +- v_az_ah00 = _mm256_slli_epi16(v_rows01, (int32_t)(2u)); +- v_az_ad00 = _mm256_unpacklo_epi16(v_az_ah00, v_az_ah00); +- v_az_eh00 = _mm256_unpackhi_epi16(v_az_ah00, v_az_ah00); +- v_az_adeh = _mm256_inserti128_si256(v_az_ad00, _mm256_castsi256_si128(v_az_eh00), (int32_t)(1u)); +- v_intermediateae = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(0u)); +- v_intermediatebf = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(85u)); +- v_intermediatecg = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(170u)); +- v_intermediatedh = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(255u)); +- break; +- } +- } +- v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u)); +- v_rows23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u)); +- v_rows45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 32u)); +- v_rows67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 48u)); +- v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u)); +- v_quants23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 16u)); +- v_quants45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 32u)); +- v_quants67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 48u)); +- v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01); +- v_rows23 = _mm256_mullo_epi16(v_rows23, v_quants23); +- v_rows45 = _mm256_mullo_epi16(v_rows45, v_quants45); +- v_rows67 = _mm256_mullo_epi16(v_rows67, v_quants67); +- v_rows04 = _mm256_permute2x128_si256(v_rows01, v_rows45, (int32_t)(32u)); +- v_rows31 = _mm256_permute2x128_si256(v_rows23, v_rows01, (int32_t)(49u)); +- v_rows26 = _mm256_permute2x128_si256(v_rows23, v_rows67, (int32_t)(32u)); +- v_rows75 = _mm256_permute2x128_si256(v_rows67, v_rows45, (int32_t)(49u)); +- v_fp_rows62 = _mm256_permute2x128_si256(v_rows26, v_rows26, (int32_t)(1u)); +- v_fp_bq2662ad = _mm256_unpacklo_epi16(v_rows26, v_fp_rows62); +- v_fp_bq2662eh = _mm256_unpackhi_epi16(v_rows26, v_fp_rows62); +- v_fp_cb26ad = _mm256_madd_epi16(v_fp_bq2662ad, v_k_29CF_1151_D630_1151); +- v_fp_cb26eh = _mm256_madd_epi16(v_fp_bq2662eh, v_k_29CF_1151_D630_1151); +- v_fp_rows40pos = _mm256_permute2x128_si256(v_rows04, v_rows04, (int32_t)(1u)); +- v_fp_rows04neg = _mm256_sign_epi16(v_rows04, v_k_0001_FFFF); +- v_fp_rows0pm4 = _mm256_add_epi16(v_fp_rows40pos, v_fp_rows04neg); +- v_fp_ccpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u)); +- v_fp_ccpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u)); +- v_fp_cd01ad = _mm256_add_epi32(v_fp_ccpmad, v_fp_cb26ad); +- v_fp_cd01eh = _mm256_add_epi32(v_fp_ccpmeh, v_fp_cb26eh); +- v_fp_cd32ad = _mm256_sub_epi32(v_fp_ccpmad, v_fp_cb26ad); +- v_fp_cd32eh = _mm256_sub_epi32(v_fp_ccpmeh, v_fp_cb26eh); +- v_fp_sums7351 = _mm256_add_epi16(v_rows75, v_rows31); +- v_fp_sums5173 = _mm256_permute2x128_si256(v_fp_sums7351, v_fp_sums7351, (int32_t)(1u)); +- v_fp_ci73515173ad = _mm256_unpacklo_epi16(v_fp_sums7351, v_fp_sums5173); +- v_fp_ci73515173eh = _mm256_unpackhi_epi16(v_fp_sums7351, v_fp_sums5173); +- v_fp_cl7351ad = _mm256_madd_epi16(v_fp_ci73515173ad, v_k_E6DC_25A1_1925_25A1); +- v_fp_cl7351eh = _mm256_madd_epi16(v_fp_ci73515173eh, v_k_E6DC_25A1_1925_25A1); +- v_fp_rows13 = _mm256_permute2x128_si256(v_rows31, v_rows31, (int32_t)(1u)); +- v_fp_bq7153ad = _mm256_unpacklo_epi16(v_rows75, v_fp_rows13); +- v_fp_bq7153eh = _mm256_unpackhi_epi16(v_rows75, v_fp_rows13); +- v_fp_ck75ad = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351ad); +- v_fp_ck75eh = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351eh); +- v_fp_cl5173ad = _mm256_permute2x128_si256(v_fp_cl7351ad, v_fp_cl7351ad, (int32_t)(1u)); +- v_fp_cl5173eh = _mm256_permute2x128_si256(v_fp_cl7351eh, v_fp_cl7351eh, (int32_t)(1u)); +- v_fp_ck13ad = _mm256_add_epi32(v_fp_cl5173ad, _mm256_madd_epi16(v_fp_bq7153ad, v_k_E333_133E_ADFD_1051)); +- v_fp_ck13eh = _mm256_add_epi32(v_fp_cl5173eh, _mm256_madd_epi16(v_fp_bq7153eh, v_k_E333_133E_ADFD_1051)); +- v_intermediate01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate01 = _mm256_packs_epi32(v_intermediate01ad, v_intermediate01eh); +- v_intermediate32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate32 = _mm256_packs_epi32(v_intermediate32ad, v_intermediate32eh); +- v_intermediate45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate45 = _mm256_packs_epi32(v_intermediate45ad, v_intermediate45eh); +- v_intermediate76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate76 = _mm256_packs_epi32(v_intermediate76ad, v_intermediate76eh); +- v_ita0a1e0e1 = _mm256_permute4x64_epi64(v_intermediate01, (int32_t)(216u)); +- v_ita2a3e2e3 = _mm256_permute4x64_epi64(v_intermediate32, (int32_t)(114u)); +- v_ita4a5e4e5 = _mm256_permute4x64_epi64(v_intermediate45, (int32_t)(216u)); +- v_ita6a7e6e7 = _mm256_permute4x64_epi64(v_intermediate76, (int32_t)(114u)); +- v_ita0c0e0g0 = _mm256_unpacklo_epi16(v_ita0a1e0e1, v_ita2a3e2e3); +- v_ita1c1e1g1 = _mm256_unpackhi_epi16(v_ita0a1e0e1, v_ita2a3e2e3); +- v_ita4c4e4g4 = _mm256_unpacklo_epi16(v_ita4a5e4e5, v_ita6a7e6e7); +- v_ita5c5e5g5 = _mm256_unpackhi_epi16(v_ita4a5e4e5, v_ita6a7e6e7); +- v_ita0b0e0f0 = _mm256_unpacklo_epi16(v_ita0c0e0g0, v_ita1c1e1g1); +- v_itc0d0g0h0 = _mm256_unpackhi_epi16(v_ita0c0e0g0, v_ita1c1e1g1); +- v_ita4b4e4f4 = _mm256_unpacklo_epi16(v_ita4c4e4g4, v_ita5c5e5g5); +- v_itc4d4g4h4 = _mm256_unpackhi_epi16(v_ita4c4e4g4, v_ita5c5e5g5); +- v_intermediateae = _mm256_unpacklo_epi64(v_ita0b0e0f0, v_ita4b4e4f4); +- v_intermediatebf = _mm256_unpackhi_epi64(v_ita0b0e0f0, v_ita4b4e4f4); +- v_intermediatecg = _mm256_unpacklo_epi64(v_itc0d0g0h0, v_itc4d4g4h4); +- v_intermediatedh = _mm256_unpackhi_epi64(v_itc0d0g0h0, v_itc4d4g4h4); +- } while (0); +- v_intermediatedb = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(32u)); +- v_intermediatehf = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(49u)); +- v_sp_cols62 = _mm256_permute2x128_si256(v_intermediatecg, v_intermediatecg, (int32_t)(1u)); +- v_sp_bq2662ad = _mm256_unpacklo_epi16(v_intermediatecg, v_sp_cols62); +- v_sp_bq2662eh = _mm256_unpackhi_epi16(v_intermediatecg, v_sp_cols62); +- v_sp_rb26ad = _mm256_madd_epi16(v_sp_bq2662ad, v_k_29CF_1151_D630_1151); +- v_sp_rb26eh = _mm256_madd_epi16(v_sp_bq2662eh, v_k_29CF_1151_D630_1151); +- v_sp_cols40pos = _mm256_permute2x128_si256(v_intermediateae, v_intermediateae, (int32_t)(1u)); +- v_sp_cols04neg = _mm256_sign_epi16(v_intermediateae, v_k_0001_FFFF); +- v_sp_cols0pm4 = _mm256_add_epi16(v_sp_cols40pos, v_sp_cols04neg); +- v_sp_rcpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u)); +- v_sp_rcpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u)); +- v_sp_rd01ad = _mm256_add_epi32(v_sp_rcpmad, v_sp_rb26ad); +- v_sp_rd01eh = _mm256_add_epi32(v_sp_rcpmeh, v_sp_rb26eh); +- v_sp_rd32ad = _mm256_sub_epi32(v_sp_rcpmad, v_sp_rb26ad); +- v_sp_rd32eh = _mm256_sub_epi32(v_sp_rcpmeh, v_sp_rb26eh); +- v_sp_sums7351 = _mm256_add_epi16(v_intermediatehf, v_intermediatedb); +- v_sp_sums5173 = _mm256_permute2x128_si256(v_sp_sums7351, v_sp_sums7351, (int32_t)(1u)); +- v_sp_ri73515173ad = _mm256_unpacklo_epi16(v_sp_sums7351, v_sp_sums5173); +- v_sp_ri73515173eh = _mm256_unpackhi_epi16(v_sp_sums7351, v_sp_sums5173); +- v_sp_rl7351ad = _mm256_madd_epi16(v_sp_ri73515173ad, v_k_E6DC_25A1_1925_25A1); +- v_sp_rl7351eh = _mm256_madd_epi16(v_sp_ri73515173eh, v_k_E6DC_25A1_1925_25A1); +- v_sp_cols13 = _mm256_permute2x128_si256(v_intermediatedb, v_intermediatedb, (int32_t)(1u)); +- v_sp_bq7153ad = _mm256_unpacklo_epi16(v_intermediatehf, v_sp_cols13); +- v_sp_bq7153eh = _mm256_unpackhi_epi16(v_intermediatehf, v_sp_cols13); +- v_sp_rk75ad = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351ad); +- v_sp_rk75eh = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351eh); +- v_sp_rl5173ad = _mm256_permute2x128_si256(v_sp_rl7351ad, v_sp_rl7351ad, (int32_t)(1u)); +- v_sp_rl5173eh = _mm256_permute2x128_si256(v_sp_rl7351eh, v_sp_rl7351eh, (int32_t)(1u)); +- v_sp_rk13ad = _mm256_add_epi32(v_sp_rl5173ad, _mm256_madd_epi16(v_sp_bq7153ad, v_k_E333_133E_ADFD_1051)); +- v_sp_rk13eh = _mm256_add_epi32(v_sp_rl5173eh, _mm256_madd_epi16(v_sp_bq7153eh, v_k_E333_133E_ADFD_1051)); +- v_final01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u)); +- v_final01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u)); +- v_final01 = _mm256_packs_epi32(v_final01ad, v_final01eh); +- v_final32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u)); +- v_final32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u)); +- v_final32 = _mm256_packs_epi32(v_final32ad, v_final32eh); +- v_final45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u)); +- v_final45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u)); +- v_final45 = _mm256_packs_epi32(v_final45ad, v_final45eh); +- v_final76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u)); +- v_final76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u)); +- v_final76 = _mm256_packs_epi32(v_final76ad, v_final76eh); +- v_fta0a1e0e1 = _mm256_permute4x64_epi64(v_final01, (int32_t)(216u)); +- v_fta2a3e2e3 = _mm256_permute4x64_epi64(v_final32, (int32_t)(114u)); +- v_fta4a5e4e5 = _mm256_permute4x64_epi64(v_final45, (int32_t)(216u)); +- v_fta6a7e6e7 = _mm256_permute4x64_epi64(v_final76, (int32_t)(114u)); +- v_fta0c0e0g0 = _mm256_unpacklo_epi16(v_fta0a1e0e1, v_fta2a3e2e3); +- v_fta1c1e1g1 = _mm256_unpackhi_epi16(v_fta0a1e0e1, v_fta2a3e2e3); +- v_fta4c4e4g4 = _mm256_unpacklo_epi16(v_fta4a5e4e5, v_fta6a7e6e7); +- v_fta5c5e5g5 = _mm256_unpackhi_epi16(v_fta4a5e4e5, v_fta6a7e6e7); +- v_fta0b0e0f0 = _mm256_unpacklo_epi16(v_fta0c0e0g0, v_fta1c1e1g1); +- v_ftc0d0g0h0 = _mm256_unpackhi_epi16(v_fta0c0e0g0, v_fta1c1e1g1); +- v_fta4b4e4f4 = _mm256_unpacklo_epi16(v_fta4c4e4g4, v_fta5c5e5g5); +- v_ftc4d4g4h4 = _mm256_unpackhi_epi16(v_fta4c4e4g4, v_fta5c5e5g5); +- v_finalae = _mm256_unpacklo_epi64(v_fta0b0e0f0, v_fta4b4e4f4); +- v_finalbf = _mm256_unpackhi_epi64(v_fta0b0e0f0, v_fta4b4e4f4); +- v_finalcg = _mm256_unpacklo_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4); +- v_finaldh = _mm256_unpackhi_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4); +- v_final0145 = _mm256_add_epi8(_mm256_packs_epi16(v_finalae, v_finalbf), v_k_8080); +- v_final2367 = _mm256_add_epi8(_mm256_packs_epi16(v_finalcg, v_finaldh), v_k_8080); +- v_final0 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(0u)))); +- v_final1 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(1u)))); +- v_final2 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(0u)))); +- v_final3 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(1u)))); +- v_final4 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(2u)))); +- v_final5 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(3u)))); +- v_final6 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(2u)))); +- v_final7 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(3u)))); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final0); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final1); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final2); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final3); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final4); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final5); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final6); +- a_dst_buffer = v_remaining; +- if (8u > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final7); +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) +-// ‼ WUFFS MULTI-FILE SECTION -x86_avx2 +- +-// -------- func jpeg.decoder.get_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_jpeg__decoder__get_quirk( +- const wuffs_jpeg__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func jpeg.decoder.set_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__set_quirk( +- wuffs_jpeg__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +-} +- +-// -------- func jpeg.decoder.decode_image_config +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__decode_image_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__image_config* a_dst, ++static wuffs_base__status ++wuffs_gif__decoder__skip_blocks( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint8_t v_block_size = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_skip_blocks; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_block_size = t_0; + } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); +- goto exit; ++ if (v_block_size == 0u) { ++ status = wuffs_base__make_status(NULL); ++ goto ok; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ self->private_data.s_skip_blocks.scratch = ((uint32_t)(v_block_size)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (self->private_data.s_skip_blocks.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_skip_blocks.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_skip_blocks.scratch; + } + + ok: +- self->private_impl.p_decode_image_config[0] = 0; ++ self->private_impl.p_skip_blocks = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_impl.p_skip_blocks = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func jpeg.decoder.do_decode_image_config ++// -------- func gif.decoder.decode_ae + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_image_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__image_config* a_dst, ++wuffs_gif__decoder__decode_ae( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_marker = 0; +- uint32_t v_pixfmt = 0; ++ uint8_t v_c8 = 0; ++ uint8_t v_block_size = 0; ++ bool v_is_animexts = false; ++ bool v_is_netscape = false; ++ bool v_is_iccp = false; ++ bool v_is_xmp = false; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -42362,253 +42476,191 @@ wuffs_jpeg__decoder__do_decode_image_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_ae; + if (coro_susp_point) { +- v_marker = self->private_data.s_do_decode_image_config[0].v_marker; ++ v_block_size = self->private_data.s_decode_ae.v_block_size; ++ v_is_animexts = self->private_data.s_decode_ae.v_is_animexts; ++ v_is_netscape = self->private_data.s_decode_ae.v_is_netscape; ++ v_is_iccp = self->private_data.s_decode_ae.v_is_iccp; ++ v_is_xmp = self->private_data.s_decode_ae.v_is_xmp; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ do { ++ if (self->private_impl.f_metadata_fourcc != 0u) { ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; + } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c != 255u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_header); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_block_size = t_0; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- if (v_c != 216u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_header); +- goto exit; +- } +- while (true) { +- while (true) { ++ if (v_block_size == 0u) { ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ if (v_block_size != 11u) { ++ self->private_data.s_decode_ae.scratch = ((uint32_t)(v_block_size)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_ae.scratch; ++ break; ++ } ++ v_is_animexts = true; ++ v_is_netscape = true; ++ v_is_iccp = true; ++ v_is_xmp = true; ++ v_block_size = 0u; ++ while (v_block_size < 11u) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ v_is_animexts = (v_is_animexts && (v_c8 == WUFFS_GIF__ANIMEXTS1DOT0[v_block_size])); ++ v_is_netscape = (v_is_netscape && (v_c8 == WUFFS_GIF__NETSCAPE2DOT0[v_block_size])); ++ v_is_iccp = (v_is_iccp && (v_c8 == WUFFS_GIF__ICCRGBG1012[v_block_size])); ++ v_is_xmp = (v_is_xmp && (v_c8 == WUFFS_GIF__XMPDATAXMP[v_block_size])); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_block_size += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ if (v_is_animexts || v_is_netscape) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } + uint8_t t_2 = *iop_a_src++; +- v_c = t_2; ++ v_block_size = t_2; + } +- if (v_c == 255u) { ++ if (v_block_size != 3u) { ++ self->private_data.s_decode_ae.scratch = ((uint32_t)(v_block_size)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_ae.scratch; + break; + } +- } +- while (true) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_3 = *iop_a_src++; +- v_c = t_3; ++ v_c8 = t_3; + } +- if (v_c != 255u) { +- v_marker = v_c; ++ if (v_c8 != 1u) { ++ self->private_data.s_decode_ae.scratch = 2u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_ae.scratch; + break; + } +- } +- if (v_marker == 0u) { +- continue; +- } else if ((208u <= v_marker) && (v_marker <= 217u)) { +- if (v_marker <= 215u) { +- continue; +- } +- } else { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + uint32_t t_4; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ self->private_data.s_decode_ae.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_decode_ae.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; + if (num_bits_4 == 8) { +- t_4 = ((uint32_t)(*scratch >> 48)); ++ t_4 = ((uint32_t)(*scratch)); + break; + } + num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)); ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; + } + } +- self->private_impl.f_payload_length = t_4; +- } +- if (self->private_impl.f_payload_length < 2u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); +- goto exit; +- } +- self->private_impl.f_payload_length -= 2u; +- } +- if (v_marker < 192u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } else if (v_marker < 208u) { +- if (v_marker <= 194u) { +- if (self->private_impl.f_sof_marker != 0u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } +- self->private_impl.f_sof_marker = v_marker; +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- status = wuffs_jpeg__decoder__decode_sof(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- break; +- } else if (v_marker == 195u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_lossless_coding); +- goto exit; +- } else if (v_marker == 196u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } else if ((197u <= v_marker) && (v_marker <= 199u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_hierarchical_coding); +- goto exit; +- } else if (v_marker == 200u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_arithmetic_coding); +- goto exit; +- } +- } else if (v_marker < 224u) { +- if (v_marker < 218u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); +- goto exit; +- } else if (v_marker == 218u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } else if (v_marker == 219u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- status = wuffs_jpeg__decoder__decode_dqt(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- continue; +- } else if (v_marker == 221u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_jpeg__decoder__decode_dri(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- continue; +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } +- } else if (v_marker < 240u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- status = wuffs_jpeg__decoder__decode_appn(self, a_src, v_marker); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; ++ self->private_impl.f_num_animation_loops_value = t_4; + } +- continue; +- } else { +- if (v_marker == 254u) { +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; ++ self->private_impl.f_seen_num_animation_loops_value = true; ++ if ((0u < self->private_impl.f_num_animation_loops_value) && (self->private_impl.f_num_animation_loops_value <= 65535u)) { ++ self->private_impl.f_num_animation_loops_value += 1u; + } ++ } else if (self->private_impl.f_call_sequence >= 32u) { ++ } else if (v_is_iccp && self->private_impl.f_report_metadata_iccp) { ++ self->private_impl.f_metadata_fourcc = 1229144912u; ++ self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ self->private_impl.f_call_sequence = 16u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; ++ } else if (v_is_xmp && self->private_impl.f_report_metadata_xmp) { ++ self->private_impl.f_metadata_fourcc = 1481461792u; ++ self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ self->private_impl.f_call_sequence = 16u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; + } +- self->private_data.s_do_decode_image_config[0].scratch = self->private_impl.f_payload_length; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- self->private_impl.f_payload_length = 0u; ++ } while (0); ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- self->private_impl.choosy_decode_idct = ( +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +- wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_jpeg__decoder__decode_idct_x86_avx2 : +-#endif +- self->private_impl.choosy_decode_idct); +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- if (a_dst != NULL) { +- v_pixfmt = 536870920u; +- if (self->private_impl.f_num_components > 1u) { +- v_pixfmt = 2415954056u; +- } +- wuffs_base__image_config__set( +- a_dst, +- v_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- true); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ status = wuffs_gif__decoder__skip_blocks(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; + } +- self->private_impl.f_call_sequence = 32u; + +- goto ok; + ok: +- self->private_impl.p_do_decode_image_config[0] = 0; ++ self->private_impl.p_decode_ae = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_image_config[0].v_marker = v_marker; ++ self->private_impl.p_decode_ae = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_ae.v_block_size = v_block_size; ++ self->private_data.s_decode_ae.v_is_animexts = v_is_animexts; ++ self->private_data.s_decode_ae.v_is_netscape = v_is_netscape; ++ self->private_data.s_decode_ae.v_is_iccp = v_is_iccp; ++ self->private_data.s_decode_ae.v_is_xmp = v_is_xmp; + + goto exit; + exit: +@@ -42619,18 +42671,18 @@ wuffs_jpeg__decoder__do_decode_image_config( + return status; + } + +-// -------- func jpeg.decoder.decode_dqt ++// -------- func gif.decoder.decode_gc + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__decode_dqt( +- wuffs_jpeg__decoder* self, ++wuffs_gif__decoder__decode_gc( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_q = 0; +- uint32_t v_i = 0; ++ uint8_t v_c8 = 0; ++ uint8_t v_flags = 0; ++ uint16_t v_gc_duration_centiseconds = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -42643,73 +42695,103 @@ wuffs_jpeg__decoder__decode_dqt( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_dqt[0]; +- if (coro_susp_point) { +- v_q = self->private_data.s_decode_dqt[0].v_q; +- v_i = self->private_data.s_decode_dqt[0].v_i; +- } ++ uint32_t coro_susp_point = self->private_impl.p_decode_gc; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- while (self->private_impl.f_payload_length > 0u) { +- self->private_impl.f_payload_length -= 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if ((v_c & 15u) > 3u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker); +- goto exit; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_q = (v_c & 15u); +- if ((v_c >> 4u) == 1u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision); +- goto exit; +- } else if (((v_c >> 4u) > 1u) || (self->private_impl.f_payload_length < 64u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker); +- goto exit; ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 4u) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- self->private_impl.f_payload_length -= 64u; +- v_i = 0u; +- while (v_i < 64u) { +- v_i += 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint8_t t_1 = *iop_a_src++; ++ v_flags = t_1; ++ } ++ self->private_impl.f_gc_has_transparent_index = (((uint8_t)(v_flags & 1u)) != 0u); ++ v_flags = ((uint8_t)(((uint8_t)(v_flags >> 2u)) & 7u)); ++ if (v_flags == 2u) { ++ self->private_impl.f_gc_disposal = 1u; ++ } else if ((v_flags == 3u) || (v_flags == 4u)) { ++ self->private_impl.f_gc_disposal = 2u; ++ } else { ++ self->private_impl.f_gc_disposal = 0u; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint16_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_gc.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint16_t t_1 = *iop_a_src++; +- self->private_impl.f_quant_tables[v_q][WUFFS_JPEG__UNZIG[v_i]] = t_1; ++ uint64_t* scratch = &self->private_data.s_decode_gc.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 8) { ++ t_2 = ((uint16_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; + } + } +- self->private_impl.f_seen_dqt[v_q] = true; +- if (self->private_impl.f_sof_marker == 0u) { +- v_i = 0u; +- while (v_i < 64u) { +- self->private_impl.f_saved_quant_tables[v_q][v_i] = self->private_impl.f_quant_tables[v_q][v_i]; +- v_i += 1u; +- } +- self->private_impl.f_saved_seen_dqt[v_q] = true; ++ v_gc_duration_centiseconds = t_2; ++ } ++ self->private_impl.f_gc_duration = (((uint64_t)(v_gc_duration_centiseconds)) * 7056000u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ self->private_impl.f_gc_transparent_index = t_3; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control); ++ goto exit; + } + + goto ok; + ok: +- self->private_impl.p_decode_dqt[0] = 0; ++ self->private_impl.p_decode_gc = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_dqt[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_dqt[0].v_q = v_q; +- self->private_data.s_decode_dqt[0].v_i = v_i; ++ self->private_impl.p_decode_gc = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -42720,12 +42802,12 @@ wuffs_jpeg__decoder__decode_dqt( + return status; + } + +-// -------- func jpeg.decoder.decode_dri ++// -------- func gif.decoder.decode_id_part0 + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__decode_dri( +- wuffs_jpeg__decoder* self, ++wuffs_gif__decoder__decode_id_part0( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +@@ -42740,57 +42822,144 @@ wuffs_jpeg__decoder__decode_dri( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_dri[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_id_part0; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_payload_length != 2u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dri_marker); +- goto exit; +- } +- self->private_impl.f_payload_length = 0u; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint16_t t_0; ++ uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src); ++ t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { +- self->private_data.s_decode_dri[0].scratch = 0; ++ self->private_data.s_decode_id_part0.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_dri[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; + if (num_bits_0 == 8) { +- t_0 = ((uint16_t)(*scratch >> 48)); ++ t_0 = ((uint32_t)(*scratch)); + break; + } + num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; + } + } +- self->private_impl.f_restart_interval = t_0; ++ self->private_impl.f_frame_rect_x0 = t_0; + } +- if (self->private_impl.f_sof_marker == 0u) { +- self->private_impl.f_saved_restart_interval = self->private_impl.f_restart_interval; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_id_part0.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 8) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ self->private_impl.f_frame_rect_y0 = t_1; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_2 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_id_part0.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 8) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ self->private_impl.f_frame_rect_x1 = t_2; ++ } ++ self->private_impl.f_frame_rect_x1 += self->private_impl.f_frame_rect_x0; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_id_part0.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 8) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ } ++ } ++ self->private_impl.f_frame_rect_y1 = t_3; ++ } ++ self->private_impl.f_frame_rect_y1 += self->private_impl.f_frame_rect_y0; ++ self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; ++ self->private_impl.f_dst_y = self->private_impl.f_frame_rect_y0; ++ if ((self->private_impl.f_num_decoded_frame_configs_value == 0u) && ! self->private_impl.f_quirks[4u]) { ++ self->private_impl.f_width = wuffs_base__u32__max(self->private_impl.f_width, self->private_impl.f_frame_rect_x1); ++ self->private_impl.f_height = wuffs_base__u32__max(self->private_impl.f_height, self->private_impl.f_frame_rect_y1); + } + + goto ok; + ok: +- self->private_impl.p_decode_dri[0] = 0; ++ self->private_impl.p_decode_id_part0 = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_dri[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_id_part0 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -42801,18 +42970,24 @@ wuffs_jpeg__decoder__decode_dri( + return status; + } + +-// -------- func jpeg.decoder.decode_appn ++// -------- func gif.decoder.decode_id_part1 + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__decode_appn( +- wuffs_jpeg__decoder* self, ++wuffs_gif__decoder__decode_id_part1( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- uint8_t a_marker) { ++ wuffs_base__pixel_blend a_blend) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c8 = 0; +- uint32_t v_c32 = 0; ++ uint8_t v_flags = 0; ++ uint8_t v_which_palette = 0; ++ uint32_t v_num_palette_entries = 0; ++ uint32_t v_i = 0; ++ uint32_t v_argb = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint8_t v_lw = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -42825,184 +43000,136 @@ wuffs_jpeg__decoder__decode_appn( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_appn[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_id_part1; ++ if (coro_susp_point) { ++ v_which_palette = self->private_data.s_decode_id_part1.v_which_palette; ++ v_num_palette_entries = self->private_data.s_decode_id_part1.v_num_palette_entries; ++ v_i = self->private_data.s_decode_id_part1.v_i; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- do { +- if (a_marker == 224u) { +- if (self->private_impl.f_payload_length >= 5u) { +- self->private_impl.f_payload_length -= 5u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_appn[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_appn[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; +- } +- } +- v_c32 = t_0; +- } +- if (v_c32 != 1179207242u) { +- self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 1u)); +- break; +- } +- { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_flags = t_0; ++ } ++ if (((uint8_t)(v_flags & 64u)) != 0u) { ++ self->private_impl.f_interlace = 4u; ++ } else { ++ self->private_impl.f_interlace = 0u; ++ } ++ v_which_palette = 1u; ++ if (((uint8_t)(v_flags & 128u)) != 0u) { ++ v_num_palette_entries = (((uint32_t)(1u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u))))); ++ v_i = 0u; ++ while (v_i < v_num_palette_entries) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { ++ t_1 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); ++ iop_a_src += 3; ++ } else { ++ self->private_data.s_decode_id_part1.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c8 = t_1; +- } +- self->private_impl.f_is_jfif = (v_c8 == 0u); +- } +- } else if (a_marker == 238u) { +- if (self->private_impl.f_payload_length >= 12u) { +- self->private_impl.f_payload_length -= 12u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_appn[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_appn[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; +- if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; +- } +- } +- v_c32 = t_2; +- } +- if (v_c32 != 1651467329u) { +- self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 8u)); +- break; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_appn[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_appn[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- } +- v_c32 = t_3; +- } +- if ((255u & v_c32) != 101u) { +- self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 4u)); +- break; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_appn[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_appn[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 24) { +- t_4 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; ++ uint64_t* scratch = &self->private_data.s_decode_id_part1.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 16) { ++ t_1 = ((uint32_t)(*scratch >> 40)); ++ break; + } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); + } +- v_c32 = t_4; +- } +- if ((v_c32 >> 24u) == 0u) { +- self->private_impl.f_is_adobe = 1u; +- } else { +- self->private_impl.f_is_adobe = 2u; + } ++ v_argb = t_1; + } ++ v_argb |= 4278190080u; ++ self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); ++ self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); ++ self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); ++ self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); ++ v_i += 1u; + } +- } while (0); +- self->private_data.s_decode_appn[0].scratch = self->private_impl.f_payload_length; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (self->private_data.s_decode_appn[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_appn[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ while (v_i < 256u) { ++ self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = 255u; ++ v_i += 1u; ++ } ++ } else if (self->private_impl.f_quirks[6u] && ! self->private_impl.f_has_global_palette) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_palette); ++ goto exit; ++ } else if (self->private_impl.f_gc_has_transparent_index) { ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_palettes[1u], 1024), wuffs_base__make_slice_u8(self->private_data.f_palettes[0u], 1024)); ++ } else { ++ v_which_palette = 0u; + } +- iop_a_src += self->private_data.s_decode_appn[0].scratch; +- self->private_impl.f_payload_length = 0u; ++ if (self->private_impl.f_gc_has_transparent_index) { ++ self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 0u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 1u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 2u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 3u)] = 0u; ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), ++ wuffs_base__utility__make_pixel_format(2198077448u), ++ wuffs_base__make_slice_u8(self->private_data.f_palettes[v_which_palette], 1024), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ if (self->private_impl.f_ignored_but_affects_benchmarks) { ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_lw = t_2; ++ } ++ if (v_lw > 8u) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width); ++ goto exit; ++ } ++ self->private_impl.f_lzw_pending_literal_width_plus_one = ((uint32_t)(((uint8_t)(1u + v_lw)))); ++ self->private_impl.f_ignored_but_affects_benchmarks = true; + +- goto ok; + ok: +- self->private_impl.p_decode_appn[0] = 0; ++ self->private_impl.p_decode_id_part1 = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_appn[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_id_part1 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_id_part1.v_which_palette = v_which_palette; ++ self->private_data.s_decode_id_part1.v_num_palette_entries = v_num_palette_entries; ++ self->private_data.s_decode_id_part1.v_i = v_i; + + goto exit; + exit: +@@ -43013,30 +43140,29 @@ wuffs_jpeg__decoder__decode_appn( + return status; + } + +-// -------- func jpeg.decoder.decode_sof ++// -------- func gif.decoder.decode_id_part2 + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__decode_sof( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src) { ++wuffs_gif__decoder__decode_id_part2( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_comp_h = 0; +- uint8_t v_comp_v = 0; +- uint32_t v_i = 0; +- uint32_t v_j = 0; +- bool v_has_h24 = false; +- bool v_has_h3 = false; +- bool v_has_v24 = false; +- bool v_has_v3 = false; +- uint32_t v_upper_bound = 0; +- uint64_t v_wh0 = 0; +- uint64_t v_wh1 = 0; +- uint64_t v_wh2 = 0; +- uint64_t v_wh3 = 0; +- uint64_t v_progressive = 0; ++ uint64_t v_block_size = 0; ++ bool v_need_block_size = false; ++ uint32_t v_n_copied = 0; ++ uint64_t v_n_compressed = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint64_t v_mark = 0; ++ wuffs_base__status v_copy_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -43049,269 +43175,185 @@ wuffs_jpeg__decoder__decode_sof( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_sof[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_id_part2; + if (coro_susp_point) { +- v_i = self->private_data.s_decode_sof[0].v_i; ++ v_block_size = self->private_data.s_decode_id_part2.v_block_size; ++ v_need_block_size = self->private_data.s_decode_id_part2.v_need_block_size; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_payload_length < 6u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } +- self->private_impl.f_payload_length -= 6u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c == 8u) { +- } else if (v_c == 12u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_12_bits); +- goto exit; +- } else if (v_c == 16u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_16_bits); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_1 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_sof[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- while (true) { ++ wuffs_gif__decoder__lzw_init(self); ++ v_need_block_size = true; ++ label__outer__continue:; ++ while (true) { ++ if (v_need_block_size) { ++ v_need_block_size = false; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_sof[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 8) { +- t_1 = ((uint32_t)(*scratch >> 48)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); ++ uint64_t t_0 = *iop_a_src++; ++ v_block_size = t_0; + } + } +- self->private_impl.f_height = t_1; +- } +- if (self->private_impl.f_height == 0u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_implicit_height); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_sof[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_sof[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); +- if (num_bits_2 == 8) { +- t_2 = ((uint32_t)(*scratch >> 48)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)); +- } ++ if (v_block_size == 0u) { ++ break; + } +- self->private_impl.f_width = t_2; +- } +- if (self->private_impl.f_width == 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ while (((uint64_t)(io2_a_src - iop_a_src)) == 0u) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); + } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; +- } +- if ((v_c == 0u) || (v_c > 4u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } else if (v_c == 2u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_color_model); +- goto exit; +- } +- self->private_impl.f_num_components = ((uint32_t)(v_c)); +- if (self->private_impl.f_payload_length != (3u * self->private_impl.f_num_components)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } +- self->private_impl.f_payload_length = 0u; +- v_i = 0u; +- while (v_i < self->private_impl.f_num_components) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- self->private_impl.f_components_c[v_i] = t_4; ++ if (self->private_impl.f_compressed_ri == self->private_impl.f_compressed_wi) { ++ self->private_impl.f_compressed_ri = 0u; ++ self->private_impl.f_compressed_wi = 0u; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ while (self->private_impl.f_compressed_wi <= 3841u) { ++ v_n_compressed = wuffs_base__u64__min(v_block_size, ((uint64_t)(io2_a_src - iop_a_src))); ++ if (v_n_compressed <= 0u) { ++ break; + } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; +- } +- v_comp_h = (v_c >> 4u); +- v_comp_v = (v_c & 15u); +- if ((v_comp_h == 0u) || +- (v_comp_h > 4u) || +- (v_comp_v == 0u) || +- (v_comp_v > 4u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } +- self->private_impl.f_components_h[v_i] = v_comp_h; +- if (self->private_impl.f_max_incl_components_h < self->private_impl.f_components_h[v_i]) { +- self->private_impl.f_max_incl_components_h = self->private_impl.f_components_h[v_i]; +- } +- self->private_impl.f_components_v[v_i] = v_comp_v; +- if (self->private_impl.f_max_incl_components_v < self->private_impl.f_components_v[v_i]) { +- self->private_impl.f_max_incl_components_v = self->private_impl.f_components_v[v_i]; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_n_copied = wuffs_private_impl__io_reader__limited_copy_u32_to_slice( ++ &iop_a_src, io2_a_src,((uint32_t)(v_n_compressed)), wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, self->private_impl.f_compressed_wi, 4096)); ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_wi, ((uint64_t)(v_n_copied))); ++ wuffs_private_impl__u64__sat_sub_indirect(&v_block_size, ((uint64_t)(v_n_copied))); ++ if (v_block_size > 0u) { ++ break; + } +- uint8_t t_6 = *iop_a_src++; +- v_c = t_6; +- } +- if (v_c >= 4u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ v_need_block_size = true; ++ break; ++ } ++ v_block_size = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); ++ iop_a_src += 1u; + } +- self->private_impl.f_components_tq[v_i] = v_c; +- v_j = 0u; +- while (v_j < v_i) { +- if (self->private_impl.f_components_c[v_j] == self->private_impl.f_components_c[v_i]) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ while (true) { ++ if ((self->private_impl.f_compressed_ri > self->private_impl.f_compressed_wi) || (self->private_impl.f_compressed_wi > 4096u)) { ++ status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); + goto exit; + } +- v_j += 1u; +- } +- v_i += 1u; +- } +- if (self->private_impl.f_num_components == 1u) { +- self->private_impl.f_max_incl_components_h = 1u; +- self->private_impl.f_max_incl_components_v = 1u; +- self->private_impl.f_components_h[0u] = 1u; +- self->private_impl.f_components_v[0u] = 1u; +- } else { +- v_has_h24 = false; +- v_has_h3 = false; +- v_has_v24 = false; +- v_has_v3 = false; +- v_i = 0u; +- while (v_i < self->private_impl.f_num_components) { +- v_has_h24 = (v_has_h24 || (self->private_impl.f_components_h[v_i] == 2u) || (self->private_impl.f_components_h[v_i] == 4u)); +- v_has_h3 = (v_has_h3 || (self->private_impl.f_components_h[v_i] == 3u)); +- v_has_v24 = (v_has_v24 || (self->private_impl.f_components_v[v_i] == 2u) || (self->private_impl.f_components_v[v_i] == 4u)); +- v_has_v3 = (v_has_v3 || (self->private_impl.f_components_v[v_i] == 3u)); +- v_i += 1u; +- } +- if ((v_has_h24 && v_has_h3) || (v_has_v24 && v_has_v3)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_fractional_sampling); +- goto exit; +- } +- if (self->private_impl.f_num_components == 4u) { +- self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe < 2u); +- } else { +- if (self->private_impl.f_is_jfif) { +- self->private_impl.f_is_rgb_or_cmyk = false; +- } else if (self->private_impl.f_is_adobe > 0u) { +- self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe == 1u); +- } else { +- self->private_impl.f_is_rgb_or_cmyk = ((self->private_impl.f_components_c[0u] == 82u) && (self->private_impl.f_components_c[1u] == 71u) && (self->private_impl.f_components_c[2u] == 66u)); ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, ++ self->private_impl.f_compressed_ri, ++ self->private_impl.f_compressed_wi), ++ 0u); ++ v_mark = ((uint64_t)(iop_v_r - io0_v_r)); ++ u_r.meta.ri = ((size_t)(iop_v_r - u_r.data.ptr)); ++ wuffs_gif__decoder__lzw_read_from(self, v_r); ++ iop_v_r = u_r.data.ptr + u_r.meta.ri; ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_ri, wuffs_private_impl__io__count_since(v_mark, ((uint64_t)(iop_v_r - io0_v_r)))); ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; + } +- } +- } +- self->private_impl.f_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, 1u, self->private_impl.f_max_incl_components_h); +- self->private_impl.f_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, 1u, self->private_impl.f_max_incl_components_v); +- v_upper_bound = 65544u; +- self->private_impl.f_components_workbuf_widths[0u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[0u])))); +- self->private_impl.f_components_workbuf_widths[1u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[1u])))); +- self->private_impl.f_components_workbuf_widths[2u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[2u])))); +- self->private_impl.f_components_workbuf_widths[3u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[3u])))); +- self->private_impl.f_components_workbuf_heights[0u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[0u])))); +- self->private_impl.f_components_workbuf_heights[1u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[1u])))); +- self->private_impl.f_components_workbuf_heights[2u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[2u])))); +- self->private_impl.f_components_workbuf_heights[3u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[3u])))); +- v_wh0 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[0u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[0u]))); +- v_wh1 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[1u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[1u]))); +- v_wh2 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[2u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[2u]))); +- v_wh3 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[3u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[3u]))); +- v_progressive = 0u; +- if (self->private_impl.f_sof_marker >= 194u) { +- v_progressive = 2u; +- v_i = 0u; +- while (v_i < 4u) { +- v_j = 0u; +- while (v_j < 10u) { +- self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u; +- v_j += 1u; ++ if (self->private_impl.f_lzw_output_ri < self->private_impl.f_lzw_output_wi) { ++ v_copy_status = wuffs_gif__decoder__copy_to_image_buffer(self, a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_lzw_output, ++ self->private_impl.f_lzw_output_ri, ++ self->private_impl.f_lzw_output_wi)); ++ if (wuffs_base__status__is_error(&v_copy_status)) { ++ status = v_copy_status; ++ goto exit; ++ } ++ self->private_impl.f_lzw_output_ri = 0u; ++ self->private_impl.f_lzw_output_wi = 0u; + } +- v_i += 1u; ++ if (self->private_impl.f_lzw_read_from_return_value == 0u) { ++ self->private_impl.f_ignored_but_affects_benchmarks = false; ++ if (v_need_block_size || (v_block_size > 0u)) { ++ self->private_data.s_decode_id_part2.scratch = ((uint32_t)(v_block_size)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (self->private_data.s_decode_id_part2.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_id_part2.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_id_part2.scratch; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_gif__decoder__skip_blocks(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ goto label__outer__break; ++ } else if (self->private_impl.f_lzw_read_from_return_value == 1u) { ++ continue; ++ } else if (self->private_impl.f_lzw_read_from_return_value == 2u) { ++ goto label__outer__continue; ++ } else if (self->private_impl.f_quirks[3u] && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) && (self->private_impl.f_interlace == 0u)) { ++ if (v_need_block_size || (v_block_size > 0u)) { ++ self->private_data.s_decode_id_part2.scratch = ((uint32_t)(v_block_size)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_data.s_decode_id_part2.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_id_part2.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_id_part2.scratch; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ status = wuffs_gif__decoder__skip_blocks(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ goto label__outer__break; ++ } else if (self->private_impl.f_lzw_read_from_return_value == 3u) { ++ status = wuffs_base__make_status(wuffs_gif__error__truncated_input); ++ goto exit; ++ } else if (self->private_impl.f_lzw_read_from_return_value == 4u) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_lzw_code); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); ++ goto exit; + } + } +- self->private_impl.f_components_workbuf_offsets[0u] = 0u; +- self->private_impl.f_components_workbuf_offsets[1u] = (self->private_impl.f_components_workbuf_offsets[0u] + v_wh0); +- self->private_impl.f_components_workbuf_offsets[2u] = (self->private_impl.f_components_workbuf_offsets[1u] + v_wh1); +- self->private_impl.f_components_workbuf_offsets[3u] = (self->private_impl.f_components_workbuf_offsets[2u] + v_wh2); +- self->private_impl.f_components_workbuf_offsets[4u] = (self->private_impl.f_components_workbuf_offsets[3u] + v_wh3); +- self->private_impl.f_components_workbuf_offsets[5u] = (self->private_impl.f_components_workbuf_offsets[4u] + (v_wh0 * v_progressive)); +- self->private_impl.f_components_workbuf_offsets[6u] = (self->private_impl.f_components_workbuf_offsets[5u] + (v_wh1 * v_progressive)); +- self->private_impl.f_components_workbuf_offsets[7u] = (self->private_impl.f_components_workbuf_offsets[6u] + (v_wh2 * v_progressive)); +- self->private_impl.f_components_workbuf_offsets[8u] = (self->private_impl.f_components_workbuf_offsets[7u] + (v_wh3 * v_progressive)); ++ label__outer__break:; ++ self->private_impl.f_compressed_ri = 0u; ++ self->private_impl.f_compressed_wi = 0u; ++ if ((self->private_impl.f_dst_y < self->private_impl.f_frame_rect_y1) && (self->private_impl.f_frame_rect_x0 != self->private_impl.f_frame_rect_x1) && (self->private_impl.f_frame_rect_y0 != self->private_impl.f_frame_rect_y1)) { ++ status = wuffs_base__make_status(wuffs_base__error__not_enough_data); ++ goto exit; ++ } + +- goto ok; + ok: +- self->private_impl.p_decode_sof[0] = 0; ++ self->private_impl.p_decode_id_part2 = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_sof[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_sof[0].v_i = v_i; ++ self->private_impl.p_decode_id_part2 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_id_part2.v_block_size = v_block_size; ++ self->private_data.s_decode_id_part2.v_need_block_size = v_need_block_size; + + goto exit; + exit: +@@ -43322,106 +43364,182 @@ wuffs_jpeg__decoder__decode_sof( + return status; + } + +-// -------- func jpeg.decoder.quantize_dimension ++// -------- func gif.decoder.copy_to_image_buffer + + WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__quantize_dimension( +- const wuffs_jpeg__decoder* self, +- uint32_t a_width, +- uint8_t a_h, +- uint8_t a_max_incl_h) { +- uint32_t v_ratio = 0; ++static wuffs_base__status ++wuffs_gif__decoder__copy_to_image_buffer( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_pb, ++ wuffs_base__slice_u8 a_src) { ++ wuffs_base__slice_u8 v_dst = {0}; ++ wuffs_base__slice_u8 v_src = {0}; ++ uint64_t v_width_in_bytes = 0; ++ uint64_t v_n = 0; ++ uint64_t v_src_ri = 0; ++ wuffs_base__pixel_format v_pixfmt = {0}; ++ uint32_t v_bytes_per_pixel = 0; ++ uint32_t v_bits_per_pixel = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_j = 0; ++ uint32_t v_replicate_y0 = 0; ++ uint32_t v_replicate_y1 = 0; ++ wuffs_base__slice_u8 v_replicate_dst = {0}; ++ wuffs_base__slice_u8 v_replicate_src = {0}; + +- v_ratio = 0u; +- if (a_h > 0u) { +- v_ratio = ((uint32_t)((a_max_incl_h / a_h))); ++ v_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_pb); ++ v_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_pixfmt); ++ if ((v_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } +- if (v_ratio == 1u) { +- return ((a_width + 7u) / 8u); +- } else if (v_ratio == 2u) { +- return ((a_width + 15u) / 16u); +- } else if (v_ratio == 3u) { +- return ((a_width + 23u) / 24u); ++ v_bytes_per_pixel = (v_bits_per_pixel >> 3u); ++ v_width_in_bytes = ((uint64_t)((self->private_impl.f_width * v_bytes_per_pixel))); ++ v_tab = wuffs_base__pixel_buffer__plane(a_pb, 0u); ++ while (v_src_ri < ((uint64_t)(a_src.len))) { ++ v_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_ri); ++ if (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) { ++ if (self->private_impl.f_quirks[3u]) { ++ return wuffs_base__make_status(NULL); ++ } ++ return wuffs_base__make_status(wuffs_base__error__too_much_data); ++ } ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, 0u); ++ } else if (v_width_in_bytes < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_width_in_bytes); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_bytes_per_pixel))); ++ if (v_i < ((uint64_t)(v_dst.len))) { ++ v_j = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * ((uint64_t)(v_bytes_per_pixel))); ++ if ((v_i <= v_j) && (v_j <= ((uint64_t)(v_dst.len)))) { ++ v_dst = wuffs_base__slice_u8__subslice_ij(v_dst, v_i, v_j); ++ } else { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i); ++ } ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024), v_src); ++ wuffs_private_impl__u64__sat_add_indirect(&v_src_ri, v_n); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1u)); ++ } ++ if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) { ++ self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; ++ if (self->private_impl.f_interlace == 0u) { ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, 1u); ++ continue; ++ } ++ if ((self->private_impl.f_num_decoded_frames_value == 0u) && ! self->private_impl.f_gc_has_transparent_index && (self->private_impl.f_interlace > 1u)) { ++ v_replicate_src = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ v_replicate_y0 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1u); ++ v_replicate_y1 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_COUNT[self->private_impl.f_interlace]))); ++ v_replicate_y1 = wuffs_base__u32__min(v_replicate_y1, self->private_impl.f_frame_rect_y1); ++ while (v_replicate_y0 < v_replicate_y1) { ++ v_replicate_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_replicate_y0); ++ wuffs_private_impl__slice_u8__copy_from_slice(v_replicate_dst, v_replicate_src); ++ v_replicate_y0 += 1u; ++ } ++ self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, v_replicate_y1); ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace]))); ++ while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_interlace -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_impl.f_dst_y = wuffs_base__u32__sat_add(self->private_impl.f_frame_rect_y0, WUFFS_GIF__INTERLACE_START[self->private_impl.f_interlace]); ++ } ++ continue; ++ } ++ if (((uint64_t)(a_src.len)) == v_src_ri) { ++ break; ++ } else if (((uint64_t)(a_src.len)) < v_src_ri) { ++ return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); ++ } ++ v_n = ((uint64_t)((self->private_impl.f_frame_rect_x1 - self->private_impl.f_dst_x))); ++ v_n = wuffs_base__u64__min(v_n, (((uint64_t)(a_src.len)) - v_src_ri)); ++ wuffs_private_impl__u64__sat_add_indirect(&v_src_ri, v_n); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) { ++ self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace]))); ++ while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_interlace -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_impl.f_dst_y = wuffs_base__u32__sat_add(self->private_impl.f_frame_rect_y0, WUFFS_GIF__INTERLACE_START[self->private_impl.f_interlace]); ++ } ++ continue; ++ } ++ if (v_src_ri != ((uint64_t)(a_src.len))) { ++ return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); ++ } ++ break; + } +- return ((a_width + 31u) / 32u); ++ return wuffs_base__make_status(NULL); + } + +-// -------- func jpeg.decoder.decode_frame_config ++// -------- func gif.decoder.lzw_init + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__decode_frame_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++static wuffs_base__empty_struct ++wuffs_gif__decoder__lzw_init( ++ wuffs_gif__decoder* self) { ++ uint32_t v_i = 0; + +- ok: +- self->private_impl.p_decode_frame_config[0] = 0; +- goto exit; ++ self->private_impl.f_lzw_literal_width = 8u; ++ if (self->private_impl.f_lzw_pending_literal_width_plus_one > 0u) { ++ self->private_impl.f_lzw_literal_width = (self->private_impl.f_lzw_pending_literal_width_plus_one - 1u); + } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ self->private_impl.f_lzw_clear_code = (((uint32_t)(1u)) << self->private_impl.f_lzw_literal_width); ++ self->private_impl.f_lzw_end_code = (self->private_impl.f_lzw_clear_code + 1u); ++ self->private_impl.f_lzw_save_code = self->private_impl.f_lzw_end_code; ++ self->private_impl.f_lzw_prev_code = self->private_impl.f_lzw_end_code; ++ self->private_impl.f_lzw_width = (self->private_impl.f_lzw_literal_width + 1u); ++ self->private_impl.f_lzw_bits = 0u; ++ self->private_impl.f_lzw_n_bits = 0u; ++ self->private_impl.f_lzw_output_ri = 0u; ++ self->private_impl.f_lzw_output_wi = 0u; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_lzw_clear_code) { ++ self->private_data.f_lzw_lm1s[v_i] = 0u; ++ self->private_data.f_lzw_suffixes[v_i][0u] = ((uint8_t)(v_i)); ++ v_i += 1u; + } +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func jpeg.decoder.do_decode_frame_config ++// -------- func gif.decoder.lzw_read_from + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_frame_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__frame_config* a_dst, ++static wuffs_base__empty_struct ++wuffs_gif__decoder__lzw_read_from( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ uint32_t v_clear_code = 0; ++ uint32_t v_end_code = 0; ++ uint32_t v_save_code = 0; ++ uint32_t v_prev_code = 0; ++ uint32_t v_width = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_output_wi = 0; ++ uint32_t v_code = 0; ++ uint32_t v_c = 0; ++ uint32_t v_o = 0; ++ uint32_t v_steps = 0; ++ uint8_t v_first_byte = 0; ++ uint16_t v_lm1_b = 0; ++ uint16_t v_lm1_a = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -43434,83 +43552,370 @@ wuffs_jpeg__decoder__do_decode_frame_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ v_clear_code = self->private_impl.f_lzw_clear_code; ++ v_end_code = self->private_impl.f_lzw_end_code; ++ v_save_code = self->private_impl.f_lzw_save_code; ++ v_prev_code = self->private_impl.f_lzw_prev_code; ++ v_width = self->private_impl.f_lzw_width; ++ v_bits = self->private_impl.f_lzw_bits; ++ v_n_bits = self->private_impl.f_lzw_n_bits; ++ v_output_wi = self->private_impl.f_lzw_output_wi; ++ while (true) { ++ if (v_n_bits < v_width) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { ++ v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits)); ++ iop_a_src += ((31u - v_n_bits) >> 3u); ++ v_n_bits |= 24u; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ self->private_impl.f_lzw_read_from_return_value = 3u; ++ } else { ++ self->private_impl.f_lzw_read_from_return_value = 2u; ++ } ++ break; ++ } else { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ if (v_n_bits >= v_width) { ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ self->private_impl.f_lzw_read_from_return_value = 3u; ++ } else { ++ self->private_impl.f_lzw_read_from_return_value = 2u; ++ } ++ break; ++ } else { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ if (v_n_bits < v_width) { ++ self->private_impl.f_lzw_read_from_return_value = 5u; ++ break; ++ } ++ } + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_jpeg__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ v_code = ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_width)); ++ v_bits >>= v_width; ++ v_n_bits -= v_width; ++ if (v_code < v_clear_code) { ++ self->private_data.f_lzw_output[v_output_wi] = ((uint8_t)(v_code)); ++ v_output_wi = ((v_output_wi + 1u) & 8191u); ++ if (v_save_code <= 4095u) { ++ v_lm1_a = ((uint16_t)(((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u)); ++ self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_a; ++ if (((uint16_t)(v_lm1_a % 8u)) != 0u) { ++ self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code]; ++ memcpy(self->private_data.f_lzw_suffixes[v_save_code],self->private_data.f_lzw_suffixes[v_prev_code], sizeof(self->private_data.f_lzw_suffixes[v_save_code])); ++ self->private_data.f_lzw_suffixes[v_save_code][((uint16_t)(v_lm1_a % 8u))] = ((uint8_t)(v_code)); ++ } else { ++ self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); ++ self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_code)); ++ } ++ v_save_code += 1u; ++ if (v_width < 12u) { ++ v_width += (1u & (v_save_code >> v_width)); ++ } ++ v_prev_code = v_code; + } +- if (status.repr) { +- goto suspend; ++ } else if (v_code <= v_end_code) { ++ if (v_code == v_end_code) { ++ self->private_impl.f_lzw_read_from_return_value = 0u; ++ break; + } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; ++ v_save_code = v_end_code; ++ v_prev_code = v_end_code; ++ v_width = (self->private_impl.f_lzw_literal_width + 1u); ++ } else if (v_code <= v_save_code) { ++ v_c = v_code; ++ if (v_code == v_save_code) { ++ v_c = v_prev_code; ++ } ++ v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) & 4294967288u)) & 8191u); ++ v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lzw_lm1s[v_c]))) & 8191u); ++ v_steps = (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) >> 3u); ++ while (true) { ++ memcpy((self->private_data.f_lzw_output)+(v_o), (self->private_data.f_lzw_suffixes[v_c]), 8u); ++ if (v_steps <= 0u) { ++ break; ++ } ++ v_steps -= 1u; ++ v_o = (((uint32_t)(v_o - 8u)) & 8191u); ++ v_c = ((uint32_t)(self->private_impl.f_lzw_prefixes[v_c])); ++ } ++ v_first_byte = self->private_data.f_lzw_suffixes[v_c][0u]; ++ if (v_code == v_save_code) { ++ self->private_data.f_lzw_output[v_output_wi] = v_first_byte; ++ v_output_wi = ((v_output_wi + 1u) & 8191u); ++ } ++ if (v_save_code <= 4095u) { ++ v_lm1_b = ((uint16_t)(((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u)); ++ self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_b; ++ if (((uint16_t)(v_lm1_b % 8u)) != 0u) { ++ self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code]; ++ memcpy(self->private_data.f_lzw_suffixes[v_save_code],self->private_data.f_lzw_suffixes[v_prev_code], sizeof(self->private_data.f_lzw_suffixes[v_save_code])); ++ self->private_data.f_lzw_suffixes[v_save_code][((uint16_t)(v_lm1_b % 8u))] = v_first_byte; ++ } else { ++ self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); ++ self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte)); ++ } ++ v_save_code += 1u; ++ if (v_width < 12u) { ++ v_width += (1u & (v_save_code >> v_width)); ++ } ++ v_prev_code = v_code; + } +- } else if (self->private_impl.f_call_sequence == 64u) { +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; + } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ self->private_impl.f_lzw_read_from_return_value = 4u; ++ break; + } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height), +- ((wuffs_base__flicks)(0u)), +- 0u, +- self->private_impl.f_frame_config_io_position, +- 0u, +- true, +- false, +- 4278190080u); ++ if (v_output_wi > 4095u) { ++ self->private_impl.f_lzw_read_from_return_value = 1u; ++ break; + } +- self->private_impl.f_call_sequence = 64u; +- +- ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; +- goto exit; + } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: ++ if (self->private_impl.f_lzw_read_from_return_value != 2u) { ++ while (v_n_bits >= 8u) { ++ v_n_bits -= 8u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ self->private_impl.f_lzw_read_from_return_value = 5u; ++ break; ++ } ++ } ++ } ++ self->private_impl.f_lzw_save_code = v_save_code; ++ self->private_impl.f_lzw_prev_code = v_prev_code; ++ self->private_impl.f_lzw_width = v_width; ++ self->private_impl.f_lzw_bits = v_bits; ++ self->private_impl.f_lzw_n_bits = v_n_bits; ++ self->private_impl.f_lzw_output_wi = v_output_wi; + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func jpeg.decoder.decode_frame ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_gzip__error__bad_checksum[] = "#gzip: bad checksum"; ++const char wuffs_gzip__error__bad_compression_method[] = "#gzip: bad compression method"; ++const char wuffs_gzip__error__bad_encoding_flags[] = "#gzip: bad encoding flags"; ++const char wuffs_gzip__error__bad_header[] = "#gzip: bad header"; ++const char wuffs_gzip__error__truncated_input[] = "#gzip: truncated input"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__decode_frame( +- wuffs_jpeg__decoder* self, +- wuffs_base__pixel_buffer* a_dst, ++static wuffs_base__status ++wuffs_gzip__decoder__do_transform_io( ++ wuffs_gzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__slice_u8 a_workbuf); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_gzip__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_gzip__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_gzip__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_gzip__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gzip__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_gzip__decoder__initialize( ++ wuffs_gzip__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ { ++ wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( ++ &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_deflate__decoder__initialize( ++ &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_gzip__decoder* ++wuffs_gzip__decoder__alloc(void) { ++ wuffs_gzip__decoder* x = ++ (wuffs_gzip__decoder*)(calloc(1, sizeof(wuffs_gzip__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_gzip__decoder__initialize( ++ x, sizeof(wuffs_gzip__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_gzip__decoder(void) { ++ return sizeof(wuffs_gzip__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func gzip.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_gzip__decoder__get_quirk( ++ const wuffs_gzip__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func gzip.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gzip__decoder__set_quirk( ++ wuffs_gzip__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func gzip.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_gzip__decoder__dst_history_retain_length( ++ const wuffs_gzip__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_base__utility__make_optional_u63(true, 0u); ++} ++ ++// -------- func gzip.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_gzip__decoder__workbuf_len( ++ const wuffs_gzip__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++} ++ ++// -------- func gzip.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gzip__decoder__transform_io( ++ wuffs_gzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -43525,65 +43930,41 @@ wuffs_jpeg__decoder__decode_frame( + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { ++ (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_ddf_status = wuffs_base__make_status(NULL); +- wuffs_base__status v_swizzle_status = wuffs_base__make_status(NULL); +- uint32_t v_scan_count = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { +- v_scan_count = self->private_impl.f_scan_count; + { +- wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_ddf_status = t_0; +- } +- if ((v_ddf_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- v_ddf_status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); ++ wuffs_base__status t_0 = wuffs_gzip__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ v_status = t_0; + } +- if (wuffs_base__status__is_error(&v_ddf_status) || (v_scan_count < self->private_impl.f_scan_count)) { +- if (self->private_impl.f_sof_marker >= 194u) { +- wuffs_jpeg__decoder__apply_progressive_idct(self, a_workbuf); +- } +- if (self->private_impl.f_num_components == 1u) { +- v_swizzle_status = wuffs_jpeg__decoder__swizzle_gray(self, a_dst, a_workbuf); +- } else { +- v_swizzle_status = wuffs_jpeg__decoder__swizzle_colorful(self, a_dst, a_workbuf); +- } +- if (wuffs_base__status__is_error(&v_ddf_status)) { +- status = v_ddf_status; +- goto exit; +- } else if (wuffs_base__status__is_error(&v_swizzle_status)) { +- status = v_swizzle_status; +- goto exit; +- } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_gzip__error__truncated_input); ++ goto exit; + } +- status = v_ddf_status; ++ status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: +- self->private_impl.p_decode_frame[0] = 0; ++ self->private_impl.p_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: +@@ -43593,24 +43974,40 @@ wuffs_jpeg__decoder__decode_frame( + return status; + } + +-// -------- func jpeg.decoder.do_decode_frame ++// -------- func gzip.decoder.do_transform_io + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_frame( +- wuffs_jpeg__decoder* self, +- wuffs_base__pixel_buffer* a_dst, ++wuffs_gzip__decoder__do_transform_io( ++ wuffs_gzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_pixfmt = 0; ++ uint8_t v_c8 = 0; ++ uint8_t v_flags = 0; ++ uint16_t v_xlen = 0; ++ uint64_t v_mark = 0; ++ uint32_t v_checksum_have = 0; ++ uint32_t v_decoded_length_have = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint8_t v_c = 0; +- uint8_t v_marker = 0; ++ uint32_t v_checksum_want = 0; ++ uint32_t v_decoded_length_want = 0; + ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -43622,236 +44019,269 @@ wuffs_jpeg__decoder__do_decode_frame( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; + if (coro_susp_point) { +- v_marker = self->private_data.s_do_decode_frame[0].v_marker; ++ v_flags = self->private_data.s_do_transform_io.v_flags; ++ v_checksum_have = self->private_data.s_do_transform_io.v_checksum_have; ++ v_decoded_length_have = self->private_data.s_do_transform_io.v_decoded_length_have; ++ v_checksum_want = self->private_data.s_do_transform_io.v_checksum_want; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++ { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_jpeg__decoder__do_decode_frame_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- if (status.repr) { ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 31u) { ++ status = wuffs_base__make_status(wuffs_gzip__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; + } +- v_pixfmt = 536870920u; +- if (self->private_impl.f_num_components > 1u) { +- v_pixfmt = 2415954056u; ++ if (v_c8 != 139u) { ++ status = wuffs_base__make_status(wuffs_gzip__error__bad_header); ++ goto exit; + } +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), +- wuffs_base__utility__make_pixel_format(v_pixfmt), +- wuffs_base__utility__empty_slice_u8(), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- goto ok; ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; + } +- if (self->private_impl.f_components_workbuf_offsets[8u] > ((uint64_t)(a_workbuf.len))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ if (v_c8 != 8u) { ++ status = wuffs_base__make_status(wuffs_gzip__error__bad_compression_method); + goto exit; +- } else if (self->private_impl.f_components_workbuf_offsets[4u] < self->private_impl.f_components_workbuf_offsets[8u]) { +- wuffs_base__bulk_memset(a_workbuf.ptr + self->private_impl.f_components_workbuf_offsets[4u], (self->private_impl.f_components_workbuf_offsets[8u] - self->private_impl.f_components_workbuf_offsets[4u]), 0u); + } +- if (self->private_impl.f_components_workbuf_offsets[4u] <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_memset(a_workbuf.ptr, self->private_impl.f_components_workbuf_offsets[4u], 128u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_flags = t_3; + } +- while (true) { ++ self->private_data.s_do_transform_io.scratch = 6u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_transform_io.scratch; ++ if (((uint8_t)(v_flags & 4u)) != 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint16_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 8) { ++ t_4 = ((uint16_t)(*scratch)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; ++ } ++ } ++ v_xlen = t_4; ++ } ++ self->private_data.s_do_transform_io.scratch = ((uint32_t)(v_xlen)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_transform_io.scratch; ++ } ++ if (((uint8_t)(v_flags & 8u)) != 0u) { + while (true) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; + } +- if (v_c == 255u) { ++ if (v_c8 == 0u) { + break; + } + } ++ } ++ if (((uint8_t)(v_flags & 16u)) != 0u) { + while (true) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; + } +- if (v_c != 255u) { +- v_marker = v_c; ++ if (v_c8 == 0u) { + break; + } + } +- if (v_marker == 0u) { +- continue; +- } else if ((208u <= v_marker) && (v_marker <= 217u)) { +- if (v_marker <= 215u) { +- continue; ++ } ++ if (((uint8_t)(v_flags & 2u)) != 0u) { ++ self->private_data.s_do_transform_io.scratch = 2u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_transform_io.scratch; ++ } ++ if (((uint8_t)(v_flags & 224u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_gzip__error__bad_encoding_flags); ++ goto exit; ++ } ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } +- } else { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_frame[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_frame[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); +- if (num_bits_2 == 8) { +- t_2 = ((uint32_t)(*scratch >> 48)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)); +- } +- } +- self->private_impl.f_payload_length = t_2; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (self->private_impl.f_payload_length < 2u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); +- goto exit; ++ wuffs_base__status t_7 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf); ++ v_status = t_7; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- self->private_impl.f_payload_length -= 2u; + } +- if (v_marker < 192u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } else if (v_marker < 208u) { +- if (v_marker == 196u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- status = wuffs_jpeg__decoder__decode_dht(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { ++ if ( ! self->private_impl.f_ignore_checksum) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_checksum, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ v_decoded_length_have += ((uint32_t)(wuffs_private_impl__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ uint32_t t_8; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- continue; +- } else if (v_marker == 200u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } else if (v_marker < 224u) { +- if (v_marker < 217u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); +- goto exit; +- } else if (v_marker == 217u) { +- break; +- } else if (v_marker == 218u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- status = wuffs_jpeg__decoder__decode_sos(self, a_src, a_workbuf); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; ++ if (num_bits_8 == 24) { ++ t_8 = ((uint32_t)(*scratch)); ++ break; + } +- if (status.repr) { ++ num_bits_8 += 8u; ++ *scratch |= ((uint64_t)(num_bits_8)) << 56; ++ } ++ } ++ v_checksum_want = t_8; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ uint32_t t_9; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_9 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- continue; +- } else if (v_marker == 219u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- status = wuffs_jpeg__decoder__decode_dqt(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- continue; +- } else if (v_marker == 221u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_jpeg__decoder__decode_dri(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9; ++ if (num_bits_9 == 24) { ++ t_9 = ((uint32_t)(*scratch)); ++ break; + } +- continue; +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } +- } else if (v_marker < 240u) { +- } else { +- if (v_marker == 254u) { +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; ++ num_bits_9 += 8u; ++ *scratch |= ((uint64_t)(num_bits_9)) << 56; + } + } +- self->private_data.s_do_decode_frame[0].scratch = self->private_impl.f_payload_length; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame[0].scratch; +- self->private_impl.f_payload_length = 0u; ++ v_decoded_length_want = t_9; ++ } ++ if ( ! self->private_impl.f_ignore_checksum && ((v_checksum_have != v_checksum_want) || (v_decoded_length_have != v_decoded_length_want))) { ++ status = wuffs_base__make_status(wuffs_gzip__error__bad_checksum); ++ goto exit; + } +- self->private_impl.f_call_sequence = 96u; + + ok: +- self->private_impl.p_do_decode_frame[0] = 0; ++ self->private_impl.p_do_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_frame[0].v_marker = v_marker; ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_transform_io.v_flags = v_flags; ++ self->private_data.s_do_transform_io.v_checksum_have = v_checksum_have; ++ self->private_data.s_do_transform_io.v_decoded_length_have = v_decoded_length_have; ++ self->private_data.s_do_transform_io.v_checksum_want = v_checksum_want; + + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -43859,891 +44289,398 @@ wuffs_jpeg__decoder__do_decode_frame( + return status; + } + +-// -------- func jpeg.decoder.decode_dht ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_dht( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) + +- uint8_t v_c = 0; +- uint8_t v_tc = 0; +- uint8_t v_th = 0; +- uint8_t v_tc4_th = 0; +- uint32_t v_working_total_count = 0; +- uint32_t v_total_count = 0; +- uint32_t v_i = 0; +- bool v_failed = false; ++// ---------------- Status Codes Implementations + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++const char wuffs_jpeg__error__bad_dht_marker[] = "#jpeg: bad DHT marker"; ++const char wuffs_jpeg__error__bad_dqt_marker[] = "#jpeg: bad DQT marker"; ++const char wuffs_jpeg__error__bad_dri_marker[] = "#jpeg: bad DRI marker"; ++const char wuffs_jpeg__error__bad_sof_marker[] = "#jpeg: bad SOF marker"; ++const char wuffs_jpeg__error__bad_sos_marker[] = "#jpeg: bad SOS marker"; ++const char wuffs_jpeg__error__bad_header[] = "#jpeg: bad header"; ++const char wuffs_jpeg__error__bad_marker[] = "#jpeg: bad marker"; ++const char wuffs_jpeg__error__bad_scan_count[] = "#jpeg: bad scan count"; ++const char wuffs_jpeg__error__missing_huffman_table[] = "#jpeg: missing Huffman table"; ++const char wuffs_jpeg__error__missing_quantization_table[] = "#jpeg: missing Quantization table"; ++const char wuffs_jpeg__error__rejected_progressive_jpeg[] = "#jpeg: rejected progressive JPEG"; ++const char wuffs_jpeg__error__truncated_input[] = "#jpeg: truncated input"; ++const char wuffs_jpeg__error__unsupported_arithmetic_coding[] = "#jpeg: unsupported arithmetic coding"; ++const char wuffs_jpeg__error__unsupported_color_model[] = "#jpeg: unsupported color model"; ++const char wuffs_jpeg__error__unsupported_fractional_sampling[] = "#jpeg: unsupported fractional sampling"; ++const char wuffs_jpeg__error__unsupported_hierarchical_coding[] = "#jpeg: unsupported hierarchical coding"; ++const char wuffs_jpeg__error__unsupported_implicit_height[] = "#jpeg: unsupported implicit height"; ++const char wuffs_jpeg__error__unsupported_lossless_coding[] = "#jpeg: unsupported lossless coding"; ++const char wuffs_jpeg__error__unsupported_marker[] = "#jpeg: unsupported marker"; ++const char wuffs_jpeg__error__unsupported_precision_12_bits[] = "#jpeg: unsupported precision (12 bits)"; ++const char wuffs_jpeg__error__unsupported_precision_16_bits[] = "#jpeg: unsupported precision (16 bits)"; ++const char wuffs_jpeg__error__unsupported_precision[] = "#jpeg: unsupported precision"; ++const char wuffs_jpeg__error__unsupported_scan_count[] = "#jpeg: unsupported scan count"; ++const char wuffs_jpeg__error__internal_error_inconsistent_decoder_state[] = "#jpeg: internal error: inconsistent decoder state"; + +- uint32_t coro_susp_point = self->private_impl.p_decode_dht[0]; +- if (coro_susp_point) { +- v_tc4_th = self->private_data.s_decode_dht[0].v_tc4_th; +- v_total_count = self->private_data.s_decode_dht[0].v_total_count; +- v_i = self->private_data.s_decode_dht[0].v_i; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// ---------------- Private Consts + +- if (self->private_impl.f_sof_marker == 0u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- while (self->private_impl.f_payload_length > 0u) { +- if (self->private_impl.f_payload_length < 17u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- self->private_impl.f_payload_length -= 17u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (((v_c >> 4u) > 1u) || ((v_c & 15u) > 3u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- v_tc = (v_c >> 4u); +- v_th = (v_c & 15u); +- v_tc4_th = ((uint8_t)(((v_tc * 4u) | v_th))); +- if ((self->private_impl.f_sof_marker == 192u) && ((v_tc4_th & 3u) > 1u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- v_i = 0u; +- while (v_i < 16u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- self->private_data.f_dht_temp_counts[v_i] = t_1; +- } +- v_i += 1u; +- } +- v_working_total_count = 0u; +- v_i = 0u; +- while (v_i < 16u) { +- v_working_total_count = ((v_working_total_count + ((uint32_t)(self->private_data.f_dht_temp_counts[v_i]))) & 65535u); +- v_i += 1u; +- } +- if ((v_working_total_count <= 0u) || (256u < v_working_total_count)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- v_total_count = v_working_total_count; +- if (self->private_impl.f_payload_length < v_total_count) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- self->private_impl.f_payload_length -= v_total_count; +- v_i = 0u; +- while (v_i < v_total_count) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = t_2; +- } +- v_i += 1u; +- } +- while (v_i < 256u) { +- self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = 0u; +- v_i += 1u; +- } +- if ((v_tc4_th & 4u) == 0u) { +- v_i = 0u; +- while (v_i < v_total_count) { +- if (self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] > 15u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- v_i += 1u; +- } +- } +- v_failed = wuffs_jpeg__decoder__calculate_huff_tables(self, v_tc4_th, v_total_count); +- if (v_failed) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- self->private_impl.f_seen_dht[v_tc4_th] = true; +- } ++static const uint8_t ++WUFFS_JPEG__UNZIG[80] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 1u, 8u, 16u, 9u, 2u, 3u, ++ 10u, 17u, 24u, 32u, 25u, 18u, 11u, 4u, ++ 5u, 12u, 19u, 26u, 33u, 40u, 48u, 41u, ++ 34u, 27u, 20u, 13u, 6u, 7u, 14u, 21u, ++ 28u, 35u, 42u, 49u, 56u, 57u, 50u, 43u, ++ 36u, 29u, 22u, 15u, 23u, 30u, 37u, 44u, ++ 51u, 58u, 59u, 52u, 45u, 38u, 31u, 39u, ++ 46u, 53u, 60u, 61u, 54u, 47u, 55u, 62u, ++ 63u, 63u, 63u, 63u, 63u, 63u, 63u, 63u, ++ 63u, 63u, 63u, 63u, 63u, 63u, 63u, 63u, ++}; + +- goto ok; +- ok: +- self->private_impl.p_decode_dht[0] = 0; +- goto exit; +- } ++static const uint8_t ++WUFFS_JPEG__BIAS_AND_CLAMP[1024] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u, ++ 136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u, ++ 144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u, ++ 152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u, ++ 160u, 161u, 162u, 163u, 164u, 165u, 166u, 167u, ++ 168u, 169u, 170u, 171u, 172u, 173u, 174u, 175u, ++ 176u, 177u, 178u, 179u, 180u, 181u, 182u, 183u, ++ 184u, 185u, 186u, 187u, 188u, 189u, 190u, 191u, ++ 192u, 193u, 194u, 195u, 196u, 197u, 198u, 199u, ++ 200u, 201u, 202u, 203u, 204u, 205u, 206u, 207u, ++ 208u, 209u, 210u, 211u, 212u, 213u, 214u, 215u, ++ 216u, 217u, 218u, 219u, 220u, 221u, 222u, 223u, ++ 224u, 225u, 226u, 227u, 228u, 229u, 230u, 231u, ++ 232u, 233u, 234u, 235u, 236u, 237u, 238u, 239u, ++ 240u, 241u, 242u, 243u, 244u, 245u, 246u, 247u, ++ 248u, 249u, 250u, 251u, 252u, 253u, 254u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, ++ 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, ++ 16u, 17u, 18u, 19u, 20u, 21u, 22u, 23u, ++ 24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u, ++ 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, ++ 40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u, ++ 48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u, ++ 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, ++ 64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u, ++ 72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u, ++ 80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u, ++ 88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u, ++ 96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u, ++ 104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u, ++ 112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u, ++ 120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u, ++}; + +- goto suspend; +- suspend: +- self->private_impl.p_decode_dht[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_dht[0].v_tc4_th = v_tc4_th; +- self->private_data.s_decode_dht[0].v_total_count = v_total_count; +- self->private_data.s_decode_dht[0].v_i = v_i; ++static const uint16_t ++WUFFS_JPEG__EXTEND[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 65535u, 65533u, 65529u, 65521u, 65505u, 65473u, 65409u, ++ 65281u, 65025u, 64513u, 63489u, 61441u, 57345u, 49153u, 32769u, ++}; + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++static const uint8_t ++WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 1u, 5u, 1u, 1u, 1u, 1u, ++ 1u, 1u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 1u, 2u, 3u, 4u, 5u, 6u, ++ 7u, 8u, 9u, 10u, 11u, ++}; + +- return status; +-} ++static const uint8_t ++WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1u, 0u, 3u, 1u, 1u, 1u, 1u, 1u, ++ 1u, 1u, 1u, 1u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 1u, 2u, 3u, 4u, 5u, 6u, ++ 7u, 8u, 9u, 10u, 11u, ++}; + +-// -------- func jpeg.decoder.calculate_huff_tables ++static const uint8_t ++WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 16u, 0u, 2u, 1u, 3u, 3u, 2u, 4u, ++ 3u, 5u, 5u, 4u, 4u, 0u, 0u, 1u, ++ 125u, 1u, 2u, 3u, 0u, 4u, 17u, 5u, ++ 18u, 33u, 49u, 65u, 6u, 19u, 81u, 97u, ++ 7u, 34u, 113u, 20u, 50u, 129u, 145u, 161u, ++ 8u, 35u, 66u, 177u, 193u, 21u, 82u, 209u, ++ 240u, 36u, 51u, 98u, 114u, 130u, 9u, 10u, ++ 22u, 23u, 24u, 25u, 26u, 37u, 38u, 39u, ++ 40u, 41u, 42u, 52u, 53u, 54u, 55u, 56u, ++ 57u, 58u, 67u, 68u, 69u, 70u, 71u, 72u, ++ 73u, 74u, 83u, 84u, 85u, 86u, 87u, 88u, ++ 89u, 90u, 99u, 100u, 101u, 102u, 103u, 104u, ++ 105u, 106u, 115u, 116u, 117u, 118u, 119u, 120u, ++ 121u, 122u, 131u, 132u, 133u, 134u, 135u, 136u, ++ 137u, 138u, 146u, 147u, 148u, 149u, 150u, 151u, ++ 152u, 153u, 154u, 162u, 163u, 164u, 165u, 166u, ++ 167u, 168u, 169u, 170u, 178u, 179u, 180u, 181u, ++ 182u, 183u, 184u, 185u, 186u, 194u, 195u, 196u, ++ 197u, 198u, 199u, 200u, 201u, 202u, 210u, 211u, ++ 212u, 213u, 214u, 215u, 216u, 217u, 218u, 225u, ++ 226u, 227u, 228u, 229u, 230u, 231u, 232u, 233u, ++ 234u, 241u, 242u, 243u, 244u, 245u, 246u, 247u, ++ 248u, 249u, 250u, ++}; ++ ++static const uint8_t ++WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 17u, 0u, 2u, 1u, 2u, 4u, 4u, 3u, ++ 4u, 7u, 5u, 4u, 4u, 0u, 1u, 2u, ++ 119u, 0u, 1u, 2u, 3u, 17u, 4u, 5u, ++ 33u, 49u, 6u, 18u, 65u, 81u, 7u, 97u, ++ 113u, 19u, 34u, 50u, 129u, 8u, 20u, 66u, ++ 145u, 161u, 177u, 193u, 9u, 35u, 51u, 82u, ++ 240u, 21u, 98u, 114u, 209u, 10u, 22u, 36u, ++ 52u, 225u, 37u, 241u, 23u, 24u, 25u, 26u, ++ 38u, 39u, 40u, 41u, 42u, 53u, 54u, 55u, ++ 56u, 57u, 58u, 67u, 68u, 69u, 70u, 71u, ++ 72u, 73u, 74u, 83u, 84u, 85u, 86u, 87u, ++ 88u, 89u, 90u, 99u, 100u, 101u, 102u, 103u, ++ 104u, 105u, 106u, 115u, 116u, 117u, 118u, 119u, ++ 120u, 121u, 122u, 130u, 131u, 132u, 133u, 134u, ++ 135u, 136u, 137u, 138u, 146u, 147u, 148u, 149u, ++ 150u, 151u, 152u, 153u, 154u, 162u, 163u, 164u, ++ 165u, 166u, 167u, 168u, 169u, 170u, 178u, 179u, ++ 180u, 181u, 182u, 183u, 184u, 185u, 186u, 194u, ++ 195u, 196u, 197u, 198u, 199u, 200u, 201u, 202u, ++ 210u, 211u, 212u, 213u, 214u, 215u, 216u, 217u, ++ 218u, 226u, 227u, 228u, 229u, 230u, 231u, 232u, ++ 233u, 234u, 242u, 243u, 244u, 245u, 246u, 247u, ++ 248u, 249u, 250u, ++}; ++ ++#define WUFFS_JPEG__QUIRKS_BASE 1220532224u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-static bool +-wuffs_jpeg__decoder__calculate_huff_tables( ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__decode_idct( + wuffs_jpeg__decoder* self, +- uint8_t a_tc4_th, +- uint32_t a_total_count) { +- uint32_t v_i = 0; +- uint8_t v_j = 0; +- uint8_t v_k = 0; +- uint32_t v_bit_length_minus_one = 0; +- uint8_t v_bit_length = 0; +- uint32_t v_bit_string = 0; +- uint32_t v_slow = 0; +- uint8_t v_prefix = 0; +- uint16_t v_fast = 0; +- uint32_t v_reps = 0; ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, ++ uint32_t a_q); + +- v_i = 0u; +- v_k = 0u; +- v_bit_length_minus_one = 0u; +- while (v_i < a_total_count) { +- while (v_k >= self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) { +- v_k = 0u; +- v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u); +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_k += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- self->private_data.f_dht_temp_bit_lengths[v_i] = ((uint8_t)((v_bit_length_minus_one + 1u))); +- v_i += 1u; +- } +- v_bit_length = 0u; +- v_bit_string = 0u; +- v_i = 0u; +- while (v_i < a_total_count) { +- while (v_bit_length < self->private_data.f_dht_temp_bit_lengths[v_i]) { +- if (v_bit_length >= 16u) { +- return true; +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_bit_length += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- v_bit_string <<= 1u; +- } +- self->private_data.f_dht_temp_bit_strings[v_i] = ((uint16_t)(v_bit_string)); +- v_bit_string += 1u; +- if ((v_bit_string >> v_bit_length) > 0u) { +- return true; +- } +- v_i += 1u; +- } +- v_k = 0u; +- v_bit_length_minus_one = 0u; +- while (true) { +- if (self->private_data.f_dht_temp_counts[v_bit_length_minus_one] == 0u) { +- self->private_impl.f_huff_tables_slow[a_tc4_th][v_bit_length_minus_one] = 0u; +- } else { +- v_slow = (255u & ((uint32_t)(((uint32_t)(v_k)) - ((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_k]))))); +- v_k += self->private_data.f_dht_temp_counts[v_bit_length_minus_one]; +- self->private_impl.f_huff_tables_slow[a_tc4_th][v_bit_length_minus_one] = (v_slow | ((((uint32_t)(self->private_data.f_dht_temp_bit_strings[((uint8_t)(v_k - 1u))])) + 1u) << 8u)); +- } +- v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u); +- if (v_bit_length_minus_one == 0u) { +- break; +- } +- } +- v_i = 0u; +- while (v_i < 256u) { +- self->private_impl.f_huff_tables_fast[a_tc4_th][v_i] = 65535u; +- v_i += 1u; +- } +- v_j = 0u; +- v_bit_length_minus_one = 0u; +- while (v_bit_length_minus_one < 8u) { +- v_k = 0u; +- while (v_k < self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) { +- v_prefix = ((uint8_t)((((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_j])) << (7u - v_bit_length_minus_one)))); +- v_fast = ((uint16_t)(((((uint32_t)((v_bit_length_minus_one + 1u))) << 8u) | ((uint32_t)(self->private_impl.f_huff_tables_symbols[a_tc4_th][v_j]))))); +- v_reps = (((uint32_t)(1u)) << (7u - v_bit_length_minus_one)); +- while (v_reps > 0u) { +- self->private_impl.f_huff_tables_fast[a_tc4_th][v_prefix] = v_fast; +- v_prefix += 1u; +- v_reps -= 1u; +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_k += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- v_j += 1u; +- } +- v_bit_length_minus_one += 1u; +- } +- return false; +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__decode_idct__choosy_default( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, ++ uint32_t a_q); + +-// -------- func jpeg.decoder.decode_sos ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__decode_idct_x86_avx2( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, ++ uint32_t a_q); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__decode_sos( ++wuffs_jpeg__decoder__do_decode_image_config( + wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_my = 0; +- uint32_t v_mx = 0; +- uint32_t v_decode_mcu_result = 0; +- uint32_t v_bitstream_length = 0; +- +- uint32_t coro_susp_point = self->private_impl.p_decode_sos[0]; +- if (coro_susp_point) { +- v_my = self->private_data.s_decode_sos[0].v_my; +- v_mx = self->private_data.s_decode_sos[0].v_mx; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- if (self->private_impl.f_scan_count >= 64u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_scan_count); +- goto exit; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_jpeg__decoder__prepare_scan(self, a_src); +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_next_restart_marker = 0u; +- self->private_impl.f_mcu_previous_dc_values[0u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[1u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[2u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[3u] = 0u; +- self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval; +- self->private_impl.f_eob_run = 0u; +- self->private_impl.f_bitstream_bits = 0u; +- self->private_impl.f_bitstream_n_bits = 0u; +- self->private_impl.f_bitstream_ri = 0u; +- self->private_impl.f_bitstream_wi = 0u; +- self->private_impl.f_bitstream_padding = 12345u; +- wuffs_jpeg__decoder__fill_bitstream(self, a_src); +- v_my = 0u; +- while (v_my < self->private_impl.f_scan_height_in_mcus) { +- v_mx = 0u; +- while (v_mx < self->private_impl.f_scan_width_in_mcus) { +- self->private_impl.f_mcu_current_block = 0u; +- self->private_impl.f_mcu_zig_index = ((uint32_t)(self->private_impl.f_scan_ss)); +- if (self->private_impl.f_sof_marker >= 194u) { +- wuffs_jpeg__decoder__load_mcu_blocks(self, v_mx, v_my, a_workbuf); +- } +- while (true) { +- v_decode_mcu_result = wuffs_jpeg__decoder__decode_mcu(self, a_workbuf, v_mx, v_my); +- if (v_decode_mcu_result == 0u) { +- break; +- } else if (v_decode_mcu_result != 1u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__internal_error_inconsistent_decoder_state); +- goto exit; +- } +- while (true) { +- v_bitstream_length = ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri)); +- wuffs_jpeg__decoder__fill_bitstream(self, a_src); +- if (v_bitstream_length < ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri))) { +- break; +- } else if (self->private_impl.f_bitstream_padding == 0u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } else if ((a_src && a_src->meta.closed) && ! self->private_impl.f_bitstream_is_closed) { +- if (self->private_impl.f_bitstream_wi < 1024u) { +- wuffs_base__bulk_memset(&self->private_data.f_bitstream_buffer[self->private_impl.f_bitstream_wi], 264u, 0u); +- self->private_impl.f_bitstream_wi += 264u; +- self->private_impl.f_bitstream_is_closed = true; +- } +- break; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- } +- } +- if (self->private_impl.f_sof_marker >= 194u) { +- wuffs_jpeg__decoder__save_mcu_blocks(self, v_mx, v_my, a_workbuf); +- } +- if (self->private_impl.f_restarts_remaining > 0u) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_restarts_remaining -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- if (self->private_impl.f_restarts_remaining == 0u) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_jpeg__decoder__skip_past_the_next_restart_marker(self, a_src); +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_mcu_previous_dc_values[0u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[1u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[2u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[3u] = 0u; +- self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval; +- self->private_impl.f_eob_run = 0u; +- self->private_impl.f_bitstream_bits = 0u; +- self->private_impl.f_bitstream_n_bits = 0u; +- self->private_impl.f_bitstream_ri = 0u; +- self->private_impl.f_bitstream_wi = 0u; +- self->private_impl.f_bitstream_padding = 12345u; +- } +- } +- v_mx += 1u; +- } +- v_my += 1u; +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_scan_count, 1u); ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dqt( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- ok: +- self->private_impl.p_decode_sos[0] = 0; +- goto exit; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dri( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- goto suspend; +- suspend: +- self->private_impl.p_decode_sos[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_sos[0].v_my = v_my; +- self->private_data.s_decode_sos[0].v_mx = v_mx; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_appn( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint8_t a_marker); + +- goto exit; +- exit: +- return status; +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_sof( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src); + +-// -------- func jpeg.decoder.prepare_scan ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__quantize_dimension( ++ const wuffs_jpeg__decoder* self, ++ uint32_t a_width, ++ uint8_t a_h, ++ uint8_t a_max_incl_h); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__prepare_scan( ++wuffs_jpeg__decoder__do_decode_frame_config( + wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- uint32_t v_i = 0; +- uint32_t v_j = 0; +- uint32_t v_j_max_incl = 0; +- bool v_failed = false; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_prepare_scan[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_prepare_scan[0].v_i; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if ((self->private_impl.f_payload_length < 6u) || (self->private_impl.f_payload_length > 12u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if ((v_c < 1u) || (v_c > 4u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_scan_num_components = ((uint32_t)(v_c)); +- if ((self->private_impl.f_scan_num_components > self->private_impl.f_num_components) || (self->private_impl.f_payload_length != (4u + (2u * self->private_impl.f_scan_num_components)))) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_payload_length = 0u; +- v_i = 0u; +- while (v_i < self->private_impl.f_scan_num_components) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- v_j = 0u; +- while (true) { +- if (v_j >= self->private_impl.f_num_components) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- if (v_c == self->private_impl.f_components_c[v_j]) { +- if ( ! self->private_impl.f_seen_dqt[self->private_impl.f_components_tq[v_j]]) { +- status = wuffs_base__make_status(wuffs_jpeg__error__missing_quantization_table); +- goto exit; +- } +- self->private_impl.f_scan_comps_cselector[v_i] = ((uint8_t)(v_j)); +- break; +- } +- v_j += 1u; +- } +- v_j = 0u; +- while (v_j < v_i) { +- if (self->private_impl.f_scan_comps_cselector[v_i] == self->private_impl.f_scan_comps_cselector[v_j]) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- v_j += 1u; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; +- } +- if (((v_c >> 4u) > 3u) || ((v_c & 15u) > 3u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_scan_comps_td[v_i] = (v_c >> 4u); +- self->private_impl.f_scan_comps_ta[v_i] = (v_c & 15u); +- if (self->private_impl.f_sof_marker == 192u) { +- if ((self->private_impl.f_scan_comps_td[v_i] > 1u) || (self->private_impl.f_scan_comps_ta[v_i] > 1u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- } +- v_i += 1u; +- } +- if (self->private_impl.f_sof_marker < 194u) { +- self->private_data.s_prepare_scan[0].scratch = 3u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (self->private_data.s_prepare_scan[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_prepare_scan[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_prepare_scan[0].scratch; +- self->private_impl.f_scan_ss = 0u; +- self->private_impl.f_scan_se = 63u; +- self->private_impl.f_scan_ah = 0u; +- self->private_impl.f_scan_al = 0u; +- } else { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; +- } +- if (v_c > 63u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_scan_ss = v_c; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; +- } +- if ((v_c > 63u) || (v_c < self->private_impl.f_scan_ss)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_scan_se = v_c; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; +- } +- if (((v_c >> 4u) > 14u) || ((v_c & 15u) > 13u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_scan_ah = (v_c >> 4u); +- self->private_impl.f_scan_al = (v_c & 15u); +- if (self->private_impl.f_scan_ah > 0u) { +- if ((self->private_impl.f_scan_ah - 1u) != self->private_impl.f_scan_al) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- } +- if (self->private_impl.f_scan_ss == 0u) { +- if (self->private_impl.f_scan_se != 0u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } else if (self->private_impl.f_scan_ah == 0u) { +- self->private_impl.choosy_decode_mcu = ( +- &wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits); +- } else { +- self->private_impl.choosy_decode_mcu = ( +- &wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit); +- } +- } else { +- if (self->private_impl.f_scan_num_components != 1u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } else if (self->private_impl.f_scan_ah == 0u) { +- self->private_impl.choosy_decode_mcu = ( +- &wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits); +- } else { +- self->private_impl.choosy_decode_mcu = ( +- &wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit); +- } +- } +- } +- v_i = 0u; +- while (v_i < self->private_impl.f_scan_num_components) { +- if ((self->private_impl.f_scan_ss == 0u) && ! self->private_impl.f_seen_dht[(0u | self->private_impl.f_scan_comps_td[v_i])]) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- status = wuffs_jpeg__decoder__use_default_huffman_table(self, (0u | self->private_impl.f_scan_comps_td[v_i])); +- if (status.repr) { +- goto suspend; +- } +- } +- if ((self->private_impl.f_scan_se != 0u) && ! self->private_impl.f_seen_dht[(4u | self->private_impl.f_scan_comps_ta[v_i])]) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_jpeg__decoder__use_default_huffman_table(self, (4u | self->private_impl.f_scan_comps_ta[v_i])); +- if (status.repr) { +- goto suspend; +- } +- } +- v_j = ((uint32_t)(self->private_impl.f_scan_ss)); +- v_j_max_incl = ((uint32_t)(wuffs_base__u8__min(self->private_impl.f_scan_se, 9u))); +- while (v_j <= v_j_max_incl) { +- self->private_impl.f_block_smoothing_lowest_scan_al[self->private_impl.f_scan_comps_cselector[v_i]][v_j] = self->private_impl.f_scan_al; +- v_j += 1u; +- } +- v_i += 1u; +- } +- if (self->private_impl.f_scan_num_components == 1u) { +- wuffs_jpeg__decoder__calculate_single_component_scan_fields(self); +- } else { +- v_failed = wuffs_jpeg__decoder__calculate_multiple_component_scan_fields(self); +- if (v_failed) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- } ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- goto ok; +- ok: +- self->private_impl.p_prepare_scan[0] = 0; +- goto exit; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__do_decode_frame( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); + +- goto suspend; +- suspend: +- self->private_impl.p_prepare_scan[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_prepare_scan[0].v_i = v_i; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dht( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++WUFFS_BASE__GENERATED_C_CODE ++static bool ++wuffs_jpeg__decoder__calculate_huff_tables( ++ wuffs_jpeg__decoder* self, ++ uint8_t a_tc4_th, ++ uint32_t a_total_count); + +- return status; +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_sos( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); + +-// -------- func jpeg.decoder.use_default_huffman_table ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__prepare_scan( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status + wuffs_jpeg__decoder__use_default_huffman_table( + wuffs_jpeg__decoder* self, +- uint8_t a_tc4_th) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__slice_u8 v_data = {0}; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- if (a_tc4_th == 0u) { +- v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA), 29); +- } else if (a_tc4_th == 1u) { +- v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA), 29); +- } else if (a_tc4_th == 4u) { +- v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA), 179); +- } else if (a_tc4_th == 5u) { +- v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA), 179); +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__missing_huffman_table); +- goto exit; +- } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- v_data, +- 0u); +- self->private_impl.f_payload_length = ((uint32_t)((((uint64_t)(v_data.len)) & 65535u))); +- { +- wuffs_base__status t_0 = wuffs_jpeg__decoder__decode_dht(self, v_r); +- v_status = t_0; +- } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; +- } +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- +- ok: +- goto exit; +- exit: +- return status; +-} +- +-// -------- func jpeg.decoder.calculate_single_component_scan_fields ++ uint8_t a_tc4_th); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct + wuffs_jpeg__decoder__calculate_single_component_scan_fields( +- wuffs_jpeg__decoder* self) { +- uint8_t v_csel = 0; +- +- self->private_impl.f_scan_comps_bx_offset[0u] = 0u; +- self->private_impl.f_scan_comps_by_offset[0u] = 0u; +- self->private_impl.f_mcu_num_blocks = 1u; +- self->private_impl.f_mcu_blocks_sselector[0u] = 0u; +- v_csel = self->private_impl.f_scan_comps_cselector[0u]; +- self->private_impl.f_mcu_blocks_offset[0u] = self->private_impl.f_components_workbuf_offsets[v_csel]; +- self->private_impl.f_mcu_blocks_mx_mul[0u] = 8u; +- self->private_impl.f_mcu_blocks_my_mul[0u] = (8u * self->private_impl.f_components_workbuf_widths[v_csel]); +- self->private_impl.f_mcu_blocks_dc_hselector[0u] = (0u | self->private_impl.f_scan_comps_td[0u]); +- self->private_impl.f_mcu_blocks_ac_hselector[0u] = (4u | self->private_impl.f_scan_comps_ta[0u]); +- self->private_impl.f_scan_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, self->private_impl.f_components_h[v_csel], self->private_impl.f_max_incl_components_h); +- self->private_impl.f_scan_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, self->private_impl.f_components_v[v_csel], self->private_impl.f_max_incl_components_v); +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.calculate_multiple_component_scan_fields ++ wuffs_jpeg__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + static bool + wuffs_jpeg__decoder__calculate_multiple_component_scan_fields( +- wuffs_jpeg__decoder* self) { +- uint32_t v_i = 0; +- uint32_t v_h = 0; +- uint32_t v_v = 0; +- uint32_t v_hv = 0; +- uint32_t v_total_hv = 0; +- uint32_t v_b = 0; +- uint32_t v_bx_offset = 0; +- uint32_t v_by_offset = 0; +- uint8_t v_ssel = 0; +- uint8_t v_csel = 0; +- +- v_total_hv = 0u; +- v_i = 0u; +- v_b = 0u; +- v_bx_offset = 0u; +- v_by_offset = 0u; +- while (v_i < self->private_impl.f_scan_num_components) { +- v_h = ((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]])); +- v_v = ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]])); +- v_hv = (((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]])) * ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]]))); +- v_total_hv += v_hv; +- while (v_hv > 0u) { +- self->private_impl.f_scan_comps_bx_offset[(v_b & 15u)] = ((uint8_t)((v_bx_offset & 3u))); +- self->private_impl.f_scan_comps_by_offset[(v_b & 15u)] = ((uint8_t)((v_by_offset & 3u))); +- self->private_impl.f_mcu_blocks_sselector[(v_b & 15u)] = ((uint8_t)(v_i)); +- v_b += 1u; +- v_bx_offset += 1u; +- if (v_bx_offset == v_h) { +- v_bx_offset = 0u; +- v_by_offset += 1u; +- if (v_by_offset == v_v) { +- v_by_offset = 0u; +- } +- } +- v_hv -= 1u; +- } +- v_i += 1u; +- } +- if (v_total_hv > 10u) { +- return true; +- } +- self->private_impl.f_mcu_num_blocks = v_total_hv; +- v_b = 0u; +- while (v_b < self->private_impl.f_mcu_num_blocks) { +- v_ssel = self->private_impl.f_mcu_blocks_sselector[v_b]; +- v_csel = self->private_impl.f_scan_comps_cselector[v_ssel]; +- self->private_impl.f_mcu_blocks_offset[v_b] = (self->private_impl.f_components_workbuf_offsets[v_csel] + (8u * ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) + (8u * ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b])) * ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])))); +- self->private_impl.f_mcu_blocks_mx_mul[v_b] = (8u * ((uint32_t)(self->private_impl.f_components_h[v_csel]))); +- self->private_impl.f_mcu_blocks_my_mul[v_b] = (8u * ((uint32_t)(self->private_impl.f_components_v[v_csel])) * self->private_impl.f_components_workbuf_widths[v_csel]); +- self->private_impl.f_mcu_blocks_dc_hselector[v_b] = (0u | self->private_impl.f_scan_comps_td[v_ssel]); +- self->private_impl.f_mcu_blocks_ac_hselector[v_b] = (4u | self->private_impl.f_scan_comps_ta[v_ssel]); +- v_b += 1u; +- } +- self->private_impl.f_scan_width_in_mcus = self->private_impl.f_width_in_mcus; +- self->private_impl.f_scan_height_in_mcus = self->private_impl.f_height_in_mcus; +- return false; +-} +- +-// -------- func jpeg.decoder.fill_bitstream ++ wuffs_jpeg__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct + wuffs_jpeg__decoder__fill_bitstream( + wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src) { +- uint32_t v_wi = 0; +- uint8_t v_c = 0; +- uint32_t v_new_wi = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- if (self->private_impl.f_bitstream_ri <= 0u) { +- } else if (self->private_impl.f_bitstream_ri >= self->private_impl.f_bitstream_wi) { +- self->private_impl.f_bitstream_ri = 0u; +- self->private_impl.f_bitstream_wi = 0u; +- } else { +- v_wi = (self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri); +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_bitstream_buffer, 2048), wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi)); +- self->private_impl.f_bitstream_ri = 0u; +- self->private_impl.f_bitstream_wi = v_wi; +- } +- v_wi = self->private_impl.f_bitstream_wi; +- while ((v_wi < 2048u) && (((uint64_t)(io2_a_src - iop_a_src)) > 0u)) { +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (v_c < 255u) { +- self->private_data.f_bitstream_buffer[v_wi] = v_c; +- v_wi += 1u; +- iop_a_src += 1u; +- continue; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) { +- break; +- } else if ((wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u) > 0u) { +- break; +- } else { +- self->private_data.f_bitstream_buffer[v_wi] = 255u; +- v_wi += 1u; +- iop_a_src += 2u; +- } +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) > 1u) { +- if ((wuffs_base__peek_u8be__no_bounds_check(iop_a_src) >= 255u) && ((wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u) > 0u)) { +- v_new_wi = (wuffs_base__u32__min(v_wi, 1784u) + 264u); +- v_new_wi = wuffs_base__u32__min(v_new_wi, (v_wi + self->private_impl.f_bitstream_padding)); +- if (v_wi < v_new_wi) { +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_bitstream_padding, (v_new_wi - v_wi)); +- wuffs_base__bulk_memset(&self->private_data.f_bitstream_buffer[v_wi], (v_new_wi - v_wi), 0u); +- v_wi = v_new_wi; +- } +- } +- } +- self->private_impl.f_bitstream_wi = v_wi; +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.load_mcu_blocks_for_single_component ++ wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +@@ -44752,9 +44689,7 @@ wuffs_jpeg__decoder__load_mcu_blocks_for_single_component( + uint32_t a_mx, + uint32_t a_my, + wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel) { +- return (*self->private_impl.choosy_load_mcu_blocks_for_single_component)(self, a_mx, a_my, a_workbuf, a_csel); +-} ++ uint32_t a_csel); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +@@ -44763,19 +44698,7 @@ wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default( + uint32_t a_mx, + uint32_t a_my, + wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel) { +- uint64_t v_stride16 = 0; +- uint64_t v_offset = 0; +- +- v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u))); +- v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16)); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); +- } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.load_mcu_blocks ++ uint32_t a_csel); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +@@ -44783,34 +44706,7 @@ wuffs_jpeg__decoder__load_mcu_blocks( + wuffs_jpeg__decoder* self, + uint32_t a_mx, + uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf) { +- uint32_t v_b = 0; +- uint8_t v_csel = 0; +- uint64_t v_h = 0; +- uint64_t v_v = 0; +- uint64_t v_stride16 = 0; +- uint64_t v_offset = 0; +- +- v_h = 1u; +- v_v = 1u; +- v_b = 0u; +- while (v_b < self->private_impl.f_mcu_num_blocks) { +- v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]]; +- if (self->private_impl.f_scan_num_components > 1u) { +- v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel])); +- v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel])); +- } +- v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u))); +- v_offset = (self->private_impl.f_components_workbuf_offsets[(v_csel | 4u)] + (((v_h * ((uint64_t)(a_mx))) + ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) * 128u) + (((v_v * ((uint64_t)(a_my))) + ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b]))) * v_stride16)); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_load_host_endian(&self->private_data.f_mcu_blocks[v_b], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); +- } +- v_b += 1u; +- } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.save_mcu_blocks ++ wuffs_base__slice_u8 a_workbuf); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +@@ -44818,4983 +44714,17911 @@ wuffs_jpeg__decoder__save_mcu_blocks( + wuffs_jpeg__decoder* self, + uint32_t a_mx, + uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf) { +- uint32_t v_b = 0; +- uint8_t v_csel = 0; +- uint64_t v_h = 0; +- uint64_t v_v = 0; +- uint64_t v_stride16 = 0; +- uint64_t v_offset = 0; +- +- v_h = 1u; +- v_v = 1u; +- v_b = 0u; +- while (v_b < self->private_impl.f_mcu_num_blocks) { +- v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]]; +- if (self->private_impl.f_scan_num_components > 1u) { +- v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel])); +- v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel])); +- } +- v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u))); +- v_offset = (self->private_impl.f_components_workbuf_offsets[(v_csel | 4u)] + (((v_h * ((uint64_t)(a_mx))) + ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) * 128u) + (((v_v * ((uint64_t)(a_my))) + ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b]))) * v_stride16)); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_save_host_endian(&self->private_data.f_mcu_blocks[v_b], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); +- } +- v_b += 1u; +- } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.skip_past_the_next_restart_marker ++ wuffs_base__slice_u8 a_workbuf); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status + wuffs_jpeg__decoder__skip_past_the_next_restart_marker( + wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_skip_past_the_next_restart_marker[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; +- } else if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) < 255u) { +- iop_a_src += 1u; +- continue; +- } +- v_c = ((uint8_t)((wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u))); +- if (v_c < 192u) { +- iop_a_src += 2u; +- continue; +- } else if ((v_c < 208u) || (215u < v_c)) { +- break; +- } +- v_c &= 7u; +- if ((self->private_impl.f_next_restart_marker == ((v_c + 1u) & 7u)) || (self->private_impl.f_next_restart_marker == ((v_c + 2u) & 7u))) { +- break; +- } else if ((self->private_impl.f_next_restart_marker == ((v_c + 7u) & 7u)) || (self->private_impl.f_next_restart_marker == ((v_c + 6u) & 7u))) { +- iop_a_src += 2u; +- continue; +- } else { +- iop_a_src += 2u; +- break; +- } +- } +- self->private_impl.f_next_restart_marker = (((uint8_t)(self->private_impl.f_next_restart_marker + 1u)) & 7u); +- +- ok: +- self->private_impl.p_skip_past_the_next_restart_marker[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_skip_past_the_next_restart_marker[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func jpeg.decoder.apply_progressive_idct ++ wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct + wuffs_jpeg__decoder__apply_progressive_idct( + wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf) { +- uint32_t v_csel = 0; +- bool v_block_smoothing_applicable = false; +- uint32_t v_scan_width_in_mcus = 0; +- uint32_t v_scan_height_in_mcus = 0; +- uint32_t v_mcu_blocks_mx_mul_0 = 0; +- uint32_t v_mcu_blocks_my_mul_0 = 0; +- uint32_t v_my = 0; +- uint32_t v_mx = 0; +- uint64_t v_stride = 0; +- uint64_t v_offset = 0; +- uint8_t v_stashed_mcu_blocks_0[128] = {0}; +- +- wuffs_base__bulk_save_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__make_slice_u8(v_stashed_mcu_blocks_0, 128)); +- v_block_smoothing_applicable = true; +- v_csel = 0u; +- while (v_csel < self->private_impl.f_num_components) { +- if ((self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][0u] >= 16u) || wuffs_jpeg__decoder__top_left_quants_has_zero(self, ((uint32_t)(self->private_impl.f_components_tq[v_csel])))) { +- v_block_smoothing_applicable = false; +- } +- v_csel += 1u; +- } +- v_csel = 0u; +- while (v_csel < self->private_impl.f_num_components) { +- v_scan_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, self->private_impl.f_components_h[v_csel], self->private_impl.f_max_incl_components_h); +- v_scan_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, self->private_impl.f_components_v[v_csel], self->private_impl.f_max_incl_components_v); +- v_mcu_blocks_mx_mul_0 = 8u; +- v_mcu_blocks_my_mul_0 = (8u * self->private_impl.f_components_workbuf_widths[v_csel]); +- if (v_block_smoothing_applicable && (0u != (self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][1u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][2u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][3u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][4u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][5u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][6u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][9u]))) { +- self->private_impl.choosy_load_mcu_blocks_for_single_component = ( +- &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth); +- self->private_impl.f_block_smoothing_mx_max_incl = wuffs_base__u32__sat_sub(v_scan_width_in_mcus, 1u); +- self->private_impl.f_block_smoothing_my_max_incl = wuffs_base__u32__sat_sub(v_scan_height_in_mcus, 1u); +- } else { +- self->private_impl.choosy_load_mcu_blocks_for_single_component = ( +- &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default); +- } +- v_my = 0u; +- while (v_my < v_scan_height_in_mcus) { +- v_mx = 0u; +- while (v_mx < v_scan_width_in_mcus) { +- wuffs_jpeg__decoder__load_mcu_blocks_for_single_component(self, +- v_mx, +- v_my, +- a_workbuf, +- v_csel); +- v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])); +- v_offset = (self->private_impl.f_components_workbuf_offsets[v_csel] + (((uint64_t)(v_mcu_blocks_mx_mul_0)) * ((uint64_t)(v_mx))) + (((uint64_t)(v_mcu_blocks_my_mul_0)) * ((uint64_t)(v_my)))); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_jpeg__decoder__decode_idct(self, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); +- } +- v_mx += 1u; +- } +- v_my += 1u; +- } +- v_csel += 1u; +- } +- wuffs_base__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__make_slice_u8(v_stashed_mcu_blocks_0, 128)); +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.swizzle_gray ++ wuffs_base__slice_u8 a_workbuf); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status + wuffs_jpeg__decoder__swizzle_gray( + wuffs_jpeg__decoder* self, + wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_length = 0; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint32_t v_y = 0; +- uint64_t v_stride = 0; +- +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_length = ((uint64_t)((v_dst_bytes_per_pixel * self->private_impl.f_width))); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- v_y = 0u; +- while (v_y < self->private_impl.f_height) { +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_y); +- if (v_dst_length < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_length); +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), a_workbuf); +- v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[0u])); +- if (v_stride <= ((uint64_t)(a_workbuf.len))) { +- a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, v_stride); +- } else { +- a_workbuf = wuffs_base__utility__empty_slice_u8(); +- } +- v_y += 1u; +- } +- return wuffs_base__make_status(NULL); +-} +- +-// -------- func jpeg.decoder.swizzle_colorful ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_x0, ++ uint32_t a_x1, ++ uint32_t a_y0, ++ uint32_t a_y1, ++ uint64_t a_stride); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status + wuffs_jpeg__decoder__swizzle_colorful( + wuffs_jpeg__decoder* self, + wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__slice_u8 v_src0 = {0}; +- wuffs_base__slice_u8 v_src1 = {0}; +- wuffs_base__slice_u8 v_src2 = {0}; +- wuffs_base__slice_u8 v_src3 = {0}; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- if ((self->private_impl.f_components_workbuf_offsets[0u] <= self->private_impl.f_components_workbuf_offsets[1u]) && (self->private_impl.f_components_workbuf_offsets[1u] <= ((uint64_t)(a_workbuf.len)))) { +- v_src0 = wuffs_base__slice_u8__subslice_ij(a_workbuf, +- self->private_impl.f_components_workbuf_offsets[0u], +- self->private_impl.f_components_workbuf_offsets[1u]); +- } +- if ((self->private_impl.f_components_workbuf_offsets[1u] <= self->private_impl.f_components_workbuf_offsets[2u]) && (self->private_impl.f_components_workbuf_offsets[2u] <= ((uint64_t)(a_workbuf.len)))) { +- v_src1 = wuffs_base__slice_u8__subslice_ij(a_workbuf, +- self->private_impl.f_components_workbuf_offsets[1u], +- self->private_impl.f_components_workbuf_offsets[2u]); +- } +- if ((self->private_impl.f_components_workbuf_offsets[2u] <= self->private_impl.f_components_workbuf_offsets[3u]) && (self->private_impl.f_components_workbuf_offsets[3u] <= ((uint64_t)(a_workbuf.len)))) { +- v_src2 = wuffs_base__slice_u8__subslice_ij(a_workbuf, +- self->private_impl.f_components_workbuf_offsets[2u], +- self->private_impl.f_components_workbuf_offsets[3u]); +- } +- if ((self->private_impl.f_components_workbuf_offsets[3u] <= self->private_impl.f_components_workbuf_offsets[4u]) && (self->private_impl.f_components_workbuf_offsets[4u] <= ((uint64_t)(a_workbuf.len)))) { +- v_src3 = wuffs_base__slice_u8__subslice_ij(a_workbuf, +- self->private_impl.f_components_workbuf_offsets[3u], +- self->private_impl.f_components_workbuf_offsets[4u]); +- } +- v_status = wuffs_base__pixel_swizzler__swizzle_ycck(&self->private_impl.f_swizzler, +- a_dst, +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), +- self->private_impl.f_width, +- self->private_impl.f_height, +- v_src0, +- v_src1, +- v_src2, +- v_src3, +- self->private_impl.f_components_workbuf_widths[0u], +- self->private_impl.f_components_workbuf_widths[1u], +- self->private_impl.f_components_workbuf_widths[2u], +- self->private_impl.f_components_workbuf_widths[3u], +- self->private_impl.f_components_workbuf_heights[0u], +- self->private_impl.f_components_workbuf_heights[1u], +- self->private_impl.f_components_workbuf_heights[2u], +- self->private_impl.f_components_workbuf_heights[3u], +- self->private_impl.f_components_workbuf_widths[0u], +- self->private_impl.f_components_workbuf_widths[1u], +- self->private_impl.f_components_workbuf_widths[2u], +- self->private_impl.f_components_workbuf_widths[3u], +- self->private_impl.f_components_h[0u], +- self->private_impl.f_components_h[1u], +- self->private_impl.f_components_h[2u], +- self->private_impl.f_components_h[3u], +- self->private_impl.f_components_v[0u], +- self->private_impl.f_components_v[1u], +- self->private_impl.f_components_v[2u], +- self->private_impl.f_components_v[3u], +- self->private_impl.f_is_rgb_or_cmyk, +- true, +- wuffs_base__make_slice_u8(self->private_data.f_swizzle_ycck_scratch_buffer_2k, 2048)); +- return wuffs_base__status__ensure_not_a_suspension(v_status); +-} +- +-// -------- func jpeg.decoder.frame_dirty_rect ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_x0, ++ uint32_t a_x1, ++ uint32_t a_y0, ++ uint32_t a_y1); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_jpeg__decoder__frame_dirty_rect( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- +- return wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height); +-} +- +-// -------- func jpeg.decoder.num_animation_loops ++static bool ++wuffs_jpeg__decoder__top_left_quants_has_zero( ++ const wuffs_jpeg__decoder* self, ++ uint32_t a_q); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_jpeg__decoder__num_animation_loops( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func jpeg.decoder.num_decoded_frame_configs ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_csel); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_jpeg__decoder__num_decoded_frame_configs( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- if (self->private_impl.f_call_sequence > 32u) { +- return 1u; +- } +- return 0u; +-} +- +-// -------- func jpeg.decoder.num_decoded_frames ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_jpeg__decoder__num_decoded_frames( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- if (self->private_impl.f_call_sequence > 64u) { +- return 1u; +- } +- return 0u; +-} +- +-// -------- func jpeg.decoder.restart_frame ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu__choosy_default( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__restart_frame( ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits( + wuffs_jpeg__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- uint32_t v_i = 0; +- uint32_t v_j = 0; ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } +- if (a_index != 0u) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- self->private_impl.f_call_sequence = 40u; +- self->private_impl.f_bitstream_is_closed = false; +- self->private_impl.f_frame_config_io_position = a_io_position; +- self->private_impl.f_scan_count = 0u; +- self->private_impl.f_restart_interval = self->private_impl.f_saved_restart_interval; +- v_i = 0u; +- while (v_i < 4u) { +- self->private_impl.f_seen_dqt[v_i] = self->private_impl.f_saved_seen_dqt[v_i]; +- v_j = 0u; +- while (v_j < 64u) { +- self->private_impl.f_quant_tables[v_i][v_j] = self->private_impl.f_saved_quant_tables[v_i][v_j]; +- v_j += 1u; +- } +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < 4u) { +- v_j = 0u; +- while (v_j < 10u) { +- self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u; +- v_j += 1u; +- } +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < 8u) { +- self->private_impl.f_seen_dht[v_i] = false; +- v_i += 1u; +- } +- return wuffs_base__make_status(NULL); +-} ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + +-// -------- func jpeg.decoder.set_report_metadata ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_jpeg__decoder__set_report_metadata( ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit( + wuffs_jpeg__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_base__make_empty_struct(); +-} ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + +-// -------- func jpeg.decoder.tell_me_more ++// ---------------- VTables + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__tell_me_more( ++const wuffs_base__image_decoder__func_ptrs ++wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_jpeg__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_jpeg__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_jpeg__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_jpeg__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_jpeg__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_jpeg__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_jpeg__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_jpeg__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_jpeg__decoder__initialize( + wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); + +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; ++ self->private_impl.choosy_decode_idct = &wuffs_jpeg__decoder__decode_idct__choosy_default; ++ self->private_impl.choosy_load_mcu_blocks_for_single_component = &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default; ++ self->private_impl.choosy_decode_mcu = &wuffs_jpeg__decoder__decode_mcu__choosy_default; + +- goto ok; +- ok: +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); + } + +-// -------- func jpeg.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_jpeg__decoder__history_retain_length( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return 0; ++wuffs_jpeg__decoder* ++wuffs_jpeg__decoder__alloc(void) { ++ wuffs_jpeg__decoder* x = ++ (wuffs_jpeg__decoder*)(calloc(1, sizeof(wuffs_jpeg__decoder))); ++ if (!x) { ++ return NULL; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (wuffs_jpeg__decoder__initialize( ++ x, sizeof(wuffs_jpeg__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; + } ++ return x; ++} + +- return 0u; ++size_t ++sizeof__wuffs_jpeg__decoder(void) { ++ return sizeof(wuffs_jpeg__decoder); + } + +-// -------- func jpeg.decoder.workbuf_len ++// ---------------- Function Implementations ++ ++// -------- func jpeg.decoder.decode_idct + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_jpeg__decoder__workbuf_len( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- +- return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_components_workbuf_offsets[8u], self->private_impl.f_components_workbuf_offsets[8u]); +-} +- +-// -------- func jpeg.decoder.top_left_quants_has_zero +- +-WUFFS_BASE__GENERATED_C_CODE +-static bool +-wuffs_jpeg__decoder__top_left_quants_has_zero( +- const wuffs_jpeg__decoder* self, ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__decode_idct( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, + uint32_t a_q) { +- return ((self->private_impl.f_quant_tables[a_q][0u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][1u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][2u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][3u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][8u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][9u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][10u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][16u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][17u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][24u] == 0u)); ++ return (*self->private_impl.choosy_decode_idct)(self, a_dst_buffer, a_dst_stride, a_q); + } + +-// -------- func jpeg.decoder.load_mcu_blocks_for_single_component_smooth +- + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth( ++wuffs_jpeg__decoder__decode_idct__choosy_default( + wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel) { +- uint64_t v_stride16 = 0; +- uint64_t v_offset = 0; +- uint32_t v_dx = 0; +- uint32_t v_dy = 0; +- uint32_t v_mx = 0; +- uint32_t v_my = 0; +- uint8_t v_q = 0; +- uint32_t v_q_00 = 0; +- uint32_t v_q_xy = 0; +- uint8_t v_al = 0; +- uint32_t v_scratch = 0; +- uint32_t v_limit = 0; ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, ++ uint32_t a_q) { ++ uint32_t v_bq0 = 0; ++ uint32_t v_bq2 = 0; ++ uint32_t v_bq4 = 0; ++ uint32_t v_bq6 = 0; ++ uint32_t v_ca = 0; ++ uint32_t v_cb2 = 0; ++ uint32_t v_cb6 = 0; ++ uint32_t v_ccp = 0; ++ uint32_t v_ccm = 0; ++ uint32_t v_cd0 = 0; ++ uint32_t v_cd1 = 0; ++ uint32_t v_cd2 = 0; ++ uint32_t v_cd3 = 0; ++ uint32_t v_bq1 = 0; ++ uint32_t v_bq3 = 0; ++ uint32_t v_bq5 = 0; ++ uint32_t v_bq7 = 0; ++ uint32_t v_ci51 = 0; ++ uint32_t v_ci53 = 0; ++ uint32_t v_ci71 = 0; ++ uint32_t v_ci73 = 0; ++ uint32_t v_cj = 0; ++ uint32_t v_ck1 = 0; ++ uint32_t v_ck3 = 0; ++ uint32_t v_ck5 = 0; ++ uint32_t v_ck7 = 0; ++ uint32_t v_cl51 = 0; ++ uint32_t v_cl73 = 0; ++ uint32_t v_in0 = 0; ++ uint32_t v_in2 = 0; ++ uint32_t v_in4 = 0; ++ uint32_t v_in6 = 0; ++ uint32_t v_ra = 0; ++ uint32_t v_rb2 = 0; ++ uint32_t v_rb6 = 0; ++ uint32_t v_rcp = 0; ++ uint32_t v_rcm = 0; ++ uint32_t v_rd0 = 0; ++ uint32_t v_rd1 = 0; ++ uint32_t v_rd2 = 0; ++ uint32_t v_rd3 = 0; ++ uint32_t v_in1 = 0; ++ uint32_t v_in3 = 0; ++ uint32_t v_in5 = 0; ++ uint32_t v_in7 = 0; ++ uint32_t v_ri51 = 0; ++ uint32_t v_ri53 = 0; ++ uint32_t v_ri71 = 0; ++ uint32_t v_ri73 = 0; ++ uint32_t v_rj = 0; ++ uint32_t v_rk1 = 0; ++ uint32_t v_rk3 = 0; ++ uint32_t v_rk5 = 0; ++ uint32_t v_rk7 = 0; ++ uint32_t v_rl51 = 0; ++ uint32_t v_rl73 = 0; ++ uint32_t v_intermediate[64] = {0}; + +- v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u))); +- v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16)); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ if (8u > a_dst_stride) { ++ return wuffs_base__make_empty_struct(); + } +- v_dy = 0u; +- while (v_dy < 5u) { +- v_my = wuffs_base__u32__min(self->private_impl.f_block_smoothing_my_max_incl, wuffs_base__u32__sat_sub((a_my + v_dy), 2u)); +- v_dx = 0u; +- while (v_dx < 5u) { +- v_mx = wuffs_base__u32__min(self->private_impl.f_block_smoothing_mx_max_incl, wuffs_base__u32__sat_sub((a_mx + v_dx), 2u)); +- v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(v_mx)) * 128u) + (((uint64_t)(v_my)) * v_stride16)); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_load_host_endian(&self->private_impl.f_block_smoothing_dc_values[v_dy][v_dx], 1u * (size_t)2u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); +- } +- v_dx += 1u; +- } +- v_dy += 1u; ++ if (0u == (self->private_data.f_mcu_blocks[0u][8u] | ++ self->private_data.f_mcu_blocks[0u][16u] | ++ self->private_data.f_mcu_blocks[0u][24u] | ++ self->private_data.f_mcu_blocks[0u][32u] | ++ self->private_data.f_mcu_blocks[0u][40u] | ++ self->private_data.f_mcu_blocks[0u][48u] | ++ self->private_data.f_mcu_blocks[0u][56u])) { ++ v_intermediate[0u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][0u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][0u])))) << 2u)); ++ v_intermediate[8u] = v_intermediate[0u]; ++ v_intermediate[16u] = v_intermediate[0u]; ++ v_intermediate[24u] = v_intermediate[0u]; ++ v_intermediate[32u] = v_intermediate[0u]; ++ v_intermediate[40u] = v_intermediate[0u]; ++ v_intermediate[48u] = v_intermediate[0u]; ++ v_intermediate[56u] = v_intermediate[0u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][16u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][16u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][48u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][48u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][0u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][0u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][32u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][32u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][8u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][8u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][24u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][24u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][40u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][40u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][56u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][56u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[0u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[56u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[8u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[48u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[16u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[40u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[24u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[32u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- v_q = self->private_impl.f_components_tq[a_csel]; +- v_q_00 = ((uint32_t)(self->private_impl.f_quant_tables[v_q][0u])); +- if (v_q_00 <= 0u) { +- return wuffs_base__make_empty_struct(); ++ if (0u == (self->private_data.f_mcu_blocks[0u][9u] | ++ self->private_data.f_mcu_blocks[0u][17u] | ++ self->private_data.f_mcu_blocks[0u][25u] | ++ self->private_data.f_mcu_blocks[0u][33u] | ++ self->private_data.f_mcu_blocks[0u][41u] | ++ self->private_data.f_mcu_blocks[0u][49u] | ++ self->private_data.f_mcu_blocks[0u][57u])) { ++ v_intermediate[1u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][1u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][1u])))) << 2u)); ++ v_intermediate[9u] = v_intermediate[1u]; ++ v_intermediate[17u] = v_intermediate[1u]; ++ v_intermediate[25u] = v_intermediate[1u]; ++ v_intermediate[33u] = v_intermediate[1u]; ++ v_intermediate[41u] = v_intermediate[1u]; ++ v_intermediate[49u] = v_intermediate[1u]; ++ v_intermediate[57u] = v_intermediate[1u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][17u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][17u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][49u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][49u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][1u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][1u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][33u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][33u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][9u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][9u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][25u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][25u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][41u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][41u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][57u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][57u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[1u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[57u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[9u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[49u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[17u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[41u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[25u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[33u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- if (0u != (16u & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][6u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][7u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][8u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][9u])) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(152u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + 128u)) / 256u))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + 128u)) / 256u))); +- } +- self->private_data.f_mcu_blocks[0u][0u] = ((uint16_t)(v_scratch)); +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][3u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][3u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][3u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][10u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][10u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][10u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][17u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][17u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][17u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][24u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][24u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][24u] = ((uint16_t)(v_scratch)); +- } ++ if (0u == (self->private_data.f_mcu_blocks[0u][10u] | ++ self->private_data.f_mcu_blocks[0u][18u] | ++ self->private_data.f_mcu_blocks[0u][26u] | ++ self->private_data.f_mcu_blocks[0u][34u] | ++ self->private_data.f_mcu_blocks[0u][42u] | ++ self->private_data.f_mcu_blocks[0u][50u] | ++ self->private_data.f_mcu_blocks[0u][58u])) { ++ v_intermediate[2u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][2u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][2u])))) << 2u)); ++ v_intermediate[10u] = v_intermediate[2u]; ++ v_intermediate[18u] = v_intermediate[2u]; ++ v_intermediate[26u] = v_intermediate[2u]; ++ v_intermediate[34u] = v_intermediate[2u]; ++ v_intermediate[42u] = v_intermediate[2u]; ++ v_intermediate[50u] = v_intermediate[2u]; ++ v_intermediate[58u] = v_intermediate[2u]; + } else { +- v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u]; +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u])); +- if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) { +- v_limit = ((((uint32_t)(1u)) << v_al) - 1u); +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } else { +- v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } +- self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch)); +- } +- v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u]; +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u])); +- if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) { +- v_limit = ((((uint32_t)(1u)) << v_al) - 1u); +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } else { +- v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } +- self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch)); +- } +- v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u]; +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u])); +- if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) { +- v_limit = ((((uint32_t)(1u)) << v_al) - 1u); +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } else { +- v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } +- self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch)); +- } +- v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u]; +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u])); +- if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) { +- v_limit = ((((uint32_t)(1u)) << v_al) - 1u); +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } else { +- v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } +- self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch)); +- } +- v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u]; +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u])); +- if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) { +- v_limit = ((((uint32_t)(1u)) << v_al) - 1u); +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } else { +- v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } +- self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch)); +- } ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][18u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][18u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][50u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][50u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][2u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][2u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][34u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][34u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][10u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][10u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][26u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][26u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][42u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][42u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][58u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][58u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[2u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[58u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[10u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[50u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[18u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[42u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[26u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[34u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.decode_mcu +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- return (*self->private_impl.choosy_decode_mcu)(self, a_workbuf, a_mx, a_my); +-} +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu__choosy_default( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- uint32_t v_ret = 0; +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint8_t v_csel = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint32_t v_pos = 0; +- uint8_t v_dc_h = 0; +- uint32_t v_dc_symbol = 0; +- uint32_t v_dc_ht_fast = 0; +- uint32_t v_dc_bl = 0; +- uint32_t v_dc_code = 0; +- uint32_t v_dc_blm1 = 0; +- uint32_t v_dc_ht_slow = 0; +- uint16_t v_dc_value = 0; +- uint16_t v_dc_extend = 0; +- const uint16_t* v_ac_huff_table_fast = NULL; +- uint8_t v_ac_h = 0; +- uint32_t v_ac_symbol = 0; +- uint32_t v_ac_ht_fast = 0; +- uint32_t v_ac_bl = 0; +- uint32_t v_ac_code = 0; +- uint32_t v_ac_blm1 = 0; +- uint32_t v_ac_ht_slow = 0; +- uint16_t v_ac_value = 0; +- uint16_t v_ac_extend = 0; +- uint32_t v_ac_rrrr = 0; +- uint32_t v_ac_ssss = 0; +- uint32_t v_z = 0; +- uint32_t v_mcb = 0; +- uint64_t v_stride = 0; +- uint64_t v_offset = 0; +- +- v_bits = self->private_impl.f_bitstream_bits; +- v_n_bits = self->private_impl.f_bitstream_n_bits; +- if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { +- return 2u; ++ if (0u == (self->private_data.f_mcu_blocks[0u][11u] | ++ self->private_data.f_mcu_blocks[0u][19u] | ++ self->private_data.f_mcu_blocks[0u][27u] | ++ self->private_data.f_mcu_blocks[0u][35u] | ++ self->private_data.f_mcu_blocks[0u][43u] | ++ self->private_data.f_mcu_blocks[0u][51u] | ++ self->private_data.f_mcu_blocks[0u][59u])) { ++ v_intermediate[3u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][3u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][3u])))) << 2u)); ++ v_intermediate[11u] = v_intermediate[3u]; ++ v_intermediate[19u] = v_intermediate[3u]; ++ v_intermediate[27u] = v_intermediate[3u]; ++ v_intermediate[35u] = v_intermediate[3u]; ++ v_intermediate[43u] = v_intermediate[3u]; ++ v_intermediate[51u] = v_intermediate[3u]; ++ v_intermediate[59u] = v_intermediate[3u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][19u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][19u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][51u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][51u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][3u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][3u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][35u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][35u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][11u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][11u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][27u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][27u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][43u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][43u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][59u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][59u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[3u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[59u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[11u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[51u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[19u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[43u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[27u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[35u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi), +- ((uint64_t)(self->private_impl.f_bitstream_ri))); +- do { +- while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { +- while (self->private_impl.f_mcu_zig_index <= 0u) { +- wuffs_base__bulk_memset(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, 0u); +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block]; +- v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)])); +- v_dc_bl = (v_dc_ht_fast >> 8u); +- if (v_n_bits >= v_dc_bl) { +- v_dc_symbol = (15u & v_dc_ht_fast); +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- v_bits <<= (v_dc_bl & 63u); +- v_n_bits -= v_dc_bl; +- } else { +- v_dc_code = ((uint32_t)((v_bits >> 55u))); +- v_dc_blm1 = 8u; +- v_bits <<= 9u; +- v_n_bits -= 9u; +- while (true) { +- v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1]; +- if (v_dc_code < (v_dc_ht_slow >> 8u)) { +- v_dc_symbol = (15u & ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_dc_h][(255u & ((uint32_t)(v_dc_code + v_dc_ht_slow)))]))); +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- break; +- } +- v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u); +- if (v_dc_blm1 == 0u) { +- v_dc_symbol = 0u; +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- break; +- } +- } +- } +- v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol)))); +- v_dc_value += (v_dc_extend & (((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)); +- v_bits <<= v_dc_symbol; +- v_n_bits -= v_dc_symbol; +- v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]]; +- self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value; +- self->private_data.f_mcu_blocks[0u][0u] = self->private_impl.f_mcu_previous_dc_values[v_csel]; +- self->private_impl.f_mcu_zig_index = 1u; +- break; +- } +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- if (v_n_bits < 16u) { +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- } +- v_z = 1u; +- self->private_impl.f_mcu_zig_index = 0u; +- v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[self->private_impl.f_mcu_current_block]; +- v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; +- while (v_z < 64u) { +- v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_ac_bl = (v_ac_ht_fast >> 8u); +- if (v_n_bits >= v_ac_bl) { +- v_ac_symbol = (255u & v_ac_ht_fast); +- v_bits <<= (v_ac_bl & 63u); +- v_n_bits -= v_ac_bl; +- } else { +- v_ac_code = ((uint32_t)((v_bits >> 55u))); +- v_ac_blm1 = 8u; +- v_bits <<= 9u; +- v_n_bits -= 9u; +- while (true) { +- v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; +- if (v_ac_code < (v_ac_ht_slow >> 8u)) { +- v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); +- break; +- } +- v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); +- if (v_ac_blm1 == 0u) { +- v_ac_symbol = 0u; +- break; +- } +- } +- } +- v_ac_rrrr = (v_ac_symbol >> 4u); +- v_z += (v_ac_rrrr + 1u); +- v_ac_ssss = (v_ac_symbol & 15u); +- v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss]; +- if (v_ac_ssss > 0u) { +- v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss)))); +- v_ac_value += (v_ac_extend & (((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)); +- v_bits <<= v_ac_ssss; +- v_n_bits -= v_ac_ssss; +- self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[v_z]] = v_ac_value; +- } else if (v_ac_rrrr < 15u) { +- break; +- } +- } +- v_mcb = self->private_impl.f_mcu_current_block; +- self->private_impl.f_mcu_current_block += 1u; +- if (self->private_impl.f_test_only_interrupt_decode_mcu) { +- goto label__goto_done__break; +- } +- v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]]; +- v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])); +- v_offset = (self->private_impl.f_mcu_blocks_offset[v_mcb] + (((uint64_t)(self->private_impl.f_mcu_blocks_mx_mul[v_mcb])) * ((uint64_t)(a_mx))) + (((uint64_t)(self->private_impl.f_mcu_blocks_my_mul[v_mcb])) * ((uint64_t)(a_my)))); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_jpeg__decoder__decode_idct(self, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); +- } +- } +- self->private_impl.f_mcu_current_block = 0u; +- } while (0); +- label__goto_done__break:; +- v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); +- if (v_pos > self->private_impl.f_bitstream_wi) { +- v_ret = 2u; +- } else { +- self->private_impl.f_bitstream_ri = v_pos; +- } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; ++ if (0u == (self->private_data.f_mcu_blocks[0u][12u] | ++ self->private_data.f_mcu_blocks[0u][20u] | ++ self->private_data.f_mcu_blocks[0u][28u] | ++ self->private_data.f_mcu_blocks[0u][36u] | ++ self->private_data.f_mcu_blocks[0u][44u] | ++ self->private_data.f_mcu_blocks[0u][52u] | ++ self->private_data.f_mcu_blocks[0u][60u])) { ++ v_intermediate[4u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][4u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][4u])))) << 2u)); ++ v_intermediate[12u] = v_intermediate[4u]; ++ v_intermediate[20u] = v_intermediate[4u]; ++ v_intermediate[28u] = v_intermediate[4u]; ++ v_intermediate[36u] = v_intermediate[4u]; ++ v_intermediate[44u] = v_intermediate[4u]; ++ v_intermediate[52u] = v_intermediate[4u]; ++ v_intermediate[60u] = v_intermediate[4u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][20u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][20u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][52u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][52u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][4u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][4u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][36u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][36u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][12u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][12u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][28u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][28u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][44u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][44u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][60u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][60u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[4u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[60u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[12u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[52u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[20u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[44u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[28u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[36u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- self->private_impl.f_bitstream_bits = v_bits; +- self->private_impl.f_bitstream_n_bits = v_n_bits; +- return v_ret; +-} +- +-// -------- func jpeg.decoder.decode_mcu_progressive_ac_high_bits +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- uint32_t v_ret = 0; +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint32_t v_pos = 0; +- const uint16_t* v_ac_huff_table_fast = NULL; +- uint8_t v_ac_h = 0; +- uint32_t v_ac_symbol = 0; +- uint32_t v_ac_ht_fast = 0; +- uint32_t v_ac_bl = 0; +- uint32_t v_ac_code = 0; +- uint32_t v_ac_blm1 = 0; +- uint32_t v_ac_ht_slow = 0; +- uint16_t v_ac_value = 0; +- uint16_t v_ac_extend = 0; +- uint32_t v_ac_rrrr = 0; +- uint32_t v_ac_ssss = 0; +- uint32_t v_z = 0; +- +- if (self->private_impl.f_eob_run > 0u) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_eob_run -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- return 0u; ++ if (0u == (self->private_data.f_mcu_blocks[0u][13u] | ++ self->private_data.f_mcu_blocks[0u][21u] | ++ self->private_data.f_mcu_blocks[0u][29u] | ++ self->private_data.f_mcu_blocks[0u][37u] | ++ self->private_data.f_mcu_blocks[0u][45u] | ++ self->private_data.f_mcu_blocks[0u][53u] | ++ self->private_data.f_mcu_blocks[0u][61u])) { ++ v_intermediate[5u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][5u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][5u])))) << 2u)); ++ v_intermediate[13u] = v_intermediate[5u]; ++ v_intermediate[21u] = v_intermediate[5u]; ++ v_intermediate[29u] = v_intermediate[5u]; ++ v_intermediate[37u] = v_intermediate[5u]; ++ v_intermediate[45u] = v_intermediate[5u]; ++ v_intermediate[53u] = v_intermediate[5u]; ++ v_intermediate[61u] = v_intermediate[5u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][21u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][21u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][53u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][53u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][5u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][5u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][37u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][37u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][13u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][13u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][29u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][29u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][45u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][45u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][61u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][61u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[5u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[61u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[13u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[53u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[21u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[45u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[29u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[37u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- v_bits = self->private_impl.f_bitstream_bits; +- v_n_bits = self->private_impl.f_bitstream_n_bits; +- if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { +- return 2u; ++ if (0u == (self->private_data.f_mcu_blocks[0u][14u] | ++ self->private_data.f_mcu_blocks[0u][22u] | ++ self->private_data.f_mcu_blocks[0u][30u] | ++ self->private_data.f_mcu_blocks[0u][38u] | ++ self->private_data.f_mcu_blocks[0u][46u] | ++ self->private_data.f_mcu_blocks[0u][54u] | ++ self->private_data.f_mcu_blocks[0u][62u])) { ++ v_intermediate[6u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][6u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][6u])))) << 2u)); ++ v_intermediate[14u] = v_intermediate[6u]; ++ v_intermediate[22u] = v_intermediate[6u]; ++ v_intermediate[30u] = v_intermediate[6u]; ++ v_intermediate[38u] = v_intermediate[6u]; ++ v_intermediate[46u] = v_intermediate[6u]; ++ v_intermediate[54u] = v_intermediate[6u]; ++ v_intermediate[62u] = v_intermediate[6u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][22u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][22u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][54u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][54u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][6u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][6u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][38u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][38u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][14u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][14u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][30u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][30u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][46u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][46u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][62u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][62u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[6u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[62u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[14u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[54u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[22u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[46u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[30u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[38u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi), +- ((uint64_t)(self->private_impl.f_bitstream_ri))); +- do { +- do { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- if (v_n_bits < 16u) { +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- } +- v_z = self->private_impl.f_mcu_zig_index; +- self->private_impl.f_mcu_zig_index = 0u; +- v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u]; +- v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; +- while (v_z <= ((uint32_t)(self->private_impl.f_scan_se))) { +- v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_ac_bl = (v_ac_ht_fast >> 8u); +- if (v_n_bits >= v_ac_bl) { +- v_ac_symbol = (255u & v_ac_ht_fast); +- v_bits <<= (v_ac_bl & 63u); +- v_n_bits -= v_ac_bl; +- } else { +- v_ac_code = ((uint32_t)((v_bits >> 55u))); +- v_ac_blm1 = 8u; +- v_bits <<= 9u; +- v_n_bits -= 9u; +- while (true) { +- v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; +- if (v_ac_code < (v_ac_ht_slow >> 8u)) { +- v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); +- break; +- } +- v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); +- if (v_ac_blm1 == 0u) { +- v_ac_symbol = 0u; +- break; +- } +- } +- } +- v_ac_rrrr = (v_ac_symbol >> 4u); +- v_z += (v_ac_rrrr + 1u); +- v_ac_ssss = (v_ac_symbol & 15u); +- v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss]; +- if (v_ac_ssss > 0u) { +- v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss)))); +- v_ac_value += (v_ac_extend & (((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)); +- v_bits <<= v_ac_ssss; +- v_n_bits -= v_ac_ssss; +- self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[v_z]] = ((uint16_t)(((uint16_t)(v_ac_value << self->private_impl.f_scan_al)))); +- } else if (v_ac_rrrr < 15u) { +- self->private_impl.f_eob_run = ((uint16_t)(((((uint16_t)(1u)) << v_ac_rrrr) - 1u))); +- if (v_ac_rrrr > 0u) { +- self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr)))); +- v_bits <<= v_ac_rrrr; +- v_n_bits -= v_ac_rrrr; +- } +- break; +- } +- } +- } while (0); +- } while (0); +- label__goto_done__break:; +- v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); +- if (v_pos > self->private_impl.f_bitstream_wi) { +- v_ret = 2u; +- } else { +- self->private_impl.f_bitstream_ri = v_pos; +- } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; ++ if (0u == (self->private_data.f_mcu_blocks[0u][15u] | ++ self->private_data.f_mcu_blocks[0u][23u] | ++ self->private_data.f_mcu_blocks[0u][31u] | ++ self->private_data.f_mcu_blocks[0u][39u] | ++ self->private_data.f_mcu_blocks[0u][47u] | ++ self->private_data.f_mcu_blocks[0u][55u] | ++ self->private_data.f_mcu_blocks[0u][63u])) { ++ v_intermediate[7u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][7u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][7u])))) << 2u)); ++ v_intermediate[15u] = v_intermediate[7u]; ++ v_intermediate[23u] = v_intermediate[7u]; ++ v_intermediate[31u] = v_intermediate[7u]; ++ v_intermediate[39u] = v_intermediate[7u]; ++ v_intermediate[47u] = v_intermediate[7u]; ++ v_intermediate[55u] = v_intermediate[7u]; ++ v_intermediate[63u] = v_intermediate[7u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][23u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][23u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][55u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][55u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][7u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][7u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][39u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][39u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][15u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][15u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][31u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][31u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][47u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][47u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][63u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][63u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[7u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[63u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[15u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[55u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[23u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[47u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[31u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[39u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- self->private_impl.f_bitstream_bits = v_bits; +- self->private_impl.f_bitstream_n_bits = v_n_bits; +- return v_ret; +-} +- +-// -------- func jpeg.decoder.decode_mcu_progressive_ac_low_bit +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- uint32_t v_ret = 0; +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint16_t v_one_lshift_scan_al = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint32_t v_pos = 0; +- const uint16_t* v_ac_huff_table_fast = NULL; +- uint8_t v_ac_h = 0; +- uint32_t v_ac_symbol = 0; +- uint32_t v_ac_ht_fast = 0; +- uint32_t v_ac_bl = 0; +- uint32_t v_ac_code = 0; +- uint32_t v_ac_blm1 = 0; +- uint32_t v_ac_ht_slow = 0; +- uint16_t v_ac_value = 0; +- uint32_t v_ac_rrrr = 0; +- uint32_t v_ac_ssss = 0; +- uint8_t v_unzig = 0; +- bool v_bit = false; +- +- v_bits = self->private_impl.f_bitstream_bits; +- v_n_bits = self->private_impl.f_bitstream_n_bits; +- v_one_lshift_scan_al = (((uint16_t)(1u)) << self->private_impl.f_scan_al); +- if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { +- return 2u; +- } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi), +- ((uint64_t)(self->private_impl.f_bitstream_ri))); +- do { +- do { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- while (true) { +- if (self->private_impl.f_eob_run > 0u) { +- break; +- } +- v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u]; +- v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; +- while (true) { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); +- v_ac_bl = (v_ac_ht_fast >> 8u); +- if (v_n_bits >= v_ac_bl) { +- v_ac_symbol = (255u & v_ac_ht_fast); +- v_bits <<= (v_ac_bl & 63u); +- v_n_bits -= v_ac_bl; +- } else { +- v_ac_code = ((uint32_t)((v_bits >> 55u))); +- v_ac_blm1 = 8u; +- v_bits <<= 9u; +- v_n_bits -= 9u; +- while (true) { +- v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; +- if (v_ac_code < (v_ac_ht_slow >> 8u)) { +- v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); +- break; +- } +- v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); +- if (v_ac_blm1 == 0u) { +- v_ac_symbol = 0u; +- break; +- } +- } +- } +- v_ac_rrrr = (v_ac_symbol >> 4u); +- v_ac_ssss = (v_ac_symbol & 15u); +- v_ac_value = 0u; +- if (v_ac_ssss > 0u) { +- v_ac_value = (((uint16_t)(1u)) << self->private_impl.f_scan_al); +- if ((v_bits >> 63u) == 0u) { +- v_ac_value = ((uint16_t)(((uint16_t)(65535u)) << self->private_impl.f_scan_al)); +- } +- v_bits <<= 1u; +- v_n_bits -= 1u; +- } else if (v_ac_rrrr < 15u) { +- self->private_impl.f_eob_run = (((uint16_t)(1u)) << v_ac_rrrr); +- if (v_ac_rrrr > 0u) { +- self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr)))); +- v_bits <<= v_ac_rrrr; +- v_n_bits -= v_ac_rrrr; +- } +- goto label__goto_do_eob__break; +- } +- while (true) { +- v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]; +- if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) { +- if (v_n_bits == 0u) { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- } +- v_bit = ((v_bits >> 63u) > 0u); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- if (v_bit) { +- if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } +- } +- } else if (v_ac_rrrr <= 0u) { +- break; +- } else { +- v_ac_rrrr -= 1u; +- } +- if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { +- break; +- } +- self->private_impl.f_mcu_zig_index += 1u; +- } +- if (v_ac_value != 0u) { +- self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]] = v_ac_value; +- } +- if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { +- break; +- } +- self->private_impl.f_mcu_zig_index += 1u; +- } +- goto label__block__break; +- } +- label__goto_do_eob__break:; +- if (self->private_impl.f_eob_run <= 0u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- while (true) { +- v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]; +- if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) { +- if (v_n_bits == 0u) { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- } +- v_bit = ((v_bits >> 63u) > 0u); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- if (v_bit) { +- if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } +- } +- } +- if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { +- break; +- } +- self->private_impl.f_mcu_zig_index += 1u; +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_eob_run -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } while (0); +- label__block__break:; +- } while (0); +- label__goto_done__break:; +- v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); +- if (v_pos > self->private_impl.f_bitstream_wi) { +- v_ret = 2u; +- } else { +- self->private_impl.f_bitstream_ri = v_pos; ++ if (0u == (v_intermediate[1u] | ++ v_intermediate[2u] | ++ v_intermediate[3u] | ++ v_intermediate[4u] | ++ v_intermediate[5u] | ++ v_intermediate[6u] | ++ v_intermediate[7u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; +- } +- self->private_impl.f_bitstream_bits = v_bits; +- self->private_impl.f_bitstream_n_bits = v_n_bits; +- return v_ret; +-} +- +-// -------- func jpeg.decoder.decode_mcu_progressive_dc_high_bits +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- uint32_t v_ret = 0; +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint8_t v_csel = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint32_t v_pos = 0; +- uint8_t v_dc_h = 0; +- uint32_t v_dc_symbol = 0; +- uint32_t v_dc_ht_fast = 0; +- uint32_t v_dc_bl = 0; +- uint32_t v_dc_code = 0; +- uint32_t v_dc_blm1 = 0; +- uint32_t v_dc_ht_slow = 0; +- uint16_t v_dc_value = 0; +- uint16_t v_dc_extend = 0; +- +- v_bits = self->private_impl.f_bitstream_bits; +- v_n_bits = self->private_impl.f_bitstream_n_bits; +- if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { +- return 2u; +- } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi), +- ((uint64_t)(self->private_impl.f_bitstream_ri))); +- do { +- while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- do { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block]; +- v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)])); +- v_dc_bl = (v_dc_ht_fast >> 8u); +- if (v_n_bits >= v_dc_bl) { +- v_dc_symbol = (15u & v_dc_ht_fast); +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- v_bits <<= (v_dc_bl & 63u); +- v_n_bits -= v_dc_bl; +- } else { +- v_dc_code = ((uint32_t)((v_bits >> 55u))); +- v_dc_blm1 = 8u; +- v_bits <<= 9u; +- v_n_bits -= 9u; +- while (true) { +- v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1]; +- if (v_dc_code < (v_dc_ht_slow >> 8u)) { +- v_dc_symbol = (15u & ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_dc_h][(255u & ((uint32_t)(v_dc_code + v_dc_ht_slow)))]))); +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- break; +- } +- v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u); +- if (v_dc_blm1 == 0u) { +- v_dc_symbol = 0u; +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- break; +- } +- } +- } +- v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol)))); +- v_dc_value += (v_dc_extend & (((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)); +- v_bits <<= v_dc_symbol; +- v_n_bits -= v_dc_symbol; +- v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]]; +- self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value; +- self->private_data.f_mcu_blocks[self->private_impl.f_mcu_current_block][0u] = ((uint16_t)(self->private_impl.f_mcu_previous_dc_values[v_csel] << self->private_impl.f_scan_al)); +- } while (0); +- self->private_impl.f_mcu_current_block += 1u; +- } +- self->private_impl.f_mcu_current_block = 0u; +- } while (0); +- label__goto_done__break:; +- v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); +- if (v_pos > self->private_impl.f_bitstream_wi) { +- v_ret = 2u; +- } else { +- self->private_impl.f_bitstream_ri = v_pos; ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[0u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[2u]; ++ v_in6 = v_intermediate[6u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[0u]; ++ v_in4 = v_intermediate[4u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[1u]; ++ v_in3 = v_intermediate[3u]; ++ v_in5 = v_intermediate[5u]; ++ v_in7 = v_intermediate[7u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; +- } +- self->private_impl.f_bitstream_bits = v_bits; +- self->private_impl.f_bitstream_n_bits = v_n_bits; +- return v_ret; +-} +- +-// -------- func jpeg.decoder.decode_mcu_progressive_dc_low_bit +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- uint32_t v_ret = 0; +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint16_t v_one_lshift_scan_al = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint32_t v_pos = 0; +- +- v_bits = self->private_impl.f_bitstream_bits; +- v_n_bits = self->private_impl.f_bitstream_n_bits; +- v_one_lshift_scan_al = (((uint16_t)(1u)) << self->private_impl.f_scan_al); +- if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { +- return 2u; ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi), +- ((uint64_t)(self->private_impl.f_bitstream_ri))); +- do { +- while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- do { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- if ((v_bits >> 63u) != 0u) { +- self->private_data.f_mcu_blocks[self->private_impl.f_mcu_current_block][0u] |= v_one_lshift_scan_al; +- } +- v_bits <<= 1u; +- v_n_bits -= 1u; +- } while (0); +- self->private_impl.f_mcu_current_block += 1u; +- } +- self->private_impl.f_mcu_current_block = 0u; +- } while (0); +- label__goto_done__break:; +- v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); +- if (v_pos > self->private_impl.f_bitstream_wi) { +- v_ret = 2u; +- } else { +- self->private_impl.f_bitstream_ri = v_pos; ++ if (0u == (v_intermediate[9u] | ++ v_intermediate[10u] | ++ v_intermediate[11u] | ++ v_intermediate[12u] | ++ v_intermediate[13u] | ++ v_intermediate[14u] | ++ v_intermediate[15u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; +- } +- self->private_impl.f_bitstream_bits = v_bits; +- self->private_impl.f_bitstream_n_bits = v_n_bits; +- return v_ret; +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_json__error__bad_c0_control_code[] = "#json: bad C0 control code"; +-const char wuffs_json__error__bad_utf_8[] = "#json: bad UTF-8"; +-const char wuffs_json__error__bad_backslash_escape[] = "#json: bad backslash-escape"; +-const char wuffs_json__error__bad_input[] = "#json: bad input"; +-const char wuffs_json__error__bad_new_line_in_a_string[] = "#json: bad new-line in a string"; +-const char wuffs_json__error__bad_quirk_combination[] = "#json: bad quirk combination"; +-const char wuffs_json__error__unsupported_number_length[] = "#json: unsupported number length"; +-const char wuffs_json__error__unsupported_recursion_depth[] = "#json: unsupported recursion depth"; +-const char wuffs_json__error__internal_error_inconsistent_i_o[] = "#json: internal error: inconsistent I/O"; +- +-// ---------------- Private Consts +- +-#define WUFFS_JSON__DECODER_NUMBER_LENGTH_MAX_INCL 99 +- +-static const uint8_t +-WUFFS_JSON__LUT_BACKSLASHES[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 3, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 162, 0, 0, 0, 0, 5, +- 0, 0, 0, 0, 0, 0, 0, 175, +- 7, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 4, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 220, 0, 0, 0, +- 0, 1, 136, 0, 0, 2, 140, 0, +- 0, 0, 0, 0, 0, 0, 138, 0, +- 0, 0, 141, 0, 137, 0, 6, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 1, 3, 4, 5, 6, 7, 10, +-}; +- +-static const uint8_t +-WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 7, 27, 10, 63, 39, 11, 0, +-}; +- +-static const uint8_t +-WUFFS_JSON__LUT_CHARS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 128, 129, 130, 131, 132, 133, 134, 135, +- 136, 137, 138, 139, 140, 141, 142, 143, +- 144, 145, 146, 147, 148, 149, 150, 151, +- 152, 153, 154, 155, 156, 157, 158, 159, +- 0, 0, 1, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 2, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 32, 32, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, +- 4, 4, 4, 4, 4, 4, 4, 4, +- 4, 4, 4, 4, 4, 4, 4, 4, +- 5, 5, 5, 5, 5, 32, 32, 32, +- 32, 32, 32, 32, 32, 32, 32, 32, +-}; +- +-#define WUFFS_JSON__CLASS_WHITESPACE 0 +- +-#define WUFFS_JSON__CLASS_STRING 1 +- +-#define WUFFS_JSON__CLASS_COMMA 2 +- +-#define WUFFS_JSON__CLASS_COLON 3 +- +-#define WUFFS_JSON__CLASS_NUMBER 4 +- +-#define WUFFS_JSON__CLASS_OPEN_CURLY_BRACE 5 +- +-#define WUFFS_JSON__CLASS_CLOSE_CURLY_BRACE 6 +- +-#define WUFFS_JSON__CLASS_OPEN_SQUARE_BRACKET 7 +- +-#define WUFFS_JSON__CLASS_CLOSE_SQUARE_BRACKET 8 +- +-#define WUFFS_JSON__CLASS_FALSE 9 +- +-#define WUFFS_JSON__CLASS_TRUE 10 +- +-#define WUFFS_JSON__CLASS_NULL_NAN_INF 11 +- +-#define WUFFS_JSON__CLASS_COMMENT 12 +- +-#define WUFFS_JSON__EXPECT_VALUE 7858 +- +-#define WUFFS_JSON__EXPECT_NON_STRING_VALUE 7856 +- +-#define WUFFS_JSON__EXPECT_STRING 4098 +- +-#define WUFFS_JSON__EXPECT_COMMA 4100 +- +-#define WUFFS_JSON__EXPECT_COLON 4104 +- +-#define WUFFS_JSON__EXPECT_NUMBER 4112 +- +-#define WUFFS_JSON__EXPECT_CLOSE_CURLY_BRACE 4160 +- +-#define WUFFS_JSON__EXPECT_CLOSE_SQUARE_BRACKET 4352 +- +-static const uint8_t +-WUFFS_JSON__LUT_CLASSES[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 0, 0, 15, 15, 0, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 0, 15, 1, 15, 15, 15, 15, 15, +- 15, 15, 15, 11, 2, 4, 15, 12, +- 4, 4, 4, 4, 4, 4, 4, 4, +- 4, 4, 3, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 11, 15, 15, 15, 15, 11, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 7, 15, 8, 15, 15, +- 15, 15, 15, 15, 15, 15, 9, 15, +- 15, 11, 15, 15, 15, 15, 11, 15, +- 15, 15, 15, 15, 10, 15, 15, 15, +- 15, 15, 15, 5, 15, 6, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +-}; +- +-static const uint8_t +-WUFFS_JSON__LUT_DECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 128, 129, 130, 131, 132, 133, 134, 135, +- 136, 137, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 128, 129, 130, 131, 132, 133, 134, 135, +- 136, 137, 0, 0, 0, 0, 0, 0, +- 0, 138, 139, 140, 141, 142, 143, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 138, 139, 140, 141, 142, 143, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +-}; +- +-#define WUFFS_JSON__QUIRKS_BASE 1225364480 +- +-#define WUFFS_JSON__QUIRKS_COUNT 21 +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_json__decoder__decode_number( +- wuffs_json__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_json__decoder__decode_digits( +- wuffs_json__decoder* self, +- wuffs_base__io_buffer* a_src, +- uint32_t a_n); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_leading( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_comment( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_inf_nan( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_trailer( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-// ---------------- VTables +- +-const wuffs_base__token_decoder__func_ptrs +-wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__token_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_json__decoder__decode_tokens), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_json__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_json__decoder__history_retain_length), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_json__decoder__set_quirk), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_json__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_json__decoder__initialize( +- wuffs_json__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[8u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[10u]; ++ v_in6 = v_intermediate[14u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[8u]; ++ v_in4 = v_intermediate[12u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[9u]; ++ v_in3 = v_intermediate[11u]; ++ v_in5 = v_intermediate[13u]; ++ v_in7 = v_intermediate[15u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ if (0u == (v_intermediate[17u] | ++ v_intermediate[18u] | ++ v_intermediate[19u] | ++ v_intermediate[20u] | ++ v_intermediate[21u] | ++ v_intermediate[22u] | ++ v_intermediate[23u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[16u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ v_in2 = v_intermediate[18u]; ++ v_in6 = v_intermediate[22u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[16u]; ++ v_in4 = v_intermediate[20u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[17u]; ++ v_in3 = v_intermediate[19u]; ++ v_in5 = v_intermediate[21u]; ++ v_in7 = v_intermediate[23u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name = +- wuffs_base__token_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers = +- (const void*)(&wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_json__decoder* +-wuffs_json__decoder__alloc(void) { +- wuffs_json__decoder* x = +- (wuffs_json__decoder*)(calloc(sizeof(wuffs_json__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_json__decoder__initialize( +- x, sizeof(wuffs_json__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} +- +-size_t +-sizeof__wuffs_json__decoder(void) { +- return sizeof(wuffs_json__decoder); +-} +- +-// ---------------- Function Implementations +- +-// -------- func json.decoder.get_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_json__decoder__get_quirk( +- const wuffs_json__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- uint32_t v_key = 0; +- +- if (a_key >= 1225364480u) { +- v_key = (a_key - 1225364480u); +- if (v_key < 21u) { +- if (self->private_impl.f_quirks[v_key]) { +- return 1u; +- } ++ if (0u == (v_intermediate[25u] | ++ v_intermediate[26u] | ++ v_intermediate[27u] | ++ v_intermediate[28u] | ++ v_intermediate[29u] | ++ v_intermediate[30u] | ++ v_intermediate[31u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } +- } +- return 0u; +-} +- +-// -------- func json.decoder.set_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_json__decoder__set_quirk( +- wuffs_json__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- if (a_key >= 1225364480u) { +- a_key -= 1225364480u; +- if (a_key < 21u) { +- self->private_impl.f_quirks[a_key] = (a_value > 0u); +- return wuffs_base__make_status(NULL); ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[24u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[26u]; ++ v_in6 = v_intermediate[30u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[24u]; ++ v_in4 = v_intermediate[28u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[25u]; ++ v_in3 = v_intermediate[27u]; ++ v_in5 = v_intermediate[29u]; ++ v_in7 = v_intermediate[31u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +-} +- +-// -------- func json.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_json__decoder__history_retain_length( +- const wuffs_json__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (0u == (v_intermediate[33u] | ++ v_intermediate[34u] | ++ v_intermediate[35u] | ++ v_intermediate[36u] | ++ v_intermediate[37u] | ++ v_intermediate[38u] | ++ v_intermediate[39u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[32u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[34u]; ++ v_in6 = v_intermediate[38u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[32u]; ++ v_in4 = v_intermediate[36u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[33u]; ++ v_in3 = v_intermediate[35u]; ++ v_in5 = v_intermediate[37u]; ++ v_in7 = v_intermediate[39u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- +- return 0u; +-} +- +-// -------- func json.decoder.workbuf_len +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_json__decoder__workbuf_len( +- const wuffs_json__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ if (0u == (v_intermediate[41u] | ++ v_intermediate[42u] | ++ v_intermediate[43u] | ++ v_intermediate[44u] | ++ v_intermediate[45u] | ++ v_intermediate[46u] | ++ v_intermediate[47u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[40u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[42u]; ++ v_in6 = v_intermediate[46u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[40u]; ++ v_in4 = v_intermediate[44u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[41u]; ++ v_in3 = v_intermediate[43u]; ++ v_in5 = v_intermediate[45u]; ++ v_in7 = v_intermediate[47u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ if (0u == (v_intermediate[49u] | ++ v_intermediate[50u] | ++ v_intermediate[51u] | ++ v_intermediate[52u] | ++ v_intermediate[53u] | ++ v_intermediate[54u] | ++ v_intermediate[55u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[48u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[50u]; ++ v_in6 = v_intermediate[54u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[48u]; ++ v_in4 = v_intermediate[52u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[49u]; ++ v_in3 = v_intermediate[51u]; ++ v_in5 = v_intermediate[53u]; ++ v_in7 = v_intermediate[55u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- +- return wuffs_base__utility__empty_range_ii_u64(); ++ if (0u == (v_intermediate[57u] | ++ v_intermediate[58u] | ++ v_intermediate[59u] | ++ v_intermediate[60u] | ++ v_intermediate[61u] | ++ v_intermediate[62u] | ++ v_intermediate[63u])) { ++ if (8u > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[56u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ } else { ++ v_in2 = v_intermediate[58u]; ++ v_in6 = v_intermediate[62u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[56u]; ++ v_in4 = v_intermediate[60u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[57u]; ++ v_in3 = v_intermediate[59u]; ++ v_in5 = v_intermediate[61u]; ++ v_in7 = v_intermediate[63u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (8u > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ } ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func json.decoder.decode_tokens ++// ‼ WUFFS MULTI-FILE SECTION +x86_avx2 ++// -------- func jpeg.decoder.decode_idct_x86_avx2 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_json__decoder__decode_tokens( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_vminor = 0; +- uint32_t v_number_length = 0; +- uint32_t v_number_status = 0; +- uint32_t v_string_length = 0; +- uint32_t v_whitespace_length = 0; +- uint32_t v_depth = 0; +- uint32_t v_stack_byte = 0; +- uint32_t v_stack_bit = 0; +- uint32_t v_match = 0; +- uint32_t v_c4 = 0; +- uint8_t v_c = 0; +- uint8_t v_backslash = 0; +- uint8_t v_char = 0; +- uint8_t v_class = 0; +- uint32_t v_multi_byte_utf8 = 0; +- uint8_t v_backslash_x_ok = 0; +- uint8_t v_backslash_x_value = 0; +- uint32_t v_backslash_x_string = 0; +- uint8_t v_uni4_ok = 0; +- uint64_t v_uni4_string = 0; +- uint32_t v_uni4_value = 0; +- uint32_t v_uni4_high_surrogate = 0; +- uint8_t v_uni8_ok = 0; +- uint64_t v_uni8_string = 0; +- uint32_t v_uni8_value = 0; +- uint32_t v_expect = 0; +- uint32_t v_expect_after_value = 0; +- +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__decode_idct_x86_avx2( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, ++ uint32_t a_q) { ++ __m256i v_k_0000 = {0}; ++ __m256i v_k_8080 = {0}; ++ __m256i v_k_0000_0002 = {0}; ++ __m256i v_k_0001_FFFF = {0}; ++ __m256i v_k_0400_0000 = {0}; ++ __m256i v_k_29CF_1151_D630_1151 = {0}; ++ __m256i v_k_E333_133E_ADFD_1051 = {0}; ++ __m256i v_k_E6DC_25A1_1925_25A1 = {0}; ++ __m256i v_k_ECC1_E333_EFB0_ADFD = {0}; ++ __m128i v_az_coeffs = {0}; ++ __m256i v_az_ah00 = {0}; ++ __m256i v_az_ad00 = {0}; ++ __m256i v_az_eh00 = {0}; ++ __m256i v_az_adeh = {0}; ++ __m256i v_rows01 = {0}; ++ __m256i v_rows23 = {0}; ++ __m256i v_rows45 = {0}; ++ __m256i v_rows67 = {0}; ++ __m256i v_quants01 = {0}; ++ __m256i v_quants23 = {0}; ++ __m256i v_quants45 = {0}; ++ __m256i v_quants67 = {0}; ++ __m256i v_rows04 = {0}; ++ __m256i v_rows31 = {0}; ++ __m256i v_rows26 = {0}; ++ __m256i v_rows75 = {0}; ++ __m256i v_fp_rows62 = {0}; ++ __m256i v_fp_bq2662ad = {0}; ++ __m256i v_fp_bq2662eh = {0}; ++ __m256i v_fp_cb26ad = {0}; ++ __m256i v_fp_cb26eh = {0}; ++ __m256i v_fp_rows40pos = {0}; ++ __m256i v_fp_rows04neg = {0}; ++ __m256i v_fp_rows0pm4 = {0}; ++ __m256i v_fp_ccpmad = {0}; ++ __m256i v_fp_ccpmeh = {0}; ++ __m256i v_fp_cd01ad = {0}; ++ __m256i v_fp_cd01eh = {0}; ++ __m256i v_fp_cd32ad = {0}; ++ __m256i v_fp_cd32eh = {0}; ++ __m256i v_fp_sums7351 = {0}; ++ __m256i v_fp_sums5173 = {0}; ++ __m256i v_fp_ci73515173ad = {0}; ++ __m256i v_fp_ci73515173eh = {0}; ++ __m256i v_fp_cl7351ad = {0}; ++ __m256i v_fp_cl7351eh = {0}; ++ __m256i v_fp_rows13 = {0}; ++ __m256i v_fp_bq7153ad = {0}; ++ __m256i v_fp_bq7153eh = {0}; ++ __m256i v_fp_ck75ad = {0}; ++ __m256i v_fp_ck75eh = {0}; ++ __m256i v_fp_cl5173ad = {0}; ++ __m256i v_fp_cl5173eh = {0}; ++ __m256i v_fp_ck13ad = {0}; ++ __m256i v_fp_ck13eh = {0}; ++ __m256i v_intermediate01ad = {0}; ++ __m256i v_intermediate01eh = {0}; ++ __m256i v_intermediate01 = {0}; ++ __m256i v_intermediate32ad = {0}; ++ __m256i v_intermediate32eh = {0}; ++ __m256i v_intermediate32 = {0}; ++ __m256i v_intermediate45ad = {0}; ++ __m256i v_intermediate45eh = {0}; ++ __m256i v_intermediate45 = {0}; ++ __m256i v_intermediate76ad = {0}; ++ __m256i v_intermediate76eh = {0}; ++ __m256i v_intermediate76 = {0}; ++ __m256i v_ita0a1e0e1 = {0}; ++ __m256i v_ita2a3e2e3 = {0}; ++ __m256i v_ita4a5e4e5 = {0}; ++ __m256i v_ita6a7e6e7 = {0}; ++ __m256i v_ita0c0e0g0 = {0}; ++ __m256i v_ita1c1e1g1 = {0}; ++ __m256i v_ita4c4e4g4 = {0}; ++ __m256i v_ita5c5e5g5 = {0}; ++ __m256i v_ita0b0e0f0 = {0}; ++ __m256i v_ita4b4e4f4 = {0}; ++ __m256i v_itc0d0g0h0 = {0}; ++ __m256i v_itc4d4g4h4 = {0}; ++ __m256i v_intermediateae = {0}; ++ __m256i v_intermediatebf = {0}; ++ __m256i v_intermediatecg = {0}; ++ __m256i v_intermediatedh = {0}; ++ __m256i v_intermediatedb = {0}; ++ __m256i v_intermediatehf = {0}; ++ __m256i v_sp_cols62 = {0}; ++ __m256i v_sp_bq2662ad = {0}; ++ __m256i v_sp_bq2662eh = {0}; ++ __m256i v_sp_rb26ad = {0}; ++ __m256i v_sp_rb26eh = {0}; ++ __m256i v_sp_cols40pos = {0}; ++ __m256i v_sp_cols04neg = {0}; ++ __m256i v_sp_cols0pm4 = {0}; ++ __m256i v_sp_rcpmad = {0}; ++ __m256i v_sp_rcpmeh = {0}; ++ __m256i v_sp_rd01ad = {0}; ++ __m256i v_sp_rd01eh = {0}; ++ __m256i v_sp_rd32ad = {0}; ++ __m256i v_sp_rd32eh = {0}; ++ __m256i v_sp_sums7351 = {0}; ++ __m256i v_sp_sums5173 = {0}; ++ __m256i v_sp_ri73515173ad = {0}; ++ __m256i v_sp_ri73515173eh = {0}; ++ __m256i v_sp_rl7351ad = {0}; ++ __m256i v_sp_rl7351eh = {0}; ++ __m256i v_sp_cols13 = {0}; ++ __m256i v_sp_bq7153ad = {0}; ++ __m256i v_sp_bq7153eh = {0}; ++ __m256i v_sp_rk75ad = {0}; ++ __m256i v_sp_rk75eh = {0}; ++ __m256i v_sp_rl5173ad = {0}; ++ __m256i v_sp_rl5173eh = {0}; ++ __m256i v_sp_rk13ad = {0}; ++ __m256i v_sp_rk13eh = {0}; ++ __m256i v_final01ad = {0}; ++ __m256i v_final01eh = {0}; ++ __m256i v_final01 = {0}; ++ __m256i v_final32ad = {0}; ++ __m256i v_final32eh = {0}; ++ __m256i v_final32 = {0}; ++ __m256i v_final45ad = {0}; ++ __m256i v_final45eh = {0}; ++ __m256i v_final45 = {0}; ++ __m256i v_final76ad = {0}; ++ __m256i v_final76eh = {0}; ++ __m256i v_final76 = {0}; ++ __m256i v_fta0a1e0e1 = {0}; ++ __m256i v_fta2a3e2e3 = {0}; ++ __m256i v_fta4a5e4e5 = {0}; ++ __m256i v_fta6a7e6e7 = {0}; ++ __m256i v_fta0c0e0g0 = {0}; ++ __m256i v_fta1c1e1g1 = {0}; ++ __m256i v_fta4c4e4g4 = {0}; ++ __m256i v_fta5c5e5g5 = {0}; ++ __m256i v_fta0b0e0f0 = {0}; ++ __m256i v_ftc0d0g0h0 = {0}; ++ __m256i v_fta4b4e4f4 = {0}; ++ __m256i v_ftc4d4g4h4 = {0}; ++ __m256i v_finalae = {0}; ++ __m256i v_finalbf = {0}; ++ __m256i v_finalcg = {0}; ++ __m256i v_finaldh = {0}; ++ __m256i v_final0145 = {0}; ++ __m256i v_final2367 = {0}; ++ uint64_t v_final0 = 0; ++ uint64_t v_final1 = 0; ++ uint64_t v_final2 = 0; ++ uint64_t v_final3 = 0; ++ uint64_t v_final4 = 0; ++ uint64_t v_final5 = 0; ++ uint64_t v_final6 = 0; ++ uint64_t v_final7 = 0; ++ wuffs_base__slice_u8 v_remaining = {0}; + +- uint32_t coro_susp_point = self->private_impl.p_decode_tokens[0]; +- if (coro_susp_point) { +- v_depth = self->private_data.s_decode_tokens[0].v_depth; +- v_expect = self->private_data.s_decode_tokens[0].v_expect; +- v_expect_after_value = self->private_data.s_decode_tokens[0].v_expect_after_value; ++ if (8u > a_dst_stride) { ++ return wuffs_base__make_empty_struct(); + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if (self->private_impl.f_end_of_data) { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- if (self->private_impl.f_quirks[18u]) { +- if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u] || self->private_impl.f_quirks[17u]) { +- status = wuffs_base__make_status(wuffs_json__error__bad_quirk_combination); +- goto exit; ++ v_k_0000 = _mm256_set_epi16((int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u)); ++ v_k_8080 = _mm256_set_epi16((int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u)); ++ v_k_0000_0002 = _mm256_set_epi16((int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u)); ++ v_k_0001_FFFF = _mm256_set_epi16((int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u)); ++ v_k_0400_0000 = _mm256_set_epi16((int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u)); ++ v_k_29CF_1151_D630_1151 = _mm256_set_epi16((int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u)); ++ v_k_E333_133E_ADFD_1051 = _mm256_set_epi16((int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u)); ++ v_k_E6DC_25A1_1925_25A1 = _mm256_set_epi16((int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u)); ++ v_k_ECC1_E333_EFB0_ADFD = _mm256_set_epi16((int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u)); ++ do { ++ if (0u == (wuffs_base__peek_u64le__no_bounds_check((const uint8_t*)(const void*)(self->private_data.f_mcu_blocks[0u] + 8u)) | wuffs_base__peek_u64le__no_bounds_check((const uint8_t*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u)))) { ++ v_az_coeffs = _mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 8u)), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 24u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 32u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 40u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 48u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 56u))); ++ if (0u == ((uint64_t)(_mm_cvtsi128_si64(_mm_packs_epi16(v_az_coeffs, v_az_coeffs))))) { ++ v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u)); ++ v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u)); ++ v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01); ++ v_az_ah00 = _mm256_slli_epi16(v_rows01, (int32_t)(2u)); ++ v_az_ad00 = _mm256_unpacklo_epi16(v_az_ah00, v_az_ah00); ++ v_az_eh00 = _mm256_unpackhi_epi16(v_az_ah00, v_az_ah00); ++ v_az_adeh = _mm256_inserti128_si256(v_az_ad00, _mm256_castsi256_si128(v_az_eh00), (int32_t)(1u)); ++ v_intermediateae = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(0u)); ++ v_intermediatebf = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(85u)); ++ v_intermediatecg = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(170u)); ++ v_intermediatedh = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(255u)); ++ break; + } + } +- if (self->private_impl.f_quirks[15u] || self->private_impl.f_quirks[16u]) { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_json__decoder__decode_leading(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } ++ v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u)); ++ v_rows23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u)); ++ v_rows45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 32u)); ++ v_rows67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 48u)); ++ v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u)); ++ v_quants23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 16u)); ++ v_quants45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 32u)); ++ v_quants67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 48u)); ++ v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01); ++ v_rows23 = _mm256_mullo_epi16(v_rows23, v_quants23); ++ v_rows45 = _mm256_mullo_epi16(v_rows45, v_quants45); ++ v_rows67 = _mm256_mullo_epi16(v_rows67, v_quants67); ++ v_rows04 = _mm256_permute2x128_si256(v_rows01, v_rows45, (int32_t)(32u)); ++ v_rows31 = _mm256_permute2x128_si256(v_rows23, v_rows01, (int32_t)(49u)); ++ v_rows26 = _mm256_permute2x128_si256(v_rows23, v_rows67, (int32_t)(32u)); ++ v_rows75 = _mm256_permute2x128_si256(v_rows67, v_rows45, (int32_t)(49u)); ++ v_fp_rows62 = _mm256_permute2x128_si256(v_rows26, v_rows26, (int32_t)(1u)); ++ v_fp_bq2662ad = _mm256_unpacklo_epi16(v_rows26, v_fp_rows62); ++ v_fp_bq2662eh = _mm256_unpackhi_epi16(v_rows26, v_fp_rows62); ++ v_fp_cb26ad = _mm256_madd_epi16(v_fp_bq2662ad, v_k_29CF_1151_D630_1151); ++ v_fp_cb26eh = _mm256_madd_epi16(v_fp_bq2662eh, v_k_29CF_1151_D630_1151); ++ v_fp_rows40pos = _mm256_permute2x128_si256(v_rows04, v_rows04, (int32_t)(1u)); ++ v_fp_rows04neg = _mm256_sign_epi16(v_rows04, v_k_0001_FFFF); ++ v_fp_rows0pm4 = _mm256_add_epi16(v_fp_rows40pos, v_fp_rows04neg); ++ v_fp_ccpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u)); ++ v_fp_ccpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u)); ++ v_fp_cd01ad = _mm256_add_epi32(v_fp_ccpmad, v_fp_cb26ad); ++ v_fp_cd01eh = _mm256_add_epi32(v_fp_ccpmeh, v_fp_cb26eh); ++ v_fp_cd32ad = _mm256_sub_epi32(v_fp_ccpmad, v_fp_cb26ad); ++ v_fp_cd32eh = _mm256_sub_epi32(v_fp_ccpmeh, v_fp_cb26eh); ++ v_fp_sums7351 = _mm256_add_epi16(v_rows75, v_rows31); ++ v_fp_sums5173 = _mm256_permute2x128_si256(v_fp_sums7351, v_fp_sums7351, (int32_t)(1u)); ++ v_fp_ci73515173ad = _mm256_unpacklo_epi16(v_fp_sums7351, v_fp_sums5173); ++ v_fp_ci73515173eh = _mm256_unpackhi_epi16(v_fp_sums7351, v_fp_sums5173); ++ v_fp_cl7351ad = _mm256_madd_epi16(v_fp_ci73515173ad, v_k_E6DC_25A1_1925_25A1); ++ v_fp_cl7351eh = _mm256_madd_epi16(v_fp_ci73515173eh, v_k_E6DC_25A1_1925_25A1); ++ v_fp_rows13 = _mm256_permute2x128_si256(v_rows31, v_rows31, (int32_t)(1u)); ++ v_fp_bq7153ad = _mm256_unpacklo_epi16(v_rows75, v_fp_rows13); ++ v_fp_bq7153eh = _mm256_unpackhi_epi16(v_rows75, v_fp_rows13); ++ v_fp_ck75ad = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351ad); ++ v_fp_ck75eh = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351eh); ++ v_fp_cl5173ad = _mm256_permute2x128_si256(v_fp_cl7351ad, v_fp_cl7351ad, (int32_t)(1u)); ++ v_fp_cl5173eh = _mm256_permute2x128_si256(v_fp_cl7351eh, v_fp_cl7351eh, (int32_t)(1u)); ++ v_fp_ck13ad = _mm256_add_epi32(v_fp_cl5173ad, _mm256_madd_epi16(v_fp_bq7153ad, v_k_E333_133E_ADFD_1051)); ++ v_fp_ck13eh = _mm256_add_epi32(v_fp_cl5173eh, _mm256_madd_epi16(v_fp_bq7153eh, v_k_E333_133E_ADFD_1051)); ++ v_intermediate01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate01 = _mm256_packs_epi32(v_intermediate01ad, v_intermediate01eh); ++ v_intermediate32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate32 = _mm256_packs_epi32(v_intermediate32ad, v_intermediate32eh); ++ v_intermediate45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate45 = _mm256_packs_epi32(v_intermediate45ad, v_intermediate45eh); ++ v_intermediate76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate76 = _mm256_packs_epi32(v_intermediate76ad, v_intermediate76eh); ++ v_ita0a1e0e1 = _mm256_permute4x64_epi64(v_intermediate01, (int32_t)(216u)); ++ v_ita2a3e2e3 = _mm256_permute4x64_epi64(v_intermediate32, (int32_t)(114u)); ++ v_ita4a5e4e5 = _mm256_permute4x64_epi64(v_intermediate45, (int32_t)(216u)); ++ v_ita6a7e6e7 = _mm256_permute4x64_epi64(v_intermediate76, (int32_t)(114u)); ++ v_ita0c0e0g0 = _mm256_unpacklo_epi16(v_ita0a1e0e1, v_ita2a3e2e3); ++ v_ita1c1e1g1 = _mm256_unpackhi_epi16(v_ita0a1e0e1, v_ita2a3e2e3); ++ v_ita4c4e4g4 = _mm256_unpacklo_epi16(v_ita4a5e4e5, v_ita6a7e6e7); ++ v_ita5c5e5g5 = _mm256_unpackhi_epi16(v_ita4a5e4e5, v_ita6a7e6e7); ++ v_ita0b0e0f0 = _mm256_unpacklo_epi16(v_ita0c0e0g0, v_ita1c1e1g1); ++ v_itc0d0g0h0 = _mm256_unpackhi_epi16(v_ita0c0e0g0, v_ita1c1e1g1); ++ v_ita4b4e4f4 = _mm256_unpacklo_epi16(v_ita4c4e4g4, v_ita5c5e5g5); ++ v_itc4d4g4h4 = _mm256_unpackhi_epi16(v_ita4c4e4g4, v_ita5c5e5g5); ++ v_intermediateae = _mm256_unpacklo_epi64(v_ita0b0e0f0, v_ita4b4e4f4); ++ v_intermediatebf = _mm256_unpackhi_epi64(v_ita0b0e0f0, v_ita4b4e4f4); ++ v_intermediatecg = _mm256_unpacklo_epi64(v_itc0d0g0h0, v_itc4d4g4h4); ++ v_intermediatedh = _mm256_unpackhi_epi64(v_itc0d0g0h0, v_itc4d4g4h4); ++ } while (0); ++ v_intermediatedb = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(32u)); ++ v_intermediatehf = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(49u)); ++ v_sp_cols62 = _mm256_permute2x128_si256(v_intermediatecg, v_intermediatecg, (int32_t)(1u)); ++ v_sp_bq2662ad = _mm256_unpacklo_epi16(v_intermediatecg, v_sp_cols62); ++ v_sp_bq2662eh = _mm256_unpackhi_epi16(v_intermediatecg, v_sp_cols62); ++ v_sp_rb26ad = _mm256_madd_epi16(v_sp_bq2662ad, v_k_29CF_1151_D630_1151); ++ v_sp_rb26eh = _mm256_madd_epi16(v_sp_bq2662eh, v_k_29CF_1151_D630_1151); ++ v_sp_cols40pos = _mm256_permute2x128_si256(v_intermediateae, v_intermediateae, (int32_t)(1u)); ++ v_sp_cols04neg = _mm256_sign_epi16(v_intermediateae, v_k_0001_FFFF); ++ v_sp_cols0pm4 = _mm256_add_epi16(v_sp_cols40pos, v_sp_cols04neg); ++ v_sp_rcpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u)); ++ v_sp_rcpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u)); ++ v_sp_rd01ad = _mm256_add_epi32(v_sp_rcpmad, v_sp_rb26ad); ++ v_sp_rd01eh = _mm256_add_epi32(v_sp_rcpmeh, v_sp_rb26eh); ++ v_sp_rd32ad = _mm256_sub_epi32(v_sp_rcpmad, v_sp_rb26ad); ++ v_sp_rd32eh = _mm256_sub_epi32(v_sp_rcpmeh, v_sp_rb26eh); ++ v_sp_sums7351 = _mm256_add_epi16(v_intermediatehf, v_intermediatedb); ++ v_sp_sums5173 = _mm256_permute2x128_si256(v_sp_sums7351, v_sp_sums7351, (int32_t)(1u)); ++ v_sp_ri73515173ad = _mm256_unpacklo_epi16(v_sp_sums7351, v_sp_sums5173); ++ v_sp_ri73515173eh = _mm256_unpackhi_epi16(v_sp_sums7351, v_sp_sums5173); ++ v_sp_rl7351ad = _mm256_madd_epi16(v_sp_ri73515173ad, v_k_E6DC_25A1_1925_25A1); ++ v_sp_rl7351eh = _mm256_madd_epi16(v_sp_ri73515173eh, v_k_E6DC_25A1_1925_25A1); ++ v_sp_cols13 = _mm256_permute2x128_si256(v_intermediatedb, v_intermediatedb, (int32_t)(1u)); ++ v_sp_bq7153ad = _mm256_unpacklo_epi16(v_intermediatehf, v_sp_cols13); ++ v_sp_bq7153eh = _mm256_unpackhi_epi16(v_intermediatehf, v_sp_cols13); ++ v_sp_rk75ad = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351ad); ++ v_sp_rk75eh = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351eh); ++ v_sp_rl5173ad = _mm256_permute2x128_si256(v_sp_rl7351ad, v_sp_rl7351ad, (int32_t)(1u)); ++ v_sp_rl5173eh = _mm256_permute2x128_si256(v_sp_rl7351eh, v_sp_rl7351eh, (int32_t)(1u)); ++ v_sp_rk13ad = _mm256_add_epi32(v_sp_rl5173ad, _mm256_madd_epi16(v_sp_bq7153ad, v_k_E333_133E_ADFD_1051)); ++ v_sp_rk13eh = _mm256_add_epi32(v_sp_rl5173eh, _mm256_madd_epi16(v_sp_bq7153eh, v_k_E333_133E_ADFD_1051)); ++ v_final01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u)); ++ v_final01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u)); ++ v_final01 = _mm256_packs_epi32(v_final01ad, v_final01eh); ++ v_final32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u)); ++ v_final32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u)); ++ v_final32 = _mm256_packs_epi32(v_final32ad, v_final32eh); ++ v_final45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u)); ++ v_final45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u)); ++ v_final45 = _mm256_packs_epi32(v_final45ad, v_final45eh); ++ v_final76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u)); ++ v_final76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u)); ++ v_final76 = _mm256_packs_epi32(v_final76ad, v_final76eh); ++ v_fta0a1e0e1 = _mm256_permute4x64_epi64(v_final01, (int32_t)(216u)); ++ v_fta2a3e2e3 = _mm256_permute4x64_epi64(v_final32, (int32_t)(114u)); ++ v_fta4a5e4e5 = _mm256_permute4x64_epi64(v_final45, (int32_t)(216u)); ++ v_fta6a7e6e7 = _mm256_permute4x64_epi64(v_final76, (int32_t)(114u)); ++ v_fta0c0e0g0 = _mm256_unpacklo_epi16(v_fta0a1e0e1, v_fta2a3e2e3); ++ v_fta1c1e1g1 = _mm256_unpackhi_epi16(v_fta0a1e0e1, v_fta2a3e2e3); ++ v_fta4c4e4g4 = _mm256_unpacklo_epi16(v_fta4a5e4e5, v_fta6a7e6e7); ++ v_fta5c5e5g5 = _mm256_unpackhi_epi16(v_fta4a5e4e5, v_fta6a7e6e7); ++ v_fta0b0e0f0 = _mm256_unpacklo_epi16(v_fta0c0e0g0, v_fta1c1e1g1); ++ v_ftc0d0g0h0 = _mm256_unpackhi_epi16(v_fta0c0e0g0, v_fta1c1e1g1); ++ v_fta4b4e4f4 = _mm256_unpacklo_epi16(v_fta4c4e4g4, v_fta5c5e5g5); ++ v_ftc4d4g4h4 = _mm256_unpackhi_epi16(v_fta4c4e4g4, v_fta5c5e5g5); ++ v_finalae = _mm256_unpacklo_epi64(v_fta0b0e0f0, v_fta4b4e4f4); ++ v_finalbf = _mm256_unpackhi_epi64(v_fta0b0e0f0, v_fta4b4e4f4); ++ v_finalcg = _mm256_unpacklo_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4); ++ v_finaldh = _mm256_unpackhi_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4); ++ v_final0145 = _mm256_add_epi8(_mm256_packs_epi16(v_finalae, v_finalbf), v_k_8080); ++ v_final2367 = _mm256_add_epi8(_mm256_packs_epi16(v_finalcg, v_finaldh), v_k_8080); ++ v_final0 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(0u)))); ++ v_final1 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(1u)))); ++ v_final2 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(0u)))); ++ v_final3 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(1u)))); ++ v_final4 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(2u)))); ++ v_final5 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(3u)))); ++ v_final6 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(2u)))); ++ v_final7 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(3u)))); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final0); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final1); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final2); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final3); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final4); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final5); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final6); ++ a_dst_buffer = v_remaining; ++ if (8u > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final7); ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++// ‼ WUFFS MULTI-FILE SECTION -x86_avx2 ++ ++// -------- func jpeg.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_jpeg__decoder__get_quirk( ++ const wuffs_jpeg__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (a_key == 2u) { ++ if (self->private_impl.f_use_lower_quality) { ++ return 18446744073709551615u; ++ } ++ } else if (a_key == 1220532224u) { ++ if (self->private_impl.f_reject_progressive_jpegs) { ++ return 1u; ++ } ++ } ++ return 0u; ++} ++ ++// -------- func jpeg.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__set_quirk( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (a_key == 2u) { ++ self->private_impl.f_use_lower_quality = (a_value >= 9223372036854775808u); ++ return wuffs_base__make_status(NULL); ++ } else if (a_key == 1220532224u) { ++ self->private_impl.f_reject_progressive_jpegs = (a_value != 0u); ++ return wuffs_base__make_status(NULL); ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func jpeg.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__decode_image_config( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func jpeg.decoder.do_decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__do_decode_image_config( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint8_t v_marker = 0; ++ uint32_t v_pixfmt = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ if (coro_susp_point) { ++ v_marker = self->private_data.s_do_decode_image_config.v_marker; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 255u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (v_c8 != 216u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_header); ++ goto exit; + } +- v_expect = 7858u; +- label__outer__continue:; + while (true) { + while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- goto label__outer__continue; +- } +- v_whitespace_length = 0u; +- v_c = 0u; +- v_class = 0u; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (v_whitespace_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_whitespace_length = 0u; +- } +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- goto label__outer__continue; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- v_class = WUFFS_JSON__LUT_CLASSES[v_c]; +- if (v_class != 0u) { +- break; +- } +- iop_a_src += 1u; +- if (v_whitespace_length >= 65534u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(65535u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_whitespace_length = 0u; +- goto label__outer__continue; ++ goto suspend; + } +- v_whitespace_length += 1u; ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; + } +- if (v_whitespace_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_whitespace_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__outer__continue; ++ if (v_c8 == 255u) { ++ break; ++ } ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; + } +- if (0u == (v_expect & (((uint32_t)(1u)) << v_class))) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; ++ if (v_c8 != 255u) { ++ v_marker = v_c8; ++ break; + } +- if (v_class == 1u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- label__string_loop_outer__continue:; +- while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- continue; +- } +- v_string_length = 0u; ++ } ++ if (v_marker == 0u) { ++ continue; ++ } else if ((208u <= v_marker) && (v_marker <= 217u)) { ++ if (v_marker <= 215u) { ++ continue; ++ } ++ } else { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- } +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- goto label__string_loop_outer__continue; ++ goto suspend; + } +- while (((uint64_t)(io2_a_src - iop_a_src)) > 4u) { +- v_c4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- if (0u != (WUFFS_JSON__LUT_CHARS[(255u & (v_c4 >> 0u))] | +- WUFFS_JSON__LUT_CHARS[(255u & (v_c4 >> 8u))] | +- WUFFS_JSON__LUT_CHARS[(255u & (v_c4 >> 16u))] | +- WUFFS_JSON__LUT_CHARS[(255u & (v_c4 >> 24u))])) { +- break; +- } +- iop_a_src += 4u; +- if (v_string_length > 65527u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- goto label__string_loop_outer__continue; +- } +- v_string_length += 4u; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ if (num_bits_4 == 8) { ++ t_4 = ((uint32_t)(*scratch >> 48)); ++ break; + } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- v_char = WUFFS_JSON__LUT_CHARS[v_c]; +- if (v_char == 0u) { +- iop_a_src += 1u; +- if (v_string_length >= 65531u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(65532u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- goto label__string_loop_outer__continue; +- } +- v_string_length += 1u; +- continue; +- } else if (v_char == 1u) { +- if (v_string_length != 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- } +- goto label__string_loop_outer__break; +- } else if (v_char == 2u) { +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__string_loop_outer__continue; +- } +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- goto label__string_loop_outer__continue; +- } +- v_c = ((uint8_t)((wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u))); +- v_backslash = WUFFS_JSON__LUT_BACKSLASHES[v_c]; +- if ((v_backslash & 128u) != 0u) { +- iop_a_src += 2u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | ((uint32_t)((v_backslash & 127u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } else if (v_backslash != 0u) { +- if (self->private_impl.f_quirks[WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[(v_backslash & 7u)]]) { +- iop_a_src += 2u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | ((uint32_t)(WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[(v_backslash & 7u)]))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- } else if (v_c == 117u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); +- goto label__string_loop_outer__continue; +- } +- v_uni4_string = (((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))) >> 16u); +- v_uni4_value = 0u; +- v_uni4_ok = 128u; +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 12u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 8u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 4u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 0u); +- if (v_uni4_ok == 0u) { +- } else if ((v_uni4_value < 55296u) || (57343u < v_uni4_value)) { +- iop_a_src += 6u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } else if (v_uni4_value >= 56320u) { +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 12u) { +- if (a_src && a_src->meta.closed) { +- if (self->private_impl.f_quirks[20u]) { +- iop_a_src += 6u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- goto label__string_loop_outer__continue; +- } +- v_uni4_string = (wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 4u) >> 16u); +- if (((255u & (v_uni4_string >> 0u)) != 92u) || ((255u & (v_uni4_string >> 8u)) != 117u)) { +- v_uni4_high_surrogate = 0u; +- v_uni4_value = 0u; +- v_uni4_ok = 0u; +- } else { +- v_uni4_high_surrogate = (65536u + ((v_uni4_value - 55296u) << 10u)); +- v_uni4_value = 0u; +- v_uni4_ok = 128u; +- v_uni4_string >>= 16u; +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 12u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 8u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 4u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 0u); +- } +- if ((v_uni4_ok != 0u) && (56320u <= v_uni4_value) && (v_uni4_value <= 57343u)) { +- v_uni4_value -= 56320u; +- iop_a_src += 12u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | v_uni4_high_surrogate | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(12u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- } +- if (self->private_impl.f_quirks[20u]) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) { +- status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- iop_a_src += 6u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- } else if ((v_c == 85u) && self->private_impl.f_quirks[2u]) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 10u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); +- goto label__string_loop_outer__continue; +- } +- v_uni8_string = wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 2u); +- v_uni8_value = 0u; +- v_uni8_ok = 128u; +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 0u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 28u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 8u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 24u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 16u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 20u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 24u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 16u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 32u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 12u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 40u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 8u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 48u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 4u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 56u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 0u); +- if (v_uni8_ok == 0u) { +- } else if ((v_uni8_value < 55296u) || ((57343u < v_uni8_value) && (v_uni8_value <= 1114111u))) { +- iop_a_src += 10u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | (v_uni8_value & 2097151u)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } else if (self->private_impl.f_quirks[20u]) { +- iop_a_src += 10u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- } else if ((v_c == 120u) && self->private_impl.f_quirks[9u]) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); +- goto label__string_loop_outer__continue; +- } +- v_backslash_x_string = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- v_backslash_x_ok = 128u; +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 16u))]; +- v_backslash_x_ok &= v_c; +- v_backslash_x_value = ((uint8_t)(((v_c & 15u) << 4u))); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 24u))]; +- v_backslash_x_ok &= v_c; +- v_backslash_x_value = ((uint8_t)((v_backslash_x_value | (v_c & 15u)))); +- if ((v_backslash_x_ok == 0u) || ((v_backslash_x_string & 65535u) != 30812u)) { +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- iop_a_src += 4u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | ((uint32_t)(v_backslash_x_value))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } else if (v_char == 3u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__string_loop_outer__continue; +- } +- } +- if (a_src && a_src->meta.closed) { +- if (self->private_impl.f_quirks[20u]) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); +- goto label__string_loop_outer__continue; +- } +- v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- if ((v_multi_byte_utf8 & 49152u) == 32768u) { +- v_multi_byte_utf8 = ((1984u & ((uint32_t)(v_multi_byte_utf8 << 6u))) | (63u & (v_multi_byte_utf8 >> 8u))); +- iop_a_src += 2u; +- if (v_string_length >= 65528u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_string_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- goto label__string_loop_outer__continue; +- } +- v_string_length += 2u; +- continue; +- } +- } else if (v_char == 4u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__string_loop_outer__continue; +- } +- } +- if (a_src && a_src->meta.closed) { +- if (self->private_impl.f_quirks[20u]) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12); +- goto label__string_loop_outer__continue; +- } +- v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); +- if ((v_multi_byte_utf8 & 12632064u) == 8421376u) { +- v_multi_byte_utf8 = ((61440u & ((uint32_t)(v_multi_byte_utf8 << 12u))) | (4032u & (v_multi_byte_utf8 >> 2u)) | (63u & (v_multi_byte_utf8 >> 16u))); +- if ((2047u < v_multi_byte_utf8) && ((v_multi_byte_utf8 < 55296u) || (57343u < v_multi_byte_utf8))) { +- iop_a_src += 3u; +- if (v_string_length >= 65528u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_string_length + 3u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- goto label__string_loop_outer__continue; +- } +- v_string_length += 3u; +- continue; +- } +- } +- } else if (v_char == 5u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__string_loop_outer__continue; +- } +- } +- if (a_src && a_src->meta.closed) { +- if (self->private_impl.f_quirks[20u]) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(13); +- goto label__string_loop_outer__continue; +- } +- v_multi_byte_utf8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- if ((v_multi_byte_utf8 & 3233857536u) == 2155905024u) { +- v_multi_byte_utf8 = ((1835008u & ((uint32_t)(v_multi_byte_utf8 << 18u))) | +- (258048u & ((uint32_t)(v_multi_byte_utf8 << 4u))) | +- (4032u & (v_multi_byte_utf8 >> 10u)) | +- (63u & (v_multi_byte_utf8 >> 24u))); +- if ((65535u < v_multi_byte_utf8) && (v_multi_byte_utf8 <= 1114111u)) { +- iop_a_src += 4u; +- if (v_string_length >= 65528u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- goto label__string_loop_outer__continue; +- } +- v_string_length += 4u; +- continue; +- } +- } +- } +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__string_loop_outer__continue; +- } +- } +- if ((v_char & 128u) != 0u) { +- if (self->private_impl.f_quirks[0u]) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | ((uint32_t)((v_char & 127u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- goto label__string_loop_outer__continue; +- } +- if (v_char == 138u) { +- status = wuffs_base__make_status(wuffs_json__error__bad_new_line_in_a_string); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_c0_control_code); +- goto exit; +- } +- if (self->private_impl.f_quirks[20u]) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); +- goto exit; ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)); + } + } +- label__string_loop_outer__break:; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(14); +- continue; +- } +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(15); +- continue; +- } +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- break; ++ self->private_impl.f_payload_length = t_4; ++ } ++ if (self->private_impl.f_payload_length < 2u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= 2u; ++ } ++ if (v_marker < 192u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } else if (v_marker < 208u) { ++ if (v_marker <= 194u) { ++ if ((v_marker == 194u) && self->private_impl.f_reject_progressive_jpegs) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__rejected_progressive_jpeg); ++ goto exit; ++ } else if (self->private_impl.f_sof_marker != 0u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; + } +- if (0u == (v_expect & (((uint32_t)(1u)) << 4u))) { +- v_expect = 4104u; +- goto label__outer__continue; ++ self->private_impl.f_sof_marker = v_marker; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ status = wuffs_jpeg__decoder__decode_sof(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; + } + break; +- } else if (v_class == 2u) { +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (0u == (v_expect & (((uint32_t)(1u)) << 8u))) { +- if (self->private_impl.f_quirks[13u]) { +- v_expect = 4162u; +- } else { +- v_expect = 4098u; +- } +- } else { +- if (self->private_impl.f_quirks[13u]) { +- v_expect = 8114u; +- } else { +- v_expect = 7858u; +- } ++ } else if (v_marker == 195u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_lossless_coding); ++ goto exit; ++ } else if (v_marker == 196u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } else if ((197u <= v_marker) && (v_marker <= 199u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_hierarchical_coding); ++ goto exit; ++ } else if (v_marker == 200u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_arithmetic_coding); ++ goto exit; ++ } ++ } else if (v_marker < 224u) { ++ if (v_marker < 218u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); ++ goto exit; ++ } else if (v_marker == 218u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } else if (v_marker == 219u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- goto label__outer__continue; +- } else if (v_class == 3u) { +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 7858u; +- goto label__outer__continue; +- } else if (v_class == 4u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_jpeg__decoder__decode_dqt(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else if (v_marker == 221u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_jpeg__decoder__decode_dri(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } ++ } else if (v_marker < 240u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ status = wuffs_jpeg__decoder__decode_appn(self, a_src, v_marker); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else { ++ if (v_marker == 254u) { ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } ++ } ++ self->private_data.s_do_decode_image_config.scratch = self->private_impl.f_payload_length; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ self->private_impl.f_payload_length = 0u; ++ } ++ self->private_impl.choosy_decode_idct = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++ wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_jpeg__decoder__decode_idct_x86_avx2 : ++#endif ++ self->private_impl.choosy_decode_idct); ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ v_pixfmt = 536870920u; ++ if (self->private_impl.f_num_components > 1u) { ++ v_pixfmt = 2415954056u; ++ } ++ wuffs_base__image_config__set( ++ a_dst, ++ v_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ true); ++ } ++ self->private_impl.f_call_sequence = 32u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_image_config.v_marker = v_marker; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_dqt ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dqt( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint8_t v_q = 0; ++ uint32_t v_i = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_dqt; ++ if (coro_susp_point) { ++ v_q = self->private_data.s_decode_dqt.v_q; ++ v_i = self->private_data.s_decode_dqt.v_i; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (self->private_impl.f_payload_length > 0u) { ++ self->private_impl.f_payload_length -= 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (((uint8_t)(v_c8 & 15u)) > 3u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker); ++ goto exit; ++ } ++ v_q = ((uint8_t)(v_c8 & 15u)); ++ if (((uint8_t)(v_c8 >> 4u)) == 1u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision); ++ goto exit; ++ } else if ((((uint8_t)(v_c8 >> 4u)) > 1u) || (self->private_impl.f_payload_length < 64u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= 64u; ++ v_i = 0u; ++ while (v_i < 64u) { ++ v_i += 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint16_t t_1 = *iop_a_src++; ++ self->private_impl.f_quant_tables[v_q][WUFFS_JPEG__UNZIG[v_i]] = t_1; ++ } ++ } ++ self->private_impl.f_seen_dqt[v_q] = true; ++ if (self->private_impl.f_sof_marker == 0u) { ++ v_i = 0u; ++ while (v_i < 64u) { ++ self->private_impl.f_saved_quant_tables[v_q][v_i] = self->private_impl.f_quant_tables[v_q][v_i]; ++ v_i += 1u; ++ } ++ self->private_impl.f_saved_seen_dqt[v_q] = true; ++ } ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_dqt = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_dqt = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_dqt.v_q = v_q; ++ self->private_data.s_decode_dqt.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_dri ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dri( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_dri; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_payload_length != 2u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dri_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint16_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_dri.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_dri.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 8) { ++ t_0 = ((uint16_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ self->private_impl.f_restart_interval = t_0; ++ } ++ if (self->private_impl.f_sof_marker == 0u) { ++ self->private_impl.f_saved_restart_interval = self->private_impl.f_restart_interval; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_dri = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_dri = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_appn ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_appn( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint8_t a_marker) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_c32 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_appn; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ do { ++ if (a_marker == 224u) { ++ if (self->private_impl.f_payload_length >= 5u) { ++ self->private_impl.f_payload_length -= 5u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_appn.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_appn.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_c32 = t_0; ++ } ++ if (v_c32 != 1179207242u) { ++ self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 1u)); ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ self->private_impl.f_is_jfif = (v_c8 == 0u); ++ } ++ } else if (a_marker == 238u) { ++ if (self->private_impl.f_payload_length >= 12u) { ++ self->private_impl.f_payload_length -= 12u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_appn.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_appn.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ v_c32 = t_2; ++ } ++ if (v_c32 != 1651467329u) { ++ self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 8u)); ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_appn.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_appn.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ } ++ } ++ v_c32 = t_3; ++ } ++ if ((255u & v_c32) != 101u) { ++ self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 4u)); ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_appn.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_appn.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 24) { ++ t_4 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; ++ } ++ } ++ v_c32 = t_4; ++ } ++ if ((v_c32 >> 24u) == 0u) { ++ self->private_impl.f_is_adobe = 1u; ++ } else { ++ self->private_impl.f_is_adobe = 2u; ++ } ++ } ++ } ++ } while (0); ++ self->private_data.s_decode_appn.scratch = self->private_impl.f_payload_length; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (self->private_data.s_decode_appn.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_appn.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_appn.scratch; ++ self->private_impl.f_payload_length = 0u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_appn = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_appn = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_sof ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_sof( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint8_t v_comp_h = 0; ++ uint8_t v_comp_v = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ bool v_has_h24 = false; ++ bool v_has_h3 = false; ++ bool v_has_v24 = false; ++ bool v_has_v3 = false; ++ uint32_t v_upper_bound = 0; ++ uint64_t v_wh0 = 0; ++ uint64_t v_wh1 = 0; ++ uint64_t v_wh2 = 0; ++ uint64_t v_wh3 = 0; ++ uint64_t v_progressive = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_sof; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_decode_sof.v_i; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_payload_length < 6u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= 6u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 == 8u) { ++ } else if (v_c8 == 12u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_12_bits); ++ goto exit; ++ } else if (v_c8 == 16u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_16_bits); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_1 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_sof.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_sof.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 8) { ++ t_1 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); ++ } ++ } ++ self->private_impl.f_height = t_1; ++ } ++ if (self->private_impl.f_height == 0u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_implicit_height); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_sof.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_sof.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); ++ if (num_bits_2 == 8) { ++ t_2 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)); ++ } ++ } ++ self->private_impl.f_width = t_2; ++ } ++ if (self->private_impl.f_width == 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if ((v_c8 == 0u) || (v_c8 > 4u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } else if (v_c8 == 2u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_color_model); ++ goto exit; ++ } ++ self->private_impl.f_num_components = ((uint32_t)(v_c8)); ++ if (self->private_impl.f_payload_length != (3u * self->private_impl.f_num_components)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length = 0u; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_components) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ self->private_impl.f_components_c[v_i] = t_4; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ v_comp_h = ((uint8_t)(v_c8 >> 4u)); ++ v_comp_v = ((uint8_t)(v_c8 & 15u)); ++ if ((v_comp_h == 0u) || ++ (v_comp_h > 4u) || ++ (v_comp_v == 0u) || ++ (v_comp_v > 4u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } ++ self->private_impl.f_components_h[v_i] = v_comp_h; ++ if (self->private_impl.f_max_incl_components_h < self->private_impl.f_components_h[v_i]) { ++ self->private_impl.f_max_incl_components_h = self->private_impl.f_components_h[v_i]; ++ } ++ self->private_impl.f_components_v[v_i] = v_comp_v; ++ if (self->private_impl.f_max_incl_components_v < self->private_impl.f_components_v[v_i]) { ++ self->private_impl.f_max_incl_components_v = self->private_impl.f_components_v[v_i]; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ if (v_c8 >= 4u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } ++ self->private_impl.f_components_tq[v_i] = v_c8; ++ v_j = 0u; ++ while (v_j < v_i) { ++ if (self->private_impl.f_components_c[v_j] == self->private_impl.f_components_c[v_i]) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ if (self->private_impl.f_num_components == 1u) { ++ self->private_impl.f_max_incl_components_h = 1u; ++ self->private_impl.f_max_incl_components_v = 1u; ++ self->private_impl.f_components_h[0u] = 1u; ++ self->private_impl.f_components_v[0u] = 1u; ++ } else { ++ v_has_h24 = false; ++ v_has_h3 = false; ++ v_has_v24 = false; ++ v_has_v3 = false; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_components) { ++ v_has_h24 = (v_has_h24 || (self->private_impl.f_components_h[v_i] == 2u) || (self->private_impl.f_components_h[v_i] == 4u)); ++ v_has_h3 = (v_has_h3 || (self->private_impl.f_components_h[v_i] == 3u)); ++ v_has_v24 = (v_has_v24 || (self->private_impl.f_components_v[v_i] == 2u) || (self->private_impl.f_components_v[v_i] == 4u)); ++ v_has_v3 = (v_has_v3 || (self->private_impl.f_components_v[v_i] == 3u)); ++ v_i += 1u; ++ } ++ if ((v_has_h24 && v_has_h3) || (v_has_v24 && v_has_v3)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_fractional_sampling); ++ goto exit; ++ } ++ if (self->private_impl.f_num_components == 4u) { ++ self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe < 2u); ++ } else { ++ if (self->private_impl.f_is_jfif) { ++ self->private_impl.f_is_rgb_or_cmyk = false; ++ } else if (self->private_impl.f_is_adobe > 0u) { ++ self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe == 1u); ++ } else { ++ self->private_impl.f_is_rgb_or_cmyk = ((self->private_impl.f_components_c[0u] == 82u) && (self->private_impl.f_components_c[1u] == 71u) && (self->private_impl.f_components_c[2u] == 66u)); ++ } ++ } ++ } ++ self->private_impl.f_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, 1u, self->private_impl.f_max_incl_components_h); ++ self->private_impl.f_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, 1u, self->private_impl.f_max_incl_components_v); ++ v_upper_bound = 65544u; ++ self->private_impl.f_components_workbuf_widths[0u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[0u])))); ++ self->private_impl.f_components_workbuf_widths[1u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[1u])))); ++ self->private_impl.f_components_workbuf_widths[2u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[2u])))); ++ self->private_impl.f_components_workbuf_widths[3u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[3u])))); ++ self->private_impl.f_components_workbuf_heights[0u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[0u])))); ++ self->private_impl.f_components_workbuf_heights[1u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[1u])))); ++ self->private_impl.f_components_workbuf_heights[2u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[2u])))); ++ self->private_impl.f_components_workbuf_heights[3u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[3u])))); ++ v_wh0 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[0u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[0u]))); ++ v_wh1 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[1u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[1u]))); ++ v_wh2 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[2u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[2u]))); ++ v_wh3 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[3u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[3u]))); ++ v_progressive = 0u; ++ if (self->private_impl.f_sof_marker >= 194u) { ++ v_progressive = 2u; ++ v_i = 0u; ++ while (v_i < 4u) { ++ v_j = 0u; ++ while (v_j < 10u) { ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ } ++ self->private_impl.f_components_workbuf_offsets[0u] = 0u; ++ self->private_impl.f_components_workbuf_offsets[1u] = (self->private_impl.f_components_workbuf_offsets[0u] + v_wh0); ++ self->private_impl.f_components_workbuf_offsets[2u] = (self->private_impl.f_components_workbuf_offsets[1u] + v_wh1); ++ self->private_impl.f_components_workbuf_offsets[3u] = (self->private_impl.f_components_workbuf_offsets[2u] + v_wh2); ++ self->private_impl.f_components_workbuf_offsets[4u] = (self->private_impl.f_components_workbuf_offsets[3u] + v_wh3); ++ self->private_impl.f_components_workbuf_offsets[5u] = (self->private_impl.f_components_workbuf_offsets[4u] + (v_wh0 * v_progressive)); ++ self->private_impl.f_components_workbuf_offsets[6u] = (self->private_impl.f_components_workbuf_offsets[5u] + (v_wh1 * v_progressive)); ++ self->private_impl.f_components_workbuf_offsets[7u] = (self->private_impl.f_components_workbuf_offsets[6u] + (v_wh2 * v_progressive)); ++ self->private_impl.f_components_workbuf_offsets[8u] = (self->private_impl.f_components_workbuf_offsets[7u] + (v_wh3 * v_progressive)); ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_sof = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_sof = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_sof.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.quantize_dimension ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__quantize_dimension( ++ const wuffs_jpeg__decoder* self, ++ uint32_t a_width, ++ uint8_t a_h, ++ uint8_t a_max_incl_h) { ++ uint32_t v_ratio = 0; ++ ++ v_ratio = 0u; ++ if (a_h > 0u) { ++ v_ratio = ((uint32_t)(((uint8_t)(a_max_incl_h / a_h)))); ++ } ++ if (v_ratio == 1u) { ++ return ((a_width + 7u) / 8u); ++ } else if (v_ratio == 2u) { ++ return ((a_width + 15u) / 16u); ++ } else if (v_ratio == 3u) { ++ return ((a_width + 23u) / 24u); ++ } ++ return ((a_width + 31u) / 32u); ++} ++ ++// -------- func jpeg.decoder.decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__decode_frame_config( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func jpeg.decoder.do_decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__do_decode_frame_config( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_jpeg__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ self->private_impl.f_frame_config_io_position, ++ 0u, ++ true, ++ false, ++ 4278190080u); ++ } ++ self->private_impl.f_call_sequence = 64u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__decode_frame( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_ddf_status = wuffs_base__make_status(NULL); ++ wuffs_base__status v_swizzle_status = wuffs_base__make_status(NULL); ++ uint32_t v_scan_count = 0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ v_scan_count = self->private_impl.f_scan_count; ++ { ++ wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_ddf_status = t_0; ++ } ++ if ((v_ddf_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ v_ddf_status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); ++ } ++ if ( ! self->private_impl.f_swizzle_immediately && (wuffs_base__status__is_error(&v_ddf_status) || (v_scan_count < self->private_impl.f_scan_count))) { ++ if (self->private_impl.f_sof_marker >= 194u) { ++ wuffs_jpeg__decoder__apply_progressive_idct(self, a_workbuf); ++ } ++ if (self->private_impl.f_num_components == 1u) { ++ v_swizzle_status = wuffs_jpeg__decoder__swizzle_gray(self, ++ a_dst, ++ a_workbuf, ++ 0u, ++ 4294967295u, ++ 0u, ++ 4294967295u, ++ ((uint64_t)(self->private_impl.f_components_workbuf_widths[0u]))); ++ } else { ++ v_swizzle_status = wuffs_jpeg__decoder__swizzle_colorful(self, ++ a_dst, ++ a_workbuf, ++ 0u, ++ 4294967295u, ++ 0u, ++ 4294967295u); ++ } ++ if (wuffs_base__status__is_error(&v_ddf_status)) { ++ status = v_ddf_status; ++ goto exit; ++ } else if (wuffs_base__status__is_error(&v_swizzle_status)) { ++ status = v_swizzle_status; ++ goto exit; ++ } ++ } ++ status = v_ddf_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func jpeg.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__do_decode_frame( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_pixfmt = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint8_t v_c8 = 0; ++ uint8_t v_marker = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ if (coro_susp_point) { ++ v_marker = self->private_data.s_do_decode_frame.v_marker; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_jpeg__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ v_pixfmt = 536870920u; ++ if (self->private_impl.f_num_components > 1u) { ++ v_pixfmt = 2415954056u; ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), ++ wuffs_base__utility__make_pixel_format(v_pixfmt), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ self->private_impl.f_swizzle_immediately = false; ++ if (self->private_impl.f_components_workbuf_offsets[8u] > ((uint64_t)(a_workbuf.len))) { ++ if (self->private_impl.f_sof_marker >= 194u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ self->private_impl.f_swizzle_immediately = self->private_impl.f_use_lower_quality; ++ self->private_impl.f_swizzle_immediately_status = wuffs_base__make_status(NULL); ++ } else if (self->private_impl.f_components_workbuf_offsets[4u] < self->private_impl.f_components_workbuf_offsets[8u]) { ++ wuffs_private_impl__bulk_memset(a_workbuf.ptr + self->private_impl.f_components_workbuf_offsets[4u], (self->private_impl.f_components_workbuf_offsets[8u] - self->private_impl.f_components_workbuf_offsets[4u]), 0u); ++ } ++ if (self->private_impl.f_components_workbuf_offsets[4u] <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_memset(a_workbuf.ptr, self->private_impl.f_components_workbuf_offsets[4u], 128u); ++ } ++ while (true) { ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 == 255u) { ++ break; ++ } ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (v_c8 != 255u) { ++ v_marker = v_c8; ++ break; ++ } ++ } ++ if (v_marker == 0u) { ++ continue; ++ } else if ((208u <= v_marker) && (v_marker <= 217u)) { ++ if (v_marker <= 215u) { ++ continue; ++ } ++ } else { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_frame.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); ++ if (num_bits_2 == 8) { ++ t_2 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)); ++ } ++ } ++ self->private_impl.f_payload_length = t_2; ++ } ++ if (self->private_impl.f_payload_length < 2u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= 2u; ++ } ++ if (v_marker < 192u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } else if (v_marker < 208u) { ++ if (v_marker == 196u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ status = wuffs_jpeg__decoder__decode_dht(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else if (v_marker == 200u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } else if (v_marker < 224u) { ++ if (v_marker < 217u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); ++ goto exit; ++ } else if (v_marker == 217u) { ++ break; ++ } else if (v_marker == 218u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ status = wuffs_jpeg__decoder__decode_sos(self, a_dst, a_src, a_workbuf); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else if (v_marker == 219u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_jpeg__decoder__decode_dqt(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else if (v_marker == 221u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_jpeg__decoder__decode_dri(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } ++ } else if (v_marker < 240u) { ++ } else { ++ if (v_marker == 254u) { ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } ++ } ++ self->private_data.s_do_decode_frame.scratch = self->private_impl.f_payload_length; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame.scratch; ++ self->private_impl.f_payload_length = 0u; ++ } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_frame.v_marker = v_marker; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_dht ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dht( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint8_t v_tc = 0; ++ uint8_t v_th = 0; ++ uint8_t v_tc4_th = 0; ++ uint32_t v_working_total_count = 0; ++ uint32_t v_total_count = 0; ++ uint32_t v_i = 0; ++ bool v_failed = false; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_dht; ++ if (coro_susp_point) { ++ v_tc4_th = self->private_data.s_decode_dht.v_tc4_th; ++ v_total_count = self->private_data.s_decode_dht.v_total_count; ++ v_i = self->private_data.s_decode_dht.v_i; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_sof_marker == 0u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ while (self->private_impl.f_payload_length > 0u) { ++ if (self->private_impl.f_payload_length < 17u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= 17u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if ((((uint8_t)(v_c8 >> 4u)) > 1u) || (((uint8_t)(v_c8 & 15u)) > 3u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ v_tc = ((uint8_t)(v_c8 >> 4u)); ++ v_th = ((uint8_t)(v_c8 & 15u)); ++ v_tc4_th = ((uint8_t)(((uint8_t)(((uint8_t)(v_tc * 4u)) | v_th)))); ++ if ((self->private_impl.f_sof_marker == 192u) && (((uint8_t)(v_tc4_th & 3u)) > 1u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ self->private_data.f_dht_temp_counts[v_i] = t_1; ++ } ++ v_i += 1u; ++ } ++ v_working_total_count = 0u; ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_working_total_count = ((v_working_total_count + ((uint32_t)(self->private_data.f_dht_temp_counts[v_i]))) & 65535u); ++ v_i += 1u; ++ } ++ if ((v_working_total_count <= 0u) || (256u < v_working_total_count)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ v_total_count = v_working_total_count; ++ if (self->private_impl.f_payload_length < v_total_count) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= v_total_count; ++ v_i = 0u; ++ while (v_i < v_total_count) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = t_2; ++ } ++ v_i += 1u; ++ } ++ while (v_i < 256u) { ++ self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = 0u; ++ v_i += 1u; ++ } ++ if (((uint8_t)(v_tc4_th & 4u)) == 0u) { ++ v_i = 0u; ++ while (v_i < v_total_count) { ++ if (self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] > 15u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ v_i += 1u; ++ } ++ } ++ v_failed = wuffs_jpeg__decoder__calculate_huff_tables(self, v_tc4_th, v_total_count); ++ if (v_failed) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ self->private_impl.f_seen_dht[v_tc4_th] = true; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_dht = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_dht = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_dht.v_tc4_th = v_tc4_th; ++ self->private_data.s_decode_dht.v_total_count = v_total_count; ++ self->private_data.s_decode_dht.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.calculate_huff_tables ++ ++WUFFS_BASE__GENERATED_C_CODE ++static bool ++wuffs_jpeg__decoder__calculate_huff_tables( ++ wuffs_jpeg__decoder* self, ++ uint8_t a_tc4_th, ++ uint32_t a_total_count) { ++ uint32_t v_i = 0; ++ uint8_t v_j = 0; ++ uint8_t v_k = 0; ++ uint32_t v_bit_length_minus_one = 0; ++ uint8_t v_bit_length = 0; ++ uint32_t v_bit_string = 0; ++ uint32_t v_slow = 0; ++ uint8_t v_prefix = 0; ++ uint16_t v_fast = 0; ++ uint32_t v_reps = 0; ++ ++ v_i = 0u; ++ v_k = 0u; ++ v_bit_length_minus_one = 0u; ++ while (v_i < a_total_count) { ++ while (v_k >= self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) { ++ v_k = 0u; ++ v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u); ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_k += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_data.f_dht_temp_bit_lengths[v_i] = ((uint8_t)((v_bit_length_minus_one + 1u))); ++ v_i += 1u; ++ } ++ v_bit_length = 0u; ++ v_bit_string = 0u; ++ v_i = 0u; ++ while (v_i < a_total_count) { ++ while (v_bit_length < self->private_data.f_dht_temp_bit_lengths[v_i]) { ++ if (v_bit_length >= 16u) { ++ return true; ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_bit_length += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bit_string <<= 1u; ++ } ++ self->private_data.f_dht_temp_bit_strings[v_i] = ((uint16_t)(v_bit_string)); ++ v_bit_string += 1u; ++ if ((v_bit_string >> v_bit_length) > 0u) { ++ return true; ++ } ++ v_i += 1u; ++ } ++ v_k = 0u; ++ v_bit_length_minus_one = 0u; ++ while (true) { ++ if (self->private_data.f_dht_temp_counts[v_bit_length_minus_one] == 0u) { ++ self->private_impl.f_huff_tables_slow[a_tc4_th][v_bit_length_minus_one] = 0u; ++ } else { ++ v_slow = (255u & ((uint32_t)(((uint32_t)(v_k)) - ((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_k]))))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_k += self->private_data.f_dht_temp_counts[v_bit_length_minus_one]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_impl.f_huff_tables_slow[a_tc4_th][v_bit_length_minus_one] = (v_slow | ((((uint32_t)(self->private_data.f_dht_temp_bit_strings[((uint8_t)(v_k - 1u))])) + 1u) << 8u)); ++ } ++ v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u); ++ if (v_bit_length_minus_one == 0u) { ++ break; ++ } ++ } ++ v_i = 0u; ++ while (v_i < 256u) { ++ self->private_impl.f_huff_tables_fast[a_tc4_th][v_i] = 65535u; ++ v_i += 1u; ++ } ++ v_j = 0u; ++ v_bit_length_minus_one = 0u; ++ while (v_bit_length_minus_one < 8u) { ++ v_k = 0u; ++ while (v_k < self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) { ++ v_prefix = ((uint8_t)((((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_j])) << (7u - v_bit_length_minus_one)))); ++ v_fast = ((uint16_t)(((((uint32_t)((v_bit_length_minus_one + 1u))) << 8u) | ((uint32_t)(self->private_impl.f_huff_tables_symbols[a_tc4_th][v_j]))))); ++ v_reps = (((uint32_t)(1u)) << (7u - v_bit_length_minus_one)); ++ while (v_reps > 0u) { ++ self->private_impl.f_huff_tables_fast[a_tc4_th][v_prefix] = v_fast; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_prefix += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_reps -= 1u; ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_k += 1u; ++ v_j += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ v_bit_length_minus_one += 1u; ++ } ++ return false; ++} ++ ++// -------- func jpeg.decoder.decode_sos ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_sos( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_my = 0; ++ uint32_t v_mx = 0; ++ uint32_t v_decode_mcu_result = 0; ++ uint32_t v_bitstream_length = 0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_sos; ++ if (coro_susp_point) { ++ v_my = self->private_data.s_decode_sos.v_my; ++ v_mx = self->private_data.s_decode_sos.v_mx; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_scan_count >= 32u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_scan_count); ++ goto exit; ++ } else if ((self->private_impl.f_scan_count > 0u) && ! self->private_impl.f_expect_multiple_scans) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_scan_count); ++ goto exit; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_jpeg__decoder__prepare_scan(self, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_next_restart_marker = 0u; ++ self->private_impl.f_mcu_previous_dc_values[0u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[1u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[2u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[3u] = 0u; ++ self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval; ++ self->private_impl.f_eob_run = 0u; ++ self->private_impl.f_bitstream_bits = 0u; ++ self->private_impl.f_bitstream_n_bits = 0u; ++ self->private_impl.f_bitstream_ri = 0u; ++ self->private_impl.f_bitstream_wi = 0u; ++ self->private_impl.f_bitstream_padding = 12345u; ++ wuffs_jpeg__decoder__fill_bitstream(self, a_src); ++ v_my = 0u; ++ while (v_my < self->private_impl.f_scan_height_in_mcus) { ++ v_mx = 0u; ++ while (v_mx < self->private_impl.f_scan_width_in_mcus) { ++ self->private_impl.f_mcu_current_block = 0u; ++ self->private_impl.f_mcu_zig_index = ((uint32_t)(self->private_impl.f_scan_ss)); ++ if (self->private_impl.f_sof_marker >= 194u) { ++ wuffs_jpeg__decoder__load_mcu_blocks(self, v_mx, v_my, a_workbuf); ++ } ++ while (true) { ++ v_decode_mcu_result = wuffs_jpeg__decoder__decode_mcu(self, ++ a_dst, ++ a_workbuf, ++ v_mx, ++ v_my); ++ if (v_decode_mcu_result == 0u) { ++ break; ++ } else if (v_decode_mcu_result == 1u) { ++ } else if (v_decode_mcu_result == 2u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__internal_error_inconsistent_decoder_state); ++ goto exit; ++ } else { ++ status = self->private_impl.f_swizzle_immediately_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ while (true) { ++ v_bitstream_length = ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri)); ++ wuffs_jpeg__decoder__fill_bitstream(self, a_src); ++ if (v_bitstream_length < ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri))) { ++ break; ++ } else if (self->private_impl.f_bitstream_padding == 0u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } else if ((a_src && a_src->meta.closed) && ! self->private_impl.f_bitstream_is_closed) { ++ if (self->private_impl.f_bitstream_wi < 1024u) { ++ wuffs_private_impl__bulk_memset(&self->private_data.f_bitstream_buffer[self->private_impl.f_bitstream_wi], 264u, 0u); ++ self->private_impl.f_bitstream_wi += 264u; ++ self->private_impl.f_bitstream_is_closed = true; ++ } ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } ++ } ++ if (self->private_impl.f_sof_marker >= 194u) { ++ wuffs_jpeg__decoder__save_mcu_blocks(self, v_mx, v_my, a_workbuf); ++ } ++ if (self->private_impl.f_restarts_remaining > 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_restarts_remaining -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ if (self->private_impl.f_restarts_remaining == 0u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_jpeg__decoder__skip_past_the_next_restart_marker(self, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_mcu_previous_dc_values[0u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[1u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[2u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[3u] = 0u; ++ self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval; ++ self->private_impl.f_eob_run = 0u; ++ self->private_impl.f_bitstream_bits = 0u; ++ self->private_impl.f_bitstream_n_bits = 0u; ++ self->private_impl.f_bitstream_ri = 0u; ++ self->private_impl.f_bitstream_wi = 0u; ++ self->private_impl.f_bitstream_padding = 12345u; ++ } ++ } ++ v_mx += 1u; ++ } ++ v_my += 1u; ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_scan_count, 1u); ++ ++ ok: ++ self->private_impl.p_decode_sos = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_sos = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_sos.v_my = v_my; ++ self->private_data.s_decode_sos.v_mx = v_mx; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func jpeg.decoder.prepare_scan ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__prepare_scan( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ uint32_t v_j_max_incl = 0; ++ bool v_failed = false; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_prepare_scan; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_prepare_scan.v_i; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if ((self->private_impl.f_payload_length < 6u) || (self->private_impl.f_payload_length > 12u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if ((v_c8 < 1u) || (v_c8 > 4u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_scan_num_components = ((uint32_t)(v_c8)); ++ if ((self->private_impl.f_scan_num_components > self->private_impl.f_num_components) || (self->private_impl.f_payload_length != (4u + (2u * self->private_impl.f_scan_num_components)))) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length = 0u; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_scan_num_components) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ v_j = 0u; ++ while (true) { ++ if (v_j >= self->private_impl.f_num_components) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ if (v_c8 == self->private_impl.f_components_c[v_j]) { ++ if ( ! self->private_impl.f_seen_dqt[self->private_impl.f_components_tq[v_j]]) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__missing_quantization_table); ++ goto exit; ++ } ++ self->private_impl.f_scan_comps_cselector[v_i] = ((uint8_t)(v_j)); ++ break; ++ } ++ v_j += 1u; ++ } ++ v_j = 0u; ++ while (v_j < v_i) { ++ if (self->private_impl.f_scan_comps_cselector[v_i] == self->private_impl.f_scan_comps_cselector[v_j]) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ v_j += 1u; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if ((((uint8_t)(v_c8 >> 4u)) > 3u) || (((uint8_t)(v_c8 & 15u)) > 3u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_scan_comps_td[v_i] = ((uint8_t)(v_c8 >> 4u)); ++ self->private_impl.f_scan_comps_ta[v_i] = ((uint8_t)(v_c8 & 15u)); ++ if (self->private_impl.f_sof_marker == 192u) { ++ if ((self->private_impl.f_scan_comps_td[v_i] > 1u) || (self->private_impl.f_scan_comps_ta[v_i] > 1u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ } ++ v_i += 1u; ++ } ++ if (self->private_impl.f_scan_count == 0u) { ++ self->private_impl.f_expect_multiple_scans = ((self->private_impl.f_sof_marker >= 194u) || (self->private_impl.f_scan_num_components < self->private_impl.f_num_components)); ++ } ++ if (self->private_impl.f_sof_marker < 194u) { ++ self->private_data.s_prepare_scan.scratch = 3u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (self->private_data.s_prepare_scan.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_prepare_scan.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_prepare_scan.scratch; ++ self->private_impl.f_scan_ss = 0u; ++ self->private_impl.f_scan_se = 63u; ++ self->private_impl.f_scan_ah = 0u; ++ self->private_impl.f_scan_al = 0u; ++ } else { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if (v_c8 > 63u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_scan_ss = v_c8; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if ((v_c8 > 63u) || (v_c8 < self->private_impl.f_scan_ss)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_scan_se = v_c8; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ if ((((uint8_t)(v_c8 >> 4u)) > 14u) || (((uint8_t)(v_c8 & 15u)) > 13u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_scan_ah = ((uint8_t)(v_c8 >> 4u)); ++ self->private_impl.f_scan_al = ((uint8_t)(v_c8 & 15u)); ++ if (self->private_impl.f_scan_ah > 0u) { ++ if (((uint8_t)(self->private_impl.f_scan_ah - 1u)) != self->private_impl.f_scan_al) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ } ++ if (self->private_impl.f_scan_ss == 0u) { ++ if (self->private_impl.f_scan_se != 0u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } else if (self->private_impl.f_scan_ah == 0u) { ++ self->private_impl.choosy_decode_mcu = ( ++ &wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits); ++ } else { ++ self->private_impl.choosy_decode_mcu = ( ++ &wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit); ++ } ++ } else { ++ if (self->private_impl.f_scan_num_components != 1u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } else if (self->private_impl.f_scan_ah == 0u) { ++ self->private_impl.choosy_decode_mcu = ( ++ &wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits); ++ } else { ++ self->private_impl.choosy_decode_mcu = ( ++ &wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit); ++ } ++ } ++ } ++ v_i = 0u; ++ while (v_i < self->private_impl.f_scan_num_components) { ++ if ((self->private_impl.f_scan_ss == 0u) && ! self->private_impl.f_seen_dht[((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_i]))]) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_jpeg__decoder__use_default_huffman_table(self, ((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_i]))); ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ if ((self->private_impl.f_scan_se != 0u) && ! self->private_impl.f_seen_dht[((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_i]))]) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_jpeg__decoder__use_default_huffman_table(self, ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_i]))); ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ v_j = ((uint32_t)(self->private_impl.f_scan_ss)); ++ v_j_max_incl = ((uint32_t)(wuffs_base__u8__min(self->private_impl.f_scan_se, 9u))); ++ while (v_j <= v_j_max_incl) { ++ self->private_impl.f_block_smoothing_lowest_scan_al[self->private_impl.f_scan_comps_cselector[v_i]][v_j] = self->private_impl.f_scan_al; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ if (self->private_impl.f_scan_num_components == 1u) { ++ wuffs_jpeg__decoder__calculate_single_component_scan_fields(self); ++ } else { ++ v_failed = wuffs_jpeg__decoder__calculate_multiple_component_scan_fields(self); ++ if (v_failed) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_prepare_scan = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_prepare_scan = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_prepare_scan.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.use_default_huffman_table ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__use_default_huffman_table( ++ wuffs_jpeg__decoder* self, ++ uint8_t a_tc4_th) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__slice_u8 v_data = {0}; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ if (a_tc4_th == 0u) { ++ v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA), 29); ++ } else if (a_tc4_th == 1u) { ++ v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA), 29); ++ } else if (a_tc4_th == 4u) { ++ v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA), 179); ++ } else if (a_tc4_th == 5u) { ++ v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA), 179); ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__missing_huffman_table); ++ goto exit; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ v_data, ++ 0u); ++ self->private_impl.f_payload_length = ((uint32_t)((((uint64_t)(v_data.len)) & 65535u))); ++ { ++ wuffs_base__status t_0 = wuffs_jpeg__decoder__decode_dht(self, v_r); ++ v_status = t_0; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ ++ ok: ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func jpeg.decoder.calculate_single_component_scan_fields ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__calculate_single_component_scan_fields( ++ wuffs_jpeg__decoder* self) { ++ uint8_t v_csel = 0; ++ ++ self->private_impl.f_scan_comps_bx_offset[0u] = 0u; ++ self->private_impl.f_scan_comps_by_offset[0u] = 0u; ++ self->private_impl.f_mcu_num_blocks = 1u; ++ self->private_impl.f_mcu_blocks_sselector[0u] = 0u; ++ v_csel = self->private_impl.f_scan_comps_cselector[0u]; ++ self->private_impl.f_mcu_blocks_offset[0u] = self->private_impl.f_components_workbuf_offsets[v_csel]; ++ self->private_impl.f_mcu_blocks_mx_mul[0u] = 8u; ++ self->private_impl.f_mcu_blocks_my_mul[0u] = (8u * self->private_impl.f_components_workbuf_widths[v_csel]); ++ self->private_impl.f_mcu_blocks_dc_hselector[0u] = ((uint8_t)(0u | self->private_impl.f_scan_comps_td[0u])); ++ self->private_impl.f_mcu_blocks_ac_hselector[0u] = ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[0u])); ++ self->private_impl.f_scan_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, self->private_impl.f_components_h[v_csel], self->private_impl.f_max_incl_components_h); ++ self->private_impl.f_scan_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, self->private_impl.f_components_v[v_csel], self->private_impl.f_max_incl_components_v); ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.calculate_multiple_component_scan_fields ++ ++WUFFS_BASE__GENERATED_C_CODE ++static bool ++wuffs_jpeg__decoder__calculate_multiple_component_scan_fields( ++ wuffs_jpeg__decoder* self) { ++ uint32_t v_i = 0; ++ uint32_t v_h = 0; ++ uint32_t v_v = 0; ++ uint32_t v_hv = 0; ++ uint32_t v_total_hv = 0; ++ uint32_t v_b = 0; ++ uint32_t v_bx_offset = 0; ++ uint32_t v_by_offset = 0; ++ uint32_t v_sibo = 0; ++ uint8_t v_ssel = 0; ++ uint8_t v_csel = 0; ++ ++ v_total_hv = 0u; ++ v_i = 0u; ++ v_b = 0u; ++ v_bx_offset = 0u; ++ v_by_offset = 0u; ++ while (v_i < self->private_impl.f_scan_num_components) { ++ v_h = ((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]])); ++ v_v = ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]])); ++ v_hv = (((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]])) * ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]]))); ++ self->private_impl.f_swizzle_immediately_c_offsets[v_i] = ((uint32_t)(64u * v_total_hv)); ++ v_total_hv += v_hv; ++ while (v_hv > 0u) { ++ self->private_impl.f_scan_comps_bx_offset[(v_b & 15u)] = ((uint8_t)((v_bx_offset & 3u))); ++ self->private_impl.f_scan_comps_by_offset[(v_b & 15u)] = ((uint8_t)((v_by_offset & 3u))); ++ self->private_impl.f_mcu_blocks_sselector[(v_b & 15u)] = ((uint8_t)(v_i)); ++ v_b += 1u; ++ v_bx_offset += 1u; ++ if (v_bx_offset == v_h) { ++ v_bx_offset = 0u; ++ v_by_offset += 1u; ++ if (v_by_offset == v_v) { ++ v_by_offset = 0u; ++ } ++ } ++ v_hv -= 1u; ++ } ++ v_i += 1u; ++ } ++ if (v_total_hv > 10u) { ++ return true; ++ } ++ self->private_impl.f_mcu_num_blocks = v_total_hv; ++ self->private_impl.f_swizzle_immediately_c_offsets[self->private_impl.f_scan_num_components] = ((uint32_t)(64u * v_total_hv)); ++ v_b = 0u; ++ while (v_b < self->private_impl.f_mcu_num_blocks) { ++ v_ssel = self->private_impl.f_mcu_blocks_sselector[v_b]; ++ v_csel = self->private_impl.f_scan_comps_cselector[v_ssel]; ++ self->private_impl.f_mcu_blocks_offset[v_b] = (self->private_impl.f_components_workbuf_offsets[v_csel] + (8u * ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) + (8u * ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b])) * ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])))); ++ self->private_impl.f_mcu_blocks_mx_mul[v_b] = (8u * ((uint32_t)(self->private_impl.f_components_h[v_csel]))); ++ self->private_impl.f_mcu_blocks_my_mul[v_b] = (8u * ((uint32_t)(self->private_impl.f_components_v[v_csel])) * self->private_impl.f_components_workbuf_widths[v_csel]); ++ self->private_impl.f_mcu_blocks_dc_hselector[v_b] = ((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_ssel])); ++ self->private_impl.f_mcu_blocks_ac_hselector[v_b] = ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_ssel])); ++ v_sibo = ((uint32_t)(self->private_impl.f_swizzle_immediately_c_offsets[v_csel] + ((8u * ((uint32_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) + (64u * ((uint32_t)(self->private_impl.f_scan_comps_by_offset[v_b])) * ((uint32_t)(self->private_impl.f_components_h[v_csel])))))); ++ self->private_impl.f_swizzle_immediately_b_offsets[v_b] = wuffs_base__u32__min(v_sibo, 576u); ++ v_b += 1u; ++ } ++ self->private_impl.f_scan_width_in_mcus = self->private_impl.f_width_in_mcus; ++ self->private_impl.f_scan_height_in_mcus = self->private_impl.f_height_in_mcus; ++ return false; ++} ++ ++// -------- func jpeg.decoder.fill_bitstream ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__fill_bitstream( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ uint32_t v_wi = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_new_wi = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ if (self->private_impl.f_bitstream_ri <= 0u) { ++ } else if (self->private_impl.f_bitstream_ri >= self->private_impl.f_bitstream_wi) { ++ self->private_impl.f_bitstream_ri = 0u; ++ self->private_impl.f_bitstream_wi = 0u; ++ } else { ++ v_wi = (self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri); ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_bitstream_buffer, 2048), wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi)); ++ self->private_impl.f_bitstream_ri = 0u; ++ self->private_impl.f_bitstream_wi = v_wi; ++ } ++ v_wi = self->private_impl.f_bitstream_wi; ++ while ((v_wi < 2048u) && (((uint64_t)(io2_a_src - iop_a_src)) > 0u)) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (v_c8 < 255u) { ++ self->private_data.f_bitstream_buffer[v_wi] = v_c8; ++ v_wi += 1u; ++ iop_a_src += 1u; ++ continue; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) { ++ break; ++ } else if (((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u)) > 0u) { ++ break; ++ } else { ++ self->private_data.f_bitstream_buffer[v_wi] = 255u; ++ v_wi += 1u; ++ iop_a_src += 2u; ++ } ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) > 1u) { ++ if ((wuffs_base__peek_u8be__no_bounds_check(iop_a_src) >= 255u) && (((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u)) > 0u)) { ++ v_new_wi = (wuffs_base__u32__min(v_wi, 1784u) + 264u); ++ v_new_wi = wuffs_base__u32__min(v_new_wi, (v_wi + self->private_impl.f_bitstream_padding)); ++ if (v_wi < v_new_wi) { ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_bitstream_padding, (v_new_wi - v_wi)); ++ wuffs_private_impl__bulk_memset(&self->private_data.f_bitstream_buffer[v_wi], (v_new_wi - v_wi), 0u); ++ v_wi = v_new_wi; ++ } ++ } ++ } ++ self->private_impl.f_bitstream_wi = v_wi; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.load_mcu_blocks_for_single_component ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__load_mcu_blocks_for_single_component( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_csel) { ++ return (*self->private_impl.choosy_load_mcu_blocks_for_single_component)(self, a_mx, a_my, a_workbuf, a_csel); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_csel) { ++ uint64_t v_stride16 = 0; ++ uint64_t v_offset = 0; ++ ++ v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u))); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16)); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.load_mcu_blocks ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__load_mcu_blocks( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf) { ++ uint32_t v_b = 0; ++ uint8_t v_csel = 0; ++ uint64_t v_h = 0; ++ uint64_t v_v = 0; ++ uint64_t v_stride16 = 0; ++ uint64_t v_offset = 0; ++ ++ v_h = 1u; ++ v_v = 1u; ++ v_b = 0u; ++ while (v_b < self->private_impl.f_mcu_num_blocks) { ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]]; ++ if (self->private_impl.f_scan_num_components > 1u) { ++ v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel])); ++ v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel])); ++ } ++ v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u))); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[((uint8_t)(v_csel | 4u))] + (((v_h * ((uint64_t)(a_mx))) + ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) * 128u) + (((v_v * ((uint64_t)(a_my))) + ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b]))) * v_stride16)); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_load_host_endian(&self->private_data.f_mcu_blocks[v_b], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ } ++ v_b += 1u; ++ } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.save_mcu_blocks ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__save_mcu_blocks( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf) { ++ uint32_t v_b = 0; ++ uint8_t v_csel = 0; ++ uint64_t v_h = 0; ++ uint64_t v_v = 0; ++ uint64_t v_stride16 = 0; ++ uint64_t v_offset = 0; ++ ++ v_h = 1u; ++ v_v = 1u; ++ v_b = 0u; ++ while (v_b < self->private_impl.f_mcu_num_blocks) { ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]]; ++ if (self->private_impl.f_scan_num_components > 1u) { ++ v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel])); ++ v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel])); ++ } ++ v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u))); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[((uint8_t)(v_csel | 4u))] + (((v_h * ((uint64_t)(a_mx))) + ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) * 128u) + (((v_v * ((uint64_t)(a_my))) + ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b]))) * v_stride16)); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_save_host_endian(&self->private_data.f_mcu_blocks[v_b], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ } ++ v_b += 1u; ++ } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.skip_past_the_next_restart_marker ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__skip_past_the_next_restart_marker( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_skip_past_the_next_restart_marker; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } else if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) < 255u) { ++ iop_a_src += 1u; ++ continue; ++ } ++ v_c8 = ((uint8_t)(((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u)))); ++ if (v_c8 < 192u) { ++ iop_a_src += 2u; ++ continue; ++ } else if ((v_c8 < 208u) || (215u < v_c8)) { ++ break; ++ } ++ v_c8 &= 7u; ++ if ((self->private_impl.f_next_restart_marker == ((uint8_t)(((uint8_t)(v_c8 + 1u)) & 7u))) || (self->private_impl.f_next_restart_marker == ((uint8_t)(((uint8_t)(v_c8 + 2u)) & 7u)))) { ++ break; ++ } else if ((self->private_impl.f_next_restart_marker == ((uint8_t)(((uint8_t)(v_c8 + 7u)) & 7u))) || (self->private_impl.f_next_restart_marker == ((uint8_t)(((uint8_t)(v_c8 + 6u)) & 7u)))) { ++ iop_a_src += 2u; ++ continue; ++ } else { ++ iop_a_src += 2u; ++ break; ++ } ++ } ++ self->private_impl.f_next_restart_marker = ((uint8_t)(((uint8_t)(self->private_impl.f_next_restart_marker + 1u)) & 7u)); ++ ++ ok: ++ self->private_impl.p_skip_past_the_next_restart_marker = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_skip_past_the_next_restart_marker = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.apply_progressive_idct ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__apply_progressive_idct( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__slice_u8 a_workbuf) { ++ uint32_t v_csel = 0; ++ bool v_block_smoothing_applicable = false; ++ uint32_t v_scan_width_in_mcus = 0; ++ uint32_t v_scan_height_in_mcus = 0; ++ uint32_t v_mcu_blocks_mx_mul_0 = 0; ++ uint32_t v_mcu_blocks_my_mul_0 = 0; ++ uint32_t v_my = 0; ++ uint32_t v_mx = 0; ++ uint64_t v_stride = 0; ++ uint64_t v_offset = 0; ++ uint8_t v_stashed_mcu_blocks_0[128] = {0}; ++ ++ wuffs_private_impl__bulk_save_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__make_slice_u8(v_stashed_mcu_blocks_0, 128)); ++ v_block_smoothing_applicable = true; ++ v_csel = 0u; ++ while (v_csel < self->private_impl.f_num_components) { ++ if ((self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][0u] >= 16u) || wuffs_jpeg__decoder__top_left_quants_has_zero(self, ((uint32_t)(self->private_impl.f_components_tq[v_csel])))) { ++ v_block_smoothing_applicable = false; ++ } ++ v_csel += 1u; ++ } ++ v_csel = 0u; ++ while (v_csel < self->private_impl.f_num_components) { ++ v_scan_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, self->private_impl.f_components_h[v_csel], self->private_impl.f_max_incl_components_h); ++ v_scan_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, self->private_impl.f_components_v[v_csel], self->private_impl.f_max_incl_components_v); ++ v_mcu_blocks_mx_mul_0 = 8u; ++ v_mcu_blocks_my_mul_0 = (8u * self->private_impl.f_components_workbuf_widths[v_csel]); ++ if (v_block_smoothing_applicable && (0u != (self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][1u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][2u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][3u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][4u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][5u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][6u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][9u]))) { ++ self->private_impl.choosy_load_mcu_blocks_for_single_component = ( ++ &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth); ++ self->private_impl.f_block_smoothing_mx_max_incl = wuffs_base__u32__sat_sub(v_scan_width_in_mcus, 1u); ++ self->private_impl.f_block_smoothing_my_max_incl = wuffs_base__u32__sat_sub(v_scan_height_in_mcus, 1u); ++ } else { ++ self->private_impl.choosy_load_mcu_blocks_for_single_component = ( ++ &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default); ++ } ++ v_my = 0u; ++ while (v_my < v_scan_height_in_mcus) { ++ v_mx = 0u; ++ while (v_mx < v_scan_width_in_mcus) { ++ wuffs_jpeg__decoder__load_mcu_blocks_for_single_component(self, ++ v_mx, ++ v_my, ++ a_workbuf, ++ v_csel); ++ v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[v_csel] + (((uint64_t)(v_mcu_blocks_mx_mul_0)) * ((uint64_t)(v_mx))) + (((uint64_t)(v_mcu_blocks_my_mul_0)) * ((uint64_t)(v_my)))); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_jpeg__decoder__decode_idct(self, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); ++ } ++ v_mx += 1u; ++ } ++ v_my += 1u; ++ } ++ v_csel += 1u; ++ } ++ wuffs_private_impl__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__make_slice_u8(v_stashed_mcu_blocks_0, 128)); ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.swizzle_gray ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__swizzle_gray( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_x0, ++ uint32_t a_x1, ++ uint32_t a_y0, ++ uint32_t a_y1, ++ uint64_t a_stride) { ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_x0 = 0; ++ uint64_t v_x1 = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint32_t v_y = 0; ++ uint32_t v_y1 = 0; ++ ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_x0 = ((uint64_t)((v_dst_bytes_per_pixel * wuffs_base__u32__min(a_x0, self->private_impl.f_width)))); ++ v_x1 = ((uint64_t)((v_dst_bytes_per_pixel * wuffs_base__u32__min(a_x1, self->private_impl.f_width)))); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_y = a_y0; ++ v_y1 = wuffs_base__u32__min(a_y1, self->private_impl.f_height); ++ while (v_y < v_y1) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y); ++ if (v_x1 < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_x1); ++ } ++ if (v_x0 < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_x0); ++ } else { ++ v_dst = wuffs_base__utility__empty_slice_u8(); ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), a_workbuf); ++ if (a_stride <= ((uint64_t)(a_workbuf.len))) { ++ a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, a_stride); ++ } else { ++ a_workbuf = wuffs_base__utility__empty_slice_u8(); ++ } ++ v_y += 1u; ++ } ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func jpeg.decoder.swizzle_colorful ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__swizzle_colorful( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_x0, ++ uint32_t a_x1, ++ uint32_t a_y0, ++ uint32_t a_y1) { ++ uint64_t v_i = 0; ++ uint64_t v_j = 0; ++ wuffs_base__slice_u8 v_src0 = {0}; ++ wuffs_base__slice_u8 v_src1 = {0}; ++ wuffs_base__slice_u8 v_src2 = {0}; ++ wuffs_base__slice_u8 v_src3 = {0}; ++ uint32_t v_width0 = 0; ++ uint32_t v_width1 = 0; ++ uint32_t v_width2 = 0; ++ uint32_t v_width3 = 0; ++ uint32_t v_height0 = 0; ++ uint32_t v_height1 = 0; ++ uint32_t v_height2 = 0; ++ uint32_t v_height3 = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ if (self->private_impl.f_swizzle_immediately) { ++ v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[0u])); ++ v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[1u])); ++ if ((v_i <= v_j) && (v_j <= 640u)) { ++ v_src0 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j); ++ v_width0 = (8u * ((uint32_t)(self->private_impl.f_components_h[0u]))); ++ v_height0 = (8u * ((uint32_t)(self->private_impl.f_components_v[0u]))); ++ } ++ v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[1u])); ++ v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[2u])); ++ if ((v_i <= v_j) && (v_j <= 640u)) { ++ v_src1 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j); ++ v_width1 = (8u * ((uint32_t)(self->private_impl.f_components_h[1u]))); ++ v_height1 = (8u * ((uint32_t)(self->private_impl.f_components_v[1u]))); ++ } ++ v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[2u])); ++ v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[3u])); ++ if ((v_i <= v_j) && (v_j <= 640u)) { ++ v_src2 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j); ++ v_width2 = (8u * ((uint32_t)(self->private_impl.f_components_h[2u]))); ++ v_height2 = (8u * ((uint32_t)(self->private_impl.f_components_v[2u]))); ++ } ++ v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[3u])); ++ v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[4u])); ++ if ((v_i <= v_j) && (v_j <= 640u)) { ++ v_src3 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j); ++ v_width3 = (8u * ((uint32_t)(self->private_impl.f_components_h[3u]))); ++ v_height3 = (8u * ((uint32_t)(self->private_impl.f_components_v[3u]))); ++ } ++ } else { ++ if ((self->private_impl.f_components_workbuf_offsets[0u] <= self->private_impl.f_components_workbuf_offsets[1u]) && (self->private_impl.f_components_workbuf_offsets[1u] <= ((uint64_t)(a_workbuf.len)))) { ++ v_src0 = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ self->private_impl.f_components_workbuf_offsets[0u], ++ self->private_impl.f_components_workbuf_offsets[1u]); ++ v_width0 = self->private_impl.f_components_workbuf_widths[0u]; ++ v_height0 = self->private_impl.f_components_workbuf_heights[0u]; ++ } ++ if ((self->private_impl.f_components_workbuf_offsets[1u] <= self->private_impl.f_components_workbuf_offsets[2u]) && (self->private_impl.f_components_workbuf_offsets[2u] <= ((uint64_t)(a_workbuf.len)))) { ++ v_src1 = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ self->private_impl.f_components_workbuf_offsets[1u], ++ self->private_impl.f_components_workbuf_offsets[2u]); ++ v_width1 = self->private_impl.f_components_workbuf_widths[1u]; ++ v_height1 = self->private_impl.f_components_workbuf_heights[1u]; ++ } ++ if ((self->private_impl.f_components_workbuf_offsets[2u] <= self->private_impl.f_components_workbuf_offsets[3u]) && (self->private_impl.f_components_workbuf_offsets[3u] <= ((uint64_t)(a_workbuf.len)))) { ++ v_src2 = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ self->private_impl.f_components_workbuf_offsets[2u], ++ self->private_impl.f_components_workbuf_offsets[3u]); ++ v_width2 = self->private_impl.f_components_workbuf_widths[2u]; ++ v_height2 = self->private_impl.f_components_workbuf_heights[2u]; ++ } ++ if ((self->private_impl.f_components_workbuf_offsets[3u] <= self->private_impl.f_components_workbuf_offsets[4u]) && (self->private_impl.f_components_workbuf_offsets[4u] <= ((uint64_t)(a_workbuf.len)))) { ++ v_src3 = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ self->private_impl.f_components_workbuf_offsets[3u], ++ self->private_impl.f_components_workbuf_offsets[4u]); ++ v_width3 = self->private_impl.f_components_workbuf_widths[3u]; ++ v_height3 = self->private_impl.f_components_workbuf_heights[3u]; ++ } ++ } ++ v_status = wuffs_base__pixel_swizzler__swizzle_ycck(&self->private_impl.f_swizzler, ++ a_dst, ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), ++ (a_x0 & 65535u), ++ wuffs_base__u32__min(a_x1, self->private_impl.f_width), ++ (a_y0 & 65535u), ++ wuffs_base__u32__min(a_y1, self->private_impl.f_height), ++ v_src0, ++ v_src1, ++ v_src2, ++ v_src3, ++ v_width0, ++ v_width1, ++ v_width2, ++ v_width3, ++ v_height0, ++ v_height1, ++ v_height2, ++ v_height3, ++ v_width0, ++ v_width1, ++ v_width2, ++ v_width3, ++ self->private_impl.f_components_h[0u], ++ self->private_impl.f_components_h[1u], ++ self->private_impl.f_components_h[2u], ++ self->private_impl.f_components_h[3u], ++ self->private_impl.f_components_v[0u], ++ self->private_impl.f_components_v[1u], ++ self->private_impl.f_components_v[2u], ++ self->private_impl.f_components_v[3u], ++ self->private_impl.f_is_rgb_or_cmyk, ++ ! self->private_impl.f_use_lower_quality, ++ wuffs_base__make_slice_u8(self->private_data.f_swizzle_ycck_scratch_buffer_2k, 2048)); ++ return wuffs_private_impl__status__ensure_not_a_suspension(v_status); ++} ++ ++// -------- func jpeg.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_jpeg__decoder__frame_dirty_rect( ++ const wuffs_jpeg__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); ++} ++ ++// -------- func jpeg.decoder.num_animation_loops ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_jpeg__decoder__num_animation_loops( ++ const wuffs_jpeg__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func jpeg.decoder.num_decoded_frame_configs ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_jpeg__decoder__num_decoded_frame_configs( ++ const wuffs_jpeg__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func jpeg.decoder.num_decoded_frames ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_jpeg__decoder__num_decoded_frames( ++ const wuffs_jpeg__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func jpeg.decoder.restart_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__restart_frame( ++ wuffs_jpeg__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if (a_index != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ self->private_impl.f_bitstream_is_closed = false; ++ self->private_impl.f_expect_multiple_scans = false; ++ self->private_impl.f_frame_config_io_position = a_io_position; ++ self->private_impl.f_scan_count = 0u; ++ self->private_impl.f_restart_interval = self->private_impl.f_saved_restart_interval; ++ v_i = 0u; ++ while (v_i < 4u) { ++ self->private_impl.f_seen_dqt[v_i] = self->private_impl.f_saved_seen_dqt[v_i]; ++ v_j = 0u; ++ while (v_j < 64u) { ++ self->private_impl.f_quant_tables[v_i][v_j] = self->private_impl.f_saved_quant_tables[v_i][v_j]; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 4u) { ++ v_j = 0u; ++ while (v_j < 10u) { ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 8u) { ++ self->private_impl.f_seen_dht[v_i] = false; ++ v_i += 1u; ++ } ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func jpeg.decoder.set_report_metadata ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_jpeg__decoder__set_report_metadata( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__tell_me_more( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func jpeg.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_jpeg__decoder__workbuf_len( ++ const wuffs_jpeg__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ if (self->private_impl.f_use_lower_quality && (self->private_impl.f_sof_marker < 194u)) { ++ return wuffs_base__utility__make_range_ii_u64(0u, self->private_impl.f_components_workbuf_offsets[8u]); ++ } ++ return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_components_workbuf_offsets[8u], self->private_impl.f_components_workbuf_offsets[8u]); ++} ++ ++// -------- func jpeg.decoder.top_left_quants_has_zero ++ ++WUFFS_BASE__GENERATED_C_CODE ++static bool ++wuffs_jpeg__decoder__top_left_quants_has_zero( ++ const wuffs_jpeg__decoder* self, ++ uint32_t a_q) { ++ return ((self->private_impl.f_quant_tables[a_q][0u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][1u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][2u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][3u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][8u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][9u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][10u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][16u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][17u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][24u] == 0u)); ++} ++ ++// -------- func jpeg.decoder.load_mcu_blocks_for_single_component_smooth ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_csel) { ++ uint64_t v_stride16 = 0; ++ uint64_t v_offset = 0; ++ uint32_t v_dx = 0; ++ uint32_t v_dy = 0; ++ uint32_t v_mx = 0; ++ uint32_t v_my = 0; ++ uint8_t v_q = 0; ++ uint32_t v_q_00 = 0; ++ uint32_t v_q_xy = 0; ++ uint8_t v_al = 0; ++ uint32_t v_scratch = 0; ++ uint32_t v_limit = 0; ++ ++ v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u))); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16)); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ } ++ v_dy = 0u; ++ while (v_dy < 5u) { ++ v_my = wuffs_base__u32__min(self->private_impl.f_block_smoothing_my_max_incl, wuffs_base__u32__sat_sub((a_my + v_dy), 2u)); ++ v_dx = 0u; ++ while (v_dx < 5u) { ++ v_mx = wuffs_base__u32__min(self->private_impl.f_block_smoothing_mx_max_incl, wuffs_base__u32__sat_sub((a_mx + v_dx), 2u)); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(v_mx)) * 128u) + (((uint64_t)(v_my)) * v_stride16)); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_load_host_endian(&self->private_impl.f_block_smoothing_dc_values[v_dy][v_dx], 1u * (size_t)2u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ } ++ v_dx += 1u; ++ } ++ v_dy += 1u; ++ } ++ v_q = self->private_impl.f_components_tq[a_csel]; ++ v_q_00 = ((uint32_t)(self->private_impl.f_quant_tables[v_q][0u])); ++ if (v_q_00 <= 0u) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (0u != (16u & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][6u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][7u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][8u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][9u])) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(152u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + 128u)) / 256u))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + 128u)) / 256u))); ++ } ++ self->private_data.f_mcu_blocks[0u][0u] = ((uint16_t)(v_scratch)); ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][3u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][3u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][3u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][10u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][10u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][10u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][17u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][17u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][17u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][24u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][24u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][24u] = ((uint16_t)(v_scratch)); ++ } ++ } else { ++ v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u]; ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u])); ++ if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) { ++ v_limit = ((((uint32_t)(1u)) << v_al) - 1u); ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } else { ++ v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } ++ self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch)); ++ } ++ v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u]; ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u])); ++ if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) { ++ v_limit = ((((uint32_t)(1u)) << v_al) - 1u); ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } else { ++ v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } ++ self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch)); ++ } ++ v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u]; ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u])); ++ if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) { ++ v_limit = ((((uint32_t)(1u)) << v_al) - 1u); ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } else { ++ v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } ++ self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch)); ++ } ++ v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u]; ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u])); ++ if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) { ++ v_limit = ((((uint32_t)(1u)) << v_al) - 1u); ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } else { ++ v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } ++ self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch)); ++ } ++ v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u]; ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u])); ++ if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) { ++ v_limit = ((((uint32_t)(1u)) << v_al) - 1u); ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } else { ++ v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } ++ self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch)); ++ } ++ } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.decode_mcu ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ return (*self->private_impl.choosy_decode_mcu)(self, a_dst, a_workbuf, a_mx, a_my); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu__choosy_default( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ uint32_t v_ret = 0; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint8_t v_csel = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint32_t v_pos = 0; ++ uint8_t v_dc_h = 0; ++ uint32_t v_dc_symbol = 0; ++ uint32_t v_dc_ht_fast = 0; ++ uint32_t v_dc_bl = 0; ++ uint32_t v_dc_code = 0; ++ uint32_t v_dc_blm1 = 0; ++ uint32_t v_dc_ht_slow = 0; ++ uint16_t v_dc_value = 0; ++ uint16_t v_dc_extend = 0; ++ const uint16_t* v_ac_huff_table_fast = NULL; ++ uint8_t v_ac_h = 0; ++ uint32_t v_ac_symbol = 0; ++ uint32_t v_ac_ht_fast = 0; ++ uint32_t v_ac_bl = 0; ++ uint32_t v_ac_code = 0; ++ uint32_t v_ac_blm1 = 0; ++ uint32_t v_ac_ht_slow = 0; ++ uint16_t v_ac_value = 0; ++ uint16_t v_ac_extend = 0; ++ uint32_t v_ac_rrrr = 0; ++ uint32_t v_ac_ssss = 0; ++ uint32_t v_z = 0; ++ uint32_t v_mcb = 0; ++ uint64_t v_stride = 0; ++ uint64_t v_offset = 0; ++ ++ v_bits = self->private_impl.f_bitstream_bits; ++ v_n_bits = self->private_impl.f_bitstream_n_bits; ++ if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { ++ return 2u; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi), ++ ((uint64_t)(self->private_impl.f_bitstream_ri))); ++ do { ++ while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { ++ while (self->private_impl.f_mcu_zig_index <= 0u) { ++ wuffs_private_impl__bulk_memset(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, 0u); ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block]; ++ v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)])); ++ v_dc_bl = (v_dc_ht_fast >> 8u); ++ if (v_n_bits >= v_dc_bl) { ++ v_dc_symbol = (15u & v_dc_ht_fast); ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ v_bits <<= (v_dc_bl & 63u); ++ v_n_bits -= v_dc_bl; ++ } else { ++ v_dc_code = ((uint32_t)((v_bits >> 55u))); ++ v_dc_blm1 = 8u; ++ v_bits <<= 9u; ++ v_n_bits -= 9u; ++ while (true) { ++ v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1]; ++ if (v_dc_code < (v_dc_ht_slow >> 8u)) { ++ v_dc_symbol = (15u & ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_dc_h][(255u & ((uint32_t)(v_dc_code + v_dc_ht_slow)))]))); ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ break; ++ } ++ v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u); ++ if (v_dc_blm1 == 0u) { ++ v_dc_symbol = 0u; ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ break; ++ } ++ } ++ } ++ v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_dc_value += ((uint16_t)(v_dc_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_dc_symbol; ++ v_n_bits -= v_dc_symbol; ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_data.f_mcu_blocks[0u][0u] = self->private_impl.f_mcu_previous_dc_values[v_csel]; ++ self->private_impl.f_mcu_zig_index = 1u; ++ break; ++ } ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ if (v_n_bits < 16u) { ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ } ++ v_z = 1u; ++ self->private_impl.f_mcu_zig_index = 0u; ++ v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[self->private_impl.f_mcu_current_block]; ++ v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; ++ while (v_z < 64u) { ++ v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_ac_bl = (v_ac_ht_fast >> 8u); ++ if (v_n_bits >= v_ac_bl) { ++ v_ac_symbol = (255u & v_ac_ht_fast); ++ v_bits <<= (v_ac_bl & 63u); ++ v_n_bits -= v_ac_bl; ++ } else { ++ v_ac_code = ((uint32_t)((v_bits >> 55u))); ++ v_ac_blm1 = 8u; ++ v_bits <<= 9u; ++ v_n_bits -= 9u; ++ while (true) { ++ v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; ++ if (v_ac_code < (v_ac_ht_slow >> 8u)) { ++ v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); ++ break; ++ } ++ v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); ++ if (v_ac_blm1 == 0u) { ++ v_ac_symbol = 0u; ++ break; ++ } ++ } ++ } ++ v_ac_rrrr = (v_ac_symbol >> 4u); ++ v_z += (v_ac_rrrr + 1u); ++ v_ac_ssss = (v_ac_symbol & 15u); ++ v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss]; ++ if (v_ac_ssss > 0u) { ++ v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_ac_value += ((uint16_t)(v_ac_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_ac_ssss; ++ v_n_bits -= v_ac_ssss; ++ self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[v_z]] = v_ac_value; ++ } else if (v_ac_rrrr < 15u) { ++ break; ++ } ++ } ++ v_mcb = self->private_impl.f_mcu_current_block; ++ self->private_impl.f_mcu_current_block += 1u; ++ if (self->private_impl.f_test_only_interrupt_decode_mcu) { ++ goto label__goto_done__break; ++ } ++ if ( ! self->private_impl.f_swizzle_immediately) { ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]]; ++ v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])); ++ v_offset = (self->private_impl.f_mcu_blocks_offset[v_mcb] + (((uint64_t)(self->private_impl.f_mcu_blocks_mx_mul[v_mcb])) * ((uint64_t)(a_mx))) + (((uint64_t)(self->private_impl.f_mcu_blocks_my_mul[v_mcb])) * ((uint64_t)(a_my)))); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_jpeg__decoder__decode_idct(self, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); ++ } ++ } else if (self->private_impl.f_num_components == 1u) { ++ wuffs_jpeg__decoder__decode_idct(self, wuffs_base__make_slice_u8(self->private_data.f_swizzle_immediately_buffer, 64), 8u, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); ++ self->private_impl.f_swizzle_immediately_status = wuffs_jpeg__decoder__swizzle_gray(self, ++ a_dst, ++ wuffs_base__make_slice_u8(self->private_data.f_swizzle_immediately_buffer, 64), ++ ((a_mx + 0u) * 8u), ++ ((a_mx + 1u) * 8u), ++ ((a_my + 0u) * 8u), ++ ((a_my + 1u) * 8u), ++ 8u); ++ if ( ! wuffs_base__status__is_ok(&self->private_impl.f_swizzle_immediately_status)) { ++ v_ret = 3u; ++ goto label__goto_done__break; ++ } ++ break; ++ } else { ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]]; ++ v_stride = (8u * ((uint64_t)(self->private_impl.f_components_h[v_csel]))); ++ wuffs_jpeg__decoder__decode_idct(self, wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, self->private_impl.f_swizzle_immediately_b_offsets[v_mcb], 640), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); ++ if (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { ++ continue; ++ } ++ self->private_impl.f_swizzle_immediately_status = wuffs_jpeg__decoder__swizzle_colorful(self, ++ a_dst, ++ wuffs_base__utility__empty_slice_u8(), ++ ((a_mx + 0u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_h))), ++ ((a_mx + 1u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_h))), ++ ((a_my + 0u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_v))), ++ ((a_my + 1u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_v)))); ++ if ( ! wuffs_base__status__is_ok(&self->private_impl.f_swizzle_immediately_status)) { ++ v_ret = 3u; ++ goto label__goto_done__break; ++ } ++ break; ++ } ++ } ++ self->private_impl.f_mcu_current_block = 0u; ++ } while (0); ++ label__goto_done__break:; ++ v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); ++ if (v_pos > self->private_impl.f_bitstream_wi) { ++ v_ret = 2u; ++ } else { ++ self->private_impl.f_bitstream_ri = v_pos; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ self->private_impl.f_bitstream_bits = v_bits; ++ self->private_impl.f_bitstream_n_bits = v_n_bits; ++ return v_ret; ++} ++ ++// -------- func jpeg.decoder.decode_mcu_progressive_ac_high_bits ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ uint32_t v_ret = 0; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint32_t v_pos = 0; ++ const uint16_t* v_ac_huff_table_fast = NULL; ++ uint8_t v_ac_h = 0; ++ uint32_t v_ac_symbol = 0; ++ uint32_t v_ac_ht_fast = 0; ++ uint32_t v_ac_bl = 0; ++ uint32_t v_ac_code = 0; ++ uint32_t v_ac_blm1 = 0; ++ uint32_t v_ac_ht_slow = 0; ++ uint16_t v_ac_value = 0; ++ uint16_t v_ac_extend = 0; ++ uint32_t v_ac_rrrr = 0; ++ uint32_t v_ac_ssss = 0; ++ uint32_t v_z = 0; ++ ++ if (self->private_impl.f_eob_run > 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_eob_run -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ return 0u; ++ } ++ v_bits = self->private_impl.f_bitstream_bits; ++ v_n_bits = self->private_impl.f_bitstream_n_bits; ++ if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { ++ return 2u; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi), ++ ((uint64_t)(self->private_impl.f_bitstream_ri))); ++ do { ++ do { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ if (v_n_bits < 16u) { ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ } ++ v_z = self->private_impl.f_mcu_zig_index; ++ self->private_impl.f_mcu_zig_index = 0u; ++ v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u]; ++ v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; ++ while (v_z <= ((uint32_t)(self->private_impl.f_scan_se))) { ++ v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_ac_bl = (v_ac_ht_fast >> 8u); ++ if (v_n_bits >= v_ac_bl) { ++ v_ac_symbol = (255u & v_ac_ht_fast); ++ v_bits <<= (v_ac_bl & 63u); ++ v_n_bits -= v_ac_bl; ++ } else { ++ v_ac_code = ((uint32_t)((v_bits >> 55u))); ++ v_ac_blm1 = 8u; ++ v_bits <<= 9u; ++ v_n_bits -= 9u; ++ while (true) { ++ v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; ++ if (v_ac_code < (v_ac_ht_slow >> 8u)) { ++ v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); ++ break; ++ } ++ v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); ++ if (v_ac_blm1 == 0u) { ++ v_ac_symbol = 0u; ++ break; ++ } ++ } ++ } ++ v_ac_rrrr = (v_ac_symbol >> 4u); ++ v_z += (v_ac_rrrr + 1u); ++ v_ac_ssss = (v_ac_symbol & 15u); ++ v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss]; ++ if (v_ac_ssss > 0u) { ++ v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_ac_value += ((uint16_t)(v_ac_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_ac_ssss; ++ v_n_bits -= v_ac_ssss; ++ self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[v_z]] = ((uint16_t)(((uint16_t)(v_ac_value << self->private_impl.f_scan_al)))); ++ } else if (v_ac_rrrr < 15u) { ++ self->private_impl.f_eob_run = ((uint16_t)(((uint16_t)(((uint16_t)(((uint16_t)(1u)) << v_ac_rrrr)) - 1u)))); ++ if (v_ac_rrrr > 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_ac_rrrr; ++ v_n_bits -= v_ac_rrrr; ++ } ++ break; ++ } ++ } ++ } while (0); ++ } while (0); ++ label__goto_done__break:; ++ v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); ++ if (v_pos > self->private_impl.f_bitstream_wi) { ++ v_ret = 2u; ++ } else { ++ self->private_impl.f_bitstream_ri = v_pos; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ self->private_impl.f_bitstream_bits = v_bits; ++ self->private_impl.f_bitstream_n_bits = v_n_bits; ++ return v_ret; ++} ++ ++// -------- func jpeg.decoder.decode_mcu_progressive_ac_low_bit ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ uint32_t v_ret = 0; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint16_t v_one_lshift_scan_al = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint32_t v_pos = 0; ++ const uint16_t* v_ac_huff_table_fast = NULL; ++ uint8_t v_ac_h = 0; ++ uint32_t v_ac_symbol = 0; ++ uint32_t v_ac_ht_fast = 0; ++ uint32_t v_ac_bl = 0; ++ uint32_t v_ac_code = 0; ++ uint32_t v_ac_blm1 = 0; ++ uint32_t v_ac_ht_slow = 0; ++ uint16_t v_ac_value = 0; ++ uint32_t v_ac_rrrr = 0; ++ uint32_t v_ac_ssss = 0; ++ uint8_t v_unzig = 0; ++ bool v_bit = false; ++ ++ v_bits = self->private_impl.f_bitstream_bits; ++ v_n_bits = self->private_impl.f_bitstream_n_bits; ++ v_one_lshift_scan_al = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al)); ++ if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { ++ return 2u; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi), ++ ((uint64_t)(self->private_impl.f_bitstream_ri))); ++ do { ++ do { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ while (true) { ++ if (self->private_impl.f_eob_run > 0u) { ++ break; ++ } ++ v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u]; ++ v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; ++ while (true) { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); ++ v_ac_bl = (v_ac_ht_fast >> 8u); ++ if (v_n_bits >= v_ac_bl) { ++ v_ac_symbol = (255u & v_ac_ht_fast); ++ v_bits <<= (v_ac_bl & 63u); ++ v_n_bits -= v_ac_bl; ++ } else { ++ v_ac_code = ((uint32_t)((v_bits >> 55u))); ++ v_ac_blm1 = 8u; ++ v_bits <<= 9u; ++ v_n_bits -= 9u; ++ while (true) { ++ v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; ++ if (v_ac_code < (v_ac_ht_slow >> 8u)) { ++ v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); ++ break; ++ } ++ v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); ++ if (v_ac_blm1 == 0u) { ++ v_ac_symbol = 0u; ++ break; ++ } ++ } ++ } ++ v_ac_rrrr = (v_ac_symbol >> 4u); ++ v_ac_ssss = (v_ac_symbol & 15u); ++ v_ac_value = 0u; ++ if (v_ac_ssss > 0u) { ++ v_ac_value = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al)); ++ if ((v_bits >> 63u) == 0u) { ++ v_ac_value = ((uint16_t)(((uint16_t)(65535u)) << self->private_impl.f_scan_al)); ++ } ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ } else if (v_ac_rrrr < 15u) { ++ self->private_impl.f_eob_run = ((uint16_t)(((uint16_t)(1u)) << v_ac_rrrr)); ++ if (v_ac_rrrr > 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_ac_rrrr; ++ v_n_bits -= v_ac_rrrr; ++ } ++ goto label__goto_do_eob__break; ++ } ++ while (true) { ++ v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]; ++ if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) { ++ if (v_n_bits == 0u) { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ } ++ v_bit = ((v_bits >> 63u) > 0u); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ if (v_bit) { ++ if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ } ++ } else if (v_ac_rrrr <= 0u) { ++ break; ++ } else { ++ v_ac_rrrr -= 1u; ++ } ++ if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { ++ break; ++ } ++ self->private_impl.f_mcu_zig_index += 1u; ++ } ++ if (v_ac_value != 0u) { ++ self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]] = v_ac_value; ++ } ++ if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { ++ break; ++ } ++ self->private_impl.f_mcu_zig_index += 1u; ++ } ++ goto label__block__break; ++ } ++ label__goto_do_eob__break:; ++ if (self->private_impl.f_eob_run <= 0u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ while (true) { ++ v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]; ++ if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) { ++ if (v_n_bits == 0u) { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ } ++ v_bit = ((v_bits >> 63u) > 0u); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ if (v_bit) { ++ if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ } ++ } ++ if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { ++ break; ++ } ++ self->private_impl.f_mcu_zig_index += 1u; ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_eob_run -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } while (0); ++ label__block__break:; ++ } while (0); ++ label__goto_done__break:; ++ v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); ++ if (v_pos > self->private_impl.f_bitstream_wi) { ++ v_ret = 2u; ++ } else { ++ self->private_impl.f_bitstream_ri = v_pos; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ self->private_impl.f_bitstream_bits = v_bits; ++ self->private_impl.f_bitstream_n_bits = v_n_bits; ++ return v_ret; ++} ++ ++// -------- func jpeg.decoder.decode_mcu_progressive_dc_high_bits ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ uint32_t v_ret = 0; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint8_t v_csel = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint32_t v_pos = 0; ++ uint8_t v_dc_h = 0; ++ uint32_t v_dc_symbol = 0; ++ uint32_t v_dc_ht_fast = 0; ++ uint32_t v_dc_bl = 0; ++ uint32_t v_dc_code = 0; ++ uint32_t v_dc_blm1 = 0; ++ uint32_t v_dc_ht_slow = 0; ++ uint16_t v_dc_value = 0; ++ uint16_t v_dc_extend = 0; ++ ++ v_bits = self->private_impl.f_bitstream_bits; ++ v_n_bits = self->private_impl.f_bitstream_n_bits; ++ if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { ++ return 2u; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi), ++ ((uint64_t)(self->private_impl.f_bitstream_ri))); ++ do { ++ while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ do { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block]; ++ v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)])); ++ v_dc_bl = (v_dc_ht_fast >> 8u); ++ if (v_n_bits >= v_dc_bl) { ++ v_dc_symbol = (15u & v_dc_ht_fast); ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ v_bits <<= (v_dc_bl & 63u); ++ v_n_bits -= v_dc_bl; ++ } else { ++ v_dc_code = ((uint32_t)((v_bits >> 55u))); ++ v_dc_blm1 = 8u; ++ v_bits <<= 9u; ++ v_n_bits -= 9u; ++ while (true) { ++ v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1]; ++ if (v_dc_code < (v_dc_ht_slow >> 8u)) { ++ v_dc_symbol = (15u & ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_dc_h][(255u & ((uint32_t)(v_dc_code + v_dc_ht_slow)))]))); ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ break; ++ } ++ v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u); ++ if (v_dc_blm1 == 0u) { ++ v_dc_symbol = 0u; ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ break; ++ } ++ } ++ } ++ v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_dc_value += ((uint16_t)(v_dc_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_dc_symbol; ++ v_n_bits -= v_dc_symbol; ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_data.f_mcu_blocks[self->private_impl.f_mcu_current_block][0u] = ((uint16_t)(self->private_impl.f_mcu_previous_dc_values[v_csel] << self->private_impl.f_scan_al)); ++ } while (0); ++ self->private_impl.f_mcu_current_block += 1u; ++ } ++ self->private_impl.f_mcu_current_block = 0u; ++ } while (0); ++ label__goto_done__break:; ++ v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); ++ if (v_pos > self->private_impl.f_bitstream_wi) { ++ v_ret = 2u; ++ } else { ++ self->private_impl.f_bitstream_ri = v_pos; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ self->private_impl.f_bitstream_bits = v_bits; ++ self->private_impl.f_bitstream_n_bits = v_n_bits; ++ return v_ret; ++} ++ ++// -------- func jpeg.decoder.decode_mcu_progressive_dc_low_bit ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ uint32_t v_ret = 0; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint16_t v_one_lshift_scan_al = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint32_t v_pos = 0; ++ ++ v_bits = self->private_impl.f_bitstream_bits; ++ v_n_bits = self->private_impl.f_bitstream_n_bits; ++ v_one_lshift_scan_al = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al)); ++ if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { ++ return 2u; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi), ++ ((uint64_t)(self->private_impl.f_bitstream_ri))); ++ do { ++ while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ do { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ if ((v_bits >> 63u) != 0u) { ++ self->private_data.f_mcu_blocks[self->private_impl.f_mcu_current_block][0u] |= v_one_lshift_scan_al; ++ } ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ } while (0); ++ self->private_impl.f_mcu_current_block += 1u; ++ } ++ self->private_impl.f_mcu_current_block = 0u; ++ } while (0); ++ label__goto_done__break:; ++ v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); ++ if (v_pos > self->private_impl.f_bitstream_wi) { ++ v_ret = 2u; ++ } else { ++ self->private_impl.f_bitstream_ri = v_pos; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ self->private_impl.f_bitstream_bits = v_bits; ++ self->private_impl.f_bitstream_n_bits = v_n_bits; ++ return v_ret; ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_json__error__bad_c0_control_code[] = "#json: bad C0 control code"; ++const char wuffs_json__error__bad_utf_8[] = "#json: bad UTF-8"; ++const char wuffs_json__error__bad_backslash_escape[] = "#json: bad backslash-escape"; ++const char wuffs_json__error__bad_input[] = "#json: bad input"; ++const char wuffs_json__error__bad_new_line_in_a_string[] = "#json: bad new-line in a string"; ++const char wuffs_json__error__bad_quirk_combination[] = "#json: bad quirk combination"; ++const char wuffs_json__error__unsupported_number_length[] = "#json: unsupported number length"; ++const char wuffs_json__error__unsupported_recursion_depth[] = "#json: unsupported recursion depth"; ++const char wuffs_json__error__internal_error_inconsistent_i_o[] = "#json: internal error: inconsistent I/O"; ++ ++// ---------------- Private Consts ++ ++#define WUFFS_JSON__DECODER_NUMBER_LENGTH_MAX_INCL 99u ++ ++static const uint8_t ++WUFFS_JSON__LUT_BACKSLASHES[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 3u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 162u, 0u, 0u, 0u, 0u, 5u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 175u, ++ 7u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 4u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 220u, 0u, 0u, 0u, ++ 0u, 1u, 136u, 0u, 0u, 2u, 140u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 138u, 0u, ++ 0u, 0u, 141u, 0u, 137u, 0u, 6u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 1u, 3u, 4u, 5u, 6u, 7u, 10u, ++}; ++ ++static const uint8_t ++WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 7u, 27u, 10u, 63u, 39u, 11u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_JSON__LUT_CHARS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u, ++ 136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u, ++ 144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u, ++ 152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u, ++ 0u, 0u, 1u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 2u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 32u, 32u, 3u, 3u, 3u, 3u, 3u, 3u, ++ 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, ++ 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, ++ 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, ++ 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, ++ 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, ++ 5u, 5u, 5u, 5u, 5u, 32u, 32u, 32u, ++ 32u, 32u, 32u, 32u, 32u, 32u, 32u, 32u, ++}; ++ ++#define WUFFS_JSON__CLASS_WHITESPACE 0u ++ ++#define WUFFS_JSON__CLASS_STRING 1u ++ ++#define WUFFS_JSON__CLASS_COMMA 2u ++ ++#define WUFFS_JSON__CLASS_COLON 3u ++ ++#define WUFFS_JSON__CLASS_NUMBER 4u ++ ++#define WUFFS_JSON__CLASS_OPEN_CURLY_BRACE 5u ++ ++#define WUFFS_JSON__CLASS_CLOSE_CURLY_BRACE 6u ++ ++#define WUFFS_JSON__CLASS_OPEN_SQUARE_BRACKET 7u ++ ++#define WUFFS_JSON__CLASS_CLOSE_SQUARE_BRACKET 8u ++ ++#define WUFFS_JSON__CLASS_FALSE 9u ++ ++#define WUFFS_JSON__CLASS_TRUE 10u ++ ++#define WUFFS_JSON__CLASS_NULL_NAN_INF 11u ++ ++#define WUFFS_JSON__CLASS_COMMENT 12u ++ ++#define WUFFS_JSON__EXPECT_VALUE 7858u ++ ++#define WUFFS_JSON__EXPECT_NON_STRING_VALUE 7856u ++ ++#define WUFFS_JSON__EXPECT_STRING 4098u ++ ++#define WUFFS_JSON__EXPECT_COMMA 4100u ++ ++#define WUFFS_JSON__EXPECT_COLON 4104u ++ ++#define WUFFS_JSON__EXPECT_NUMBER 4112u ++ ++#define WUFFS_JSON__EXPECT_CLOSE_CURLY_BRACE 4160u ++ ++#define WUFFS_JSON__EXPECT_CLOSE_SQUARE_BRACKET 4352u ++ ++static const uint8_t ++WUFFS_JSON__LUT_CLASSES[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 0u, 0u, 15u, 15u, 0u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 0u, 15u, 1u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 11u, 2u, 4u, 15u, 12u, ++ 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, ++ 4u, 4u, 3u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 11u, 15u, 15u, 15u, 15u, 11u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 7u, 15u, 8u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 9u, 15u, ++ 15u, 11u, 15u, 15u, 15u, 15u, 11u, 15u, ++ 15u, 15u, 15u, 15u, 10u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 5u, 15u, 6u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++}; ++ ++static const uint8_t ++WUFFS_JSON__LUT_DECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u, ++ 136u, 137u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u, ++ 136u, 137u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 138u, 139u, 140u, 141u, 142u, 143u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 138u, 139u, 140u, 141u, 142u, 143u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++}; ++ ++#define WUFFS_JSON__QUIRKS_BASE 1225364480u ++ ++#define WUFFS_JSON__QUIRKS_COUNT 21u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_json__decoder__decode_number( ++ wuffs_json__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_json__decoder__decode_digits( ++ wuffs_json__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_n); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_leading( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_comment( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_inf_nan( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_trailer( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++// ---------------- VTables ++ ++const wuffs_base__token_decoder__func_ptrs ++wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__token_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_json__decoder__decode_tokens), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_json__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_json__decoder__set_quirk), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_json__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_json__decoder__initialize( ++ wuffs_json__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name = ++ wuffs_base__token_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers = ++ (const void*)(&wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_json__decoder* ++wuffs_json__decoder__alloc(void) { ++ wuffs_json__decoder* x = ++ (wuffs_json__decoder*)(calloc(1, sizeof(wuffs_json__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_json__decoder__initialize( ++ x, sizeof(wuffs_json__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_json__decoder(void) { ++ return sizeof(wuffs_json__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func json.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_json__decoder__get_quirk( ++ const wuffs_json__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ uint32_t v_key = 0; ++ ++ if (a_key >= 1225364480u) { ++ v_key = (a_key - 1225364480u); ++ if (v_key < 21u) { ++ if (self->private_impl.f_quirks[v_key]) { ++ return 1u; ++ } ++ } ++ } ++ return 0u; ++} ++ ++// -------- func json.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_json__decoder__set_quirk( ++ wuffs_json__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (a_key >= 1225364480u) { ++ a_key -= 1225364480u; ++ if (a_key < 21u) { ++ self->private_impl.f_quirks[a_key] = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func json.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_json__decoder__workbuf_len( ++ const wuffs_json__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__empty_range_ii_u64(); ++} ++ ++// -------- func json.decoder.decode_tokens ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_json__decoder__decode_tokens( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_vminor = 0; ++ uint32_t v_number_length = 0; ++ uint32_t v_number_status = 0; ++ uint32_t v_string_length = 0; ++ uint32_t v_whitespace_length = 0; ++ uint32_t v_depth = 0; ++ uint32_t v_stack_byte = 0; ++ uint32_t v_stack_bit = 0; ++ uint32_t v_match = 0; ++ uint32_t v_c32 = 0; ++ uint8_t v_c8 = 0; ++ uint8_t v_backslash = 0; ++ uint8_t v_char = 0; ++ uint8_t v_class = 0; ++ uint32_t v_multi_byte_utf8 = 0; ++ uint8_t v_backslash_x_ok = 0; ++ uint8_t v_backslash_x_value = 0; ++ uint32_t v_backslash_x_string = 0; ++ uint8_t v_uni4_ok = 0; ++ uint64_t v_uni4_string = 0; ++ uint32_t v_uni4_value = 0; ++ uint32_t v_uni4_high_surrogate = 0; ++ uint8_t v_uni8_ok = 0; ++ uint64_t v_uni8_string = 0; ++ uint32_t v_uni8_value = 0; ++ uint32_t v_expect = 0; ++ uint32_t v_expect_after_value = 0; ++ ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_tokens; ++ if (coro_susp_point) { ++ v_depth = self->private_data.s_decode_tokens.v_depth; ++ v_expect = self->private_data.s_decode_tokens.v_expect; ++ v_expect_after_value = self->private_data.s_decode_tokens.v_expect_after_value; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_end_of_data) { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (self->private_impl.f_quirks[18u]) { ++ if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u] || self->private_impl.f_quirks[17u]) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_quirk_combination); ++ goto exit; ++ } ++ } ++ if (self->private_impl.f_quirks[15u] || self->private_impl.f_quirks[16u]) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_json__decoder__decode_leading(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ v_expect = 7858u; ++ label__outer__continue:; ++ while (true) { ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ goto label__outer__continue; ++ } ++ v_whitespace_length = 0u; ++ v_c8 = 0u; ++ v_class = 0u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (v_whitespace_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_whitespace_length = 0u; ++ } ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ goto label__outer__continue; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ v_class = WUFFS_JSON__LUT_CLASSES[v_c8]; ++ if (v_class != 0u) { ++ break; ++ } ++ iop_a_src += 1u; ++ if (v_whitespace_length >= 65534u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(65535u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_whitespace_length = 0u; ++ goto label__outer__continue; ++ } ++ v_whitespace_length += 1u; ++ } ++ if (v_whitespace_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_whitespace_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__outer__continue; ++ } ++ } ++ if (0u == (v_expect & (((uint32_t)(1u)) << v_class))) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ if (v_class == 1u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ label__string_loop_outer__continue:; ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ continue; ++ } ++ v_string_length = 0u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ } ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ goto label__string_loop_outer__continue; ++ } ++ while (((uint64_t)(io2_a_src - iop_a_src)) > 4u) { ++ v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ if (0u != (WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 0u))] | ++ WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 8u))] | ++ WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 16u))] | ++ WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 24u))])) { ++ break; ++ } ++ iop_a_src += 4u; ++ if (v_string_length > 65527u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ goto label__string_loop_outer__continue; ++ } ++ v_string_length += 4u; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ v_char = WUFFS_JSON__LUT_CHARS[v_c8]; ++ if (v_char == 0u) { ++ iop_a_src += 1u; ++ if (v_string_length >= 65531u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(65532u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ goto label__string_loop_outer__continue; ++ } ++ v_string_length += 1u; ++ continue; ++ } else if (v_char == 1u) { ++ if (v_string_length != 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ } ++ goto label__string_loop_outer__break; ++ } else if (v_char == 2u) { ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ goto label__string_loop_outer__continue; ++ } ++ v_c8 = ((uint8_t)(((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u)))); ++ v_backslash = WUFFS_JSON__LUT_BACKSLASHES[v_c8]; ++ if (((uint8_t)(v_backslash & 128u)) != 0u) { ++ iop_a_src += 2u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | ((uint32_t)(((uint8_t)(v_backslash & 127u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } else if (v_backslash != 0u) { ++ if (self->private_impl.f_quirks[WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[((uint8_t)(v_backslash & 7u))]]) { ++ iop_a_src += 2u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | ((uint32_t)(WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[((uint8_t)(v_backslash & 7u))]))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ } else if (v_c8 == 117u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ goto label__string_loop_outer__continue; ++ } ++ v_uni4_string = (((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))) >> 16u); ++ v_uni4_value = 0u; ++ v_uni4_ok = 128u; ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u); ++ if (v_uni4_ok == 0u) { ++ } else if ((v_uni4_value < 55296u) || (57343u < v_uni4_value)) { ++ iop_a_src += 6u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } else if (v_uni4_value >= 56320u) { ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 12u) { ++ if (a_src && a_src->meta.closed) { ++ if (self->private_impl.f_quirks[20u]) { ++ iop_a_src += 6u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ goto label__string_loop_outer__continue; ++ } ++ v_uni4_string = (wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 4u) >> 16u); ++ if (((255u & (v_uni4_string >> 0u)) != 92u) || ((255u & (v_uni4_string >> 8u)) != 117u)) { ++ v_uni4_high_surrogate = 0u; ++ v_uni4_value = 0u; ++ v_uni4_ok = 0u; ++ } else { ++ v_uni4_high_surrogate = (65536u + ((v_uni4_value - 55296u) << 10u)); ++ v_uni4_value = 0u; ++ v_uni4_ok = 128u; ++ v_uni4_string >>= 16u; ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u); ++ } ++ if ((v_uni4_ok != 0u) && (56320u <= v_uni4_value) && (v_uni4_value <= 57343u)) { ++ v_uni4_value -= 56320u; ++ iop_a_src += 12u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | v_uni4_high_surrogate | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(12u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (self->private_impl.f_quirks[20u]) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) { ++ status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ iop_a_src += 6u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ } else if ((v_c8 == 85u) && self->private_impl.f_quirks[2u]) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 10u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ goto label__string_loop_outer__continue; ++ } ++ v_uni8_string = wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 2u); ++ v_uni8_value = 0u; ++ v_uni8_ok = 128u; ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 0u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 28u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 8u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 24u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 16u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 20u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 24u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 16u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 32u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 40u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 48u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 56u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u); ++ if (v_uni8_ok == 0u) { ++ } else if ((v_uni8_value < 55296u) || ((57343u < v_uni8_value) && (v_uni8_value <= 1114111u))) { ++ iop_a_src += 10u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | (v_uni8_value & 2097151u)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } else if (self->private_impl.f_quirks[20u]) { ++ iop_a_src += 10u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ } else if ((v_c8 == 120u) && self->private_impl.f_quirks[9u]) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ goto label__string_loop_outer__continue; ++ } ++ v_backslash_x_string = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ v_backslash_x_ok = 128u; ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 16u))]; ++ v_backslash_x_ok &= v_c8; ++ v_backslash_x_value = ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 & 15u)) << 4u)))); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 24u))]; ++ v_backslash_x_ok &= v_c8; ++ v_backslash_x_value = ((uint8_t)(((uint8_t)(v_backslash_x_value | ((uint8_t)(v_c8 & 15u)))))); ++ if ((v_backslash_x_ok == 0u) || ((v_backslash_x_string & 65535u) != 30812u)) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ iop_a_src += 4u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | ((uint32_t)(v_backslash_x_value))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } else if (v_char == 3u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (a_src && a_src->meta.closed) { ++ if (self->private_impl.f_quirks[20u]) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); ++ goto label__string_loop_outer__continue; ++ } ++ v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ if ((v_multi_byte_utf8 & 49152u) == 32768u) { ++ v_multi_byte_utf8 = ((1984u & ((uint32_t)(v_multi_byte_utf8 << 6u))) | (63u & (v_multi_byte_utf8 >> 8u))); ++ iop_a_src += 2u; ++ if (v_string_length >= 65528u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_string_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ goto label__string_loop_outer__continue; ++ } ++ v_string_length += 2u; ++ continue; ++ } ++ } else if (v_char == 4u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (a_src && a_src->meta.closed) { ++ if (self->private_impl.f_quirks[20u]) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12); ++ goto label__string_loop_outer__continue; ++ } ++ v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); ++ if ((v_multi_byte_utf8 & 12632064u) == 8421376u) { ++ v_multi_byte_utf8 = ((61440u & ((uint32_t)(v_multi_byte_utf8 << 12u))) | (4032u & (v_multi_byte_utf8 >> 2u)) | (63u & (v_multi_byte_utf8 >> 16u))); ++ if ((2047u < v_multi_byte_utf8) && ((v_multi_byte_utf8 < 55296u) || (57343u < v_multi_byte_utf8))) { ++ iop_a_src += 3u; ++ if (v_string_length >= 65528u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_string_length + 3u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ goto label__string_loop_outer__continue; ++ } ++ v_string_length += 3u; ++ continue; ++ } ++ } ++ } else if (v_char == 5u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (a_src && a_src->meta.closed) { ++ if (self->private_impl.f_quirks[20u]) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(13); ++ goto label__string_loop_outer__continue; ++ } ++ v_multi_byte_utf8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ if ((v_multi_byte_utf8 & 3233857536u) == 2155905024u) { ++ v_multi_byte_utf8 = ((1835008u & ((uint32_t)(v_multi_byte_utf8 << 18u))) | ++ (258048u & ((uint32_t)(v_multi_byte_utf8 << 4u))) | ++ (4032u & (v_multi_byte_utf8 >> 10u)) | ++ (63u & (v_multi_byte_utf8 >> 24u))); ++ if ((65535u < v_multi_byte_utf8) && (v_multi_byte_utf8 <= 1114111u)) { ++ iop_a_src += 4u; ++ if (v_string_length >= 65528u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ goto label__string_loop_outer__continue; ++ } ++ v_string_length += 4u; ++ continue; ++ } ++ } ++ } ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (((uint8_t)(v_char & 128u)) != 0u) { ++ if (self->private_impl.f_quirks[0u]) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | ((uint32_t)(((uint8_t)(v_char & 127u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ goto label__string_loop_outer__continue; ++ } ++ if (v_char == 138u) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_new_line_in_a_string); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_c0_control_code); ++ goto exit; ++ } ++ if (self->private_impl.f_quirks[20u]) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); ++ goto exit; ++ } ++ } ++ label__string_loop_outer__break:; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(14); ++ continue; ++ } ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(15); ++ continue; ++ } ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ break; ++ } ++ if (0u == (v_expect & (((uint32_t)(1u)) << 4u))) { ++ v_expect = 4104u; ++ goto label__outer__continue; ++ } ++ break; ++ } else if (v_class == 2u) { ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (0u == (v_expect & (((uint32_t)(1u)) << 8u))) { ++ if (self->private_impl.f_quirks[13u]) { ++ v_expect = 4162u; ++ } else { ++ v_expect = 4098u; ++ } ++ } else { ++ if (self->private_impl.f_quirks[13u]) { ++ v_expect = 8114u; ++ } else { ++ v_expect = 7858u; ++ } ++ } ++ goto label__outer__continue; ++ } else if (v_class == 3u) { ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 7858u; ++ goto label__outer__continue; ++ } else if (v_class == 4u) { ++ while (true) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_number_length = wuffs_json__decoder__decode_number(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ v_number_status = (v_number_length >> 8u); ++ v_vminor = 10486787u; ++ if ((v_number_length & 128u) != 0u) { ++ v_vminor = 10486785u; ++ } ++ v_number_length = (v_number_length & 127u); ++ if (v_number_status == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_number_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ break; ++ } ++ while (v_number_length > 0u) { ++ v_number_length -= 1u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ } ++ if (v_number_status == 1u) { ++ if (self->private_impl.f_quirks[14u]) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } else if (v_number_status == 2u) { ++ status = wuffs_base__make_status(wuffs_json__error__unsupported_number_length); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(17); ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(18); ++ } ++ } ++ } ++ break; ++ } else if (v_class == 5u) { ++ v_vminor = 2113553u; ++ if (v_depth == 0u) { ++ } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) { ++ v_vminor = 2113601u; ++ } else { ++ v_vminor = 2113569u; ++ } ++ if (v_depth >= 1024u) { ++ status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth); ++ goto exit; ++ } ++ v_stack_byte = (v_depth / 32u); ++ v_stack_bit = (v_depth & 31u); ++ self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(1u)) << v_stack_bit); ++ v_depth += 1u; ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 4162u; ++ v_expect_after_value = 4164u; ++ goto label__outer__continue; ++ } else if (v_class == 6u) { ++ iop_a_src += 1u; ++ if (v_depth <= 1u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2101314u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__outer__break; ++ } ++ v_depth -= 1u; ++ v_stack_byte = ((v_depth - 1u) / 32u); ++ v_stack_bit = ((v_depth - 1u) & 31u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2105410u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 4356u; ++ v_expect_after_value = 4356u; ++ } else { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2113602u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 4164u; ++ v_expect_after_value = 4164u; ++ } ++ goto label__outer__continue; ++ } else if (v_class == 7u) { ++ v_vminor = 2105361u; ++ if (v_depth == 0u) { ++ } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) { ++ v_vminor = 2105409u; ++ } else { ++ v_vminor = 2105377u; ++ } ++ if (v_depth >= 1024u) { ++ status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth); ++ goto exit; ++ } ++ v_stack_byte = (v_depth / 32u); ++ v_stack_bit = (v_depth & 31u); ++ self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(1u)) << v_stack_bit)); ++ v_depth += 1u; ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 8114u; ++ v_expect_after_value = 4356u; ++ goto label__outer__continue; ++ } else if (v_class == 8u) { ++ iop_a_src += 1u; ++ if (v_depth <= 1u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2101282u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__outer__break; ++ } ++ v_depth -= 1u; ++ v_stack_byte = ((v_depth - 1u) / 32u); ++ v_stack_bit = ((v_depth - 1u) & 31u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2105378u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 4356u; ++ v_expect_after_value = 4356u; ++ } else { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2113570u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 4164u; ++ v_expect_after_value = 4164u; ++ } ++ goto label__outer__continue; ++ } else if (v_class == 9u) { ++ v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 111546413966853u); ++ if (v_match == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(8388612u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(5u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) { ++ status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ iop_a_src += 5u; ++ break; ++ } else if (v_match == 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(19); ++ goto label__outer__continue; ++ } ++ } else if (v_class == 10u) { ++ v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 435762131972u); ++ if (v_match == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(8388616u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ iop_a_src += 4u; ++ break; ++ } else if (v_match == 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(20); ++ goto label__outer__continue; ++ } ++ } else if (v_class == 11u) { ++ v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 465676103172u); ++ if (v_match == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(8388610u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ iop_a_src += 4u; ++ break; ++ } else if (v_match == 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(21); ++ goto label__outer__continue; ++ } ++ if (self->private_impl.f_quirks[14u]) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); ++ status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ break; ++ } ++ } else if (v_class == 12u) { ++ if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u]) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); ++ status = wuffs_json__decoder__decode_comment(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_comment_type > 0u) { ++ goto label__outer__continue; ++ } ++ } ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ if (v_depth == 0u) { ++ break; ++ } ++ v_expect = v_expect_after_value; ++ } ++ label__outer__break:; ++ if (self->private_impl.f_quirks[17u] || self->private_impl.f_quirks[18u]) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); ++ status = wuffs_json__decoder__decode_trailer(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ self->private_impl.f_end_of_data = true; ++ ++ ok: ++ self->private_impl.p_decode_tokens = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_tokens = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_data.s_decode_tokens.v_depth = v_depth; ++ self->private_data.s_decode_tokens.v_expect = v_expect; ++ self->private_data.s_decode_tokens.v_expect_after_value = v_expect_after_value; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func json.decoder.decode_number ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_json__decoder__decode_number( ++ wuffs_json__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ uint8_t v_c8 = 0; ++ uint32_t v_n = 0; ++ uint32_t v_floating_point = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ do { ++ v_n = 0u; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (v_c8 != 45u) { ++ } else { ++ v_n += 1u; ++ iop_a_src += 1u; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ v_n |= 256u; ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ } ++ if (v_c8 == 48u) { ++ v_n += 1u; ++ iop_a_src += 1u; ++ } else { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (v_n > 99u) { ++ break; ++ } ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (v_c8 != 46u) { ++ } else { ++ if (v_n >= 99u) { ++ v_n |= 512u; ++ break; ++ } ++ v_n += 1u; ++ iop_a_src += 1u; ++ v_floating_point = 128u; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (v_n > 99u) { ++ break; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ } ++ if ((v_c8 != 69u) && (v_c8 != 101u)) { ++ break; ++ } ++ if (v_n >= 99u) { ++ v_n |= 512u; ++ break; ++ } ++ v_n += 1u; ++ iop_a_src += 1u; ++ v_floating_point = 128u; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ v_n |= 256u; ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if ((v_c8 != 43u) && (v_c8 != 45u)) { ++ } else { ++ if (v_n >= 99u) { ++ v_n |= 512u; ++ break; ++ } ++ v_n += 1u; ++ iop_a_src += 1u; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } while (0); ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ return (v_n | v_floating_point); ++} ++ ++// -------- func json.decoder.decode_digits ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_json__decoder__decode_digits( ++ wuffs_json__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_n) { ++ uint8_t v_c8 = 0; ++ uint32_t v_n = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ v_n = a_n; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (0u == WUFFS_JSON__LUT_DECIMAL_DIGITS[v_c8]) { ++ break; ++ } ++ if (v_n >= 99u) { ++ v_n |= 512u; ++ break; ++ } ++ v_n += 1u; ++ iop_a_src += 1u; ++ } ++ if (v_n == a_n) { ++ v_n |= 256u; ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ return v_n; ++} ++ ++// -------- func json.decoder.decode_leading ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_leading( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_u = 0; ++ ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_leading; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_allow_leading_ars = self->private_impl.f_quirks[15u]; ++ self->private_impl.f_allow_leading_ubom = self->private_impl.f_quirks[16u]; ++ while (self->private_impl.f_allow_leading_ars || self->private_impl.f_allow_leading_ubom) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ continue; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if ((v_c8 == 30u) && self->private_impl.f_allow_leading_ars) { ++ self->private_impl.f_allow_leading_ars = false; ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ continue; ++ } else if ((v_c8 == 239u) && self->private_impl.f_allow_leading_ubom) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { ++ if (a_src && a_src->meta.closed) { ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ continue; ++ } ++ v_u = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); ++ if (v_u == 12565487u) { ++ self->private_impl.f_allow_leading_ubom = false; ++ iop_a_src += 3u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ continue; ++ } ++ } ++ break; ++ } ++ ++ ok: ++ self->private_impl.p_decode_leading = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_leading = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func json.decoder.decode_comment ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_comment( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint16_t v_c16 = 0; ++ uint32_t v_length = 0; ++ ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_comment; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_comment_type = 0u; ++ while ((((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) || (((uint64_t)(io2_a_src - iop_a_src)) <= 1u)) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } ++ v_c16 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ if ((v_c16 == 10799u) && self->private_impl.f_quirks[11u]) { ++ iop_a_src += 2u; ++ v_length = 2u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) { ++ if (v_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ } ++ v_length = 0u; ++ continue; ++ } ++ v_c16 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ if (v_c16 == 12074u) { ++ iop_a_src += 2u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)((v_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ self->private_impl.f_comment_type = 1u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ iop_a_src += 1u; ++ if (v_length >= 65533u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ } ++ v_length = 0u; ++ continue; ++ } ++ v_length += 1u; ++ } ++ } else if ((v_c16 == 12079u) && self->private_impl.f_quirks[12u]) { ++ iop_a_src += 2u; ++ v_length = 2u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ self->private_impl.f_comment_type = 2u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } else if (v_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ } ++ v_length = 0u; ++ continue; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (v_c8 == 10u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ self->private_impl.f_comment_type = 2u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ iop_a_src += 1u; ++ if (v_length >= 65533u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ } ++ v_length = 0u; ++ continue; ++ } ++ v_length += 1u; ++ } ++ } ++ ++ ok: ++ self->private_impl.p_decode_comment = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_comment = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func json.decoder.decode_inf_nan ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_inf_nan( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_c32 = 0; ++ uint32_t v_neg = 0; ++ ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_inf_nan; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 2u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ continue; ++ } ++ v_c32 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); ++ if ((v_c32 | 2105376u) == 6712937u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) > 7u) { ++ if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) | 2314885530818453536u) == 8751735898823356009u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(8u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 8u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ } else if ( ! (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ continue; ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 3u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } else if ((v_c32 | 2105376u) == 7233902u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(10485888u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 3u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } else if ((v_c32 & 255u) == 43u) { ++ v_neg = 0u; ++ } else if ((v_c32 & 255u) == 45u) { ++ v_neg = 1u; ++ } else { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 3u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ continue; ++ } ++ v_c32 = (wuffs_base__peek_u32le__no_bounds_check(iop_a_src) >> 8u); ++ if ((v_c32 | 2105376u) == 6712937u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) > 8u) { ++ if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 1u) | 2314885530818453536u) == 8751735898823356009u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 9u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ } else if ( ! (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ continue; ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 4u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } else if ((v_c32 | 2105376u) == 7233902u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((10485760u | (((uint32_t)(128u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 4u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ ++ ok: ++ self->private_impl.p_decode_inf_nan = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_inf_nan = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func json.decoder.decode_trailer ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_trailer( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_whitespace_length = 0; ++ ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_trailer; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_quirks[18u]) { ++ self->private_impl.f_trailer_stop = 10u; ++ } else { ++ self->private_impl.f_trailer_stop = 0u; ++ } ++ label__outer__continue:; ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } ++ v_whitespace_length = 0u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (v_whitespace_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ if (a_src && a_src->meta.closed) { ++ goto label__outer__break; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ goto label__outer__continue; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (WUFFS_JSON__LUT_CLASSES[v_c8] != 0u) { ++ if (v_whitespace_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ if (self->private_impl.f_trailer_stop > 0u) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_json__decoder__decode_comment(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_comment_type > 0u) { ++ goto label__outer__continue; ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ iop_a_src += 1u; ++ if ((v_whitespace_length >= 65534u) || (v_c8 == self->private_impl.f_trailer_stop)) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)((v_whitespace_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (v_c8 == self->private_impl.f_trailer_stop) { ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ goto label__outer__continue; ++ } ++ v_whitespace_length += 1u; ++ } ++ } ++ label__outer__break:; ++ ++ ok: ++ self->private_impl.p_decode_trailer = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_trailer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_lzma__error__bad_lzma2_header[] = "#lzma: bad LZMA2 header"; ++const char wuffs_lzma__error__bad_bitstream_trailer[] = "#lzma: bad bitstream trailer"; ++const char wuffs_lzma__error__bad_code[] = "#lzma: bad code"; ++const char wuffs_lzma__error__bad_decoded_length[] = "#lzma: bad decoded length"; ++const char wuffs_lzma__error__bad_distance[] = "#lzma: bad distance"; ++const char wuffs_lzma__error__bad_header[] = "#lzma: bad header"; ++const char wuffs_lzma__error__truncated_input[] = "#lzma: truncated input"; ++const char wuffs_lzma__error__unsupported_decoded_length[] = "#lzma: unsupported decoded length"; ++const char wuffs_lzma__error__unsupported_properties[] = "#lzma: unsupported properties"; ++const char wuffs_lzma__error__internal_error_inconsistent_i_o[] = "#lzma: internal error: inconsistent I/O"; ++const char wuffs_lzma__error__internal_error_inconsistent_dictionary_state[] = "#lzma: internal error: inconsistent dictionary state"; ++ ++// ---------------- Private Consts ++ ++static const uint8_t ++WUFFS_LZMA__STATE_TRANSITION_LITERAL[12] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 1u, 2u, 3u, 4u, ++ 5u, 6u, 4u, 5u, ++}; ++ ++static const uint8_t ++WUFFS_LZMA__STATE_TRANSITION_MATCH[12] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 7u, 7u, 7u, 7u, 7u, 7u, 7u, 10u, ++ 10u, 10u, 10u, 10u, ++}; ++ ++static const uint8_t ++WUFFS_LZMA__STATE_TRANSITION_LONGREP[12] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 8u, 8u, 8u, 8u, 8u, 8u, 8u, 11u, ++ 11u, 11u, 11u, 11u, ++}; ++ ++static const uint8_t ++WUFFS_LZMA__STATE_TRANSITION_SHORTREP[12] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 9u, 9u, 9u, 9u, 9u, 9u, 9u, 11u, ++ 11u, 11u, 11u, 11u, ++}; ++ ++static const uint8_t ++WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 1u, 2u, 3u, 3u, 3u, 3u, 3u, ++}; ++ ++#define WUFFS_LZMA__QUIRKS_BASE 1348001792u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream_fast( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream_slow( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__add_history( ++ wuffs_lzma__decoder* self, ++ wuffs_base__slice_u8 a_hist, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__do_transform_io( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__update_stashed_bytes( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_optional_end_of_stream( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzma__decoder__initialize_dict( ++ wuffs_lzma__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzma__decoder__initialize_probs( ++ wuffs_lzma__decoder* self); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_lzma__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzma__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_lzma__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_lzma__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_lzma__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzma__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_lzma__decoder__initialize( ++ wuffs_lzma__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_lzma__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_lzma__decoder* ++wuffs_lzma__decoder__alloc(void) { ++ wuffs_lzma__decoder* x = ++ (wuffs_lzma__decoder*)(calloc(1, sizeof(wuffs_lzma__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_lzma__decoder__initialize( ++ x, sizeof(wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_lzma__decoder(void) { ++ return sizeof(wuffs_lzma__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func lzma.decoder.decode_bitstream_fast ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream_fast( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_range = 0; ++ uint32_t v_state = 0; ++ uint32_t v_rep0 = 0; ++ uint32_t v_rep1 = 0; ++ uint32_t v_rep2 = 0; ++ uint32_t v_rep3 = 0; ++ uint32_t v_reptmp = 0; ++ uint32_t v_rep = 0; ++ uint64_t v_pos = 0; ++ uint64_t v_pos_end = 0; ++ uint32_t v_lc = 0; ++ uint64_t v_lp_mask = 0; ++ uint64_t v_pb_mask = 0; ++ uint32_t v_prob = 0; ++ uint32_t v_threshold = 0; ++ uint32_t v_tree_node = 0; ++ uint8_t v_prev_byte = 0; ++ uint32_t v_match_byte = 0; ++ uint32_t v_match_cusp = 0; ++ uint32_t v_len_state = 0; ++ uint32_t v_slot = 0; ++ uint32_t v_len = 0; ++ uint32_t v_lanl_offset = 0; ++ uint32_t v_lanl_old_offset = 0; ++ uint32_t v_lanl_index = 0; ++ uint32_t v_num_extra_bits = 0; ++ uint32_t v_dist_extra_bits = 0; ++ uint32_t v_high_bit_was_on = 0; ++ uint32_t v_i = 0; ++ uint32_t v_index_ao00 = 0; ++ uint32_t v_index_ao41 = 0; ++ uint32_t v_index_lit = 0; ++ uint32_t v_index_len = 0; ++ uint32_t v_index_small_dist_base = 0; ++ uint32_t v_index_small_dist_extra = 0; ++ uint32_t v_index_small_dist = 0; ++ uint32_t v_index_large_dist = 0; ++ uint32_t v_dist = 0; ++ uint32_t v_adj_dist = 0; ++ uint64_t v_wb_index = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ v_prev_byte = self->private_impl.f_stashed_bytes[0u]; ++ v_match_byte = ((uint32_t)(self->private_impl.f_stashed_bytes[1u])); ++ v_bits = self->private_impl.f_stashed_bits; ++ v_range = self->private_impl.f_stashed_range; ++ v_state = self->private_impl.f_stashed_state; ++ v_rep0 = self->private_impl.f_stashed_rep0; ++ v_rep1 = self->private_impl.f_stashed_rep1; ++ v_rep2 = self->private_impl.f_stashed_rep2; ++ v_rep3 = self->private_impl.f_stashed_rep3; ++ v_pos = self->private_impl.f_stashed_pos; ++ v_pos_end = self->private_impl.f_stashed_pos_end; ++ v_lc = self->private_impl.f_lc; ++ v_lp_mask = ((((uint64_t)(1u)) << self->private_impl.f_lp) - 1u); ++ v_pb_mask = ((((uint64_t)(1u)) << self->private_impl.f_pb) - 1u); ++ while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 282u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 48u)) { ++ if (v_pos >= v_pos_end) { ++ self->private_impl.f_end_of_chunk = true; ++ break; ++ } ++ v_index_ao00 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask)))); ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao00[v_index_ao00])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_lit = (15u & ((((uint32_t)((v_pos & v_lp_mask))) << v_lc) | (((uint32_t)(v_prev_byte)) >> (8u - v_lc)))); ++ v_lanl_offset = 0u; ++ if (v_state >= 7u) { ++ v_lanl_offset = 256u; ++ } ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_match_byte <<= 1u; ++ v_lanl_old_offset = v_lanl_offset; ++ v_lanl_offset &= v_match_byte; ++ v_lanl_index = (v_lanl_offset + v_lanl_old_offset + v_tree_node); ++ v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_lanl_index])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_lanl_offset = ((v_lanl_offset ^ v_lanl_old_offset) & 256u); ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_prev_byte = ((uint8_t)(v_tree_node)); ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_prev_byte), iop_a_dst += 1); ++ v_pos += 1u; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LITERAL[v_state])); ++ continue; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao20[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len_state = ((uint32_t)(WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[(v_tree_node & 7u)])); ++ v_len = ((v_tree_node & 7u) + 2u); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 10u); ++ v_len_state = 3u; ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_high[0u][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 255u) + 18u); ++ v_len_state = 3u; ++ } while (0); ++ v_slot = 1u; ++ while (v_slot < 64u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_slot[v_len_state][v_slot])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob)); ++ v_slot = (v_slot << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob)); ++ v_slot = ((v_slot << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_slot &= 63u; ++ v_rep = v_slot; ++ if (v_slot < 4u) { ++ } else if (v_slot < 14u) { ++ v_num_extra_bits = ((v_slot >> 1u) - 1u); ++ v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits); ++ v_index_small_dist_base = ((uint32_t)(v_rep - v_slot)); ++ v_index_small_dist_extra = 1u; ++ v_dist_extra_bits = 0u; ++ v_i = 0u; ++ while (v_i < v_num_extra_bits) { ++ v_index_small_dist = (((uint32_t)(v_index_small_dist_base + v_index_small_dist_extra)) & 127u); ++ v_prob = ((uint32_t)(self->private_data.f_probs_small_dist[v_index_small_dist])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob)); ++ v_index_small_dist_extra = ((uint32_t)(v_index_small_dist_extra << 1u)); ++ v_i += 1u; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob)); ++ v_index_small_dist_extra = (((uint32_t)(v_index_small_dist_extra << 1u)) | 1u); ++ v_dist_extra_bits |= (((uint32_t)(1u)) << v_i); ++ v_i += 1u; ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_rep += v_dist_extra_bits; ++ } else { ++ v_num_extra_bits = ((v_slot >> 1u) - 1u); ++ v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits); ++ v_dist_extra_bits = 0u; ++ while (true) { ++ v_range >>= 1u; ++ v_bits -= v_range; ++ v_high_bit_was_on = ((uint32_t)(0u - (v_bits >> 31u))); ++ v_bits += (v_range & v_high_bit_was_on); ++ v_dist_extra_bits = (((uint32_t)(v_dist_extra_bits << 1u)) | (((uint32_t)(v_high_bit_was_on + 1u)) & 1u)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_num_extra_bits -= 1u; ++ if (v_num_extra_bits <= 4u) { ++ break; ++ } ++ } ++ v_dist_extra_bits <<= 4u; ++ v_index_large_dist = 1u; ++ while (true) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_large_dist[v_index_large_dist])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob)); ++ v_index_large_dist = (15u & ((uint32_t)(v_index_large_dist << 1u))); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob)); ++ v_index_large_dist = (15u & (((uint32_t)(v_index_large_dist << 1u)) | 1u)); ++ v_dist_extra_bits |= (((uint32_t)(1u)) << (4u - v_num_extra_bits)); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_num_extra_bits -= 1u; ++ if (v_num_extra_bits <= 0u) { ++ break; ++ } ++ } ++ v_rep += v_dist_extra_bits; ++ } ++ if (v_rep >= 4294967295u) { ++ self->private_impl.f_end_of_chunk = true; ++ goto label__outer__break; ++ } ++ v_rep3 = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_rep; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_MATCH[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao40[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ v_index_ao41 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask)))); ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao41[v_index_ao41])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_len = 1u; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_SHORTREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao60[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao63[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep3; ++ v_rep3 = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } ++ } ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 2u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 10u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_high[0u][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 255u) + 18u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ } while (0); ++ } while (0); ++ v_dist = (v_rep0 + 1u); ++ if ((((uint64_t)(v_dist)) > v_pos) || (((uint64_t)(v_dist)) > ((uint64_t)(self->private_impl.f_dict_size)))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_distance); ++ goto exit; ++ } ++ v_pos += ((uint64_t)(v_len)); ++ if (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_adj_dist > self->private_impl.f_dict_seen) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_distance); ++ goto exit; ++ } ++ v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist)))); ++ while (v_wb_index >= 9223372036854775808u) { ++ v_wb_index += ((uint64_t)(self->private_impl.f_dict_size)); ++ } ++ if (v_wb_index >= ((uint64_t)(a_workbuf.len))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ if (v_len < v_adj_dist) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,(v_len + 1u), wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_match_byte = ((uint32_t)(iop_a_dst[-1])); ++ iop_a_dst--; ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_prev_byte = iop_a_dst[-1]; ++ continue; ++ } else if (v_len == v_adj_dist) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_len, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history( ++ &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist); ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_match_byte = ((uint32_t)(iop_a_dst[-1])); ++ iop_a_dst--; ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_prev_byte = iop_a_dst[-1]; ++ continue; ++ } ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_adj_dist, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ v_len -= v_adj_dist; ++ if ((((uint64_t)(v_len)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_len + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst)))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ } ++ if (v_dist >= 8u) { ++ v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist); ++ v_match_byte = (v_match_cusp >> 8u); ++ v_prev_byte = ((uint8_t)(v_match_cusp)); ++ } else { ++ v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist); ++ v_match_byte = (v_match_cusp >> 8u); ++ v_prev_byte = ((uint8_t)(v_match_cusp)); ++ } ++ } ++ label__outer__break:; ++ self->private_impl.f_stashed_bytes[0u] = v_prev_byte; ++ self->private_impl.f_stashed_bytes[1u] = ((uint8_t)(v_match_byte)); ++ self->private_impl.f_stashed_bits = v_bits; ++ self->private_impl.f_stashed_range = v_range; ++ self->private_impl.f_stashed_state = v_state; ++ self->private_impl.f_stashed_rep0 = v_rep0; ++ self->private_impl.f_stashed_rep1 = v_rep1; ++ self->private_impl.f_stashed_rep2 = v_rep2; ++ self->private_impl.f_stashed_rep3 = v_rep3; ++ self->private_impl.f_stashed_pos = v_pos; ++ self->private_impl.f_stashed_pos_end = v_pos_end; ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func lzma.decoder.decode_bitstream_slow ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream_slow( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_range = 0; ++ uint32_t v_state = 0; ++ uint32_t v_rep0 = 0; ++ uint32_t v_rep1 = 0; ++ uint32_t v_rep2 = 0; ++ uint32_t v_rep3 = 0; ++ uint32_t v_reptmp = 0; ++ uint32_t v_rep = 0; ++ uint64_t v_pos = 0; ++ uint64_t v_pos_end = 0; ++ uint32_t v_lc = 0; ++ uint64_t v_lp_mask = 0; ++ uint64_t v_pb_mask = 0; ++ uint32_t v_prob = 0; ++ uint32_t v_threshold = 0; ++ uint32_t v_tree_node = 0; ++ uint8_t v_prev_byte = 0; ++ uint32_t v_match_byte = 0; ++ uint32_t v_match_cusp = 0; ++ uint32_t v_len_state = 0; ++ uint32_t v_slot = 0; ++ uint32_t v_len = 0; ++ uint32_t v_lanl_offset = 0; ++ uint32_t v_lanl_old_offset = 0; ++ uint32_t v_lanl_index = 0; ++ uint32_t v_num_extra_bits = 0; ++ uint32_t v_dist_extra_bits = 0; ++ uint32_t v_high_bit_was_on = 0; ++ uint32_t v_i = 0; ++ uint32_t v_index_ao00 = 0; ++ uint32_t v_index_ao41 = 0; ++ uint32_t v_index_lit = 0; ++ uint32_t v_index_len = 0; ++ uint32_t v_index_small_dist_base = 0; ++ uint32_t v_index_small_dist_extra = 0; ++ uint32_t v_index_small_dist = 0; ++ uint32_t v_index_large_dist = 0; ++ uint32_t v_dist = 0; ++ uint32_t v_adj_dist = 0; ++ uint64_t v_wb_index = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_bitstream_slow; ++ if (coro_susp_point) { ++ v_bits = self->private_data.s_decode_bitstream_slow.v_bits; ++ v_range = self->private_data.s_decode_bitstream_slow.v_range; ++ v_state = self->private_data.s_decode_bitstream_slow.v_state; ++ v_rep0 = self->private_data.s_decode_bitstream_slow.v_rep0; ++ v_rep1 = self->private_data.s_decode_bitstream_slow.v_rep1; ++ v_rep2 = self->private_data.s_decode_bitstream_slow.v_rep2; ++ v_rep3 = self->private_data.s_decode_bitstream_slow.v_rep3; ++ v_rep = self->private_data.s_decode_bitstream_slow.v_rep; ++ v_pos = self->private_data.s_decode_bitstream_slow.v_pos; ++ v_pos_end = self->private_data.s_decode_bitstream_slow.v_pos_end; ++ v_lc = self->private_data.s_decode_bitstream_slow.v_lc; ++ v_lp_mask = self->private_data.s_decode_bitstream_slow.v_lp_mask; ++ v_pb_mask = self->private_data.s_decode_bitstream_slow.v_pb_mask; ++ v_tree_node = self->private_data.s_decode_bitstream_slow.v_tree_node; ++ v_prev_byte = self->private_data.s_decode_bitstream_slow.v_prev_byte; ++ v_match_byte = self->private_data.s_decode_bitstream_slow.v_match_byte; ++ v_len_state = self->private_data.s_decode_bitstream_slow.v_len_state; ++ v_slot = self->private_data.s_decode_bitstream_slow.v_slot; ++ v_len = self->private_data.s_decode_bitstream_slow.v_len; ++ v_lanl_offset = self->private_data.s_decode_bitstream_slow.v_lanl_offset; ++ v_num_extra_bits = self->private_data.s_decode_bitstream_slow.v_num_extra_bits; ++ v_dist_extra_bits = self->private_data.s_decode_bitstream_slow.v_dist_extra_bits; ++ v_i = self->private_data.s_decode_bitstream_slow.v_i; ++ v_index_lit = self->private_data.s_decode_bitstream_slow.v_index_lit; ++ v_index_len = self->private_data.s_decode_bitstream_slow.v_index_len; ++ v_index_small_dist_base = self->private_data.s_decode_bitstream_slow.v_index_small_dist_base; ++ v_index_small_dist_extra = self->private_data.s_decode_bitstream_slow.v_index_small_dist_extra; ++ v_index_large_dist = self->private_data.s_decode_bitstream_slow.v_index_large_dist; ++ v_dist = self->private_data.s_decode_bitstream_slow.v_dist; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ v_prev_byte = self->private_impl.f_stashed_bytes[0u]; ++ v_match_byte = ((uint32_t)(self->private_impl.f_stashed_bytes[1u])); ++ v_bits = self->private_impl.f_stashed_bits; ++ v_range = self->private_impl.f_stashed_range; ++ v_state = self->private_impl.f_stashed_state; ++ v_rep0 = self->private_impl.f_stashed_rep0; ++ v_rep1 = self->private_impl.f_stashed_rep1; ++ v_rep2 = self->private_impl.f_stashed_rep2; ++ v_rep3 = self->private_impl.f_stashed_rep3; ++ v_pos = self->private_impl.f_stashed_pos; ++ v_pos_end = self->private_impl.f_stashed_pos_end; ++ v_lc = self->private_impl.f_lc; ++ v_lp_mask = ((((uint64_t)(1u)) << self->private_impl.f_lp) - 1u); ++ v_pb_mask = ((((uint64_t)(1u)) << self->private_impl.f_pb) - 1u); ++ while ( ! (self->private_impl.p_decode_bitstream_slow != 0)) { ++ if (v_pos >= v_pos_end) { ++ self->private_impl.f_end_of_chunk = true; ++ break; ++ } ++ v_index_ao00 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask)))); ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao00[v_index_ao00])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_lit = (15u & ((((uint32_t)((v_pos & v_lp_mask))) << v_lc) | (((uint32_t)(v_prev_byte)) >> (8u - v_lc)))); ++ if (v_state >= 7u) { ++ v_lanl_offset = 256u; ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_match_byte <<= 1u; ++ v_lanl_old_offset = v_lanl_offset; ++ v_lanl_offset &= v_match_byte; ++ v_lanl_index = (v_lanl_offset + v_lanl_old_offset + v_tree_node); ++ v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_lanl_index])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_lanl_offset = ((v_lanl_offset ^ v_lanl_old_offset) & 256u); ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ } else { ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ } ++ v_prev_byte = ((uint8_t)(v_tree_node)); ++ self->private_data.s_decode_bitstream_slow.scratch = v_prev_byte; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (iop_a_dst == io2_a_dst) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ goto suspend; ++ } ++ *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_bitstream_slow.scratch)); ++ v_pos += 1u; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LITERAL[v_state])); ++ continue; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao20[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len_state = ((uint32_t)(WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[(v_tree_node & 7u)])); ++ v_len = ((v_tree_node & 7u) + 2u); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_7 = *iop_a_src++; ++ v_c8 = t_7; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_8 = *iop_a_src++; ++ v_c8 = t_8; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_9 = *iop_a_src++; ++ v_c8 = t_9; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 10u); ++ v_len_state = 3u; ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_10 = *iop_a_src++; ++ v_c8 = t_10; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_high[0u][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_11 = *iop_a_src++; ++ v_c8 = t_11; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 255u) + 18u); ++ v_len_state = 3u; ++ } while (0); ++ v_slot = 1u; ++ while (v_slot < 64u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_slot[v_len_state][v_slot])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob)); ++ v_slot = (v_slot << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob)); ++ v_slot = ((v_slot << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_12 = *iop_a_src++; ++ v_c8 = t_12; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_slot &= 63u; ++ v_rep = v_slot; ++ if (v_slot < 4u) { ++ } else if (v_slot < 14u) { ++ v_num_extra_bits = ((v_slot >> 1u) - 1u); ++ v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits); ++ v_index_small_dist_base = ((uint32_t)(v_rep - v_slot)); ++ v_index_small_dist_extra = 1u; ++ v_dist_extra_bits = 0u; ++ v_i = 0u; ++ while (v_i < v_num_extra_bits) { ++ v_index_small_dist = (((uint32_t)(v_index_small_dist_base + v_index_small_dist_extra)) & 127u); ++ v_prob = ((uint32_t)(self->private_data.f_probs_small_dist[v_index_small_dist])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob)); ++ v_index_small_dist_extra = ((uint32_t)(v_index_small_dist_extra << 1u)); ++ v_i += 1u; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob)); ++ v_index_small_dist_extra = (((uint32_t)(v_index_small_dist_extra << 1u)) | 1u); ++ v_dist_extra_bits |= (((uint32_t)(1u)) << v_i); ++ v_i += 1u; ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_13 = *iop_a_src++; ++ v_c8 = t_13; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_rep += v_dist_extra_bits; ++ } else { ++ v_num_extra_bits = ((v_slot >> 1u) - 1u); ++ v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits); ++ v_dist_extra_bits = 0u; ++ while (true) { ++ v_range >>= 1u; ++ v_bits -= v_range; ++ v_high_bit_was_on = ((uint32_t)(0u - (v_bits >> 31u))); ++ v_bits += (v_range & v_high_bit_was_on); ++ v_dist_extra_bits = (((uint32_t)(v_dist_extra_bits << 1u)) | (((uint32_t)(v_high_bit_was_on + 1u)) & 1u)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_14 = *iop_a_src++; ++ v_c8 = t_14; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_num_extra_bits -= 1u; ++ if (v_num_extra_bits <= 4u) { ++ break; ++ } ++ } ++ v_dist_extra_bits <<= 4u; ++ v_index_large_dist = 1u; ++ while (true) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_large_dist[v_index_large_dist])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob)); ++ v_index_large_dist = (15u & ((uint32_t)(v_index_large_dist << 1u))); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob)); ++ v_index_large_dist = (15u & (((uint32_t)(v_index_large_dist << 1u)) | 1u)); ++ v_dist_extra_bits |= (((uint32_t)(1u)) << (4u - v_num_extra_bits)); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_15 = *iop_a_src++; ++ v_c8 = t_15; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_num_extra_bits -= 1u; ++ if (v_num_extra_bits <= 0u) { ++ break; ++ } ++ } ++ v_rep += v_dist_extra_bits; ++ } ++ if (v_rep >= 4294967295u) { ++ self->private_impl.f_end_of_chunk = true; ++ goto label__outer__break; ++ } ++ v_rep3 = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_rep; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_MATCH[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_16 = *iop_a_src++; ++ v_c8 = t_16; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao40[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_17 = *iop_a_src++; ++ v_c8 = t_17; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_ao41 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask)))); ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao41[v_index_ao41])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_18 = *iop_a_src++; ++ v_c8 = t_18; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_len = 1u; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_SHORTREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_19 = *iop_a_src++; ++ v_c8 = t_19; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_20 = *iop_a_src++; ++ v_c8 = t_20; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao60[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_21 = *iop_a_src++; ++ v_c8 = t_21; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_22 = *iop_a_src++; ++ v_c8 = t_22; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao63[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(25); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_23 = *iop_a_src++; ++ v_c8 = t_23; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_24 = *iop_a_src++; ++ v_c8 = t_24; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep3; ++ v_rep3 = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } ++ } ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_25 = *iop_a_src++; ++ v_c8 = t_25; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_26 = *iop_a_src++; ++ v_c8 = t_26; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 2u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_27 = *iop_a_src++; ++ v_c8 = t_27; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_28 = *iop_a_src++; ++ v_c8 = t_28; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(31); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_29 = *iop_a_src++; ++ v_c8 = t_29; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 10u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_30 = *iop_a_src++; ++ v_c8 = t_30; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_high[0u][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_31 = *iop_a_src++; ++ v_c8 = t_31; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 255u) + 18u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ } while (0); ++ } while (0); ++ v_dist = (v_rep0 + 1u); ++ if ((((uint64_t)(v_dist)) > v_pos) || (((uint64_t)(v_dist)) > ((uint64_t)(self->private_impl.f_dict_size)))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_distance); ++ goto exit; ++ } ++ v_pos += ((uint64_t)(v_len)); ++ while (274u > ((uint64_t)(io2_a_dst - iop_a_dst))) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(34); ++ } ++ if (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_adj_dist > self->private_impl.f_dict_seen) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_distance); ++ goto exit; ++ } ++ v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist)))); ++ while (v_wb_index >= 9223372036854775808u) { ++ v_wb_index += ((uint64_t)(self->private_impl.f_dict_size)); ++ } ++ if (v_wb_index >= ((uint64_t)(a_workbuf.len))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ if (v_len < v_adj_dist) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,(v_len + 1u), wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_match_byte = ((uint32_t)(iop_a_dst[-1])); ++ iop_a_dst--; ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_prev_byte = iop_a_dst[-1]; ++ continue; ++ } else if (v_len == v_adj_dist) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_len, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history( ++ &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist); ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_match_byte = ((uint32_t)(iop_a_dst[-1])); ++ iop_a_dst--; ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_prev_byte = iop_a_dst[-1]; ++ continue; ++ } ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_adj_dist, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ v_len -= v_adj_dist; ++ if ((((uint64_t)(v_len)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst)))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ } ++ v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist); ++ v_match_byte = (v_match_cusp >> 8u); ++ v_prev_byte = ((uint8_t)(v_match_cusp)); ++ } ++ label__outer__break:; ++ self->private_impl.f_stashed_bytes[0u] = v_prev_byte; ++ self->private_impl.f_stashed_bytes[1u] = ((uint8_t)(v_match_byte)); ++ self->private_impl.f_stashed_bits = v_bits; ++ self->private_impl.f_stashed_range = v_range; ++ self->private_impl.f_stashed_state = v_state; ++ self->private_impl.f_stashed_rep0 = v_rep0; ++ self->private_impl.f_stashed_rep1 = v_rep1; ++ self->private_impl.f_stashed_rep2 = v_rep2; ++ self->private_impl.f_stashed_rep3 = v_rep3; ++ self->private_impl.f_stashed_pos = v_pos; ++ self->private_impl.f_stashed_pos_end = v_pos_end; ++ ++ ok: ++ self->private_impl.p_decode_bitstream_slow = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_bitstream_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_bitstream_slow.v_bits = v_bits; ++ self->private_data.s_decode_bitstream_slow.v_range = v_range; ++ self->private_data.s_decode_bitstream_slow.v_state = v_state; ++ self->private_data.s_decode_bitstream_slow.v_rep0 = v_rep0; ++ self->private_data.s_decode_bitstream_slow.v_rep1 = v_rep1; ++ self->private_data.s_decode_bitstream_slow.v_rep2 = v_rep2; ++ self->private_data.s_decode_bitstream_slow.v_rep3 = v_rep3; ++ self->private_data.s_decode_bitstream_slow.v_rep = v_rep; ++ self->private_data.s_decode_bitstream_slow.v_pos = v_pos; ++ self->private_data.s_decode_bitstream_slow.v_pos_end = v_pos_end; ++ self->private_data.s_decode_bitstream_slow.v_lc = v_lc; ++ self->private_data.s_decode_bitstream_slow.v_lp_mask = v_lp_mask; ++ self->private_data.s_decode_bitstream_slow.v_pb_mask = v_pb_mask; ++ self->private_data.s_decode_bitstream_slow.v_tree_node = v_tree_node; ++ self->private_data.s_decode_bitstream_slow.v_prev_byte = v_prev_byte; ++ self->private_data.s_decode_bitstream_slow.v_match_byte = v_match_byte; ++ self->private_data.s_decode_bitstream_slow.v_len_state = v_len_state; ++ self->private_data.s_decode_bitstream_slow.v_slot = v_slot; ++ self->private_data.s_decode_bitstream_slow.v_len = v_len; ++ self->private_data.s_decode_bitstream_slow.v_lanl_offset = v_lanl_offset; ++ self->private_data.s_decode_bitstream_slow.v_num_extra_bits = v_num_extra_bits; ++ self->private_data.s_decode_bitstream_slow.v_dist_extra_bits = v_dist_extra_bits; ++ self->private_data.s_decode_bitstream_slow.v_i = v_i; ++ self->private_data.s_decode_bitstream_slow.v_index_lit = v_index_lit; ++ self->private_data.s_decode_bitstream_slow.v_index_len = v_index_len; ++ self->private_data.s_decode_bitstream_slow.v_index_small_dist_base = v_index_small_dist_base; ++ self->private_data.s_decode_bitstream_slow.v_index_small_dist_extra = v_index_small_dist_extra; ++ self->private_data.s_decode_bitstream_slow.v_index_large_dist = v_index_large_dist; ++ self->private_data.s_decode_bitstream_slow.v_dist = v_dist; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func lzma.decoder.add_history ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__add_history( ++ wuffs_lzma__decoder* self, ++ wuffs_base__slice_u8 a_hist, ++ wuffs_base__slice_u8 a_workbuf) { ++ uint64_t v_dict_workbuf_index = 0; ++ uint64_t v_dict_size = 0; ++ uint64_t v_hist_length = 0; ++ wuffs_base__slice_u8 v_s = {0}; ++ uint64_t v_n_copied = 0; ++ uint64_t v_n = 0; ++ ++ v_dict_workbuf_index = ((uint64_t)(self->private_impl.f_dict_workbuf_index)); ++ v_dict_size = ((uint64_t)(self->private_impl.f_dict_size)); ++ if (((uint64_t)(a_hist.len)) == 0u) { ++ return wuffs_base__make_status(NULL); ++ } ++ if (((uint64_t)(a_workbuf.len)) < (v_dict_size + 273u)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ } ++ v_hist_length = ((uint64_t)(a_hist.len)); ++ if (v_hist_length > 4294967295u) { ++ self->private_impl.f_dict_seen = 4294967295u; ++ } else { ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dict_seen, ((uint32_t)(v_hist_length))); ++ } ++ v_s = a_hist; ++ if (((uint64_t)(v_s.len)) >= v_dict_size) { ++ v_s = wuffs_private_impl__slice_u8__suffix(v_s, v_dict_size); ++ wuffs_private_impl__slice_u8__copy_from_slice(a_workbuf, v_s); ++ self->private_impl.f_dict_workbuf_index = 0u; ++ } else if (v_dict_workbuf_index > v_dict_size) { ++ return wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ } else { ++ v_n_copied = wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__slice_u8__subslice_ij(a_workbuf, v_dict_workbuf_index, v_dict_size), v_s); ++ if (v_n_copied < ((uint64_t)(v_s.len))) { ++ v_n = wuffs_private_impl__slice_u8__copy_from_slice(a_workbuf, wuffs_base__slice_u8__subslice_i(v_s, v_n_copied)); ++ self->private_impl.f_dict_workbuf_index = ((uint32_t)(v_n)); ++ } else { ++ v_n = ((uint64_t)(v_dict_workbuf_index + v_n_copied)); ++ if (v_n < v_dict_size) { ++ self->private_impl.f_dict_workbuf_index = ((uint32_t)(v_n)); ++ } else { ++ self->private_impl.f_dict_workbuf_index = 0u; ++ } ++ } ++ } ++ if ((273u > v_dict_size) || (v_dict_size > ((uint64_t)(a_workbuf.len)))) { ++ return wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ } ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__slice_u8__subslice_i(a_workbuf, v_dict_size), wuffs_base__slice_u8__subslice_j(a_workbuf, 273u)); ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func lzma.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_lzma__decoder__get_quirk( ++ const wuffs_lzma__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (a_key == 1348001792u) { ++ if (self->private_impl.f_allow_non_zero_initial_byte) { ++ return 1u; ++ } ++ } else if (a_key == 1348001793u) { ++ return ((uint64_t)(self->private_impl.f_format_extension)); ++ } ++ return 0u; ++} ++ ++// -------- func lzma.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzma__decoder__set_quirk( ++ wuffs_lzma__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ uint32_t v_v = 0; ++ uint32_t v_n = 0; ++ ++ if (a_key == 1348001792u) { ++ self->private_impl.f_allow_non_zero_initial_byte = (a_value > 0u); ++ } else if (a_key == 1348001793u) { ++ if (a_value == 0u) { ++ self->private_impl.f_format_extension = 0u; ++ return wuffs_base__make_status(NULL); ++ } else if ((a_value & 255u) == 1u) { ++ if ((a_value >> 8u) <= 255u) { ++ self->private_impl.f_format_extension = ((uint32_t)(a_value)); ++ v_v = (self->private_impl.f_format_extension >> 8u); ++ v_n = (((uint32_t)(1u)) << (v_v & 31u)); ++ wuffs_private_impl__u32__sat_sub_indirect(&v_n, ((v_n >> 4u) * ((v_v >> 5u) & 7u))); ++ if ((v_n < 4096u) || (536870912u < v_n)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_dict_size = v_n; ++ return wuffs_base__make_status(NULL); ++ } ++ } else if ((a_value & 255u) == 2u) { ++ if ((a_value >> 8u) <= 40u) { ++ self->private_impl.f_format_extension = ((uint32_t)(a_value)); ++ v_v = (self->private_impl.f_format_extension >> 8u); ++ if (v_v < 40u) { ++ self->private_impl.f_dict_size = ((2u | (v_v & 1u)) << ((v_v >> 1u) + 11u)); ++ } else { ++ self->private_impl.f_dict_size = 4294967295u; ++ } ++ return wuffs_base__make_status(NULL); ++ } ++ } ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func lzma.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzma__decoder__dst_history_retain_length( ++ const wuffs_lzma__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_base__utility__make_optional_u63(true, 0u); ++} ++ ++// -------- func lzma.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_lzma__decoder__workbuf_len( ++ const wuffs_lzma__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ uint64_t v_m = 0; ++ ++ if (self->private_impl.f_dict_size == 0u) { ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ } ++ v_m = (((uint64_t)(self->private_impl.f_dict_size)) + 273u); ++ return wuffs_base__utility__make_range_ii_u64(v_m, v_m); ++} ++ ++// -------- func lzma.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzma__decoder__transform_io( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint64_t v_mark = 0; ++ wuffs_base__status v_dti_status = wuffs_base__make_status(NULL); ++ wuffs_base__status v_ah_status = wuffs_base__make_status(NULL); ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ wuffs_base__status t_0 = wuffs_lzma__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ v_dti_status = t_0; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ } ++ if ( ! wuffs_base__status__is_suspension(&v_dti_status)) { ++ status = v_dti_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } else if ((v_dti_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__truncated_input); ++ goto exit; ++ } ++ v_ah_status = wuffs_lzma__decoder__add_history(self, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst), a_workbuf); ++ if (wuffs_base__status__is_error(&v_ah_status)) { ++ status = v_ah_status; ++ goto exit; ++ } ++ status = v_dti_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func lzma.decoder.do_transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__do_transform_io( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_header_byte = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_c32 = 0; ++ uint8_t v_prop_byte = 0; ++ uint32_t v_lc = 0; ++ uint32_t v_lp = 0; ++ uint32_t v_pb = 0; ++ uint32_t v_length = 0; ++ uint32_t v_n_copied = 0; ++ uint64_t v_smark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; ++ if (coro_susp_point) { ++ v_header_byte = self->private_data.s_do_transform_io.v_header_byte; ++ v_length = self->private_data.s_do_transform_io.v_length; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_lzma2_need_prob_reset = true; ++ self->private_impl.f_lzma2_need_properties = true; ++ self->private_impl.f_lzma2_need_dict_reset = true; ++ while (true) { ++ if ((self->private_impl.f_format_extension & 255u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_prop_byte = t_0; ++ } ++ if (v_prop_byte >= 225u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_header); ++ goto exit; ++ } ++ v_lc = ((uint32_t)(((uint8_t)(v_prop_byte % 9u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_prop_byte /= 9u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_lp = ((uint32_t)(((uint8_t)(v_prop_byte % 5u)))); ++ v_pb = ((uint32_t)(((uint8_t)(v_prop_byte / 5u)))); ++ if ((v_lc + v_lp) > 4u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__unsupported_properties); ++ goto exit; ++ } ++ self->private_impl.f_lc = wuffs_base__u32__min(v_lc, 4u); ++ self->private_impl.f_lp = v_lp; ++ self->private_impl.f_pb = v_pb; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_c32 = t_1; ++ } ++ self->private_impl.f_dict_size = wuffs_base__u32__max(v_c32, 4096u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint64_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_2 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 56) { ++ t_2 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ self->private_impl.f_decoded_length = t_2; ++ } ++ if ((self->private_impl.f_decoded_length >= 9223372036854775808u) && (self->private_impl.f_decoded_length != 18446744073709551615u)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__unsupported_decoded_length); ++ goto exit; ++ } ++ wuffs_lzma__decoder__initialize_probs(self); ++ } else if ((self->private_impl.f_format_extension & 255u) == 1u) { ++ self->private_impl.f_lc = 3u; ++ self->private_impl.f_lp = 0u; ++ self->private_impl.f_pb = 2u; ++ self->private_impl.f_decoded_length = 18446744073709551615u; ++ wuffs_lzma__decoder__initialize_probs(self); ++ } else { ++ while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ } ++ if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) == 0u) { ++ iop_a_src += 1u; ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_header_byte = t_3; ++ } ++ if (v_header_byte < 128u) { ++ if (v_header_byte < 2u) { ++ self->private_impl.f_lzma2_need_prob_reset = true; ++ self->private_impl.f_lzma2_need_properties = true; ++ self->private_impl.f_lzma2_need_dict_reset = false; ++ wuffs_lzma__decoder__initialize_dict(self); ++ } else if ((v_header_byte > 2u) || self->private_impl.f_lzma2_need_dict_reset) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header); ++ goto exit; ++ } ++ self->private_impl.f_prev_lzma2_chunk_was_uncompressed = true; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ if (num_bits_4 == 8) { ++ t_4 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)); ++ } ++ } ++ v_c32 = t_4; ++ } ++ v_length = (1u + v_c32); ++ while (true) { ++ v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_reader( ++ &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src); ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_stashed_pos, ((uint64_t)(v_n_copied))); ++ if (v_length <= v_n_copied) { ++ break; ++ } ++ v_length -= v_n_copied; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ } else { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); ++ } ++ } ++ continue; ++ } ++ self->private_impl.f_decoded_length = ((uint64_t)(v_header_byte)); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ uint32_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); ++ if (num_bits_5 == 8) { ++ t_5 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)); ++ } ++ } ++ v_c32 = t_5; ++ } ++ self->private_impl.f_decoded_length = (((self->private_impl.f_decoded_length & 31u) << 16u) + ((uint64_t)((1u + v_c32)))); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ uint32_t t_6; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_6 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); ++ if (num_bits_6 == 8) { ++ t_6 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_6 += 8u; ++ *scratch |= ((uint64_t)(num_bits_6)); ++ } ++ } ++ v_c32 = t_6; ++ } ++ self->private_impl.f_lzma2_encoded_length_want = ((uint64_t)((1u + v_c32))); ++ if (v_header_byte >= 160u) { ++ wuffs_lzma__decoder__initialize_probs(self); ++ self->private_impl.f_lzma2_need_prob_reset = false; ++ } ++ if (v_header_byte >= 192u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_7 = *iop_a_src++; ++ v_prop_byte = t_7; ++ } ++ if (v_prop_byte >= 225u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header); ++ goto exit; ++ } ++ v_lc = ((uint32_t)(((uint8_t)(v_prop_byte % 9u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_prop_byte /= 9u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_lp = ((uint32_t)(((uint8_t)(v_prop_byte % 5u)))); ++ v_pb = ((uint32_t)(((uint8_t)(v_prop_byte / 5u)))); ++ if ((v_lc + v_lp) > 4u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header); ++ goto exit; ++ } ++ self->private_impl.f_lc = wuffs_base__u32__min(v_lc, 4u); ++ self->private_impl.f_lp = v_lp; ++ self->private_impl.f_pb = v_pb; ++ self->private_impl.f_lzma2_need_properties = false; ++ } ++ if (v_header_byte >= 224u) { ++ self->private_impl.f_lzma2_need_dict_reset = false; ++ wuffs_lzma__decoder__initialize_dict(self); ++ } else if (self->private_impl.f_prev_lzma2_chunk_was_uncompressed) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); ++ status = wuffs_lzma__decoder__update_stashed_bytes(self, a_dst, a_workbuf); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ self->private_impl.f_prev_lzma2_chunk_was_uncompressed = false; ++ if (self->private_impl.f_lzma2_need_prob_reset || self->private_impl.f_lzma2_need_properties || self->private_impl.f_lzma2_need_dict_reset) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header); ++ goto exit; ++ } ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_8 = *iop_a_src++; ++ v_c8 = t_8; ++ } ++ if ((v_c8 != 0u) && ! self->private_impl.f_allow_non_zero_initial_byte) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_code); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); ++ uint32_t t_9; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_9 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_9 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_9); ++ if (num_bits_9 == 24) { ++ t_9 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_9 += 8u; ++ *scratch |= ((uint64_t)(num_bits_9)); ++ } ++ } ++ self->private_impl.f_stashed_bits = t_9; ++ } ++ if (self->private_impl.f_stashed_bits == 4294967295u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_code); ++ goto exit; ++ } ++ self->private_impl.f_stashed_range = 4294967295u; ++ self->private_impl.f_stashed_pos_end = wuffs_base__u64__sat_add(self->private_impl.f_stashed_pos, self->private_impl.f_decoded_length); ++ if ((self->private_impl.f_stashed_pos_end == 18446744073709551615u) && (self->private_impl.f_decoded_length != 18446744073709551615u)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__unsupported_decoded_length); ++ goto exit; ++ } ++ self->private_impl.f_lzma2_encoded_length_have = 5u; ++ while (((uint64_t)(a_workbuf.len)) < (((uint64_t)(self->private_impl.f_dict_size)) + 273u)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_workbuf); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(21); ++ } ++ while (true) { ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_10 = wuffs_lzma__decoder__decode_bitstream(self, a_dst, a_src, a_workbuf); ++ v_status = t_10; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_lzma2_encoded_length_have, wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)))); ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(22); ++ } ++ if (self->private_impl.f_decoded_length == 18446744073709551615u) { ++ if (self->private_impl.f_stashed_bits != 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer); ++ goto exit; ++ } ++ } else if (self->private_impl.f_stashed_pos != self->private_impl.f_stashed_pos_end) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_decoded_length); ++ goto exit; ++ } else if (self->private_impl.f_stashed_bits != 0u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); ++ status = wuffs_lzma__decoder__decode_optional_end_of_stream(self, a_src, a_workbuf); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_stashed_bits != 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer); ++ goto exit; ++ } ++ } ++ if ((self->private_impl.f_format_extension & 255u) < 2u) { ++ break; ++ } else if (self->private_impl.f_lzma2_encoded_length_have != self->private_impl.f_lzma2_encoded_length_want) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header); ++ goto exit; ++ } ++ } ++ ++ ok: ++ self->private_impl.p_do_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_transform_io.v_header_byte = v_header_byte; ++ self->private_data.s_do_transform_io.v_length = v_length; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func lzma.decoder.decode_bitstream ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_bitstream; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_end_of_chunk = false; ++ while (true) { ++ v_status = wuffs_lzma__decoder__decode_bitstream_fast(self, a_dst, a_src, a_workbuf); ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; ++ } ++ if (self->private_impl.f_end_of_chunk) { ++ break; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_lzma__decoder__decode_bitstream_slow(self, a_dst, a_src, a_workbuf); ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_end_of_chunk) { ++ break; ++ } ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_bitstream = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_bitstream = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func lzma.decoder.update_stashed_bytes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__update_stashed_bytes( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_dist = 0; ++ uint32_t v_which = 0; ++ uint32_t v_adj_dist = 0; ++ uint64_t v_wb_index = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_update_stashed_bytes; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ v_dist = 1u; ++ v_which = 0u; ++ while (v_which < 2u) { ++ if (((uint64_t)(v_dist)) <= ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history( ++ &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist); ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ self->private_impl.f_stashed_bytes[v_which] = iop_a_dst[-1]; ++ iop_a_dst--; ++ } else { ++ v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist)))); ++ while (v_wb_index >= 9223372036854775808u) { ++ v_wb_index += ((uint64_t)(self->private_impl.f_dict_size)); ++ } ++ if (v_wb_index >= ((uint64_t)(a_workbuf.len))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ self->private_impl.f_stashed_bytes[v_which] = a_workbuf.ptr[v_wb_index]; ++ } ++ v_dist = (1u + self->private_impl.f_stashed_rep0); ++ v_which += 1u; ++ } ++ ++ ok: ++ self->private_impl.p_update_stashed_bytes = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_update_stashed_bytes = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func lzma.decoder.decode_optional_end_of_stream ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_optional_end_of_stream( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_w = &u_w; ++ uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_optional_end_of_stream; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_stashed_pos_end = 18446744073709551615u; ++ while (true) { ++ { ++ wuffs_base__io_buffer* o_0_v_w = v_w; ++ uint8_t* o_0_iop_v_w = iop_v_w; ++ uint8_t* o_0_io0_v_w = io0_v_w; ++ uint8_t* o_0_io1_v_w = io1_v_w; ++ uint8_t* o_0_io2_v_w = io2_v_w; ++ v_w = wuffs_private_impl__io_writer__set( ++ &u_w, ++ &iop_v_w, ++ &io0_v_w, ++ &io1_v_w, ++ &io2_v_w, ++ wuffs_base__utility__empty_slice_u8(), ++ 0u); ++ { ++ wuffs_base__status t_0 = wuffs_lzma__decoder__decode_bitstream_slow(self, v_w, a_src, a_workbuf); ++ v_status = t_0; ++ } ++ v_w = o_0_v_w; ++ iop_v_w = o_0_iop_v_w; ++ io0_v_w = o_0_io0_v_w; ++ io1_v_w = o_0_io1_v_w; ++ io2_v_w = o_0_io2_v_w; ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if (v_status.repr == wuffs_base__suspension__short_write) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ self->private_impl.f_stashed_pos_end = self->private_impl.f_stashed_pos; ++ ++ ok: ++ self->private_impl.p_decode_optional_end_of_stream = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_optional_end_of_stream = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func lzma.decoder.initialize_dict ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzma__decoder__initialize_dict( ++ wuffs_lzma__decoder* self) { ++ self->private_impl.f_dict_workbuf_index = 0u; ++ self->private_impl.f_dict_seen = 0u; ++ self->private_impl.f_stashed_bytes[0u] = 0u; ++ self->private_impl.f_stashed_bytes[1u] = 0u; ++ self->private_impl.f_stashed_pos = 0u; ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func lzma.decoder.initialize_probs ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzma__decoder__initialize_probs( ++ wuffs_lzma__decoder* self) { ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ ++ v_i = 0u; ++ while (v_i < 192u) { ++ self->private_data.f_probs_ao00[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 12u) { ++ self->private_data.f_probs_ao20[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 12u) { ++ self->private_data.f_probs_ao40[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 192u) { ++ self->private_data.f_probs_ao41[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 12u) { ++ self->private_data.f_probs_ao60[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 12u) { ++ self->private_data.f_probs_ao63[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_j = 0u; ++ while (v_j < 8u) { ++ self->private_data.f_probs_match_len_low[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_j = 0u; ++ while (v_j < 8u) { ++ self->private_data.f_probs_match_len_mid[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 256u) { ++ self->private_data.f_probs_match_len_high[0u][v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_j = 0u; ++ while (v_j < 8u) { ++ self->private_data.f_probs_longrep_len_low[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_j = 0u; ++ while (v_j < 8u) { ++ self->private_data.f_probs_longrep_len_mid[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 256u) { ++ self->private_data.f_probs_longrep_len_high[0u][v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 4u) { ++ v_j = 0u; ++ while (v_j < 64u) { ++ self->private_data.f_probs_slot[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 128u) { ++ self->private_data.f_probs_small_dist[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ self->private_data.f_probs_large_dist[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_j = 0u; ++ while (v_j < 768u) { ++ self->private_data.f_probs_lit[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ self->private_impl.f_stashed_state = 0u; ++ self->private_impl.f_stashed_rep0 = 0u; ++ self->private_impl.f_stashed_rep1 = 0u; ++ self->private_impl.f_stashed_rep2 = 0u; ++ self->private_impl.f_stashed_rep3 = 0u; ++ return wuffs_base__make_empty_struct(); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_lzip__error__bad_checksum[] = "#lzip: bad checksum"; ++const char wuffs_lzip__error__bad_footer[] = "#lzip: bad footer"; ++const char wuffs_lzip__error__bad_header[] = "#lzip: bad header"; ++const char wuffs_lzip__error__truncated_input[] = "#lzip: truncated input"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzip__decoder__do_transform_io( ++ wuffs_lzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_lzip__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzip__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_lzip__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_lzip__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_lzip__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzip__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_lzip__decoder__initialize( ++ wuffs_lzip__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ { ++ wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( ++ &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_lzma__decoder__initialize( ++ &self->private_data.f_lzma, sizeof(self->private_data.f_lzma), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_lzip__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_lzip__decoder* ++wuffs_lzip__decoder__alloc(void) { ++ wuffs_lzip__decoder* x = ++ (wuffs_lzip__decoder*)(calloc(1, sizeof(wuffs_lzip__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_lzip__decoder__initialize( ++ x, sizeof(wuffs_lzip__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_lzip__decoder(void) { ++ return sizeof(wuffs_lzip__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func lzip.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_lzip__decoder__get_quirk( ++ const wuffs_lzip__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func lzip.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzip__decoder__set_quirk( ++ wuffs_lzip__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func lzip.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzip__decoder__dst_history_retain_length( ++ const wuffs_lzip__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_lzma__decoder__dst_history_retain_length(&self->private_data.f_lzma); ++} ++ ++// -------- func lzip.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_lzip__decoder__workbuf_len( ++ const wuffs_lzip__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_lzma__decoder__workbuf_len(&self->private_data.f_lzma); ++} ++ ++// -------- func lzip.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzip__decoder__transform_io( ++ wuffs_lzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_lzip__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_lzip__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func lzip.decoder.do_transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzip__decoder__do_transform_io( ++ wuffs_lzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_c32 = 0; ++ uint64_t v_c64 = 0; ++ uint64_t v_dmark = 0; ++ uint64_t v_smark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_checksum_want = 0; ++ uint32_t v_checksum_have = 0; ++ uint64_t v_size_want = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 5)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u40le__no_bounds_check(iop_a_src))); ++ iop_a_src += 5; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 32) { ++ t_0 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_c64 = t_0; ++ } ++ if (v_c64 != 5641951820u) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ v_status = wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1348001793u, (1u | (((uint64_t)(v_c8)) << 8u))); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ if (v_status.repr == wuffs_base__error__bad_argument) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_header); ++ goto exit; ++ } ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ self->private_impl.f_ssize_have = 0u; ++ self->private_impl.f_dsize_have = 0u; ++ wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1348001792u, 1u); ++ while (true) { ++ v_dmark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf); ++ v_status = t_2; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ self->private_impl.f_ssize_have += wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src))); ++ self->private_impl.f_dsize_have += wuffs_private_impl__io__count_since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst))); ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ } ++ } ++ v_checksum_want = t_3; ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32); ++ if (v_checksum_have != v_checksum_want) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_checksum); ++ goto exit; ++ } ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint64_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_4 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 56) { ++ t_4 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; ++ } ++ } ++ v_size_want = t_4; ++ } ++ if (self->private_impl.f_dsize_have != v_size_want) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_footer); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ uint64_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_5 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5; ++ if (num_bits_5 == 56) { ++ t_5 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)) << 56; ++ } ++ } ++ v_size_want = t_5; ++ } ++ if ((v_size_want < 26u) || (2251799813685248u < v_size_want)) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_footer); ++ goto exit; ++ } else if (self->private_impl.f_ssize_have != (v_size_want - 26u)) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_footer); ++ goto exit; ++ } ++ while (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ if (a_src && a_src->meta.closed) { ++ goto label__outer__break; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); ++ } ++ v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ if (v_c32 != 1346984524u) { ++ break; ++ } ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_private_impl__ignore_status(wuffs_lzma__decoder__initialize(&self->private_data.f_lzma, ++ sizeof (wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ label__outer__break:; ++ ++ ok: ++ self->private_impl.p_do_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_lzw__error__bad_code[] = "#lzw: bad code"; ++const char wuffs_lzw__error__truncated_input[] = "#lzw: truncated input"; ++const char wuffs_lzw__error__internal_error_inconsistent_i_o[] = "#lzw: internal error: inconsistent I/O"; ++ ++// ---------------- Private Consts ++ ++#define WUFFS_LZW__QUIRKS_BASE 1348378624u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzw__decoder__read_from( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzw__decoder__write_to( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_dst); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzw__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_lzw__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_lzw__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_lzw__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzw__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_lzw__decoder__initialize( ++ wuffs_lzw__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_lzw__decoder* ++wuffs_lzw__decoder__alloc(void) { ++ wuffs_lzw__decoder* x = ++ (wuffs_lzw__decoder*)(calloc(1, sizeof(wuffs_lzw__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_lzw__decoder__initialize( ++ x, sizeof(wuffs_lzw__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_lzw__decoder(void) { ++ return sizeof(wuffs_lzw__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func lzw.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_lzw__decoder__get_quirk( ++ const wuffs_lzw__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (a_key == 1348378624u) { ++ return ((uint64_t)(self->private_impl.f_pending_literal_width_plus_one)); ++ } ++ return 0u; ++} ++ ++// -------- func lzw.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzw__decoder__set_quirk( ++ wuffs_lzw__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (a_key == 1348378624u) { ++ if (a_value > 9u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_pending_literal_width_plus_one = ((uint32_t)(a_value)); ++ return wuffs_base__make_status(NULL); ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func lzw.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzw__decoder__dst_history_retain_length( ++ const wuffs_lzw__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_base__utility__make_optional_u63(true, 0u); ++} ++ ++// -------- func lzw.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_lzw__decoder__workbuf_len( ++ const wuffs_lzw__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} ++ ++// -------- func lzw.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzw__decoder__transform_io( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_i = 0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_literal_width = 8u; ++ if (self->private_impl.f_pending_literal_width_plus_one > 0u) { ++ self->private_impl.f_literal_width = (self->private_impl.f_pending_literal_width_plus_one - 1u); ++ } ++ self->private_impl.f_clear_code = (((uint32_t)(1u)) << self->private_impl.f_literal_width); ++ self->private_impl.f_end_code = (self->private_impl.f_clear_code + 1u); ++ self->private_impl.f_save_code = self->private_impl.f_end_code; ++ self->private_impl.f_prev_code = self->private_impl.f_end_code; ++ self->private_impl.f_width = (self->private_impl.f_literal_width + 1u); ++ self->private_impl.f_bits = 0u; ++ self->private_impl.f_n_bits = 0u; ++ self->private_impl.f_output_ri = 0u; ++ self->private_impl.f_output_wi = 0u; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_clear_code) { ++ self->private_data.f_lm1s[v_i] = 0u; ++ self->private_data.f_suffixes[v_i][0u] = ((uint8_t)(v_i)); ++ v_i += 1u; ++ } ++ while (true) { ++ wuffs_lzw__decoder__read_from(self, a_src); ++ if (self->private_impl.f_output_wi > 0u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_lzw__decoder__write_to(self, a_dst); ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ if (self->private_impl.f_read_from_return_value == 0u) { ++ break; ++ } else if (self->private_impl.f_read_from_return_value == 1u) { ++ continue; ++ } else if (self->private_impl.f_read_from_return_value == 2u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } else if (self->private_impl.f_read_from_return_value == 3u) { ++ status = wuffs_base__make_status(wuffs_lzw__error__truncated_input); ++ goto exit; ++ } else if (self->private_impl.f_read_from_return_value == 4u) { ++ status = wuffs_base__make_status(wuffs_lzw__error__bad_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ } ++ ++ ok: ++ self->private_impl.p_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func lzw.decoder.read_from ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzw__decoder__read_from( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ uint32_t v_clear_code = 0; ++ uint32_t v_end_code = 0; ++ uint32_t v_save_code = 0; ++ uint32_t v_prev_code = 0; ++ uint32_t v_width = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_output_wi = 0; ++ uint32_t v_code = 0; ++ uint32_t v_c = 0; ++ uint32_t v_o = 0; ++ uint32_t v_steps = 0; ++ uint8_t v_first_byte = 0; ++ uint16_t v_lm1_b = 0; ++ uint16_t v_lm1_a = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ v_clear_code = self->private_impl.f_clear_code; ++ v_end_code = self->private_impl.f_end_code; ++ v_save_code = self->private_impl.f_save_code; ++ v_prev_code = self->private_impl.f_prev_code; ++ v_width = self->private_impl.f_width; ++ v_bits = self->private_impl.f_bits; ++ v_n_bits = self->private_impl.f_n_bits; ++ v_output_wi = self->private_impl.f_output_wi; ++ while (true) { ++ if (v_n_bits < v_width) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { ++ v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits)); ++ iop_a_src += ((31u - v_n_bits) >> 3u); ++ v_n_bits |= 24u; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ self->private_impl.f_read_from_return_value = 3u; ++ } else { ++ self->private_impl.f_read_from_return_value = 2u; ++ } ++ break; ++ } else { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ if (v_n_bits >= v_width) { ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ self->private_impl.f_read_from_return_value = 3u; ++ } else { ++ self->private_impl.f_read_from_return_value = 2u; ++ } ++ break; ++ } else { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ if (v_n_bits < v_width) { ++ self->private_impl.f_read_from_return_value = 5u; ++ break; ++ } ++ } ++ } ++ } ++ v_code = ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_width)); ++ v_bits >>= v_width; ++ v_n_bits -= v_width; ++ if (v_code < v_clear_code) { ++ self->private_data.f_output[v_output_wi] = ((uint8_t)(v_code)); ++ v_output_wi = ((v_output_wi + 1u) & 8191u); ++ if (v_save_code <= 4095u) { ++ v_lm1_a = ((uint16_t)(((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u)); ++ self->private_data.f_lm1s[v_save_code] = v_lm1_a; ++ if (((uint16_t)(v_lm1_a % 8u)) != 0u) { ++ self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code]; ++ memcpy(self->private_data.f_suffixes[v_save_code],self->private_data.f_suffixes[v_prev_code], sizeof(self->private_data.f_suffixes[v_save_code])); ++ self->private_data.f_suffixes[v_save_code][((uint16_t)(v_lm1_a % 8u))] = ((uint8_t)(v_code)); ++ } else { ++ self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); ++ self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_code)); ++ } ++ v_save_code += 1u; ++ if (v_width < 12u) { ++ v_width += (1u & (v_save_code >> v_width)); ++ } ++ v_prev_code = v_code; ++ } ++ } else if (v_code <= v_end_code) { ++ if (v_code == v_end_code) { ++ self->private_impl.f_read_from_return_value = 0u; ++ break; ++ } ++ v_save_code = v_end_code; ++ v_prev_code = v_end_code; ++ v_width = (self->private_impl.f_literal_width + 1u); ++ } else if (v_code <= v_save_code) { ++ v_c = v_code; ++ if (v_code == v_save_code) { ++ v_c = v_prev_code; ++ } ++ v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lm1s[v_c])) & 4294967288u)) & 8191u); ++ v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lm1s[v_c]))) & 8191u); ++ v_steps = (((uint32_t)(self->private_data.f_lm1s[v_c])) >> 3u); ++ while (true) { ++ memcpy((self->private_data.f_output)+(v_o), (self->private_data.f_suffixes[v_c]), 8u); ++ if (v_steps <= 0u) { ++ break; ++ } ++ v_steps -= 1u; ++ v_o = (((uint32_t)(v_o - 8u)) & 8191u); ++ v_c = ((uint32_t)(self->private_impl.f_prefixes[v_c])); ++ } ++ v_first_byte = self->private_data.f_suffixes[v_c][0u]; ++ if (v_code == v_save_code) { ++ self->private_data.f_output[v_output_wi] = v_first_byte; ++ v_output_wi = ((v_output_wi + 1u) & 8191u); ++ } ++ if (v_save_code <= 4095u) { ++ v_lm1_b = ((uint16_t)(((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u)); ++ self->private_data.f_lm1s[v_save_code] = v_lm1_b; ++ if (((uint16_t)(v_lm1_b % 8u)) != 0u) { ++ self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code]; ++ memcpy(self->private_data.f_suffixes[v_save_code],self->private_data.f_suffixes[v_prev_code], sizeof(self->private_data.f_suffixes[v_save_code])); ++ self->private_data.f_suffixes[v_save_code][((uint16_t)(v_lm1_b % 8u))] = v_first_byte; ++ } else { ++ self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); ++ self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte)); ++ } ++ v_save_code += 1u; ++ if (v_width < 12u) { ++ v_width += (1u & (v_save_code >> v_width)); ++ } ++ v_prev_code = v_code; ++ } ++ } else { ++ self->private_impl.f_read_from_return_value = 4u; ++ break; ++ } ++ if (v_output_wi > 4095u) { ++ self->private_impl.f_read_from_return_value = 1u; ++ break; ++ } ++ } ++ if (self->private_impl.f_read_from_return_value != 2u) { ++ while (v_n_bits >= 8u) { ++ v_n_bits -= 8u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ self->private_impl.f_read_from_return_value = 5u; ++ break; ++ } ++ } ++ } ++ self->private_impl.f_save_code = v_save_code; ++ self->private_impl.f_prev_code = v_prev_code; ++ self->private_impl.f_width = v_width; ++ self->private_impl.f_bits = v_bits; ++ self->private_impl.f_n_bits = v_n_bits; ++ self->private_impl.f_output_wi = v_output_wi; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func lzw.decoder.write_to ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzw__decoder__write_to( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_dst) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__slice_u8 v_s = {0}; ++ uint64_t v_n = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_write_to; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (self->private_impl.f_output_wi > 0u) { ++ if (self->private_impl.f_output_ri > self->private_impl.f_output_wi) { ++ status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_s = wuffs_base__make_slice_u8_ij(self->private_data.f_output, ++ self->private_impl.f_output_ri, ++ self->private_impl.f_output_wi); ++ v_n = wuffs_private_impl__io_writer__copy_from_slice(&iop_a_dst, io2_a_dst,v_s); ++ if (v_n == ((uint64_t)(v_s.len))) { ++ self->private_impl.f_output_ri = 0u; ++ self->private_impl.f_output_wi = 0u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ self->private_impl.f_output_ri = (((uint32_t)(self->private_impl.f_output_ri + ((uint32_t)(v_n)))) & 8191u); ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_write_to = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_write_to = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func lzw.decoder.flush ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8 ++wuffs_lzw__decoder__flush( ++ wuffs_lzw__decoder* self) { ++ if (!self) { ++ return wuffs_base__empty_slice_u8(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__empty_slice_u8(); ++ } ++ ++ uint32_t v_ri = 0; ++ uint32_t v_wi = 0; ++ ++ v_ri = self->private_impl.f_output_ri; ++ v_wi = self->private_impl.f_output_wi; ++ self->private_impl.f_output_ri = 0u; ++ self->private_impl.f_output_wi = 0u; ++ if (v_ri <= v_wi) { ++ return wuffs_base__make_slice_u8_ij(self->private_data.f_output, v_ri, v_wi); ++ } ++ return wuffs_base__make_slice_u8(self->private_data.f_output, 0); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_netpbm__error__bad_header[] = "#netpbm: bad header"; ++const char wuffs_netpbm__error__truncated_input[] = "#netpbm: truncated input"; ++const char wuffs_netpbm__error__unsupported_netpbm_file[] = "#netpbm: unsupported Netpbm file"; ++const char wuffs_netpbm__note__internal_note_short_read[] = "@netpbm: internal note: short read"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_image_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_frame_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_frame( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__swizzle( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_netpbm__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_netpbm__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_netpbm__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_netpbm__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_netpbm__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_netpbm__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_netpbm__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_netpbm__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_netpbm__decoder__initialize( ++ wuffs_netpbm__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_netpbm__decoder* ++wuffs_netpbm__decoder__alloc(void) { ++ wuffs_netpbm__decoder* x = ++ (wuffs_netpbm__decoder*)(calloc(1, sizeof(wuffs_netpbm__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_netpbm__decoder__initialize( ++ x, sizeof(wuffs_netpbm__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_netpbm__decoder(void) { ++ return sizeof(wuffs_netpbm__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func netpbm.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_netpbm__decoder__get_quirk( ++ const wuffs_netpbm__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func netpbm.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__set_quirk( ++ wuffs_netpbm__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func netpbm.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__decode_image_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func netpbm.decoder.do_decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_image_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_n = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 80u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if ((v_c8 < 49u) || (55u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } else if (v_c8 == 53u) { ++ self->private_impl.f_pixfmt = 536870920u; ++ } else if (v_c8 == 54u) { ++ self->private_impl.f_pixfmt = 2684356744u; ++ } else { ++ status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (v_c8 != 10u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u)) { ++ continue; ++ } else if (v_c8 == 35u) { ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if (v_c8 == 10u) { ++ break; ++ } ++ } ++ continue; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_width = ((uint32_t)(((uint8_t)(v_c8 - 48u)))); ++ break; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u)) { ++ break; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ v_n = ((10u * self->private_impl.f_width) + ((uint32_t)(((uint8_t)(v_c8 - 48u))))); ++ if (v_n > 16777215u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ goto exit; ++ } ++ self->private_impl.f_width = v_n; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u)) { ++ continue; ++ } else if (v_c8 == 35u) { ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_7 = *iop_a_src++; ++ v_c8 = t_7; ++ } ++ if (v_c8 == 10u) { ++ break; ++ } ++ } ++ continue; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_height = ((uint32_t)(((uint8_t)(v_c8 - 48u)))); ++ break; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_8 = *iop_a_src++; ++ v_c8 = t_8; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u) || (v_c8 == 13u)) { ++ continue; ++ } else if (v_c8 == 10u) { ++ break; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ v_n = ((10u * self->private_impl.f_height) + ((uint32_t)(((uint8_t)(v_c8 - 48u))))); ++ if (v_n > 16777215u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ goto exit; ++ } ++ self->private_impl.f_height = v_n; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_9 = *iop_a_src++; ++ v_c8 = t_9; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u)) { ++ continue; ++ } else if (v_c8 == 35u) { ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_10 = *iop_a_src++; ++ v_c8 = t_10; ++ } ++ if (v_c8 == 10u) { ++ break; ++ } ++ } ++ continue; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_max_value = ((uint32_t)(((uint8_t)(v_c8 - 48u)))); ++ break; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_11 = *iop_a_src++; ++ v_c8 = t_11; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u) || (v_c8 == 13u)) { ++ continue; ++ } else if (v_c8 == 10u) { ++ break; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ v_n = ((10u * self->private_impl.f_max_value) + ((uint32_t)(((uint8_t)(v_c8 - 48u))))); ++ if (v_n > 16777215u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ goto exit; ++ } ++ self->private_impl.f_max_value = v_n; ++ } ++ if (self->private_impl.f_max_value != 255u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ goto exit; ++ } ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ false); ++ } ++ self->private_impl.f_call_sequence = 32u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func netpbm.decoder.decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__decode_frame_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func netpbm.decoder.do_decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_frame_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_netpbm__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ self->private_impl.f_frame_config_io_position, ++ 0u, ++ false, ++ false, ++ 0u); ++ } ++ self->private_impl.f_call_sequence = 64u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func netpbm.decoder.decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__decode_frame( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func netpbm.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_frame( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_netpbm__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y = 0u; ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ while (true) { ++ v_status = wuffs_netpbm__decoder__swizzle(self, a_dst, a_src); ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if (v_status.repr != wuffs_netpbm__note__internal_note_short_read) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func netpbm.decoder.swizzle ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__swizzle( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ uint32_t v_src_bytes_per_pixel = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_j = 0; ++ uint64_t v_n = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ while (true) { ++ if (self->private_impl.f_dst_x == self->private_impl.f_width) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += 1u; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ break; ++ } ++ } ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i >= ((uint64_t)(v_dst.len))) { ++ v_src_bytes_per_pixel = 1u; ++ if (self->private_impl.f_pixfmt == 2684356744u) { ++ v_src_bytes_per_pixel = 3u; ++ } ++ v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); ++ v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); ++ v_j = v_n; ++ while (v_j >= 8u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 8u); ++ } ++ v_j -= 8u; ++ } ++ while (v_j > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 1u); ++ } ++ v_j -= 1u; ++ } ++ } else { ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( ++ &self->private_impl.f_swizzler, ++ wuffs_base__slice_u8__subslice_i(v_dst, v_i), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ &iop_a_src, ++ io2_a_src); ++ } ++ if (v_n == 0u) { ++ status = wuffs_base__make_status(wuffs_netpbm__note__internal_note_short_read); ++ goto ok; ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ ++ ok: ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func netpbm.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_netpbm__decoder__frame_dirty_rect( ++ const wuffs_netpbm__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); ++} ++ ++// -------- func netpbm.decoder.num_animation_loops ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_netpbm__decoder__num_animation_loops( ++ const wuffs_netpbm__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func netpbm.decoder.num_decoded_frame_configs ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_netpbm__decoder__num_decoded_frame_configs( ++ const wuffs_netpbm__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func netpbm.decoder.num_decoded_frames ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_netpbm__decoder__num_decoded_frames( ++ const wuffs_netpbm__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func netpbm.decoder.restart_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__restart_frame( ++ wuffs_netpbm__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func netpbm.decoder.set_report_metadata ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_netpbm__decoder__set_report_metadata( ++ wuffs_netpbm__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func netpbm.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__tell_me_more( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func netpbm.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_netpbm__decoder__workbuf_len( ++ const wuffs_netpbm__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_nie__error__bad_header[] = "#nie: bad header"; ++const char wuffs_nie__error__truncated_input[] = "#nie: truncated input"; ++const char wuffs_nie__error__unsupported_nie_file[] = "#nie: unsupported NIE file"; ++const char wuffs_nie__note__internal_note_short_read[] = "@nie: internal note: short read"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_image_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_frame_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_frame( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__swizzle( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_nie__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_nie__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_nie__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_nie__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_nie__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_nie__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_nie__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_nie__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_nie__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_nie__decoder__initialize( ++ wuffs_nie__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_nie__decoder* ++wuffs_nie__decoder__alloc(void) { ++ wuffs_nie__decoder* x = ++ (wuffs_nie__decoder*)(calloc(1, sizeof(wuffs_nie__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_nie__decoder__initialize( ++ x, sizeof(wuffs_nie__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_nie__decoder(void) { ++ return sizeof(wuffs_nie__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func nie.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_nie__decoder__get_quirk( ++ const wuffs_nie__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func nie.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__set_quirk( ++ wuffs_nie__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func nie.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_image_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_nie__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func nie.decoder.do_decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_image_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_a = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_a = t_0; ++ } ++ if (v_a != 1169146734u) { ++ status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_a = t_1; ++ } ++ if (v_a == 879649535u) { ++ self->private_impl.f_pixfmt = 2164295816u; ++ } else if (v_a == 946758399u) { ++ self->private_impl.f_pixfmt = 2164308923u; ++ } else if (v_a == 879780607u) { ++ status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file); ++ goto exit; ++ } else if (v_a == 946889471u) { ++ status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ v_a = t_2; ++ } ++ if (v_a > 2147483647u) { ++ status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ goto exit; ++ } else if (v_a > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_width = v_a; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ } ++ } ++ v_a = t_3; ++ } ++ if (v_a > 2147483647u) { ++ status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ goto exit; ++ } else if (v_a > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_height = v_a; ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ 16u, ++ false); ++ } ++ self->private_impl.f_call_sequence = 32u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func nie.decoder.decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_frame_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_nie__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func nie.decoder.do_decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_frame_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_nie__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (16u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ 16u, ++ 0u, ++ false, ++ false, ++ 0u); ++ } ++ self->private_impl.f_call_sequence = 64u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func nie.decoder.decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_frame( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_nie__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func nie.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_frame( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_nie__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y = 0u; ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ while (true) { ++ v_status = wuffs_nie__decoder__swizzle(self, a_dst, a_src); ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if (v_status.repr != wuffs_nie__note__internal_note_short_read) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func nie.decoder.swizzle ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__swizzle( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ uint32_t v_src_bytes_per_pixel = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_j = 0; ++ uint64_t v_n = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ while (true) { ++ if (self->private_impl.f_dst_x == self->private_impl.f_width) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += 1u; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ break; ++ } ++ } ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i >= ((uint64_t)(v_dst.len))) { ++ v_src_bytes_per_pixel = 4u; ++ if (self->private_impl.f_pixfmt == 2164308923u) { ++ v_src_bytes_per_pixel = 8u; ++ } ++ v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); ++ v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); ++ v_j = v_n; ++ while (v_j >= 8u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 8u); ++ } ++ v_j -= 8u; ++ } ++ while (v_j > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 1u); ++ } ++ v_j -= 1u; ++ } ++ } else { ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( ++ &self->private_impl.f_swizzler, ++ wuffs_base__slice_u8__subslice_i(v_dst, v_i), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ &iop_a_src, ++ io2_a_src); ++ } ++ if (v_n == 0u) { ++ status = wuffs_base__make_status(wuffs_nie__note__internal_note_short_read); ++ goto ok; ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ ++ ok: ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func nie.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_nie__decoder__frame_dirty_rect( ++ const wuffs_nie__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); ++} ++ ++// -------- func nie.decoder.num_animation_loops ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_nie__decoder__num_animation_loops( ++ const wuffs_nie__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func nie.decoder.num_decoded_frame_configs ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_nie__decoder__num_decoded_frame_configs( ++ const wuffs_nie__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func nie.decoder.num_decoded_frames ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_nie__decoder__num_decoded_frames( ++ const wuffs_nie__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func nie.decoder.restart_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__restart_frame( ++ wuffs_nie__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if ((a_index != 0u) || (a_io_position != 16u)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func nie.decoder.set_report_metadata ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_nie__decoder__set_report_metadata( ++ wuffs_nie__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func nie.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__tell_me_more( ++ wuffs_nie__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func nie.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_nie__decoder__workbuf_len( ++ const wuffs_nie__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_zlib__note__dictionary_required[] = "@zlib: dictionary required"; ++const char wuffs_zlib__error__bad_checksum[] = "#zlib: bad checksum"; ++const char wuffs_zlib__error__bad_compression_method[] = "#zlib: bad compression method"; ++const char wuffs_zlib__error__bad_compression_window_size[] = "#zlib: bad compression window size"; ++const char wuffs_zlib__error__bad_parity_check[] = "#zlib: bad parity check"; ++const char wuffs_zlib__error__incorrect_dictionary[] = "#zlib: incorrect dictionary"; ++const char wuffs_zlib__error__truncated_input[] = "#zlib: truncated input"; ++ ++// ---------------- Private Consts ++ ++#define WUFFS_ZLIB__QUIRKS_BASE 2113790976u ++ ++#define WUFFS_ZLIB__QUIRKS_COUNT 1u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_zlib__decoder__do_transform_io( ++ wuffs_zlib__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_zlib__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_zlib__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_zlib__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_zlib__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_zlib__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_zlib__decoder__initialize( ++ wuffs_zlib__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ { ++ wuffs_base__status z = wuffs_adler32__hasher__initialize( ++ &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_adler32__hasher__initialize( ++ &self->private_data.f_dict_id_hasher, sizeof(self->private_data.f_dict_id_hasher), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_deflate__decoder__initialize( ++ &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_zlib__decoder* ++wuffs_zlib__decoder__alloc(void) { ++ wuffs_zlib__decoder* x = ++ (wuffs_zlib__decoder*)(calloc(1, sizeof(wuffs_zlib__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_zlib__decoder__initialize( ++ x, sizeof(wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_zlib__decoder(void) { ++ return sizeof(wuffs_zlib__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func zlib.decoder.dictionary_id ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_zlib__decoder__dictionary_id( ++ const wuffs_zlib__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return self->private_impl.f_dict_id_want; ++} ++ ++// -------- func zlib.decoder.add_dictionary ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_zlib__decoder__add_dictionary( ++ wuffs_zlib__decoder* self, ++ wuffs_base__slice_u8 a_dict) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } ++ ++ if (self->private_impl.f_header_complete) { ++ self->private_impl.f_bad_call_sequence = true; ++ } else { ++ self->private_impl.f_dict_id_have = wuffs_adler32__hasher__update_u32(&self->private_data.f_dict_id_hasher, a_dict); ++ wuffs_deflate__decoder__add_history(&self->private_data.f_flate, a_dict); ++ } ++ self->private_impl.f_got_dictionary = true; ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func zlib.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_zlib__decoder__get_quirk( ++ const wuffs_zlib__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ uint32_t v_key = 0; ++ ++ if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } else if (a_key >= 2113790976u) { ++ v_key = (a_key - 2113790976u); ++ if (v_key < 1u) { ++ if (self->private_impl.f_quirks[v_key]) { ++ return 1u; ++ } ++ } ++ } ++ return 0u; ++} ++ ++// -------- func zlib.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_zlib__decoder__set_quirk( ++ wuffs_zlib__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (self->private_impl.f_header_complete) { ++ self->private_impl.f_bad_call_sequence = true; ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } else if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } else if (a_key >= 2113790976u) { ++ a_key -= 2113790976u; ++ if (a_key < 1u) { ++ self->private_impl.f_quirks[a_key] = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func zlib.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_zlib__decoder__dst_history_retain_length( ++ const wuffs_zlib__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_base__utility__make_optional_u63(true, 0u); ++} ++ ++// -------- func zlib.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_zlib__decoder__workbuf_len( ++ const wuffs_zlib__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++} ++ ++// -------- func zlib.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_zlib__decoder__transform_io( ++ wuffs_zlib__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_zlib__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_zlib__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func zlib.decoder.do_transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_zlib__decoder__do_transform_io( ++ wuffs_zlib__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint16_t v_x = 0; ++ uint32_t v_checksum_have = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_checksum_want = 0; ++ uint64_t v_mark = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; ++ if (coro_susp_point) { ++ v_checksum_have = self->private_data.s_do_transform_io.v_checksum_have; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_bad_call_sequence) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if (self->private_impl.f_quirks[0u]) { ++ } else if ( ! self->private_impl.f_want_dictionary) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint16_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_number_length = wuffs_json__decoder__decode_number(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- v_number_status = (v_number_length >> 8u); +- v_vminor = 10486787u; +- if ((v_number_length & 128u) != 0u) { +- v_vminor = 10486785u; ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_number_length = (v_number_length & 127u); +- if (v_number_status == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_number_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 8) { ++ t_0 = ((uint16_t)(*scratch >> 48)); + break; + } +- while (v_number_length > 0u) { +- v_number_length -= 1u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); +- goto exit; ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ v_x = t_0; ++ } ++ if (((uint16_t)(((uint16_t)(v_x >> 8u)) & 15u)) != 8u) { ++ status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_method); ++ goto exit; ++ } ++ if (((uint16_t)(v_x >> 12u)) > 7u) { ++ status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_window_size); ++ goto exit; ++ } ++ if (((uint16_t)(v_x % 31u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_zlib__error__bad_parity_check); ++ goto exit; ++ } ++ self->private_impl.f_want_dictionary = (((uint16_t)(v_x & 32u)) != 0u); ++ if (self->private_impl.f_want_dictionary) { ++ self->private_impl.f_dict_id_have = 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- } +- if (v_number_status == 1u) { +- if (self->private_impl.f_quirks[14u]) { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch >> 32)); + break; + } +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } else if (v_number_status == 2u) { +- status = wuffs_base__make_status(wuffs_json__error__unsupported_number_length); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(17); +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(18); +- } +- } +- } +- break; +- } else if (v_class == 5u) { +- v_vminor = 2113553u; +- if (v_depth == 0u) { +- } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) { +- v_vminor = 2113601u; +- } else { +- v_vminor = 2113569u; +- } +- if (v_depth >= 1024u) { +- status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth); +- goto exit; +- } +- v_stack_byte = (v_depth / 32u); +- v_stack_bit = (v_depth & 31u); +- self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(1u)) << v_stack_bit); +- v_depth += 1u; +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 4162u; +- v_expect_after_value = 4164u; +- goto label__outer__continue; +- } else if (v_class == 6u) { +- iop_a_src += 1u; +- if (v_depth <= 1u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2101314u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__outer__break; +- } +- v_depth -= 1u; +- v_stack_byte = ((v_depth - 1u) / 32u); +- v_stack_bit = ((v_depth - 1u) & 31u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2105410u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 4356u; +- v_expect_after_value = 4356u; +- } else { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2113602u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 4164u; +- v_expect_after_value = 4164u; +- } +- goto label__outer__continue; +- } else if (v_class == 7u) { +- v_vminor = 2105361u; +- if (v_depth == 0u) { +- } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) { +- v_vminor = 2105409u; +- } else { +- v_vminor = 2105377u; +- } +- if (v_depth >= 1024u) { +- status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth); +- goto exit; +- } +- v_stack_byte = (v_depth / 32u); +- v_stack_bit = (v_depth & 31u); +- self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(1u)) << v_stack_bit)); +- v_depth += 1u; +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 8114u; +- v_expect_after_value = 4356u; +- goto label__outer__continue; +- } else if (v_class == 8u) { +- iop_a_src += 1u; +- if (v_depth <= 1u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2101282u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__outer__break; +- } +- v_depth -= 1u; +- v_stack_byte = ((v_depth - 1u) / 32u); +- v_stack_bit = ((v_depth - 1u) & 31u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2105378u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 4356u; +- v_expect_after_value = 4356u; +- } else { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2113570u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 4164u; +- v_expect_after_value = 4164u; +- } +- goto label__outer__continue; +- } else if (v_class == 9u) { +- v_match = wuffs_base__io_reader__match7(iop_a_src, io2_a_src, a_src, 111546413966853u); +- if (v_match == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(8388612u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(5u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) { +- status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- iop_a_src += 5u; +- break; +- } else if (v_match == 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(19); +- goto label__outer__continue; +- } +- } else if (v_class == 10u) { +- v_match = wuffs_base__io_reader__match7(iop_a_src, io2_a_src, a_src, 435762131972u); +- if (v_match == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(8388616u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- iop_a_src += 4u; +- break; +- } else if (v_match == 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(20); +- goto label__outer__continue; +- } +- } else if (v_class == 11u) { +- v_match = wuffs_base__io_reader__match7(iop_a_src, io2_a_src, a_src, 465676103172u); +- if (v_match == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(8388610u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- iop_a_src += 4u; +- break; +- } else if (v_match == 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(21); +- goto label__outer__continue; +- } +- if (self->private_impl.f_quirks[14u]) { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); +- status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- break; +- } +- } else if (v_class == 12u) { +- if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u]) { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); +- status = wuffs_json__decoder__decode_comment(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_comment_type > 0u) { +- goto label__outer__continue; ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); + } + } ++ self->private_impl.f_dict_id_want = t_1; + } +- status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required); ++ goto ok; ++ } else if (self->private_impl.f_got_dictionary) { ++ status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary); + goto exit; + } +- if (v_depth == 0u) { +- break; ++ } else if (self->private_impl.f_dict_id_have != self->private_impl.f_dict_id_want) { ++ if (self->private_impl.f_got_dictionary) { ++ status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary); ++ goto exit; + } +- v_expect = v_expect_after_value; ++ status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required); ++ goto ok; + } +- label__outer__break:; +- if (self->private_impl.f_quirks[17u] || self->private_impl.f_quirks[18u]) { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ self->private_impl.f_header_complete = true; ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf); ++ v_status = t_2; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } + } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if ( ! self->private_impl.f_ignore_checksum && ! self->private_impl.f_quirks[0u]) { ++ v_checksum_have = wuffs_adler32__hasher__update_u32(&self->private_data.f_checksum, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); +- status = wuffs_json__decoder__decode_trailer(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; + } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ } ++ if ( ! self->private_impl.f_quirks[0u]) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)); ++ } ++ } ++ v_checksum_want = t_3; + } +- if (status.repr) { +- goto suspend; ++ if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != v_checksum_want)) { ++ status = wuffs_base__make_status(wuffs_zlib__error__bad_checksum); ++ goto exit; + } + } +- self->private_impl.f_end_of_data = true; + +- ok: +- self->private_impl.p_decode_tokens[0] = 0; +- goto exit; +- } ++ ok: ++ self->private_impl.p_do_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_transform_io.v_checksum_have = v_checksum_have; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_png__error__bad_animation_sequence_number[] = "#png: bad animation sequence number"; ++const char wuffs_png__error__bad_checksum[] = "#png: bad checksum"; ++const char wuffs_png__error__bad_chunk[] = "#png: bad chunk"; ++const char wuffs_png__error__bad_filter[] = "#png: bad filter"; ++const char wuffs_png__error__bad_header[] = "#png: bad header"; ++const char wuffs_png__error__bad_text_chunk_not_latin_1[] = "#png: bad text chunk (not Latin-1)"; ++const char wuffs_png__error__missing_palette[] = "#png: missing palette"; ++const char wuffs_png__error__truncated_input[] = "#png: truncated input"; ++const char wuffs_png__error__unsupported_cgbi_extension[] = "#png: unsupported CgBI extension"; ++const char wuffs_png__error__unsupported_png_compression_method[] = "#png: unsupported PNG compression method"; ++const char wuffs_png__error__unsupported_png_file[] = "#png: unsupported PNG file"; ++const char wuffs_png__error__internal_error_inconsistent_i_o[] = "#png: internal error: inconsistent I/O"; ++const char wuffs_png__error__internal_error_inconsistent_chunk_type[] = "#png: internal error: inconsistent chunk type"; ++const char wuffs_png__error__internal_error_inconsistent_workbuf_length[] = "#png: internal error: inconsistent workbuf length"; ++const char wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input[] = "#png: internal error: zlib decoder did not exhaust its input"; ++ ++// ---------------- Private Consts ++ ++#define WUFFS_PNG__ANCILLARY_BIT 32u ++ ++static const uint8_t ++WUFFS_PNG__INTERLACING[8][6] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ { ++ 0u, 0u, 0u, 0u, 0u, 0u, ++ }, { ++ 3u, 7u, 0u, 3u, 7u, 0u, ++ }, { ++ 3u, 3u, 4u, 3u, 7u, 0u, ++ }, { ++ 2u, 3u, 0u, 3u, 3u, 4u, ++ }, { ++ 2u, 1u, 2u, 2u, 3u, 0u, ++ }, { ++ 1u, 1u, 0u, 2u, 1u, 2u, ++ }, { ++ 1u, 0u, 1u, 1u, 1u, 0u, ++ }, { ++ 0u, 0u, 0u, 1u, 0u, 1u, ++ }, ++}; ++ ++static const uint8_t ++WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 255u, 85u, 0u, 17u, 0u, 0u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 8u, 4u, 0u, 2u, 0u, 0u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_PNG__NUM_CHANNELS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1u, 0u, 3u, 1u, 2u, 0u, 4u, 0u, ++}; ++ ++static const uint16_t ++WUFFS_PNG__LATIN_1[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, ++ 40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u, ++ 48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u, ++ 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, ++ 64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u, ++ 72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u, ++ 80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u, ++ 88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u, ++ 96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u, ++ 104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u, ++ 112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u, ++ 120u, 121u, 122u, 123u, 124u, 125u, 126u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 41410u, 41666u, 41922u, 42178u, 42434u, 42690u, 42946u, ++ 43202u, 43458u, 43714u, 43970u, 44226u, 44482u, 44738u, 44994u, ++ 45250u, 45506u, 45762u, 46018u, 46274u, 46530u, 46786u, 47042u, ++ 47298u, 47554u, 47810u, 48066u, 48322u, 48578u, 48834u, 49090u, ++ 32963u, 33219u, 33475u, 33731u, 33987u, 34243u, 34499u, 34755u, ++ 35011u, 35267u, 35523u, 35779u, 36035u, 36291u, 36547u, 36803u, ++ 37059u, 37315u, 37571u, 37827u, 38083u, 38339u, 38595u, 38851u, ++ 39107u, 39363u, 39619u, 39875u, 40131u, 40387u, 40643u, 40899u, ++ 41155u, 41411u, 41667u, 41923u, 42179u, 42435u, 42691u, 42947u, ++ 43203u, 43459u, 43715u, 43971u, 44227u, 44483u, 44739u, 44995u, ++ 45251u, 45507u, 45763u, 46019u, 46275u, 46531u, 46787u, 47043u, ++ 47299u, 47555u, 47811u, 48067u, 48323u, 48579u, 48835u, 49091u, ++}; ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_2( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +- goto suspend; +- suspend: +- self->private_impl.p_decode_tokens[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; +- self->private_data.s_decode_tokens[0].v_depth = v_depth; +- self->private_data.s_decode_tokens[0].v_expect = v_expect; +- self->private_data.s_decode_tokens[0].v_expect_after_value = v_expect_after_value; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +-// -------- func json.decoder.decode_number ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + + WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_json__decoder__decode_number( +- wuffs_json__decoder* self, +- wuffs_base__io_buffer* a_src) { +- uint8_t v_c = 0; +- uint32_t v_n = 0; +- uint32_t v_floating_point = 0; ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +- do { +- v_n = 0u; +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- break; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (v_c != 45u) { +- } else { +- v_n += 1u; +- iop_a_src += 1u; +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- v_n |= 256u; +- break; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- } +- if (v_c == 48u) { +- v_n += 1u; +- iop_a_src += 1u; +- } else { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (v_n > 99u) { +- break; +- } +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- break; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (v_c != 46u) { +- } else { +- if (v_n >= 99u) { +- v_n |= 512u; +- break; +- } +- v_n += 1u; +- iop_a_src += 1u; +- v_floating_point = 128u; +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (v_n > 99u) { +- break; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- break; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- } +- if ((v_c != 69u) && (v_c != 101u)) { +- break; +- } +- if (v_n >= 99u) { +- v_n |= 512u; +- break; +- } +- v_n += 1u; +- iop_a_src += 1u; +- v_floating_point = 128u; +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- v_n |= 256u; +- break; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if ((v_c != 43u) && (v_c != 45u)) { +- } else { +- if (v_n >= 99u) { +- v_n |= 512u; +- break; +- } +- v_n += 1u; +- iop_a_src += 1u; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } while (0); +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- return (v_n | v_floating_point); +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +-// -------- func json.decoder.decode_digits ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_json__decoder__decode_digits( +- wuffs_json__decoder* self, ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_decode_image_config( ++ wuffs_png__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_ihdr( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__assign_filter_distance( ++ wuffs_png__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint64_t ++wuffs_png__decoder__calculate_bytes_per_row( ++ const wuffs_png__decoder* self, ++ uint32_t a_width); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__choose_filter_implementations( ++ wuffs_png__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_other_chunk( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src, +- uint32_t a_n) { +- uint8_t v_c = 0; +- uint32_t v_n = 0; ++ bool a_framy); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_actl( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_chrm( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_exif( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_fctl( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_gama( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_iccp( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_plte( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_srgb( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_trns( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_decode_frame_config( ++ wuffs_png__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__skip_frame( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_decode_frame( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_pass( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_tell_me_more( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle_tricky( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_png__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_png__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_png__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_png__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_png__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_png__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_png__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_png__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_png__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_png__decoder__initialize( ++ wuffs_png__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + +- v_n = a_n; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- break; ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (0u == WUFFS_JSON__LUT_DECIMAL_DIGITS[v_c]) { +- break; ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } +- if (v_n >= 99u) { +- v_n |= 512u; +- break; ++ } ++ ++ self->private_impl.choosy_filter_1 = &wuffs_png__decoder__filter_1__choosy_default; ++ self->private_impl.choosy_filter_3 = &wuffs_png__decoder__filter_3__choosy_default; ++ self->private_impl.choosy_filter_4 = &wuffs_png__decoder__filter_4__choosy_default; ++ self->private_impl.choosy_filter_and_swizzle = &wuffs_png__decoder__filter_and_swizzle__choosy_default; ++ ++ { ++ wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( ++ &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; + } +- v_n += 1u; +- iop_a_src += 1u; + } +- if (v_n == a_n) { +- v_n |= 256u; ++ { ++ wuffs_base__status z = wuffs_zlib__decoder__initialize( ++ &self->private_data.f_zlib, sizeof(self->private_data.f_zlib), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } + } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_png__decoder* ++wuffs_png__decoder__alloc(void) { ++ wuffs_png__decoder* x = ++ (wuffs_png__decoder*)(calloc(1, sizeof(wuffs_png__decoder))); ++ if (!x) { ++ return NULL; + } +- return v_n; ++ if (wuffs_png__decoder__initialize( ++ x, sizeof(wuffs_png__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_png__decoder(void) { ++ return sizeof(wuffs_png__decoder); + } + +-// -------- func json.decoder.decode_leading ++// ---------------- Function Implementations + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_leading( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++// ‼ WUFFS MULTI-FILE SECTION +arm_neon ++// -------- func png.decoder.filter_1_distance_4_arm_neon + +- uint8_t v_c = 0; +- uint32_t v_u = 0; ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ uint8x8_t v_fa = {0}; ++ uint8x8_t v_fx = {0}; + +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, v_fa); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, v_fa); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; + } ++ v_curr.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, v_fa); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ } ++ v_curr.len = 0; + } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +- uint32_t coro_susp_point = self->private_impl.p_decode_leading[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// ‼ WUFFS MULTI-FILE SECTION +arm_neon ++// -------- func png.decoder.filter_3_distance_4_arm_neon + +- self->private_impl.f_allow_leading_ars = self->private_impl.f_quirks[15u]; +- self->private_impl.f_allow_leading_ubom = self->private_impl.f_quirks[16u]; +- while (self->private_impl.f_allow_leading_ars || self->private_impl.f_allow_leading_ubom) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint8x8_t v_fa = {0}; ++ uint8x8_t v_fb = {0}; ++ uint8x8_t v_fx = {0}; ++ ++ if (((uint64_t)(a_prev.len)) == 0u) { ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; + } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- break; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- continue; ++ v_curr.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; + } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if ((v_c == 30u) && self->private_impl.f_allow_leading_ars) { +- self->private_impl.f_allow_leading_ars = false; +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- continue; +- } else if ((v_c == 239u) && self->private_impl.f_allow_leading_ubom) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { +- if (a_src && a_src->meta.closed) { +- break; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- continue; +- } +- v_u = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); +- if (v_u == 12565487u) { +- self->private_impl.f_allow_leading_ubom = false; +- iop_a_src += 3u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- continue; +- } ++ v_curr.len = 0; ++ } ++ } else { ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; + } +- break; ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- +- ok: +- self->private_impl.p_decode_leading[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_leading[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- +- return status; ++ return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +-// -------- func json.decoder.decode_comment ++// ‼ WUFFS MULTI-FILE SECTION +arm_neon ++// -------- func png.decoder.filter_4_distance_3_arm_neon + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_comment( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- uint16_t v_c2 = 0; +- uint32_t v_length = 0; ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint8x8_t v_fa = {0}; ++ uint8x8_t v_fb = {0}; ++ uint8x8_t v_fc = {0}; ++ uint8x8_t v_fx = {0}; ++ uint16x8_t v_fafb = {0}; ++ uint16x8_t v_fcfc = {0}; ++ uint16x8_t v_pa = {0}; ++ uint16x8_t v_pb = {0}; ++ uint16x8_t v_pc = {0}; ++ uint16x8_t v_cmpab = {0}; ++ uint16x8_t v_cmpac = {0}; ++ uint8x8_t v_picka = {0}; ++ uint8x8_t v_pickb = {0}; + +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; + } ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ } ++ v_curr.len = 3; ++ v_prev.len = 3; ++ const uint8_t* i_end2_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end2_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +- uint32_t coro_susp_point = self->private_impl.p_decode_comment[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// ‼ WUFFS MULTI-FILE SECTION +arm_neon ++// -------- func png.decoder.filter_4_distance_4_arm_neon + +- self->private_impl.f_comment_type = 0u; +- while ((((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) || (((uint64_t)(io2_a_src - iop_a_src)) <= 1u)) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; +- } +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- } +- v_c2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- if ((v_c2 == 10799u) && self->private_impl.f_quirks[11u]) { +- iop_a_src += 2u; +- v_length = 2u; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) { +- if (v_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- } +- v_length = 0u; +- continue; +- } +- v_c2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- if (v_c2 == 12074u) { +- iop_a_src += 2u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)((v_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- self->private_impl.f_comment_type = 1u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- iop_a_src += 1u; +- if (v_length >= 65533u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- } +- v_length = 0u; +- continue; +- } +- v_length += 1u; +- } +- } else if ((v_c2 == 12079u) && self->private_impl.f_quirks[12u]) { +- iop_a_src += 2u; +- v_length = 2u; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- self->private_impl.f_comment_type = 2u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } else if (v_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); +- } +- v_length = 0u; +- continue; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (v_c == 10u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- self->private_impl.f_comment_type = 2u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- iop_a_src += 1u; +- if (v_length >= 65533u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- } +- v_length = 0u; +- continue; +- } +- v_length += 1u; +- } ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint8x8_t v_fa = {0}; ++ uint8x8_t v_fb = {0}; ++ uint8x8_t v_fc = {0}; ++ uint8x8_t v_fx = {0}; ++ uint16x8_t v_fafb = {0}; ++ uint16x8_t v_fcfc = {0}; ++ uint16x8_t v_pa = {0}; ++ uint16x8_t v_pb = {0}; ++ uint16x8_t v_pc = {0}; ++ uint16x8_t v_cmpab = {0}; ++ uint16x8_t v_cmpac = {0}; ++ uint8x8_t v_picka = {0}; ++ uint8x8_t v_pickb = {0}; ++ ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; + } +- +- ok: +- self->private_impl.p_decode_comment[0] = 0; +- goto exit; ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +- goto suspend; +- suspend: +- self->private_impl.p_decode_comment[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++// -------- func png.decoder.filter_1 + +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ return (*self->private_impl.choosy_filter_1)(self, a_curr); ++} + +- return status; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ uint64_t v_filter_distance = 0; ++ uint8_t v_fa = 0; ++ uint64_t v_i_start = 0; ++ uint64_t v_i = 0; ++ ++ v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); ++ v_i_start = 0u; ++ while (v_i_start < v_filter_distance) { ++ v_fa = 0u; ++ v_i = v_i_start; ++ while (v_i < ((uint64_t)(a_curr.len))) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + v_fa)); ++ v_fa = a_curr.ptr[v_i]; ++ v_i += v_filter_distance; ++ } ++ v_i_start += 1u; ++ } ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func json.decoder.decode_inf_nan ++// -------- func png.decoder.filter_1_distance_3_fallback + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_inf_nan( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_c4 = 0; +- uint32_t v_neg = 0; ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ uint8_t v_fa0 = 0; ++ uint8_t v_fa1 = 0; ++ uint8_t v_fa2 = 0; + +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 3; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; + } ++ v_curr.len = 3; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ } ++ v_curr.len = 0; + } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ return wuffs_base__make_empty_struct(); ++} + +- uint32_t coro_susp_point = self->private_impl.p_decode_inf_nan[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// -------- func png.decoder.filter_1_distance_4_fallback + +- while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 2u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- continue; +- } +- v_c4 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); +- if ((v_c4 | 2105376u) == 6712937u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) > 7u) { +- if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) | 2314885530818453536u) == 8751735898823356009u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(8u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 8u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- } else if ( ! (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- continue; +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 3u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } else if ((v_c4 | 2105376u) == 7233902u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(10485888u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 3u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } else if ((v_c4 & 255u) == 43u) { +- v_neg = 0u; +- } else if ((v_c4 & 255u) == 45u) { +- v_neg = 1u; +- } else { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 3u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- continue; +- } +- v_c4 = (wuffs_base__peek_u32le__no_bounds_check(iop_a_src) >> 8u); +- if ((v_c4 | 2105376u) == 6712937u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) > 8u) { +- if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 1u) | 2314885530818453536u) == 8751735898823356009u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 9u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- } else if ( ! (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- continue; +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 4u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } else if ((v_c4 | 2105376u) == 7233902u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((10485760u | (((uint32_t)(128u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 4u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ uint8_t v_fa0 = 0; ++ uint8_t v_fa1 = 0; ++ uint8_t v_fa2 = 0; ++ uint8_t v_fa3 = 0; + +- ok: +- self->private_impl.p_decode_inf_nan[0] = 0; +- goto exit; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_fa3 = ((uint8_t)(v_fa3 + v_curr.ptr[3u])); ++ v_curr.ptr[3u] = v_fa3; ++ v_curr.ptr += 4; ++ } ++ v_curr.len = 0; + } ++ return wuffs_base__make_empty_struct(); ++} + +- goto suspend; +- suspend: +- self->private_impl.p_decode_inf_nan[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++// -------- func png.decoder.filter_2 + +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_2( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ uint64_t v_n = 0; ++ uint64_t v_i = 0; + +- return status; ++ v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); ++ v_i = 0u; ++ while (v_i < v_n) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i])); ++ v_i += 1u; ++ } ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func json.decoder.decode_trailer ++// -------- func png.decoder.filter_3 + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_trailer( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ return (*self->private_impl.choosy_filter_3)(self, a_curr, a_prev); ++} + +- uint8_t v_c = 0; +- uint32_t v_whitespace_length = 0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ uint64_t v_filter_distance = 0; ++ uint64_t v_n = 0; ++ uint64_t v_i = 0; + +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; ++ v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); ++ if (((uint64_t)(a_prev.len)) == 0u) { ++ v_i = v_filter_distance; ++ while (v_i < ((uint64_t)(a_curr.len))) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(a_curr.ptr[(v_i - v_filter_distance)] / 2u)))); ++ v_i += 1u; ++ } ++ } else { ++ v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); ++ v_i = 0u; ++ while ((v_i < v_n) && (v_i < v_filter_distance)) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(a_prev.ptr[v_i] / 2u)))); ++ v_i += 1u; ++ } ++ v_i = v_filter_distance; ++ while (v_i < v_n) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(((((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)])) + ((uint32_t)(a_prev.ptr[v_i]))) / 2u))))); ++ v_i += 1u; + } + } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ return wuffs_base__make_empty_struct(); ++} + +- uint32_t coro_susp_point = self->private_impl.p_decode_trailer[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// -------- func png.decoder.filter_3_distance_3_fallback + +- if (self->private_impl.f_quirks[18u]) { +- self->private_impl.f_trailer_stop = 10u; +- } else { +- self->private_impl.f_trailer_stop = 0u; +- } +- label__outer__continue:; +- while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint8_t v_fa0 = 0; ++ uint8_t v_fa1 = 0; ++ uint8_t v_fa2 = 0; ++ ++ if (((uint64_t)(a_prev.len)) == 0u) { ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 3; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; + } +- v_whitespace_length = 0u; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (v_whitespace_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- if (a_src && a_src->meta.closed) { +- goto label__outer__break; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- goto label__outer__continue; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (WUFFS_JSON__LUT_CLASSES[v_c] != 0u) { +- if (v_whitespace_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- if (self->private_impl.f_trailer_stop > 0u) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_json__decoder__decode_comment(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_comment_type > 0u) { +- goto label__outer__continue; +- } +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- iop_a_src += 1u; +- if ((v_whitespace_length >= 65534u) || (v_c == self->private_impl.f_trailer_stop)) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)((v_whitespace_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (v_c == self->private_impl.f_trailer_stop) { +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- goto label__outer__continue; +- } +- v_whitespace_length += 1u; ++ v_curr.len = 3; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; + } ++ v_curr.len = 0; ++ } ++ } else { ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 3; ++ v_prev.len = 3; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ } ++ v_curr.len = 3; ++ v_prev.len = 3; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- label__outer__break:; +- +- ok: +- self->private_impl.p_decode_trailer[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_trailer[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_lzw__error__bad_code[] = "#lzw: bad code"; +-const char wuffs_lzw__error__truncated_input[] = "#lzw: truncated input"; +-const char wuffs_lzw__error__internal_error_inconsistent_i_o[] = "#lzw: internal error: inconsistent I/O"; +- +-// ---------------- Private Consts +- +-#define WUFFS_LZW__QUIRKS_BASE 1348378624 +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes ++// -------- func png.decoder.filter_3_distance_4_fallback + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_lzw__decoder__read_from( +- wuffs_lzw__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_lzw__decoder__write_to( +- wuffs_lzw__decoder* self, +- wuffs_base__io_buffer* a_dst); +- +-// ---------------- VTables +- +-const wuffs_base__io_transformer__func_ptrs +-wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer = { +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_lzw__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_lzw__decoder__history_retain_length), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_lzw__decoder__set_quirk), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_lzw__decoder__transform_io), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzw__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_lzw__decoder__initialize( +- wuffs_lzw__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++wuffs_png__decoder__filter_3_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint8_t v_fa0 = 0; ++ uint8_t v_fa1 = 0; ++ uint8_t v_fa2 = 0; ++ uint8_t v_fa3 = 0; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ if (((uint64_t)(a_prev.len)) == 0u) { ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_fa3 = ((uint8_t)(((uint8_t)(v_fa3 / 2u)) + v_curr.ptr[3u])); ++ v_curr.ptr[3u] = v_fa3; ++ v_curr.ptr += 4; ++ } ++ v_curr.len = 0; + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif + } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_fa3 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa3)) + ((uint32_t)(v_prev.ptr[3u]))) / 2u))) + v_curr.ptr[3u])); ++ v_curr.ptr[3u] = v_fa3; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } + } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = +- wuffs_base__io_transformer__vtable_name; +- self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = +- (const void*)(&wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer); +- return wuffs_base__make_status(NULL); ++ return wuffs_base__make_empty_struct(); + } + +-wuffs_lzw__decoder* +-wuffs_lzw__decoder__alloc(void) { +- wuffs_lzw__decoder* x = +- (wuffs_lzw__decoder*)(calloc(sizeof(wuffs_lzw__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_lzw__decoder__initialize( +- x, sizeof(wuffs_lzw__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} ++// -------- func png.decoder.filter_4 + +-size_t +-sizeof__wuffs_lzw__decoder(void) { +- return sizeof(wuffs_lzw__decoder); ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ return (*self->private_impl.choosy_filter_4)(self, a_curr, a_prev); + } + +-// ---------------- Function Implementations +- +-// -------- func lzw.decoder.get_quirk +- + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_lzw__decoder__get_quirk( +- const wuffs_lzw__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ uint64_t v_filter_distance = 0; ++ uint64_t v_n = 0; ++ uint64_t v_i = 0; ++ uint32_t v_fa = 0; ++ uint32_t v_fb = 0; ++ uint32_t v_fc = 0; ++ uint32_t v_pp = 0; ++ uint32_t v_pa = 0; ++ uint32_t v_pb = 0; ++ uint32_t v_pc = 0; + +- if (a_key == 1348378624u) { +- return ((uint64_t)(self->private_impl.f_pending_literal_width_plus_one)); ++ v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); ++ v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); ++ v_i = 0u; ++ while ((v_i < v_n) && (v_i < v_filter_distance)) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i])); ++ v_i += 1u; + } +- return 0u; ++ v_i = v_filter_distance; ++ while (v_i < v_n) { ++ v_fa = ((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)])); ++ v_fb = ((uint32_t)(a_prev.ptr[v_i])); ++ v_fc = ((uint32_t)(a_prev.ptr[(v_i - v_filter_distance)])); ++ v_pp = ((uint32_t)(((uint32_t)(v_fa + v_fb)) - v_fc)); ++ v_pa = ((uint32_t)(v_pp - v_fa)); ++ if (v_pa >= 2147483648u) { ++ v_pa = ((uint32_t)(0u - v_pa)); ++ } ++ v_pb = ((uint32_t)(v_pp - v_fb)); ++ if (v_pb >= 2147483648u) { ++ v_pb = ((uint32_t)(0u - v_pb)); ++ } ++ v_pc = ((uint32_t)(v_pp - v_fc)); ++ if (v_pc >= 2147483648u) { ++ v_pc = ((uint32_t)(0u - v_pc)); ++ } ++ if ((v_pa <= v_pb) && (v_pa <= v_pc)) { ++ } else if (v_pb <= v_pc) { ++ v_fa = v_fb; ++ } else { ++ v_fa = v_fc; ++ } ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(v_fa)))); ++ v_i += 1u; ++ } ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func lzw.decoder.set_quirk ++// -------- func png.decoder.filter_4_distance_3_fallback + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_lzw__decoder__set_quirk( +- wuffs_lzw__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint32_t v_fa0 = 0; ++ uint32_t v_fa1 = 0; ++ uint32_t v_fa2 = 0; ++ uint32_t v_fb0 = 0; ++ uint32_t v_fb1 = 0; ++ uint32_t v_fb2 = 0; ++ uint32_t v_fc0 = 0; ++ uint32_t v_fc1 = 0; ++ uint32_t v_fc2 = 0; ++ uint32_t v_pp0 = 0; ++ uint32_t v_pp1 = 0; ++ uint32_t v_pp2 = 0; ++ uint32_t v_pa0 = 0; ++ uint32_t v_pa1 = 0; ++ uint32_t v_pa2 = 0; ++ uint32_t v_pb0 = 0; ++ uint32_t v_pb1 = 0; ++ uint32_t v_pb2 = 0; ++ uint32_t v_pc0 = 0; ++ uint32_t v_pc1 = 0; ++ uint32_t v_pc2 = 0; + +- if (a_key == 1348378624u) { +- if (a_value > 9u) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 3; ++ v_prev.len = 3; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fb0 = ((uint32_t)(v_prev.ptr[0u])); ++ v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0)); ++ v_pa0 = ((uint32_t)(v_pp0 - v_fa0)); ++ if (v_pa0 >= 2147483648u) { ++ v_pa0 = ((uint32_t)(0u - v_pa0)); ++ } ++ v_pb0 = ((uint32_t)(v_pp0 - v_fb0)); ++ if (v_pb0 >= 2147483648u) { ++ v_pb0 = ((uint32_t)(0u - v_pb0)); ++ } ++ v_pc0 = ((uint32_t)(v_pp0 - v_fc0)); ++ if (v_pc0 >= 2147483648u) { ++ v_pc0 = ((uint32_t)(0u - v_pc0)); ++ } ++ if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) { ++ } else if (v_pb0 <= v_pc0) { ++ v_fa0 = v_fb0; ++ } else { ++ v_fa0 = v_fc0; ++ } ++ v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0)))); ++ v_fa0 = ((uint32_t)(v_curr.ptr[0u])); ++ v_fc0 = v_fb0; ++ v_fb1 = ((uint32_t)(v_prev.ptr[1u])); ++ v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1)); ++ v_pa1 = ((uint32_t)(v_pp1 - v_fa1)); ++ if (v_pa1 >= 2147483648u) { ++ v_pa1 = ((uint32_t)(0u - v_pa1)); ++ } ++ v_pb1 = ((uint32_t)(v_pp1 - v_fb1)); ++ if (v_pb1 >= 2147483648u) { ++ v_pb1 = ((uint32_t)(0u - v_pb1)); ++ } ++ v_pc1 = ((uint32_t)(v_pp1 - v_fc1)); ++ if (v_pc1 >= 2147483648u) { ++ v_pc1 = ((uint32_t)(0u - v_pc1)); ++ } ++ if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) { ++ } else if (v_pb1 <= v_pc1) { ++ v_fa1 = v_fb1; ++ } else { ++ v_fa1 = v_fc1; ++ } ++ v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1)))); ++ v_fa1 = ((uint32_t)(v_curr.ptr[1u])); ++ v_fc1 = v_fb1; ++ v_fb2 = ((uint32_t)(v_prev.ptr[2u])); ++ v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2)); ++ v_pa2 = ((uint32_t)(v_pp2 - v_fa2)); ++ if (v_pa2 >= 2147483648u) { ++ v_pa2 = ((uint32_t)(0u - v_pa2)); ++ } ++ v_pb2 = ((uint32_t)(v_pp2 - v_fb2)); ++ if (v_pb2 >= 2147483648u) { ++ v_pb2 = ((uint32_t)(0u - v_pb2)); ++ } ++ v_pc2 = ((uint32_t)(v_pp2 - v_fc2)); ++ if (v_pc2 >= 2147483648u) { ++ v_pc2 = ((uint32_t)(0u - v_pc2)); ++ } ++ if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) { ++ } else if (v_pb2 <= v_pc2) { ++ v_fa2 = v_fb2; ++ } else { ++ v_fa2 = v_fc2; ++ } ++ v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2)))); ++ v_fa2 = ((uint32_t)(v_curr.ptr[2u])); ++ v_fc2 = v_fb2; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; + } +- self->private_impl.f_pending_literal_width_plus_one = ((uint32_t)(a_value)); +- return wuffs_base__make_status(NULL); ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func lzw.decoder.history_retain_length ++// -------- func png.decoder.filter_4_distance_4_fallback + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_lzw__decoder__history_retain_length( +- const wuffs_lzw__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func lzw.decoder.workbuf_len ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint32_t v_fa0 = 0; ++ uint32_t v_fa1 = 0; ++ uint32_t v_fa2 = 0; ++ uint32_t v_fa3 = 0; ++ uint32_t v_fb0 = 0; ++ uint32_t v_fb1 = 0; ++ uint32_t v_fb2 = 0; ++ uint32_t v_fb3 = 0; ++ uint32_t v_fc0 = 0; ++ uint32_t v_fc1 = 0; ++ uint32_t v_fc2 = 0; ++ uint32_t v_fc3 = 0; ++ uint32_t v_pp0 = 0; ++ uint32_t v_pp1 = 0; ++ uint32_t v_pp2 = 0; ++ uint32_t v_pp3 = 0; ++ uint32_t v_pa0 = 0; ++ uint32_t v_pa1 = 0; ++ uint32_t v_pa2 = 0; ++ uint32_t v_pa3 = 0; ++ uint32_t v_pb0 = 0; ++ uint32_t v_pb1 = 0; ++ uint32_t v_pb2 = 0; ++ uint32_t v_pb3 = 0; ++ uint32_t v_pc0 = 0; ++ uint32_t v_pc1 = 0; ++ uint32_t v_pc2 = 0; ++ uint32_t v_pc3 = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_lzw__decoder__workbuf_len( +- const wuffs_lzw__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fb0 = ((uint32_t)(v_prev.ptr[0u])); ++ v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0)); ++ v_pa0 = ((uint32_t)(v_pp0 - v_fa0)); ++ if (v_pa0 >= 2147483648u) { ++ v_pa0 = ((uint32_t)(0u - v_pa0)); ++ } ++ v_pb0 = ((uint32_t)(v_pp0 - v_fb0)); ++ if (v_pb0 >= 2147483648u) { ++ v_pb0 = ((uint32_t)(0u - v_pb0)); ++ } ++ v_pc0 = ((uint32_t)(v_pp0 - v_fc0)); ++ if (v_pc0 >= 2147483648u) { ++ v_pc0 = ((uint32_t)(0u - v_pc0)); ++ } ++ if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) { ++ } else if (v_pb0 <= v_pc0) { ++ v_fa0 = v_fb0; ++ } else { ++ v_fa0 = v_fc0; ++ } ++ v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0)))); ++ v_fa0 = ((uint32_t)(v_curr.ptr[0u])); ++ v_fc0 = v_fb0; ++ v_fb1 = ((uint32_t)(v_prev.ptr[1u])); ++ v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1)); ++ v_pa1 = ((uint32_t)(v_pp1 - v_fa1)); ++ if (v_pa1 >= 2147483648u) { ++ v_pa1 = ((uint32_t)(0u - v_pa1)); ++ } ++ v_pb1 = ((uint32_t)(v_pp1 - v_fb1)); ++ if (v_pb1 >= 2147483648u) { ++ v_pb1 = ((uint32_t)(0u - v_pb1)); ++ } ++ v_pc1 = ((uint32_t)(v_pp1 - v_fc1)); ++ if (v_pc1 >= 2147483648u) { ++ v_pc1 = ((uint32_t)(0u - v_pc1)); ++ } ++ if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) { ++ } else if (v_pb1 <= v_pc1) { ++ v_fa1 = v_fb1; ++ } else { ++ v_fa1 = v_fc1; ++ } ++ v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1)))); ++ v_fa1 = ((uint32_t)(v_curr.ptr[1u])); ++ v_fc1 = v_fb1; ++ v_fb2 = ((uint32_t)(v_prev.ptr[2u])); ++ v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2)); ++ v_pa2 = ((uint32_t)(v_pp2 - v_fa2)); ++ if (v_pa2 >= 2147483648u) { ++ v_pa2 = ((uint32_t)(0u - v_pa2)); ++ } ++ v_pb2 = ((uint32_t)(v_pp2 - v_fb2)); ++ if (v_pb2 >= 2147483648u) { ++ v_pb2 = ((uint32_t)(0u - v_pb2)); ++ } ++ v_pc2 = ((uint32_t)(v_pp2 - v_fc2)); ++ if (v_pc2 >= 2147483648u) { ++ v_pc2 = ((uint32_t)(0u - v_pc2)); ++ } ++ if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) { ++ } else if (v_pb2 <= v_pc2) { ++ v_fa2 = v_fb2; ++ } else { ++ v_fa2 = v_fc2; ++ } ++ v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2)))); ++ v_fa2 = ((uint32_t)(v_curr.ptr[2u])); ++ v_fc2 = v_fb2; ++ v_fb3 = ((uint32_t)(v_prev.ptr[3u])); ++ v_pp3 = ((uint32_t)(((uint32_t)(v_fa3 + v_fb3)) - v_fc3)); ++ v_pa3 = ((uint32_t)(v_pp3 - v_fa3)); ++ if (v_pa3 >= 2147483648u) { ++ v_pa3 = ((uint32_t)(0u - v_pa3)); ++ } ++ v_pb3 = ((uint32_t)(v_pp3 - v_fb3)); ++ if (v_pb3 >= 2147483648u) { ++ v_pb3 = ((uint32_t)(0u - v_pb3)); ++ } ++ v_pc3 = ((uint32_t)(v_pp3 - v_fc3)); ++ if (v_pc3 >= 2147483648u) { ++ v_pc3 = ((uint32_t)(0u - v_pc3)); ++ } ++ if ((v_pa3 <= v_pb3) && (v_pa3 <= v_pc3)) { ++ } else if (v_pb3 <= v_pc3) { ++ v_fa3 = v_fb3; ++ } else { ++ v_fa3 = v_fc3; ++ } ++ v_curr.ptr[3u] = ((uint8_t)(v_curr.ptr[3u] + ((uint8_t)(v_fa3)))); ++ v_fa3 = ((uint32_t)(v_curr.ptr[3u])); ++ v_fc3 = v_fb3; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func lzw.decoder.transform_io ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func png.decoder.filter_1_distance_4_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_lzw__decoder__transform_io( +- wuffs_lzw__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_i = 0; +- +- uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ __m128i v_x128 = {0}; ++ __m128i v_a128 = {0}; + +- self->private_impl.f_literal_width = 8u; +- if (self->private_impl.f_pending_literal_width_plus_one > 0u) { +- self->private_impl.f_literal_width = (self->private_impl.f_pending_literal_width_plus_one - 1u); +- } +- self->private_impl.f_clear_code = (((uint32_t)(1u)) << self->private_impl.f_literal_width); +- self->private_impl.f_end_code = (self->private_impl.f_clear_code + 1u); +- self->private_impl.f_save_code = self->private_impl.f_end_code; +- self->private_impl.f_prev_code = self->private_impl.f_end_code; +- self->private_impl.f_width = (self->private_impl.f_literal_width + 1u); +- self->private_impl.f_bits = 0u; +- self->private_impl.f_n_bits = 0u; +- self->private_impl.f_output_ri = 0u; +- self->private_impl.f_output_wi = 0u; +- v_i = 0u; +- while (v_i < self->private_impl.f_clear_code) { +- self->private_data.f_lm1s[v_i] = 0u; +- self->private_data.f_suffixes[v_i][0u] = ((uint8_t)(v_i)); +- v_i += 1u; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_a128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_a128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; + } +- while (true) { +- wuffs_lzw__decoder__read_from(self, a_src); +- if (self->private_impl.f_output_wi > 0u) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_lzw__decoder__write_to(self, a_dst); +- if (status.repr) { +- goto suspend; +- } +- } +- if (self->private_impl.f_read_from_return_value == 0u) { +- break; +- } else if (self->private_impl.f_read_from_return_value == 1u) { +- continue; +- } else if (self->private_impl.f_read_from_return_value == 2u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- } else if (self->private_impl.f_read_from_return_value == 3u) { +- status = wuffs_base__make_status(wuffs_lzw__error__truncated_input); +- goto exit; +- } else if (self->private_impl.f_read_from_return_value == 4u) { +- status = wuffs_base__make_status(wuffs_lzw__error__bad_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o); +- goto exit; +- } ++ v_curr.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_a128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; + } +- +- ok: +- self->private_impl.p_transform_io[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ v_curr.len = 0; + } +- return status; ++ return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// -------- func lzw.decoder.read_from ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func png.decoder.filter_3_distance_4_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_lzw__decoder__read_from( +- wuffs_lzw__decoder* self, +- wuffs_base__io_buffer* a_src) { +- uint32_t v_clear_code = 0; +- uint32_t v_end_code = 0; +- uint32_t v_save_code = 0; +- uint32_t v_prev_code = 0; +- uint32_t v_width = 0; +- uint32_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_output_wi = 0; +- uint32_t v_code = 0; +- uint32_t v_c = 0; +- uint32_t v_o = 0; +- uint32_t v_steps = 0; +- uint8_t v_first_byte = 0; +- uint16_t v_lm1_b = 0; +- uint16_t v_lm1_a = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++wuffs_png__decoder__filter_3_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ __m128i v_x128 = {0}; ++ __m128i v_a128 = {0}; ++ __m128i v_b128 = {0}; ++ __m128i v_p128 = {0}; ++ __m128i v_k128 = {0}; + +- v_clear_code = self->private_impl.f_clear_code; +- v_end_code = self->private_impl.f_end_code; +- v_save_code = self->private_impl.f_save_code; +- v_prev_code = self->private_impl.f_prev_code; +- v_width = self->private_impl.f_width; +- v_bits = self->private_impl.f_bits; +- v_n_bits = self->private_impl.f_n_bits; +- v_output_wi = self->private_impl.f_output_wi; +- while (true) { +- if (v_n_bits < v_width) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { +- v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits)); +- iop_a_src += ((31u - v_n_bits) >> 3u); +- v_n_bits |= 24u; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- self->private_impl.f_read_from_return_value = 3u; +- } else { +- self->private_impl.f_read_from_return_value = 2u; +- } +- break; +- } else { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- if (v_n_bits >= v_width) { +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- self->private_impl.f_read_from_return_value = 3u; +- } else { +- self->private_impl.f_read_from_return_value = 2u; +- } +- break; +- } else { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- if (v_n_bits < v_width) { +- self->private_impl.f_read_from_return_value = 5u; +- break; +- } +- } +- } +- } +- v_code = ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_width)); +- v_bits >>= v_width; +- v_n_bits -= v_width; +- if (v_code < v_clear_code) { +- self->private_data.f_output[v_output_wi] = ((uint8_t)(v_code)); +- v_output_wi = ((v_output_wi + 1u) & 8191u); +- if (v_save_code <= 4095u) { +- v_lm1_a = (((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u); +- self->private_data.f_lm1s[v_save_code] = v_lm1_a; +- if ((v_lm1_a % 8u) != 0u) { +- self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code]; +- memcpy(self->private_data.f_suffixes[v_save_code],self->private_data.f_suffixes[v_prev_code], sizeof(self->private_data.f_suffixes[v_save_code])); +- self->private_data.f_suffixes[v_save_code][(v_lm1_a % 8u)] = ((uint8_t)(v_code)); +- } else { +- self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); +- self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_code)); +- } +- v_save_code += 1u; +- if (v_width < 12u) { +- v_width += (1u & (v_save_code >> v_width)); +- } +- v_prev_code = v_code; +- } +- } else if (v_code <= v_end_code) { +- if (v_code == v_end_code) { +- self->private_impl.f_read_from_return_value = 0u; +- break; +- } +- v_save_code = v_end_code; +- v_prev_code = v_end_code; +- v_width = (self->private_impl.f_literal_width + 1u); +- } else if (v_code <= v_save_code) { +- v_c = v_code; +- if (v_code == v_save_code) { +- v_c = v_prev_code; +- } +- v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lm1s[v_c])) & 4294967288u)) & 8191u); +- v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lm1s[v_c]))) & 8191u); +- v_steps = (((uint32_t)(self->private_data.f_lm1s[v_c])) >> 3u); +- while (true) { +- memcpy((self->private_data.f_output)+(v_o), (self->private_data.f_suffixes[v_c]), 8u); +- if (v_steps <= 0u) { +- break; +- } +- v_steps -= 1u; +- v_o = (((uint32_t)(v_o - 8u)) & 8191u); +- v_c = ((uint32_t)(self->private_impl.f_prefixes[v_c])); +- } +- v_first_byte = self->private_data.f_suffixes[v_c][0u]; +- if (v_code == v_save_code) { +- self->private_data.f_output[v_output_wi] = v_first_byte; +- v_output_wi = ((v_output_wi + 1u) & 8191u); ++ if (((uint64_t)(a_prev.len)) == 0u) { ++ v_k128 = _mm_set1_epi8((int8_t)(254u)); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; + } +- if (v_save_code <= 4095u) { +- v_lm1_b = (((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u); +- self->private_data.f_lm1s[v_save_code] = v_lm1_b; +- if ((v_lm1_b % 8u) != 0u) { +- self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code]; +- memcpy(self->private_data.f_suffixes[v_save_code],self->private_data.f_suffixes[v_prev_code], sizeof(self->private_data.f_suffixes[v_save_code])); +- self->private_data.f_suffixes[v_save_code][(v_lm1_b % 8u)] = v_first_byte; +- } else { +- self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); +- self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte)); +- } +- v_save_code += 1u; +- if (v_width < 12u) { +- v_width += (1u & (v_save_code >> v_width)); +- } +- v_prev_code = v_code; ++ v_curr.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; + } +- } else { +- self->private_impl.f_read_from_return_value = 4u; +- break; +- } +- if (v_output_wi > 4095u) { +- self->private_impl.f_read_from_return_value = 1u; +- break; ++ v_curr.len = 0; + } +- } +- if (self->private_impl.f_read_from_return_value != 2u) { +- while (v_n_bits >= 8u) { +- v_n_bits -= 8u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- self->private_impl.f_read_from_return_value = 5u; +- break; ++ } else { ++ v_k128 = _mm_set1_epi8((int8_t)(1u)); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_p128 = _mm_avg_epu8(v_a128, v_b128); ++ v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_p128 = _mm_avg_epu8(v_a128, v_b128); ++ v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ } ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_p128 = _mm_avg_epu8(v_a128, v_b128); ++ v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; + } ++ v_curr.len = 0; ++ v_prev.len = 0; + } + } +- self->private_impl.f_save_code = v_save_code; +- self->private_impl.f_prev_code = v_prev_code; +- self->private_impl.f_width = v_width; +- self->private_impl.f_bits = v_bits; +- self->private_impl.f_n_bits = v_n_bits; +- self->private_impl.f_output_wi = v_output_wi; +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- + return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// -------- func lzw.decoder.write_to ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func png.decoder.filter_4_distance_3_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_lzw__decoder__write_to( +- wuffs_lzw__decoder* self, +- wuffs_base__io_buffer* a_dst) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__slice_u8 v_s = {0}; +- uint64_t v_n = 0; ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ __m128i v_x128 = {0}; ++ __m128i v_a128 = {0}; ++ __m128i v_b128 = {0}; ++ __m128i v_c128 = {0}; ++ __m128i v_p128 = {0}; ++ __m128i v_pa128 = {0}; ++ __m128i v_pb128 = {0}; ++ __m128i v_pc128 = {0}; ++ __m128i v_smallest128 = {0}; ++ __m128i v_z128 = {0}; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; + } +- } +- +- uint32_t coro_susp_point = self->private_impl.p_write_to[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (self->private_impl.f_output_wi > 0u) { +- if (self->private_impl.f_output_ri > self->private_impl.f_output_wi) { +- status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- v_s = wuffs_base__make_slice_u8_ij(self->private_data.f_output, +- self->private_impl.f_output_ri, +- self->private_impl.f_output_wi); +- v_n = wuffs_base__io_writer__copy_from_slice(&iop_a_dst, io2_a_dst,v_s); +- if (v_n == ((uint64_t)(v_s.len))) { +- self->private_impl.f_output_ri = 0u; +- self->private_impl.f_output_wi = 0u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- self->private_impl.f_output_ri = (((uint32_t)(self->private_impl.f_output_ri + ((uint32_t)(v_n)))) & 8191u); +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; + } +- +- ok: +- self->private_impl.p_write_to[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_write_to[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func lzw.decoder.flush +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8 +-wuffs_lzw__decoder__flush( +- wuffs_lzw__decoder* self) { +- if (!self) { +- return wuffs_base__make_slice_u8(NULL, 0); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_slice_u8(NULL, 0); +- } +- +- uint32_t v_ri = 0; +- uint32_t v_wi = 0; +- +- v_ri = self->private_impl.f_output_ri; +- v_wi = self->private_impl.f_output_wi; +- self->private_impl.f_output_ri = 0u; +- self->private_impl.f_output_wi = 0u; +- if (v_ri <= v_wi) { +- return wuffs_base__make_slice_u8_ij(self->private_data.f_output, v_ri, v_wi); ++ v_curr.len = 3; ++ v_prev.len = 3; ++ const uint8_t* i_end2_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end2_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- return wuffs_base__make_slice_u8(self->private_data.f_output, 0); ++ return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_netpbm__error__bad_header[] = "#netpbm: bad header"; +-const char wuffs_netpbm__error__truncated_input[] = "#netpbm: truncated input"; +-const char wuffs_netpbm__error__unsupported_netpbm_file[] = "#netpbm: unsupported Netpbm file"; +-const char wuffs_netpbm__note__internal_note_short_read[] = "@netpbm: internal note: short read"; +- +-// ---------------- Private Consts +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_image_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_frame_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_frame( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func png.decoder.filter_4_distance_4_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_netpbm__decoder__swizzle( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-// ---------------- VTables +- +-const wuffs_base__image_decoder__func_ptrs +-wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_netpbm__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_netpbm__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_netpbm__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_netpbm__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_netpbm__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_netpbm__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_netpbm__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_netpbm__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_netpbm__decoder__initialize( +- wuffs_netpbm__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ __m128i v_x128 = {0}; ++ __m128i v_a128 = {0}; ++ __m128i v_b128 = {0}; ++ __m128i v_c128 = {0}; ++ __m128i v_p128 = {0}; ++ __m128i v_pa128 = {0}; ++ __m128i v_pb128 = {0}; ++ __m128i v_pc128 = {0}; ++ __m128i v_smallest128 = {0}; ++ __m128i v_z128 = {0}; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; + } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_netpbm__decoder* +-wuffs_netpbm__decoder__alloc(void) { +- wuffs_netpbm__decoder* x = +- (wuffs_netpbm__decoder*)(calloc(sizeof(wuffs_netpbm__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_netpbm__decoder__initialize( +- x, sizeof(wuffs_netpbm__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} +- +-size_t +-sizeof__wuffs_netpbm__decoder(void) { +- return sizeof(wuffs_netpbm__decoder); ++ return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// ---------------- Function Implementations +- +-// -------- func netpbm.decoder.get_quirk ++// -------- func png.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__get_quirk( +- const wuffs_netpbm__decoder* self, ++wuffs_png__decoder__get_quirk( ++ const wuffs_png__decoder* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -49804,15 +62628,18 @@ wuffs_netpbm__decoder__get_quirk( + return 0; + } + ++ if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } + return 0u; + } + +-// -------- func netpbm.decoder.set_quirk ++// -------- func png.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__set_quirk( +- wuffs_netpbm__decoder* self, ++wuffs_png__decoder__set_quirk( ++ wuffs_png__decoder* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -49825,15 +62652,20 @@ wuffs_netpbm__decoder__set_quirk( + : wuffs_base__error__initialize_not_called); + } + ++ if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, a_key, a_value); ++ return wuffs_base__make_status(NULL); ++ } + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func netpbm.decoder.decode_image_config ++// -------- func png.decoder.decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_image_config( +- wuffs_netpbm__decoder* self, ++wuffs_png__decoder__decode_image_config( ++ wuffs_png__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { +@@ -49859,53 +62691,364 @@ wuffs_netpbm__decoder__decode_image_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_png__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func png.decoder.do_decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_decode_image_config( ++ wuffs_png__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint64_t v_magic = 0; ++ uint64_t v_mark = 0; ++ uint32_t v_checksum_have = 0; ++ uint32_t v_checksum_want = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ if (coro_susp_point) { ++ v_checksum_have = self->private_data.s_do_decode_image_config.v_checksum_have; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if ( ! self->private_impl.f_seen_ihdr) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_0 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 56) { ++ t_0 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_magic = t_0; ++ } ++ if (v_magic != 727905341920923785u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint64_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_1 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 56) { ++ t_1 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_magic = t_1; ++ } ++ if (v_magic != 5927942488114331648u) { ++ if (v_magic == 5278895250759221248u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_cgbi_extension); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_chunk_type_array[0u] = 73u; ++ self->private_impl.f_chunk_type_array[1u] = 72u; ++ self->private_impl.f_chunk_type_array[2u] = 68u; ++ self->private_impl.f_chunk_type_array[3u] = 82u; ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_png__decoder__decode_ihdr(self, a_src); ++ v_status = t_2; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)); ++ } ++ } ++ v_checksum_want = t_3; ++ } ++ if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != v_checksum_want)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_checksum); ++ goto exit; ++ } ++ self->private_impl.f_seen_ihdr = true; ++ } else if (self->private_impl.f_metadata_fourcc != 0u) { ++ self->private_impl.f_call_sequence = 16u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; ++ } + while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ continue; ++ } ++ self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); ++ if (self->private_impl.f_chunk_type == 1413563465u) { ++ if ( ! self->private_impl.f_seen_actl || self->private_impl.f_seen_fctl) { ++ break; ++ } ++ self->private_impl.f_seen_idat = true; ++ } else if (self->private_impl.f_chunk_type == 1413571686u) { ++ if (self->private_impl.f_seen_idat && self->private_impl.f_seen_fctl) { ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ iop_a_src += 8u; ++ if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) { ++ self->private_impl.f_chunk_type_array[0u] = ((uint8_t)((self->private_impl.f_chunk_type >> 0u))); ++ self->private_impl.f_chunk_type_array[1u] = ((uint8_t)((self->private_impl.f_chunk_type >> 8u))); ++ self->private_impl.f_chunk_type_array[2u] = ((uint8_t)((self->private_impl.f_chunk_type >> 16u))); ++ self->private_impl.f_chunk_type_array[3u] = ((uint8_t)((self->private_impl.f_chunk_type >> 24u))); ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); ++ } ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_4 = wuffs_png__decoder__decode_other_chunk(self, a_src, false); ++ v_status = t_4; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ } ++ if (self->private_impl.f_metadata_fourcc != 0u) { ++ self->private_impl.f_call_sequence = 16u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; ++ } + { +- wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ uint32_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); ++ if (num_bits_5 == 24) { ++ t_5 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)); ++ } ++ } ++ v_checksum_want = t_5; + } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); ++ if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u) && (v_checksum_have != v_checksum_want)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_checksum); + goto exit; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } ++ if ((self->private_impl.f_color_type == 3u) && ! self->private_impl.f_seen_plte) { ++ status = wuffs_base__make_status(wuffs_png__error__missing_palette); ++ goto exit; ++ } ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ self->private_impl.f_first_config_io_position = self->private_impl.f_frame_config_io_position; ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_dst_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_first_config_io_position, ++ ((self->private_impl.f_color_type <= 3u) && ! self->private_impl.f_seen_trns)); ++ } ++ if ( ! self->private_impl.f_seen_actl) { ++ self->private_impl.f_num_animation_frames_value = 1u; ++ self->private_impl.f_first_rect_x0 = 0u; ++ self->private_impl.f_first_rect_y0 = 0u; ++ self->private_impl.f_first_rect_x1 = self->private_impl.f_width; ++ self->private_impl.f_first_rect_y1 = self->private_impl.f_height; ++ self->private_impl.f_first_duration = 0u; ++ self->private_impl.f_first_disposal = 0u; ++ self->private_impl.f_first_overwrite_instead_of_blend = false; ++ } ++ self->private_impl.f_call_sequence = 32u; + + ok: +- self->private_impl.p_decode_image_config[0] = 0; ++ self->private_impl.p_do_decode_image_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_image_config.v_checksum_have = v_checksum_have; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func netpbm.decoder.do_decode_image_config ++// -------- func png.decoder.decode_ihdr + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_image_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__image_config* a_dst, ++wuffs_png__decoder__decode_ihdr( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint32_t v_n = 0; ++ uint32_t v_a32 = 0; ++ uint8_t v_a8 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -49918,348 +63061,343 @@ wuffs_netpbm__decoder__do_decode_image_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_ihdr; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_ihdr.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_ihdr.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ v_a32 = t_0; ++ } ++ if ((v_a32 == 0u) || (v_a32 > 2147483647u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; ++ } else if (v_a32 > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); + goto exit; + } ++ self->private_impl.f_width = v_a32; + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_ihdr.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_ihdr.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); ++ } ++ } ++ v_a32 = t_1; ++ } ++ if ((v_a32 == 0u) || (v_a32 > 2147483647u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; ++ } else if (v_a32 > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_height = v_a32; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; ++ uint8_t t_2 = *iop_a_src++; ++ v_a8 = t_2; + } +- if (v_c != 80u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ if (v_a8 > 16u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); + goto exit; + } ++ self->private_impl.f_depth = v_a8; + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; ++ uint8_t t_3 = *iop_a_src++; ++ v_a8 = t_3; + } +- if ((v_c < 49u) || (55u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; +- } else if (v_c == 53u) { +- self->private_impl.f_pixfmt = 536870920u; +- } else if (v_c == 54u) { +- self->private_impl.f_pixfmt = 2684356744u; +- } else { +- status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ if ((v_a8 == 1u) || (v_a8 == 5u) || (v_a8 > 6u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); + goto exit; + } ++ self->private_impl.f_color_type = v_a8; + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; ++ uint8_t t_4 = *iop_a_src++; ++ v_a8 = t_4; + } +- if (v_c != 10u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ if (v_a8 != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); + goto exit; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; +- } +- if ((v_c == 32u) || (v_c == 9u)) { +- continue; +- } else if (v_c == 35u) { +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; +- } +- if (v_c == 10u) { +- break; +- } +- } +- continue; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- self->private_impl.f_width = ((uint32_t)((v_c - 48u))); +- break; ++ uint8_t t_5 = *iop_a_src++; ++ v_a8 = t_5; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; +- } +- if ((v_c == 32u) || (v_c == 9u)) { +- break; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; +- } +- v_n = ((10u * self->private_impl.f_width) + ((uint32_t)((v_c - 48u)))); +- if (v_n > 16777215u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); +- goto exit; +- } +- self->private_impl.f_width = v_n; ++ if (v_a8 != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_6 = *iop_a_src++; +- v_c = t_6; +- } +- if ((v_c == 32u) || (v_c == 9u)) { +- continue; +- } else if (v_c == 35u) { +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_7 = *iop_a_src++; +- v_c = t_7; +- } +- if (v_c == 10u) { +- break; +- } +- } +- continue; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- self->private_impl.f_height = ((uint32_t)((v_c - 48u))); +- break; ++ uint8_t t_6 = *iop_a_src++; ++ v_a8 = t_6; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_8 = *iop_a_src++; +- v_c = t_8; +- } +- if ((v_c == 32u) || (v_c == 9u) || (v_c == 13u)) { +- continue; +- } else if (v_c == 10u) { +- break; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; +- } +- v_n = ((10u * self->private_impl.f_height) + ((uint32_t)((v_c - 48u)))); +- if (v_n > 16777215u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); +- goto exit; +- } +- self->private_impl.f_height = v_n; ++ if (v_a8 == 0u) { ++ self->private_impl.f_interlace_pass = 0u; ++ } else if (v_a8 == 1u) { ++ self->private_impl.f_interlace_pass = 1u; ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_9 = *iop_a_src++; +- v_c = t_9; +- } +- if ((v_c == 32u) || (v_c == 9u)) { +- continue; +- } else if (v_c == 35u) { +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_10 = *iop_a_src++; +- v_c = t_10; +- } +- if (v_c == 10u) { +- break; +- } +- } +- continue; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; +- } +- self->private_impl.f_max_value = ((uint32_t)((v_c - 48u))); +- break; ++ self->private_impl.f_filter_distance = 0u; ++ wuffs_png__decoder__assign_filter_distance(self); ++ if (self->private_impl.f_filter_distance == 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_11 = *iop_a_src++; +- v_c = t_11; +- } +- if ((v_c == 32u) || (v_c == 9u) || (v_c == 13u)) { +- continue; +- } else if (v_c == 10u) { +- break; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; +- } +- v_n = ((10u * self->private_impl.f_max_value) + ((uint32_t)((v_c - 48u)))); +- if (v_n > 16777215u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); +- goto exit; ++ self->private_impl.f_overall_workbuf_length = (((uint64_t)(self->private_impl.f_height)) * (1u + wuffs_png__decoder__calculate_bytes_per_row(self, self->private_impl.f_width))); ++ wuffs_png__decoder__choose_filter_implementations(self); ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_ihdr = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_ihdr = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func png.decoder.assign_filter_distance ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__assign_filter_distance( ++ wuffs_png__decoder* self) { ++ if (self->private_impl.f_depth < 8u) { ++ if ((self->private_impl.f_depth != 1u) && (self->private_impl.f_depth != 2u) && (self->private_impl.f_depth != 4u)) { ++ return wuffs_base__make_empty_struct(); ++ } else if (self->private_impl.f_color_type == 0u) { ++ self->private_impl.f_dst_pixfmt = 536870920u; ++ self->private_impl.f_src_pixfmt = 536870920u; ++ } else if (self->private_impl.f_color_type == 3u) { ++ self->private_impl.f_dst_pixfmt = 2198077448u; ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ } else { ++ return wuffs_base__make_empty_struct(); ++ } ++ self->private_impl.f_filter_distance = 1u; ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); ++ } else if (self->private_impl.f_color_type == 0u) { ++ if (self->private_impl.f_depth == 8u) { ++ self->private_impl.f_dst_pixfmt = 536870920u; ++ self->private_impl.f_src_pixfmt = 536870920u; ++ self->private_impl.f_filter_distance = 1u; ++ } else if (self->private_impl.f_depth == 16u) { ++ if (self->private_impl.f_interlace_pass == 0u) { ++ self->private_impl.f_dst_pixfmt = 536870923u; ++ self->private_impl.f_src_pixfmt = 537919499u; ++ } else { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; + } +- self->private_impl.f_max_value = v_n; ++ self->private_impl.f_filter_distance = 2u; + } +- if (self->private_impl.f_max_value != 255u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); +- goto exit; ++ } else if (self->private_impl.f_color_type == 2u) { ++ if (self->private_impl.f_depth == 8u) { ++ self->private_impl.f_dst_pixfmt = 2147485832u; ++ self->private_impl.f_src_pixfmt = 2684356744u; ++ self->private_impl.f_filter_distance = 3u; ++ } else if (self->private_impl.f_depth == 16u) { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ self->private_impl.f_filter_distance = 6u; ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); + } +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- self->private_impl.f_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- false); ++ } else if (self->private_impl.f_color_type == 3u) { ++ if (self->private_impl.f_depth == 8u) { ++ self->private_impl.f_dst_pixfmt = 2198077448u; ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ self->private_impl.f_filter_distance = 1u; ++ } ++ } else if (self->private_impl.f_color_type == 4u) { ++ if (self->private_impl.f_depth == 8u) { ++ self->private_impl.f_dst_pixfmt = 553648264u; ++ self->private_impl.f_src_pixfmt = 553648264u; ++ self->private_impl.f_filter_distance = 2u; ++ } else if (self->private_impl.f_depth == 16u) { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ self->private_impl.f_filter_distance = 4u; ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); ++ } ++ } else if (self->private_impl.f_color_type == 6u) { ++ if (self->private_impl.f_depth == 8u) { ++ self->private_impl.f_dst_pixfmt = 2164295816u; ++ self->private_impl.f_src_pixfmt = 2701166728u; ++ self->private_impl.f_filter_distance = 4u; ++ } else if (self->private_impl.f_depth == 16u) { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ self->private_impl.f_filter_distance = 8u; ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); + } +- self->private_impl.f_call_sequence = 32u; +- +- goto ok; +- ok: +- self->private_impl.p_do_decode_image_config[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func netpbm.decoder.decode_frame_config ++// -------- func png.decoder.calculate_bytes_per_row + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_frame_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++static uint64_t ++wuffs_png__decoder__calculate_bytes_per_row( ++ const wuffs_png__decoder* self, ++ uint32_t a_width) { ++ uint64_t v_bytes_per_channel = 0; + +- ok: +- self->private_impl.p_decode_frame_config[0] = 0; +- goto exit; ++ if (self->private_impl.f_depth == 1u) { ++ return ((uint64_t)(((a_width + 7u) / 8u))); ++ } else if (self->private_impl.f_depth == 2u) { ++ return ((uint64_t)(((a_width + 3u) / 4u))); ++ } else if (self->private_impl.f_depth == 4u) { ++ return ((uint64_t)(((a_width + 1u) / 2u))); + } ++ v_bytes_per_channel = ((uint64_t)(((uint8_t)(self->private_impl.f_depth >> 3u)))); ++ return (((uint64_t)(a_width)) * v_bytes_per_channel * ((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type]))); ++} + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++// -------- func png.decoder.choose_filter_implementations + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__choose_filter_implementations( ++ wuffs_png__decoder* self) { ++ if (self->private_impl.f_filter_distance == 3u) { ++ self->private_impl.choosy_filter_1 = ( ++ &wuffs_png__decoder__filter_1_distance_3_fallback); ++ self->private_impl.choosy_filter_3 = ( ++ &wuffs_png__decoder__filter_3_distance_3_fallback); ++ self->private_impl.choosy_filter_4 = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_3_arm_neon : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_3_x86_sse42 : ++#endif ++ &wuffs_png__decoder__filter_4_distance_3_fallback); ++ } else if (self->private_impl.f_filter_distance == 4u) { ++ self->private_impl.choosy_filter_1 = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_1_distance_4_arm_neon : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_1_distance_4_x86_sse42 : ++#endif ++ &wuffs_png__decoder__filter_1_distance_4_fallback); ++ self->private_impl.choosy_filter_3 = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_3_distance_4_arm_neon : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_3_distance_4_x86_sse42 : ++#endif ++ &wuffs_png__decoder__filter_3_distance_4_fallback); ++ self->private_impl.choosy_filter_4 = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_4_arm_neon : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_4_x86_sse42 : ++#endif ++ &wuffs_png__decoder__filter_4_distance_4_fallback); + } +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func netpbm.decoder.do_decode_frame_config ++// -------- func png.decoder.decode_other_chunk + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_frame_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++wuffs_png__decoder__decode_other_chunk( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ bool a_framy) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; +@@ -50273,62 +63411,218 @@ wuffs_netpbm__decoder__do_decode_frame_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_other_chunk; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if ((self->private_impl.f_chunk_type == 1163152464u) && ! a_framy) { ++ if (self->private_impl.f_seen_plte) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } else if (self->private_impl.f_color_type == 3u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_png__decoder__decode_plte(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if ((self->private_impl.f_color_type == 2u) || (self->private_impl.f_color_type == 6u)) { ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_netpbm__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ self->private_impl.f_seen_plte = true; ++ } else if ((self->private_impl.f_chunk_type & 32u) == 0u) { ++ if (self->private_impl.f_chunk_type != 1413563465u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- if (status.repr) { +- goto suspend; ++ } ++ if (self->private_impl.f_chunk_type == 1716082789u) { ++ if (self->private_impl.f_report_metadata_exif) { ++ if (self->private_impl.f_seen_exif) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_png__decoder__decode_exif(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_exif = true; + } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; ++ } else if ((self->private_impl.f_chunk_type == 1951945833u) || (self->private_impl.f_chunk_type == 1951942004u) || (self->private_impl.f_chunk_type == 1951945850u)) { ++ if (self->private_impl.f_report_metadata_kvp) { ++ self->private_impl.f_metadata_flavor = 4u; ++ self->private_impl.f_metadata_fourcc = 1263947851u; ++ self->private_impl.f_metadata_x = 0u; ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; ++ } ++ } else if ( ! a_framy) { ++ if (self->private_impl.f_chunk_type == 1280598881u) { ++ if (self->private_impl.f_seen_actl) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_png__decoder__decode_actl(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_actl = true; ++ } else if (self->private_impl.f_chunk_type == 1297238115u) { ++ if (self->private_impl.f_report_metadata_chrm) { ++ if (self->private_impl.f_seen_chrm) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_png__decoder__decode_chrm(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_chrm = true; ++ } ++ } else if (self->private_impl.f_chunk_type == 1280598886u) { ++ if (self->private_impl.f_seen_fctl) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ status = wuffs_png__decoder__decode_fctl(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_fctl = true; ++ } else if (self->private_impl.f_chunk_type == 1095582055u) { ++ if (self->private_impl.f_report_metadata_gama) { ++ if (self->private_impl.f_seen_gama) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ status = wuffs_png__decoder__decode_gama(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_gama = true; ++ } ++ } else if (self->private_impl.f_chunk_type == 1346585449u) { ++ if (self->private_impl.f_report_metadata_iccp) { ++ if (self->private_impl.f_seen_iccp) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ status = wuffs_png__decoder__decode_iccp(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_iccp = true; ++ } ++ } else if (self->private_impl.f_chunk_type == 1111970419u) { ++ if (self->private_impl.f_report_metadata_srgb) { ++ if (self->private_impl.f_seen_srgb) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_png__decoder__decode_srgb(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_srgb = true; ++ } ++ } else if (self->private_impl.f_chunk_type == 1397641844u) { ++ if (self->private_impl.f_seen_trns || ((self->private_impl.f_color_type == 3u) && ! self->private_impl.f_seen_plte)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } else if (self->private_impl.f_color_type > 3u) { ++ } else { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_png__decoder__decode_trns(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ self->private_impl.f_seen_trns = true; + } +- } else if (self->private_impl.f_call_sequence == 64u) { +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; + } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height), +- ((wuffs_base__flicks)(0u)), +- 0u, +- self->private_impl.f_frame_config_io_position, +- 0u, +- false, +- false, +- 0u); ++ if (self->private_impl.f_metadata_fourcc == 0u) { ++ self->private_data.s_decode_other_chunk.scratch = self->private_impl.f_chunk_length; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (self->private_data.s_decode_other_chunk.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_other_chunk.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_other_chunk.scratch; + } +- self->private_impl.f_call_sequence = 64u; + ++ goto ok; + ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; ++ self->private_impl.p_decode_other_chunk = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_other_chunk = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -50339,181 +63633,130 @@ wuffs_netpbm__decoder__do_decode_frame_config( + return status; + } + +-// -------- func netpbm.decoder.decode_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_frame( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } +- +- ok: +- self->private_impl.p_decode_frame[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} +- +-// -------- func netpbm.decoder.do_decode_frame ++// -------- func png.decoder.decode_actl + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_frame( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++wuffs_png__decoder__decode_actl( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_actl; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_netpbm__decoder__do_decode_frame_config(self, NULL, a_src); +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ if (self->private_impl.f_chunk_length != 8u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } else if (self->private_impl.f_interlace_pass > 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ goto exit; + } +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y = 0u; +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette(a_dst), +- wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), +- wuffs_base__utility__empty_slice_u8(), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; ++ self->private_impl.f_chunk_length = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_actl.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_actl.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } + } +- goto ok; ++ self->private_impl.f_num_animation_frames_value = t_0; + } +- while (true) { +- v_status = wuffs_netpbm__decoder__swizzle(self, a_dst, a_src); +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } else if (v_status.repr != wuffs_netpbm__note__internal_note_short_read) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; ++ if (self->private_impl.f_num_animation_frames_value == 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_actl.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_actl.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); + } +- goto ok; + } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ self->private_impl.f_num_animation_loops_value = t_1; + } +- self->private_impl.f_call_sequence = 96u; + ++ goto ok; + ok: +- self->private_impl.p_do_decode_frame[0] = 0; ++ self->private_impl.p_decode_actl = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_actl = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ + return status; + } + +-// -------- func netpbm.decoder.swizzle ++// -------- func png.decoder.decode_chrm + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_netpbm__decoder__swizzle( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, ++wuffs_png__decoder__decode_chrm( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- uint32_t v_src_bytes_per_pixel = 0; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_j = 0; +- uint64_t v_n = 0; ++ uint64_t v_u = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -50526,543 +63769,337 @@ wuffs_netpbm__decoder__swizzle( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- while (true) { +- if (self->private_impl.f_dst_x == self->private_impl.f_width) { +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += 1u; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- break; +- } +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ uint32_t coro_susp_point = self->private_impl.p_decode_chrm; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_chunk_length != 32u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i >= ((uint64_t)(v_dst.len))) { +- v_src_bytes_per_pixel = 1u; +- if (self->private_impl.f_pixfmt == 2684356744u) { +- v_src_bytes_per_pixel = 3u; +- } +- v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); +- v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); +- v_j = v_n; +- while (v_j >= 8u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 8u); ++ self->private_impl.f_chunk_length = 0u; ++ self->private_impl.f_metadata_flavor = 5u; ++ self->private_impl.f_metadata_fourcc = 1128813133u; ++ self->private_impl.f_metadata_x = 0u; ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); + } +- v_j -= 8u; + } +- while (v_j > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 1u); ++ v_u = t_0; ++ } ++ self->private_impl.f_metadata_x |= ((16777215u & v_u) << 0u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint64_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 24) { ++ t_1 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); + } +- v_j -= 1u; + } +- } else { +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( +- &self->private_impl.f_swizzler, +- wuffs_base__slice_u8__subslice_i(v_dst, v_i), +- wuffs_base__pixel_buffer__palette(a_dst), +- &iop_a_src, +- io2_a_src); +- } +- if (v_n == 0u) { +- status = wuffs_base__make_status(wuffs_netpbm__note__internal_note_short_read); +- goto ok; ++ v_u = t_1; + } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- } +- status = wuffs_base__make_status(NULL); +- goto ok; +- +- ok: +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func netpbm.decoder.frame_dirty_rect +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_netpbm__decoder__frame_dirty_rect( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- +- return wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height); +-} +- +-// -------- func netpbm.decoder.num_animation_loops +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_netpbm__decoder__num_animation_loops( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func netpbm.decoder.num_decoded_frame_configs +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__num_decoded_frame_configs( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- if (self->private_impl.f_call_sequence > 32u) { +- return 1u; +- } +- return 0u; +-} +- +-// -------- func netpbm.decoder.num_decoded_frames +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__num_decoded_frames( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- if (self->private_impl.f_call_sequence > 64u) { +- return 1u; +- } +- return 0u; +-} +- +-// -------- func netpbm.decoder.restart_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__restart_frame( +- wuffs_netpbm__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } +- if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- self->private_impl.f_call_sequence = 40u; +- return wuffs_base__make_status(NULL); +-} +- +-// -------- func netpbm.decoder.set_report_metadata +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_netpbm__decoder__set_report_metadata( +- wuffs_netpbm__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func netpbm.decoder.tell_me_more +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__tell_me_more( +- wuffs_netpbm__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; +- +- goto ok; +- ok: +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} +- +-// -------- func netpbm.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__history_retain_length( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func netpbm.decoder.workbuf_len +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_netpbm__decoder__workbuf_len( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_nie__error__bad_header[] = "#nie: bad header"; +-const char wuffs_nie__error__truncated_input[] = "#nie: truncated input"; +-const char wuffs_nie__error__unsupported_nie_file[] = "#nie: unsupported NIE file"; +-const char wuffs_nie__note__internal_note_short_read[] = "@nie: internal note: short read"; +- +-// ---------------- Private Consts +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_nie__decoder__do_decode_image_config( +- wuffs_nie__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_nie__decoder__do_decode_frame_config( +- wuffs_nie__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_nie__decoder__do_decode_frame( +- wuffs_nie__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_nie__decoder__swizzle( +- wuffs_nie__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-// ---------------- VTables +- +-const wuffs_base__image_decoder__func_ptrs +-wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_nie__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_nie__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_nie__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_nie__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_nie__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_nie__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_nie__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_nie__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_nie__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_nie__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_nie__decoder__initialize( +- wuffs_nie__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } +- +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ self->private_impl.f_metadata_x |= ((16777215u & v_u) << 24u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint64_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); ++ if (num_bits_2 == 24) { ++ t_2 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)); ++ } ++ } ++ v_u = t_2; + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ self->private_impl.f_metadata_x |= ((uint64_t)((16777215u & v_u) << 48u)); ++ self->private_impl.f_metadata_y |= ((16777215u & v_u) >> 16u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint64_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); ++ if (num_bits_3 == 24) { ++ t_3 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)); ++ } ++ } ++ v_u = t_3; + } +- } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_nie__decoder* +-wuffs_nie__decoder__alloc(void) { +- wuffs_nie__decoder* x = +- (wuffs_nie__decoder*)(calloc(sizeof(wuffs_nie__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_nie__decoder__initialize( +- x, sizeof(wuffs_nie__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} +- +-size_t +-sizeof__wuffs_nie__decoder(void) { +- return sizeof(wuffs_nie__decoder); +-} +- +-// ---------------- Function Implementations +- +-// -------- func nie.decoder.get_quirk ++ self->private_impl.f_metadata_y |= ((16777215u & v_u) << 8u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ uint64_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_4 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ if (num_bits_4 == 24) { ++ t_4 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)); ++ } ++ } ++ v_u = t_4; ++ } ++ self->private_impl.f_metadata_y |= ((16777215u & v_u) << 32u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ uint64_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_5 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); ++ if (num_bits_5 == 24) { ++ t_5 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)); ++ } ++ } ++ v_u = t_5; ++ } ++ self->private_impl.f_metadata_y |= ((uint64_t)((16777215u & v_u) << 56u)); ++ self->private_impl.f_metadata_z |= ((16777215u & v_u) >> 8u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ uint64_t t_6; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_6 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); ++ if (num_bits_6 == 24) { ++ t_6 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_6 += 8u; ++ *scratch |= ((uint64_t)(num_bits_6)); ++ } ++ } ++ v_u = t_6; ++ } ++ self->private_impl.f_metadata_z |= ((16777215u & v_u) << 16u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ uint64_t t_7; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_7 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_7 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_7); ++ if (num_bits_7 == 24) { ++ t_7 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_7 += 8u; ++ *scratch |= ((uint64_t)(num_bits_7)); ++ } ++ } ++ v_u = t_7; ++ } ++ self->private_impl.f_metadata_z |= ((16777215u & v_u) << 40u); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__get_quirk( +- const wuffs_nie__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ goto ok; ++ ok: ++ self->private_impl.p_decode_chrm = 0; ++ goto exit; + } + +- return 0u; +-} +- +-// -------- func nie.decoder.set_quirk ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_chrm = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__set_quirk( +- wuffs_nie__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ return status; + } + +-// -------- func nie.decoder.decode_image_config ++// -------- func png.decoder.decode_exif + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_image_config( +- wuffs_nie__decoder* self, +- wuffs_base__image_config* a_dst, ++static wuffs_base__status ++wuffs_png__decoder__decode_exif( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_nie__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +- ok: +- self->private_impl.p_decode_image_config[0] = 0; ++ if (self->private_impl.f_chunk_length < 4u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } ++ self->private_impl.f_metadata_flavor = 3u; ++ self->private_impl.f_metadata_fourcc = 1163413830u; ++ self->private_impl.f_metadata_x = 0u; ++ self->private_impl.f_metadata_y = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ self->private_impl.f_metadata_z = wuffs_base__u64__sat_add(self->private_impl.f_metadata_y, ((uint64_t)(self->private_impl.f_chunk_length))); ++ self->private_impl.f_chunk_length = 0u; + +- goto suspend; +- suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; +- ++ goto ok; ++ ok: + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func nie.decoder.do_decode_image_config ++// -------- func png.decoder.decode_fctl + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_nie__decoder__do_decode_image_config( +- wuffs_nie__decoder* self, +- wuffs_base__image_config* a_dst, ++wuffs_png__decoder__decode_fctl( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_a = 0; ++ uint32_t v_x0 = 0; ++ uint32_t v_y0 = 0; ++ uint32_t v_x1 = 0; ++ uint32_t v_y1 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -51075,185 +64112,309 @@ wuffs_nie__decoder__do_decode_image_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_fctl; ++ if (coro_susp_point) { ++ v_x0 = self->private_data.s_decode_fctl.v_x0; ++ v_x1 = self->private_data.s_decode_fctl.v_x1; ++ v_y1 = self->private_data.s_decode_fctl.v_y1; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ if (self->private_impl.f_chunk_length != 26u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } ++ self->private_impl.f_chunk_length = 0u; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; ++ self->private_data.s_decode_fctl.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); + if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch)); ++ t_0 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ *scratch |= ((uint64_t)(num_bits_0)); + } + } +- v_a = t_0; ++ v_x0 = t_0; + } +- if (v_a != 1169146734u) { +- status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ if (v_x0 != self->private_impl.f_next_animation_seq_num) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); ++ goto exit; ++ } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); + goto exit; + } ++ self->private_impl.f_next_animation_seq_num += 1u; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; ++ self->private_data.s_decode_fctl.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); + if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch)); ++ t_1 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ *scratch |= ((uint64_t)(num_bits_1)); + } + } +- v_a = t_1; +- } +- if (v_a == 879649535u) { +- self->private_impl.f_pixfmt = 2164295816u; +- } else if (v_a == 946758399u) { +- self->private_impl.f_pixfmt = 2164308923u; +- } else if (v_a == 879780607u) { +- status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file); +- goto exit; +- } else if (v_a == 946889471u) { +- status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_nie__error__bad_header); +- goto exit; ++ v_x1 = t_1; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + uint32_t t_2; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; ++ self->private_data.s_decode_fctl.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); + if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch)); ++ t_2 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ *scratch |= ((uint64_t)(num_bits_2)); + } + } +- v_a = t_2; +- } +- if (v_a > 2147483647u) { +- status = wuffs_base__make_status(wuffs_nie__error__bad_header); +- goto exit; +- } else if (v_a > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; ++ v_y1 = t_2; + } +- self->private_impl.f_width = v_a; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + uint32_t t_3; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; ++ self->private_data.s_decode_fctl.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)); ++ } ++ } ++ v_x0 = t_3; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_4 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_fctl.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ if (num_bits_4 == 24) { ++ t_4 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)); ++ } ++ } ++ v_y0 = t_4; ++ } ++ v_x1 += v_x0; ++ v_y1 += v_y0; ++ if ((v_x0 >= v_x1) || ++ (v_x0 > self->private_impl.f_width) || ++ (v_x1 > self->private_impl.f_width) || ++ (v_y0 >= v_y1) || ++ (v_y0 > self->private_impl.f_height) || ++ (v_y1 > self->private_impl.f_height)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_frame_rect_x0 = v_x0; ++ self->private_impl.f_frame_rect_y0 = v_y0; ++ self->private_impl.f_frame_rect_x1 = v_x1; ++ self->private_impl.f_frame_rect_y1 = v_y1; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ uint32_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_fctl.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; + *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); ++ if (num_bits_5 == 8) { ++ t_5 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)); ++ } ++ } ++ v_x0 = t_5; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ uint32_t t_6; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_6 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_fctl.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu)); + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch)); ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); ++ if (num_bits_6 == 8) { ++ t_6 = ((uint32_t)(*scratch >> 48)); + break; + } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ num_bits_6 += 8u; ++ *scratch |= ((uint64_t)(num_bits_6)); + } + } +- v_a = t_3; ++ v_x1 = t_6; + } +- if (v_a > 2147483647u) { +- status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ if (v_x1 <= 0u) { ++ self->private_impl.f_frame_duration = (((uint64_t)(v_x0)) * 7056000u); ++ } else { ++ self->private_impl.f_frame_duration = ((((uint64_t)(v_x0)) * 705600000u) / ((uint64_t)(v_x1))); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_7 = *iop_a_src++; ++ v_x0 = t_7; ++ } ++ if (v_x0 == 0u) { ++ self->private_impl.f_frame_disposal = 0u; ++ } else if (v_x0 == 1u) { ++ self->private_impl.f_frame_disposal = 1u; ++ } else if (v_x0 == 2u) { ++ self->private_impl.f_frame_disposal = 2u; ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; +- } else if (v_a > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_8 = *iop_a_src++; ++ v_x0 = t_8; ++ } ++ if (v_x0 == 0u) { ++ self->private_impl.f_frame_overwrite_instead_of_blend = true; ++ } else if (v_x0 == 1u) { ++ self->private_impl.f_frame_overwrite_instead_of_blend = false; ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } +- self->private_impl.f_height = v_a; +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- self->private_impl.f_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- 16u, +- false); ++ if (self->private_impl.f_num_decoded_frame_configs_value == 0u) { ++ self->private_impl.f_first_rect_x0 = self->private_impl.f_frame_rect_x0; ++ self->private_impl.f_first_rect_y0 = self->private_impl.f_frame_rect_y0; ++ self->private_impl.f_first_rect_x1 = self->private_impl.f_frame_rect_x1; ++ self->private_impl.f_first_rect_y1 = self->private_impl.f_frame_rect_y1; ++ self->private_impl.f_first_duration = self->private_impl.f_frame_duration; ++ self->private_impl.f_first_disposal = self->private_impl.f_frame_disposal; ++ self->private_impl.f_first_overwrite_instead_of_blend = self->private_impl.f_frame_overwrite_instead_of_blend; + } +- self->private_impl.f_call_sequence = 32u; + + goto ok; + ok: +- self->private_impl.p_do_decode_image_config[0] = 0; ++ self->private_impl.p_decode_fctl = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_fctl = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_fctl.v_x0 = v_x0; ++ self->private_data.s_decode_fctl.v_x1 = v_x1; ++ self->private_data.s_decode_fctl.v_y1 = v_y1; + + goto exit; + exit: +@@ -51264,82 +64425,99 @@ wuffs_nie__decoder__do_decode_image_config( + return status; + } + +-// -------- func nie.decoder.decode_frame_config ++// -------- func png.decoder.decode_gama + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_frame_config( +- wuffs_nie__decoder* self, +- wuffs_base__frame_config* a_dst, ++static wuffs_base__status ++wuffs_png__decoder__decode_gama( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_gama; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_nie__error__truncated_input); +- goto exit; ++ if (self->private_impl.f_chunk_length != 4u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length = 0u; ++ self->private_impl.f_metadata_flavor = 5u; ++ self->private_impl.f_metadata_fourcc = 1195461953u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_gama.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_gama.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ self->private_impl.f_metadata_x = t_0; + } ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; + ++ goto ok; + ok: +- self->private_impl.p_decode_frame_config[0] = 0; ++ self->private_impl.p_decode_gama = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ self->private_impl.p_decode_gama = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func nie.decoder.do_decode_frame_config ++// -------- func png.decoder.decode_iccp + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_nie__decoder__do_decode_frame_config( +- wuffs_nie__decoder* self, +- wuffs_base__frame_config* a_dst, ++wuffs_png__decoder__decode_iccp( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + ++ uint8_t v_c8 = 0; ++ + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -51351,62 +64529,63 @@ wuffs_nie__decoder__do_decode_frame_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_iccp; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ while (true) { ++ if (self->private_impl.f_chunk_length <= 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_nie__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ self->private_impl.f_chunk_length -= 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- if (status.repr) { +- goto suspend; ++ if (v_c8 == 0u) { ++ break; + } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (16u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; ++ } ++ if (self->private_impl.f_chunk_length <= 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- } else if (self->private_impl.f_call_sequence == 64u) { +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; + } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height), +- ((wuffs_base__flicks)(0u)), +- 0u, +- 16u, +- 0u, +- false, +- false, +- 0u); ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); ++ goto exit; + } +- self->private_impl.f_call_sequence = 64u; ++ self->private_impl.f_metadata_is_zlib_compressed = true; ++ self->private_impl.f_metadata_flavor = 4u; ++ self->private_impl.f_metadata_fourcc = 1229144912u; ++ self->private_impl.f_metadata_x = 0u; ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; + ++ goto ok; + ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; ++ self->private_impl.p_decode_iccp = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_iccp = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -51417,182 +64596,119 @@ wuffs_nie__decoder__do_decode_frame_config( + return status; + } + +-// -------- func nie.decoder.decode_frame ++// -------- func png.decoder.decode_plte + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_frame( +- wuffs_nie__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; ++static wuffs_base__status ++wuffs_png__decoder__decode_plte( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_nie__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++ uint32_t v_num_entries = 0; ++ uint32_t v_i = 0; ++ uint32_t v_argb = 0; + +- ok: +- self->private_impl.p_decode_frame[0] = 0; +- goto exit; ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ uint32_t coro_susp_point = self->private_impl.p_decode_plte; ++ if (coro_susp_point) { ++ v_num_entries = self->private_data.s_decode_plte.v_num_entries; ++ v_i = self->private_data.s_decode_plte.v_i; + } +- return status; +-} +- +-// -------- func nie.decoder.do_decode_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_nie__decoder__do_decode_frame( +- wuffs_nie__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_nie__decoder__do_decode_frame_config(self, NULL, a_src); +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y = 0u; +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette(a_dst), +- wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), +- wuffs_base__utility__empty_slice_u8(), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; ++ if ((self->private_impl.f_chunk_length > 768u) || ((self->private_impl.f_chunk_length % 3u) != 0u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- while (true) { +- v_status = wuffs_nie__decoder__swizzle(self, a_dst, a_src); +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } else if (v_status.repr != wuffs_nie__note__internal_note_short_read) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; ++ v_num_entries = (((uint32_t)(self->private_impl.f_chunk_length)) / 3u); ++ self->private_impl.f_chunk_length = 0u; ++ while (v_i < v_num_entries) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { ++ t_0 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); ++ iop_a_src += 3; ++ } else { ++ self->private_data.s_decode_plte.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_plte.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 16) { ++ t_0 = ((uint32_t)(*scratch >> 40)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } + } +- goto ok; ++ v_argb = t_0; + } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ v_argb |= 4278190080u; ++ self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); ++ self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); ++ self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); ++ v_i += 1u; ++ } ++ while (v_i < 256u) { ++ self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u; ++ v_i += 1u; + } +- self->private_impl.f_call_sequence = 96u; + ++ goto ok; + ok: +- self->private_impl.p_do_decode_frame[0] = 0; ++ self->private_impl.p_decode_plte = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_plte = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_plte.v_num_entries = v_num_entries; ++ self->private_data.s_decode_plte.v_i = v_i; + + goto exit; + exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ + return status; + } + +-// -------- func nie.decoder.swizzle ++// -------- func png.decoder.decode_srgb + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_nie__decoder__swizzle( +- wuffs_nie__decoder* self, +- wuffs_base__pixel_buffer* a_dst, ++wuffs_png__decoder__decode_srgb( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- uint32_t v_src_bytes_per_pixel = 0; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_j = 0; +- uint64_t v_n = 0; +- + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -51604,66 +64720,39 @@ wuffs_nie__decoder__swizzle( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- while (true) { +- if (self->private_impl.f_dst_x == self->private_impl.f_width) { +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += 1u; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- break; +- } +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); +- } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i >= ((uint64_t)(v_dst.len))) { +- v_src_bytes_per_pixel = 4u; +- if (self->private_impl.f_pixfmt == 2164308923u) { +- v_src_bytes_per_pixel = 8u; +- } +- v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); +- v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); +- v_j = v_n; +- while (v_j >= 8u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 8u); +- } +- v_j -= 8u; +- } +- while (v_j > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 1u); +- } +- v_j -= 1u; +- } +- } else { +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( +- &self->private_impl.f_swizzler, +- wuffs_base__slice_u8__subslice_i(v_dst, v_i), +- wuffs_base__pixel_buffer__palette(a_dst), +- &iop_a_src, +- io2_a_src); ++ uint32_t coro_susp_point = self->private_impl.p_decode_srgb; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_chunk_length != 1u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- if (v_n == 0u) { +- status = wuffs_base__make_status(wuffs_nie__note__internal_note_short_read); +- goto ok; ++ self->private_impl.f_chunk_length = 0u; ++ self->private_impl.f_metadata_flavor = 5u; ++ self->private_impl.f_metadata_fourcc = 1397901122u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t t_0 = *iop_a_src++; ++ self->private_impl.f_metadata_x = t_0; + } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_srgb = 0; ++ goto exit; + } +- status = wuffs_base__make_status(NULL); +- goto ok; + +- ok: ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_srgb = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ + goto exit; + exit: + if (a_src && a_src->data.ptr) { +@@ -51673,131 +64762,199 @@ wuffs_nie__decoder__swizzle( + return status; + } + +-// -------- func nie.decoder.frame_dirty_rect +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_nie__decoder__frame_dirty_rect( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- +- return wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height); +-} +- +-// -------- func nie.decoder.num_animation_loops ++// -------- func png.decoder.decode_trns + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_nie__decoder__num_animation_loops( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} ++static wuffs_base__status ++wuffs_png__decoder__decode_trns( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// -------- func nie.decoder.num_decoded_frame_configs ++ uint32_t v_i = 0; ++ uint32_t v_n = 0; ++ uint64_t v_u = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__num_decoded_frame_configs( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- if (self->private_impl.f_call_sequence > 32u) { +- return 1u; ++ uint32_t coro_susp_point = self->private_impl.p_decode_trns; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_decode_trns.v_i; ++ v_n = self->private_data.s_decode_trns.v_n; + } +- return 0u; +-} +- +-// -------- func nie.decoder.num_decoded_frames ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__num_decoded_frames( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ if (self->private_impl.f_color_type == 0u) { ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); ++ if (self->private_impl.f_depth <= 8u) { ++ self->private_impl.f_dst_pixfmt = 2164295816u; ++ self->private_impl.f_src_pixfmt = 2164295816u; ++ } else { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ } ++ if (self->private_impl.f_chunk_length != 2u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_trns.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_trns.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 8) { ++ t_0 = ((uint64_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ v_u = t_0; ++ } ++ if (self->private_impl.f_depth <= 1u) { ++ self->private_impl.f_remap_transparency = (((v_u & 1u) * 16777215u) | 4278190080u); ++ } else if (self->private_impl.f_depth <= 2u) { ++ self->private_impl.f_remap_transparency = (((v_u & 3u) * 5592405u) | 4278190080u); ++ } else if (self->private_impl.f_depth <= 4u) { ++ self->private_impl.f_remap_transparency = (((v_u & 15u) * 1118481u) | 4278190080u); ++ } else if (self->private_impl.f_depth <= 8u) { ++ self->private_impl.f_remap_transparency = (((v_u & 255u) * 65793u) | 4278190080u); ++ } else { ++ self->private_impl.f_remap_transparency = ((v_u * 4295032833u) | 18446462598732840960u); ++ } ++ } else if (self->private_impl.f_color_type == 2u) { ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); ++ if (self->private_impl.f_depth <= 8u) { ++ self->private_impl.f_dst_pixfmt = 2164295816u; ++ self->private_impl.f_src_pixfmt = 2164295816u; ++ } else { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ } ++ if (self->private_impl.f_chunk_length != 6u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint64_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) { ++ t_1 = ((uint64_t)(wuffs_base__peek_u48be__no_bounds_check(iop_a_src))); ++ iop_a_src += 6; ++ } else { ++ self->private_data.s_decode_trns.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_trns.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 40) { ++ t_1 = ((uint64_t)(*scratch >> 16)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); ++ } ++ } ++ v_u = t_1; ++ } ++ if (self->private_impl.f_depth <= 8u) { ++ self->private_impl.f_remap_transparency = ((255u & (v_u >> 0u)) | ++ (65280u & (v_u >> 8u)) | ++ (16711680u & (v_u >> 16u)) | ++ 4278190080u); ++ } else { ++ self->private_impl.f_remap_transparency = (v_u | 18446462598732840960u); ++ } ++ } else if (self->private_impl.f_color_type == 3u) { ++ self->private_impl.f_dst_pixfmt = 2164523016u; ++ self->private_impl.f_src_pixfmt = 2164523016u; ++ if (self->private_impl.f_chunk_length > 256u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ v_n = ((uint32_t)(self->private_impl.f_chunk_length)); ++ self->private_impl.f_chunk_length = 0u; ++ while (v_i < v_n) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = t_2; ++ } ++ v_i += 1u; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } + +- if (self->private_impl.f_call_sequence > 64u) { +- return 1u; ++ goto ok; ++ ok: ++ self->private_impl.p_decode_trns = 0; ++ goto exit; + } +- return 0u; +-} +- +-// -------- func nie.decoder.restart_frame + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__restart_frame( +- wuffs_nie__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_trns = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_trns.v_i = v_i; ++ self->private_data.s_decode_trns.v_n = v_n; + +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } +- if ((a_index != 0u) || (a_io_position != 16u)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- self->private_impl.f_call_sequence = 40u; +- return wuffs_base__make_status(NULL); +-} + +-// -------- func nie.decoder.set_report_metadata +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_nie__decoder__set_report_metadata( +- wuffs_nie__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_base__make_empty_struct(); ++ return status; + } + +-// -------- func nie.decoder.tell_me_more ++// -------- func png.decoder.decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__tell_me_more( +- wuffs_nie__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, ++wuffs_png__decoder__decode_frame_config( ++ wuffs_png__decoder* self, ++ wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); +@@ -51808,354 +64965,485 @@ wuffs_nie__decoder__tell_me_more( + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } +- if (!a_dst || !a_src) { ++ if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { ++ (self->private_impl.active_coroutine != 2)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; +- +- goto ok; +- ok: +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} +- +-// -------- func nie.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__history_retain_length( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func nie.decoder.workbuf_len +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_nie__decoder__workbuf_len( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_zlib__note__dictionary_required[] = "@zlib: dictionary required"; +-const char wuffs_zlib__error__bad_checksum[] = "#zlib: bad checksum"; +-const char wuffs_zlib__error__bad_compression_method[] = "#zlib: bad compression method"; +-const char wuffs_zlib__error__bad_compression_window_size[] = "#zlib: bad compression window size"; +-const char wuffs_zlib__error__bad_parity_check[] = "#zlib: bad parity check"; +-const char wuffs_zlib__error__incorrect_dictionary[] = "#zlib: incorrect dictionary"; +-const char wuffs_zlib__error__truncated_input[] = "#zlib: truncated input"; +- +-// ---------------- Private Consts +- +-#define WUFFS_ZLIB__QUIRKS_BASE 2113790976 +- +-#define WUFFS_ZLIB__QUIRKS_COUNT 1 +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_zlib__decoder__do_transform_io( +- wuffs_zlib__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); +- +-// ---------------- VTables +- +-const wuffs_base__io_transformer__func_ptrs +-wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer = { +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_zlib__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_zlib__decoder__history_retain_length), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_zlib__decoder__set_quirk), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_zlib__decoder__transform_io), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_zlib__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_zlib__decoder__initialize( +- wuffs_zlib__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } +- } ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- { +- wuffs_base__status z = wuffs_adler32__hasher__initialize( +- &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options); +- if (z.repr) { +- return z; +- } +- } +- { +- wuffs_base__status z = wuffs_adler32__hasher__initialize( +- &self->private_data.f_dict_id_hasher, sizeof(self->private_data.f_dict_id_hasher), WUFFS_VERSION, options); +- if (z.repr) { +- return z; +- } +- } +- { +- wuffs_base__status z = wuffs_deflate__decoder__initialize( +- &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options); +- if (z.repr) { +- return z; ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- } +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = +- wuffs_base__io_transformer__vtable_name; +- self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = +- (const void*)(&wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_zlib__decoder* +-wuffs_zlib__decoder__alloc(void) { +- wuffs_zlib__decoder* x = +- (wuffs_zlib__decoder*)(calloc(sizeof(wuffs_zlib__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_zlib__decoder__initialize( +- x, sizeof(wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} +- +-size_t +-sizeof__wuffs_zlib__decoder(void) { +- return sizeof(wuffs_zlib__decoder); +-} +- +-// ---------------- Function Implementations +- +-// -------- func zlib.decoder.dictionary_id +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_zlib__decoder__dictionary_id( +- const wuffs_zlib__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return self->private_impl.f_dict_id_want; +-} + +-// -------- func zlib.decoder.add_dictionary +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_zlib__decoder__add_dictionary( +- wuffs_zlib__decoder* self, +- wuffs_base__slice_u8 a_dict) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; + } + +- if (self->private_impl.f_header_complete) { +- self->private_impl.f_bad_call_sequence = true; +- } else { +- self->private_impl.f_dict_id_got = wuffs_adler32__hasher__update_u32(&self->private_data.f_dict_id_hasher, a_dict); +- wuffs_deflate__decoder__add_history(&self->private_data.f_flate, a_dict); ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- self->private_impl.f_got_dictionary = true; +- return wuffs_base__make_empty_struct(); ++ return status; + } + +-// -------- func zlib.decoder.get_quirk ++// -------- func png.decoder.do_decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_zlib__decoder__get_quirk( +- const wuffs_zlib__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++static wuffs_base__status ++wuffs_png__decoder__do_decode_frame_config( ++ wuffs_png__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_checksum_have = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t v_key = 0; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { +- return 1u; +- } else if (a_key >= 2113790976u) { +- v_key = (a_key - 2113790976u); +- if (v_key < 1u) { +- if (self->private_impl.f_quirks[v_key]) { +- return 1u; ++ if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_png__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_png__decoder__skip_frame(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (self->private_impl.f_metadata_fourcc != 0u) { ++ self->private_impl.f_call_sequence = 48u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; ++ } ++ if (self->private_impl.f_num_decoded_frame_configs_value == 0u) { ++ self->private_impl.f_frame_rect_x0 = self->private_impl.f_first_rect_x0; ++ self->private_impl.f_frame_rect_y0 = self->private_impl.f_first_rect_y0; ++ self->private_impl.f_frame_rect_x1 = self->private_impl.f_first_rect_x1; ++ self->private_impl.f_frame_rect_y1 = self->private_impl.f_first_rect_y1; ++ self->private_impl.f_frame_config_io_position = self->private_impl.f_first_config_io_position; ++ self->private_impl.f_frame_duration = self->private_impl.f_first_duration; ++ self->private_impl.f_frame_disposal = self->private_impl.f_first_disposal; ++ self->private_impl.f_frame_overwrite_instead_of_blend = self->private_impl.f_first_overwrite_instead_of_blend; ++ } else { ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_frame_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ self->private_impl.f_chunk_length = t_0; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_frame_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ self->private_impl.f_chunk_type = t_1; ++ } ++ if (self->private_impl.f_chunk_type == 1145980233u) { ++ if (self->private_impl.f_chunk_length != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_frame_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ v_checksum_have = t_2; ++ } ++ if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != 2187346606u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_checksum); ++ goto exit; ++ } ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else if (self->private_impl.f_chunk_type == 1413571686u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } else if (self->private_impl.f_chunk_type == 1280598886u) { ++ self->private_impl.f_frame_config_io_position = ((uint64_t)(wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) - 8u)); ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_png__decoder__decode_fctl(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_data.s_do_decode_frame_config.scratch = 4u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (self->private_data.s_do_decode_frame_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame_config.scratch; ++ break; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ status = wuffs_png__decoder__decode_other_chunk(self, a_src, true); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_metadata_fourcc != 0u) { ++ self->private_impl.f_call_sequence = 48u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; ++ } ++ self->private_data.s_do_decode_frame_config.scratch = 4u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (self->private_data.s_do_decode_frame_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame_config.scratch; ++ self->private_impl.f_chunk_length = 0u; + } + } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ self->private_impl.f_frame_rect_x0, ++ self->private_impl.f_frame_rect_y0, ++ self->private_impl.f_frame_rect_x1, ++ self->private_impl.f_frame_rect_y1), ++ ((wuffs_base__flicks)(self->private_impl.f_frame_duration)), ++ ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)), ++ self->private_impl.f_frame_config_io_position, ++ self->private_impl.f_frame_disposal, ++ ((self->private_impl.f_color_type <= 3u) && ! self->private_impl.f_seen_trns), ++ self->private_impl.f_frame_overwrite_instead_of_blend, ++ 0u); ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u); ++ self->private_impl.f_call_sequence = 64u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; + } +- return 0u; +-} + +-// -------- func zlib.decoder.set_quirk ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_zlib__decoder__set_quirk( +- wuffs_zlib__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- if (self->private_impl.f_header_complete) { +- self->private_impl.f_bad_call_sequence = true; +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } else if (a_key == 1u) { +- self->private_impl.f_ignore_checksum = (a_value > 0u); +- return wuffs_base__make_status(NULL); +- } else if (a_key >= 2113790976u) { +- a_key -= 2113790976u; +- if (a_key < 1u) { +- self->private_impl.f_quirks[a_key] = (a_value > 0u); +- return wuffs_base__make_status(NULL); +- } +- } +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ return status; + } + +-// -------- func zlib.decoder.history_retain_length ++// -------- func png.decoder.skip_frame + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_zlib__decoder__history_retain_length( +- const wuffs_zlib__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++static wuffs_base__status ++wuffs_png__decoder__skip_frame( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_seq_num = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- return 0u; +-} ++ uint32_t coro_susp_point = self->private_impl.p_skip_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-// -------- func zlib.decoder.workbuf_len ++ self->private_impl.f_chunk_type_array[0u] = 0u; ++ self->private_impl.f_chunk_type_array[1u] = 0u; ++ self->private_impl.f_chunk_type_array[2u] = 0u; ++ self->private_impl.f_chunk_type_array[3u] = 0u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } ++ self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); ++ if (self->private_impl.f_chunk_type == 1413563465u) { ++ if (self->private_impl.f_chunk_type_array[0u] == 102u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_type_array[0u] = 73u; ++ self->private_impl.f_chunk_type_array[1u] = 68u; ++ self->private_impl.f_chunk_type_array[2u] = 65u; ++ self->private_impl.f_chunk_type_array[3u] = 84u; ++ } else if (self->private_impl.f_chunk_type == 1413571686u) { ++ if (self->private_impl.f_chunk_type_array[0u] == 73u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_type_array[0u] = 102u; ++ self->private_impl.f_chunk_type_array[1u] = 100u; ++ self->private_impl.f_chunk_type_array[2u] = 65u; ++ self->private_impl.f_chunk_type_array[3u] = 84u; ++ if (self->private_impl.f_chunk_length < 4u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 4u; ++ iop_a_src += 8u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_skip_frame.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_skip_frame.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ v_seq_num = t_0; ++ } ++ if (v_seq_num != self->private_impl.f_next_animation_seq_num) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); ++ goto exit; ++ } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ goto exit; ++ } ++ self->private_impl.f_next_animation_seq_num += 1u; ++ self->private_data.s_skip_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 4u); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_skip_frame.scratch; ++ self->private_impl.f_chunk_length = 0u; ++ continue; ++ } else if (self->private_impl.f_chunk_type_array[0u] != 0u) { ++ break; ++ } else if (self->private_impl.f_chunk_type == 1280598886u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_data.s_skip_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_skip_frame.scratch; ++ self->private_impl.f_chunk_length = 0u; ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ self->private_impl.f_call_sequence = 32u; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_zlib__decoder__workbuf_len( +- const wuffs_zlib__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ ok: ++ self->private_impl.p_skip_frame = 0; ++ goto exit; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_skip_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++ return status; + } + +-// -------- func zlib.decoder.transform_io ++// -------- func png.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_zlib__decoder__transform_io( +- wuffs_zlib__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_png__decoder__decode_frame( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -52170,7 +65458,7 @@ wuffs_zlib__decoder__transform_io( + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { ++ (self->private_impl.active_coroutine != 3)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -52179,71 +65467,312 @@ wuffs_zlib__decoder__transform_io( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func png.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_decode_frame( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_seq_num = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_pass_width = 0; ++ uint32_t v_pass_height = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + ++ if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if (self->private_impl.f_call_sequence >= 96u) { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else if (self->private_impl.f_call_sequence != 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_png__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } + while (true) { +- { +- wuffs_base__status t_0 = wuffs_zlib__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); +- v_status = t_0; ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ continue; + } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_zlib__error__truncated_input); ++ self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); ++ if (self->private_impl.f_chunk_type == 1413563465u) { ++ self->private_impl.f_chunk_type_array[0u] = 73u; ++ self->private_impl.f_chunk_type_array[1u] = 68u; ++ self->private_impl.f_chunk_type_array[2u] = 65u; ++ self->private_impl.f_chunk_type_array[3u] = 84u; ++ iop_a_src += 8u; ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); ++ } ++ break; ++ } else if (self->private_impl.f_chunk_type == 1413571686u) { ++ self->private_impl.f_chunk_type_array[0u] = 102u; ++ self->private_impl.f_chunk_type_array[1u] = 100u; ++ self->private_impl.f_chunk_type_array[2u] = 65u; ++ self->private_impl.f_chunk_type_array[3u] = 84u; ++ if (self->private_impl.f_chunk_length < 4u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 4u; ++ iop_a_src += 8u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_frame.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ v_seq_num = t_0; ++ } ++ if (v_seq_num != self->private_impl.f_next_animation_seq_num) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); ++ goto exit; ++ } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ goto exit; ++ } ++ self->private_impl.f_next_animation_seq_num += 1u; ++ break; ++ } else if (self->private_impl.f_chunk_type == 1280598886u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } ++ self->private_data.s_do_decode_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame.scratch; ++ self->private_impl.f_chunk_length = 0u; ++ } ++ if (self->private_impl.f_zlib_is_dirty) { ++ wuffs_private_impl__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib, ++ sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ if (self->private_impl.f_ignore_checksum) { ++ wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u); ++ } ++ } ++ self->private_impl.f_zlib_is_dirty = true; ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), ++ wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { + status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ self->private_impl.f_workbuf_hist_pos_base = 0u; ++ while (true) { ++ if (self->private_impl.f_chunk_type_array[0u] == 73u) { ++ v_pass_width = (16777215u & ((((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][1u])) + self->private_impl.f_width) >> WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u])); ++ v_pass_height = (16777215u & ((((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][4u])) + self->private_impl.f_height) >> WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3u])); ++ } else { ++ v_pass_width = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_x1 - self->private_impl.f_frame_rect_x0))); ++ v_pass_height = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_y1 - self->private_impl.f_frame_rect_y0))); ++ } ++ if ((v_pass_width > 0u) && (v_pass_height > 0u)) { ++ self->private_impl.f_pass_bytes_per_row = wuffs_png__decoder__calculate_bytes_per_row(self, v_pass_width); ++ self->private_impl.f_pass_workbuf_length = (((uint64_t)(v_pass_height)) * (1u + self->private_impl.f_pass_bytes_per_row)); ++ while (true) { ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_1 = wuffs_png__decoder__decode_pass(self, a_src, a_workbuf); ++ v_status = t_1; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if (wuffs_base__status__is_error(&v_status) || ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed))) { ++ if (self->private_impl.f_workbuf_wi <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_png__decoder__filter_and_swizzle(self, a_dst, wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_workbuf_wi)); ++ } ++ if (v_status.repr == wuffs_base__suspension__short_read) { ++ status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ goto exit; ++ } ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ } ++ v_status = wuffs_png__decoder__filter_and_swizzle(self, a_dst, a_workbuf); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ self->private_impl.f_workbuf_hist_pos_base += self->private_impl.f_pass_workbuf_length; ++ } ++ if ((self->private_impl.f_interlace_pass == 0u) || (self->private_impl.f_interlace_pass >= 7u)) { ++ break; ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_interlace_pass += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif + } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ self->private_impl.f_call_sequence = 32u; + + ok: +- self->private_impl.p_transform_io[0] = 0; ++ self->private_impl.p_do_decode_frame = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func zlib.decoder.do_transform_io ++// -------- func png.decoder.decode_pass + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_zlib__decoder__do_transform_io( +- wuffs_zlib__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_png__decoder__decode_pass( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint16_t v_x = 0; +- uint32_t v_checksum_got = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_w = &u_w; ++ uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint64_t v_w_mark = 0; ++ uint64_t v_r_mark = 0; ++ wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL); ++ uint32_t v_checksum_have = 0; + uint32_t v_checksum_want = 0; +- uint64_t v_mark = 0; ++ uint32_t v_seq_num = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -52255,77 +65784,93 @@ wuffs_zlib__decoder__do_transform_io( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0]; +- if (coro_susp_point) { +- v_checksum_got = self->private_data.s_do_transform_io[0].v_checksum_got; +- } ++ uint32_t coro_susp_point = self->private_impl.p_decode_pass; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_bad_call_sequence) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if (self->private_impl.f_quirks[0u]) { +- } else if ( ! self->private_impl.f_want_dictionary) { ++ self->private_impl.f_workbuf_wi = 0u; ++ while (true) { ++ if ((self->private_impl.f_workbuf_wi > self->private_impl.f_pass_workbuf_length) || (self->private_impl.f_pass_workbuf_length > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint16_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_transform_io[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ wuffs_base__io_buffer* o_0_v_w = v_w; ++ uint8_t* o_0_iop_v_w = iop_v_w; ++ uint8_t* o_0_io0_v_w = io0_v_w; ++ uint8_t* o_0_io1_v_w = io1_v_w; ++ uint8_t* o_0_io2_v_w = io2_v_w; ++ v_w = wuffs_private_impl__io_writer__set( ++ &u_w, ++ &iop_v_w, ++ &io0_v_w, ++ &io1_v_w, ++ &io2_v_w, ++ wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ self->private_impl.f_workbuf_wi, ++ self->private_impl.f_pass_workbuf_length), ++ ((uint64_t)(self->private_impl.f_workbuf_hist_pos_base + self->private_impl.f_workbuf_wi))); ++ { ++ const bool o_1_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_1_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; ++ } ++ v_w_mark = ((uint64_t)(iop_v_w - io0_v_w)); ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr)); ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 8) { +- t_0 = ((uint16_t)(*scratch >> 48)); +- break; ++ wuffs_base__status t_0 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, v_w, a_src, wuffs_base__utility__empty_slice_u8()); ++ v_zlib_status = t_0; ++ iop_v_w = u_w.data.ptr + u_w.meta.wi; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_workbuf_wi, wuffs_private_impl__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w)))); ++ io2_a_src = o_1_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_1_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); + } + } +- v_x = t_0; +- } +- if (((v_x >> 8u) & 15u) != 8u) { +- status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_method); +- goto exit; +- } +- if ((v_x >> 12u) > 7u) { +- status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_window_size); +- goto exit; +- } +- if ((v_x % 31u) != 0u) { +- status = wuffs_base__make_status(wuffs_zlib__error__bad_parity_check); +- goto exit; ++ v_w = o_0_v_w; ++ iop_v_w = o_0_iop_v_w; ++ io0_v_w = o_0_io0_v_w; ++ io1_v_w = o_0_io1_v_w; ++ io2_v_w = o_0_io2_v_w; + } +- self->private_impl.f_want_dictionary = ((v_x & 32u) != 0u); +- if (self->private_impl.f_want_dictionary) { +- self->private_impl.f_dict_id_got = 1u; ++ if (wuffs_base__status__is_ok(&v_zlib_status)) { ++ if (self->private_impl.f_chunk_length > 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__too_much_data); ++ goto exit; ++ } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { +- self->private_data.s_do_transform_io[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ self->private_data.s_decode_pass.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; ++ uint64_t* scratch = &self->private_data.s_decode_pass.scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); + *scratch >>= 8; + *scratch <<= 8; +@@ -52338,101 +65883,208 @@ wuffs_zlib__decoder__do_transform_io( + *scratch |= ((uint64_t)(num_bits_1)); + } + } +- self->private_impl.f_dict_id_want = t_1; ++ v_checksum_want = t_1; + } +- status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required); +- goto ok; +- } else if (self->private_impl.f_got_dictionary) { +- status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary); +- goto exit; +- } +- } else if (self->private_impl.f_dict_id_got != self->private_impl.f_dict_id_want) { +- if (self->private_impl.f_got_dictionary) { +- status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary); ++ if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8()); ++ if (v_checksum_have != v_checksum_want) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_checksum); ++ goto exit; ++ } ++ } ++ break; ++ } else if (v_zlib_status.repr == wuffs_base__suspension__short_write) { ++ if ((1u <= self->private_impl.f_interlace_pass) && (self->private_impl.f_interlace_pass <= 6u)) { ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_base__error__too_much_data); + goto exit; +- } +- status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required); +- goto ok; +- } +- self->private_impl.f_header_complete = true; +- while (true) { +- v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); +- { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } else if (v_zlib_status.repr != wuffs_base__suspension__short_read) { ++ status = v_zlib_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; + } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ goto ok; ++ } else if (self->private_impl.f_chunk_length == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_pass.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_pass.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)); ++ } ++ } ++ v_checksum_want = t_2; + } +- wuffs_base__status t_2 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf); +- v_status = t_2; +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8()); ++ if (v_checksum_have != v_checksum_want) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_checksum); ++ goto exit; ++ } + } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_pass.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_pass.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)); ++ } ++ } ++ self->private_impl.f_chunk_length = t_3; + } +- } +- if ( ! self->private_impl.f_ignore_checksum && ! self->private_impl.f_quirks[0u]) { +- v_checksum_got = wuffs_adler32__hasher__update_u32(&self->private_data.f_checksum, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); +- } +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- } +- if ( ! self->private_impl.f_quirks[0u]) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_transform_io[0].scratch = 0; ++ { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_pass.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_pass.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 24) { ++ t_4 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; + } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch >> 32)); +- break; ++ } ++ self->private_impl.f_chunk_type = t_4; ++ } ++ if (self->private_impl.f_chunk_type_array[0u] == 73u) { ++ if (self->private_impl.f_chunk_type != 1413563465u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); ++ } ++ } else { ++ if ((self->private_impl.f_chunk_type != 1413571686u) || (self->private_impl.f_chunk_length < 4u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 4u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ uint32_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_pass.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_pass.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); ++ if (num_bits_5 == 24) { ++ t_5 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)); ++ } + } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)); ++ v_seq_num = t_5; ++ } ++ if (v_seq_num != self->private_impl.f_next_animation_seq_num) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); ++ goto exit; ++ } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ goto exit; + } ++ self->private_impl.f_next_animation_seq_num += 1u; + } +- v_checksum_want = t_3; +- } +- if ( ! self->private_impl.f_ignore_checksum && (v_checksum_got != v_checksum_want)) { +- status = wuffs_base__make_status(wuffs_zlib__error__bad_checksum); ++ continue; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) > 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input); + goto exit; + } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); ++ } ++ if (self->private_impl.f_workbuf_wi != self->private_impl.f_pass_workbuf_length) { ++ status = wuffs_base__make_status(wuffs_base__error__not_enough_data); ++ goto exit; ++ } else if (0u < ((uint64_t)(a_workbuf.len))) { ++ if (a_workbuf.ptr[0u] == 4u) { ++ a_workbuf.ptr[0u] = 1u; ++ } + } + + ok: +- self->private_impl.p_do_transform_io[0] = 0; ++ self->private_impl.p_decode_pass = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_transform_io[0].v_checksum_got = v_checksum_got; ++ self->private_impl.p_decode_pass = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -52440,2021 +66092,1710 @@ wuffs_zlib__decoder__do_transform_io( + return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_png__error__bad_animation_sequence_number[] = "#png: bad animation sequence number"; +-const char wuffs_png__error__bad_checksum[] = "#png: bad checksum"; +-const char wuffs_png__error__bad_chunk[] = "#png: bad chunk"; +-const char wuffs_png__error__bad_filter[] = "#png: bad filter"; +-const char wuffs_png__error__bad_header[] = "#png: bad header"; +-const char wuffs_png__error__bad_text_chunk_not_latin_1[] = "#png: bad text chunk (not Latin-1)"; +-const char wuffs_png__error__missing_palette[] = "#png: missing palette"; +-const char wuffs_png__error__truncated_input[] = "#png: truncated input"; +-const char wuffs_png__error__unsupported_cgbi_extension[] = "#png: unsupported CgBI extension"; +-const char wuffs_png__error__unsupported_png_compression_method[] = "#png: unsupported PNG compression method"; +-const char wuffs_png__error__unsupported_png_file[] = "#png: unsupported PNG file"; +-const char wuffs_png__error__internal_error_inconsistent_i_o[] = "#png: internal error: inconsistent I/O"; +-const char wuffs_png__error__internal_error_inconsistent_chunk_type[] = "#png: internal error: inconsistent chunk type"; +-const char wuffs_png__error__internal_error_inconsistent_frame_bounds[] = "#png: internal error: inconsistent frame bounds"; +-const char wuffs_png__error__internal_error_inconsistent_workbuf_length[] = "#png: internal error: inconsistent workbuf length"; +-const char wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input[] = "#png: internal error: zlib decoder did not exhaust its input"; +- +-// ---------------- Private Consts +- +-#define WUFFS_PNG__ANCILLARY_BIT 32 +- +-static const uint8_t +-WUFFS_PNG__INTERLACING[8][6] WUFFS_BASE__POTENTIALLY_UNUSED = { +- { +- 0, 0, 0, 0, 0, 0, +- }, { +- 3, 7, 0, 3, 7, 0, +- }, { +- 3, 3, 4, 3, 7, 0, +- }, { +- 2, 3, 0, 3, 3, 4, +- }, { +- 2, 1, 2, 2, 3, 0, +- }, { +- 1, 1, 0, 2, 1, 2, +- }, { +- 1, 0, 1, 1, 1, 0, +- }, { +- 0, 0, 0, 1, 0, 1, +- }, +-}; +- +-static const uint8_t +-WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 255, 85, 0, 17, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 8, 4, 0, 2, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_PNG__NUM_CHANNELS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1, 0, 3, 1, 2, 0, 4, 0, +-}; +- +-static const uint16_t +-WUFFS_PNG__LATIN_1[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 32, 33, 34, 35, 36, 37, 38, 39, +- 40, 41, 42, 43, 44, 45, 46, 47, +- 48, 49, 50, 51, 52, 53, 54, 55, +- 56, 57, 58, 59, 60, 61, 62, 63, +- 64, 65, 66, 67, 68, 69, 70, 71, +- 72, 73, 74, 75, 76, 77, 78, 79, +- 80, 81, 82, 83, 84, 85, 86, 87, +- 88, 89, 90, 91, 92, 93, 94, 95, +- 96, 97, 98, 99, 100, 101, 102, 103, +- 104, 105, 106, 107, 108, 109, 110, 111, +- 112, 113, 114, 115, 116, 117, 118, 119, +- 120, 121, 122, 123, 124, 125, 126, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 41410, 41666, 41922, 42178, 42434, 42690, 42946, +- 43202, 43458, 43714, 43970, 44226, 44482, 44738, 44994, +- 45250, 45506, 45762, 46018, 46274, 46530, 46786, 47042, +- 47298, 47554, 47810, 48066, 48322, 48578, 48834, 49090, +- 32963, 33219, 33475, 33731, 33987, 34243, 34499, 34755, +- 35011, 35267, 35523, 35779, 36035, 36291, 36547, 36803, +- 37059, 37315, 37571, 37827, 38083, 38339, 38595, 38851, +- 39107, 39363, 39619, 39875, 40131, 40387, 40643, 40899, +- 41155, 41411, 41667, 41923, 42179, 42435, 42691, 42947, +- 43203, 43459, 43715, 43971, 44227, 44483, 44739, 44995, +- 45251, 45507, 45763, 46019, 46275, 46531, 46787, 47043, +- 47299, 47555, 47811, 48067, 48323, 48579, 48835, 49091, +-}; +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_3_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_2( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_3_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__do_decode_image_config( +- wuffs_png__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_ihdr( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__assign_filter_distance( +- wuffs_png__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint64_t +-wuffs_png__decoder__calculate_bytes_per_row( +- const wuffs_png__decoder* self, +- uint32_t a_width); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__choose_filter_implementations( +- wuffs_png__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_other_chunk( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src, +- bool a_framy); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_actl( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++// -------- func png.decoder.frame_dirty_rect + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_chrm( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_png__decoder__frame_dirty_rect( ++ const wuffs_png__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_exif( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++ return wuffs_base__utility__make_rect_ie_u32( ++ self->private_impl.f_frame_rect_x0, ++ self->private_impl.f_frame_rect_y0, ++ self->private_impl.f_frame_rect_x1, ++ self->private_impl.f_frame_rect_y1); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_fctl( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++// -------- func png.decoder.num_animation_loops + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_gama( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_png__decoder__num_animation_loops( ++ const wuffs_png__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_iccp( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++ return self->private_impl.f_num_animation_loops_value; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_plte( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++// -------- func png.decoder.num_decoded_frame_configs + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_srgb( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_png__decoder__num_decoded_frame_configs( ++ const wuffs_png__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_trns( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++ return ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__do_decode_frame_config( +- wuffs_png__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); ++// -------- func png.decoder.num_decoded_frames + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__skip_frame( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_png__decoder__num_decoded_frames( ++ const wuffs_png__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__do_decode_frame( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++ return ((uint64_t)(self->private_impl.f_num_decoded_frames_value)); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_pass( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); ++// -------- func png.decoder.restart_frame + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__do_tell_me_more( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_png__decoder__restart_frame( + wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src); ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf); ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } else if ((a_index >= ((uint64_t)(self->private_impl.f_num_animation_frames_value))) || ((a_index == 0u) && (a_io_position != self->private_impl.f_first_config_io_position))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ if (self->private_impl.f_interlace_pass >= 1u) { ++ self->private_impl.f_interlace_pass = 1u; ++ } ++ self->private_impl.f_frame_config_io_position = a_io_position; ++ self->private_impl.f_num_decoded_frame_configs_value = ((uint32_t)(a_index)); ++ self->private_impl.f_num_decoded_frames_value = self->private_impl.f_num_decoded_frame_configs_value; ++ return wuffs_base__make_status(NULL); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf); ++// -------- func png.decoder.set_report_metadata + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle_tricky( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_png__decoder__set_report_metadata( + wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf); +- +-// ---------------- VTables ++ uint32_t a_fourcc, ++ bool a_report) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } + +-const wuffs_base__image_decoder__func_ptrs +-wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_png__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_png__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_png__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_png__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_png__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_png__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_png__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_png__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_png__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_png__decoder__workbuf_len), +-}; ++ if (a_fourcc == 1128813133u) { ++ self->private_impl.f_report_metadata_chrm = a_report; ++ } else if (a_fourcc == 1163413830u) { ++ self->private_impl.f_report_metadata_exif = a_report; ++ } else if (a_fourcc == 1195461953u) { ++ self->private_impl.f_report_metadata_gama = a_report; ++ } else if (a_fourcc == 1229144912u) { ++ self->private_impl.f_report_metadata_iccp = a_report; ++ } else if (a_fourcc == 1263947808u) { ++ self->private_impl.f_report_metadata_kvp = a_report; ++ } else if (a_fourcc == 1397901122u) { ++ self->private_impl.f_report_metadata_srgb = a_report; ++ } ++ return wuffs_base__make_empty_struct(); ++} + +-// ---------------- Initializer Implementations ++// -------- func png.decoder.tell_me_more + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_png__decoder__initialize( ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_png__decoder__tell_me_more( + wuffs_png__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } +- +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- self->private_impl.choosy_filter_1 = &wuffs_png__decoder__filter_1__choosy_default; +- self->private_impl.choosy_filter_3 = &wuffs_png__decoder__filter_3__choosy_default; +- self->private_impl.choosy_filter_4 = &wuffs_png__decoder__filter_4__choosy_default; +- self->private_impl.choosy_filter_and_swizzle = &wuffs_png__decoder__filter_and_swizzle__choosy_default; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- { +- wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( +- &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options); +- if (z.repr) { +- return z; +- } +- } +- { +- wuffs_base__status z = wuffs_zlib__decoder__initialize( +- &self->private_data.f_zlib, sizeof(self->private_data.f_zlib), WUFFS_VERSION, options); +- if (z.repr) { +- return z; ++ uint32_t coro_susp_point = self->private_impl.p_tell_me_more; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_png__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- } +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); +-} + +-wuffs_png__decoder* +-wuffs_png__decoder__alloc(void) { +- wuffs_png__decoder* x = +- (wuffs_png__decoder*)(calloc(sizeof(wuffs_png__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_png__decoder__initialize( +- x, sizeof(wuffs_png__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ ok: ++ self->private_impl.p_tell_me_more = 0; ++ goto exit; + } +- return x; +-} + +-size_t +-sizeof__wuffs_png__decoder(void) { +- return sizeof(wuffs_png__decoder); +-} ++ goto suspend; ++ suspend: ++ self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; + +-// ---------------- Function Implementations ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} + +-// ‼ WUFFS MULTI-FILE SECTION +arm_neon +-// -------- func png.decoder.filter_1_distance_4_arm_neon ++// -------- func png.decoder.do_tell_me_more + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_arm_neon( ++static wuffs_base__status ++wuffs_png__decoder__do_tell_me_more( + wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- wuffs_base__slice_u8 v_curr = {0}; +- uint8x8_t v_fa = {0}; +- uint8x8_t v_fx = {0}; ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, v_fa); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, v_fa); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- } +- v_curr.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, v_fa); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; ++ uint8_t v_c8 = 0; ++ uint16_t v_c16 = 0; ++ wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_w = &u_w; ++ uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint64_t v_num_written = 0; ++ uint64_t v_w_mark = 0; ++ uint64_t v_r_mark = 0; ++ wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL); ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; + } +- v_curr.len = 0; + } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-// ‼ WUFFS MULTI-FILE SECTION -arm_neon +- +-// ‼ WUFFS MULTI-FILE SECTION +arm_neon +-// -------- func png.decoder.filter_3_distance_4_arm_neon ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint8x8_t v_fa = {0}; +- uint8x8_t v_fb = {0}; +- uint8x8_t v_fx = {0}; ++ uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more; ++ if (coro_susp_point) { ++ v_zlib_status = self->private_data.s_do_tell_me_more.v_zlib_status; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (((uint64_t)(a_prev.len)) == 0u) { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; ++ if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) == 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } ++ if (self->private_impl.f_metadata_fourcc == 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ } ++ do { ++ if (self->private_impl.f_metadata_flavor == 3u) { ++ while (true) { ++ if (wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_y) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); ++ goto exit; ++ } else if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ self->private_impl.f_metadata_flavor, ++ self->private_impl.f_metadata_fourcc, ++ self->private_impl.f_metadata_x, ++ self->private_impl.f_metadata_y, ++ self->private_impl.f_metadata_z); ++ } ++ if (self->private_impl.f_metadata_y >= self->private_impl.f_metadata_z) { ++ goto label__goto_done__break; ++ } ++ self->private_impl.f_metadata_y = self->private_impl.f_metadata_z; ++ status = wuffs_base__make_status(wuffs_base__suspension__even_more_information); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ } ++ if (self->private_impl.f_metadata_is_zlib_compressed) { ++ if (self->private_impl.f_zlib_is_dirty) { ++ wuffs_private_impl__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib, ++ sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ if (self->private_impl.f_ignore_checksum) { ++ wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u); ++ } ++ } ++ self->private_impl.f_zlib_is_dirty = true; ++ self->private_impl.f_ztxt_hist_pos = 0u; ++ } ++ label__loop__continue:; ++ while (true) { ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ self->private_impl.f_metadata_flavor, ++ self->private_impl.f_metadata_fourcc, ++ self->private_impl.f_metadata_x, ++ self->private_impl.f_metadata_y, ++ self->private_impl.f_metadata_z); ++ } ++ if (self->private_impl.f_metadata_flavor != 4u) { ++ break; ++ } ++ if (self->private_impl.f_metadata_is_zlib_compressed) { ++ if (self->private_impl.f_chunk_type == 1346585449u) { ++ { ++ const bool o_0_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_0_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; ++ } ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_0 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, a_dst, a_src, wuffs_base__utility__empty_slice_u8()); ++ v_zlib_status = t_0; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ io2_a_src = o_0_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_0_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_zlib_status)) { ++ self->private_impl.f_metadata_is_zlib_compressed = false; ++ break; ++ } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { ++ status = v_zlib_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ status = v_zlib_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } else if (self->private_impl.f_chunk_type == 1951945833u) { ++ { ++ const bool o_1_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_1_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; ++ } ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_1 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, a_dst, a_src, wuffs_base__utility__empty_slice_u8()); ++ v_zlib_status = t_1; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ io2_a_src = o_1_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_1_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_zlib_status)) { ++ self->private_impl.f_metadata_is_zlib_compressed = false; ++ break; ++ } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { ++ status = v_zlib_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ status = v_zlib_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ } else if (self->private_impl.f_chunk_type == 1951945850u) { ++ if (self->private_impl.f_ztxt_ri == self->private_impl.f_ztxt_wi) { ++ { ++ wuffs_base__io_buffer* o_2_v_w = v_w; ++ uint8_t* o_2_iop_v_w = iop_v_w; ++ uint8_t* o_2_io0_v_w = io0_v_w; ++ uint8_t* o_2_io1_v_w = io1_v_w; ++ uint8_t* o_2_io2_v_w = io2_v_w; ++ v_w = wuffs_private_impl__io_writer__set( ++ &u_w, ++ &iop_v_w, ++ &io0_v_w, ++ &io1_v_w, ++ &io2_v_w, ++ wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024), ++ self->private_impl.f_ztxt_hist_pos); ++ { ++ const bool o_3_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_3_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; ++ } ++ v_w_mark = ((uint64_t)(iop_v_w - io0_v_w)); ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr)); ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, v_w, a_src, wuffs_base__utility__empty_slice_u8()); ++ v_zlib_status = t_2; ++ iop_v_w = u_w.data.ptr + u_w.meta.wi; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ v_num_written = wuffs_private_impl__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w))); ++ io2_a_src = o_3_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_3_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); ++ } ++ } ++ v_w = o_2_v_w; ++ iop_v_w = o_2_iop_v_w; ++ io0_v_w = o_2_io0_v_w; ++ io1_v_w = o_2_io1_v_w; ++ io2_v_w = o_2_io2_v_w; ++ } ++ if (v_num_written > 1024u) { ++ status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ self->private_impl.f_ztxt_ri = 0u; ++ self->private_impl.f_ztxt_wi = ((uint32_t)(v_num_written)); ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_ztxt_hist_pos, v_num_written); ++ } ++ while (self->private_impl.f_ztxt_ri < self->private_impl.f_ztxt_wi) { ++ v_c16 = WUFFS_PNG__LATIN_1[self->private_data.f_dst_palette[self->private_impl.f_ztxt_ri]]; ++ if (v_c16 == 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1); ++ goto exit; ++ } else if (v_c16 <= 127u) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ goto label__loop__continue; ++ } ++ self->private_impl.f_ztxt_ri += 1u; ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c16))), iop_a_dst += 1); ++ } else { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ goto label__loop__continue; ++ } ++ self->private_impl.f_ztxt_ri += 1u; ++ (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c16), iop_a_dst += 2); ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_zlib_status)) { ++ self->private_impl.f_metadata_is_zlib_compressed = false; ++ break; ++ } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { ++ status = v_zlib_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } else if (v_zlib_status.repr != wuffs_base__suspension__short_write) { ++ status = v_zlib_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_chunk_type); ++ goto exit; ++ } ++ } else if ((self->private_impl.f_chunk_type == 1951945833u) && (self->private_impl.f_metadata_fourcc == 1263947862u)) { ++ while (true) { ++ if (self->private_impl.f_chunk_length <= 0u) { ++ goto label__loop__break; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ goto label__loop__continue; ++ } else if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ goto label__loop__continue; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_c8), iop_a_dst += 1); ++ } ++ } else { ++ while (true) { ++ if (self->private_impl.f_chunk_length <= 0u) { ++ if (self->private_impl.f_metadata_fourcc == 1263947851u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ goto label__loop__break; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ goto label__loop__continue; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (v_c8 == 0u) { ++ self->private_impl.f_chunk_length -= 1u; ++ iop_a_src += 1u; ++ goto label__loop__break; ++ } ++ v_c16 = WUFFS_PNG__LATIN_1[v_c8]; ++ if (v_c16 == 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1); ++ goto exit; ++ } else if (v_c16 <= 127u) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ goto label__loop__continue; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ iop_a_src += 1u; ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c16))), iop_a_dst += 1); ++ } else { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); ++ goto label__loop__continue; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ iop_a_src += 1u; ++ (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c16), iop_a_dst += 2); ++ } ++ } ++ } + } +- v_curr.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; ++ label__loop__break:; ++ if (self->private_impl.f_metadata_fourcc == 1263947851u) { ++ self->private_impl.f_metadata_fourcc = 1263947862u; ++ if (self->private_impl.f_chunk_type == 1951945833u) { ++ if (self->private_impl.f_chunk_length <= 1u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 2u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if (v_c8 == 0u) { ++ self->private_impl.f_metadata_is_zlib_compressed = false; ++ } else if (v_c8 == 1u) { ++ self->private_impl.f_metadata_is_zlib_compressed = true; ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if ((v_c8 != 0u) && self->private_impl.f_metadata_is_zlib_compressed) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); ++ goto exit; ++ } ++ self->private_impl.f_metadata_fourcc -= 2u; ++ while (self->private_impl.f_metadata_fourcc != 1263947862u) { ++ self->private_impl.f_metadata_fourcc += 1u; ++ while (true) { ++ if (self->private_impl.f_chunk_length <= 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ if (v_c8 == 0u) { ++ break; ++ } ++ } ++ } ++ } else if (self->private_impl.f_chunk_type == 1951945850u) { ++ if (self->private_impl.f_chunk_length <= 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); ++ goto exit; ++ } ++ self->private_impl.f_metadata_is_zlib_compressed = true; ++ } ++ self->private_impl.f_call_sequence &= 239u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; + } +- v_curr.len = 0; ++ } while (0); ++ label__goto_done__break:; ++ if (self->private_impl.f_chunk_length != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- } else { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 0; +- v_prev.len = 0; ++ self->private_data.s_do_tell_me_more.scratch = 4u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ if (self->private_data.s_do_tell_me_more.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_tell_me_more.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-// ‼ WUFFS MULTI-FILE SECTION -arm_neon +- +-// ‼ WUFFS MULTI-FILE SECTION +arm_neon +-// -------- func png.decoder.filter_4_distance_3_arm_neon +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint8x8_t v_fa = {0}; +- uint8x8_t v_fb = {0}; +- uint8x8_t v_fc = {0}; +- uint8x8_t v_fx = {0}; +- uint16x8_t v_fafb = {0}; +- uint16x8_t v_fcfc = {0}; +- uint16x8_t v_pa = {0}; +- uint16x8_t v_pb = {0}; +- uint16x8_t v_pc = {0}; +- uint16x8_t v_cmpab = {0}; +- uint16x8_t v_cmpac = {0}; +- uint8x8_t v_picka = {0}; +- uint8x8_t v_pickb = {0}; ++ iop_a_src += self->private_data.s_do_tell_me_more.scratch; ++ self->private_impl.f_metadata_flavor = 0u; ++ self->private_impl.f_metadata_fourcc = 0u; ++ self->private_impl.f_metadata_x = 0u; ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; ++ self->private_impl.f_call_sequence &= 239u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + wuffs_base__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6); +- while (v_curr.ptr < i_end0_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + wuffs_base__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3); +- while (v_curr.ptr < i_end1_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 3; +- v_prev.len = 3; +- uint8_t* i_end2_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end2_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 0; +- v_prev.len = 0; ++ ok: ++ self->private_impl.p_do_tell_me_more = 0; ++ goto exit; + } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +-// ‼ WUFFS MULTI-FILE SECTION +arm_neon +-// -------- func png.decoder.filter_4_distance_4_arm_neon +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint8x8_t v_fa = {0}; +- uint8x8_t v_fb = {0}; +- uint8x8_t v_fc = {0}; +- uint8x8_t v_fx = {0}; +- uint16x8_t v_fafb = {0}; +- uint16x8_t v_fcfc = {0}; +- uint16x8_t v_pa = {0}; +- uint16x8_t v_pb = {0}; +- uint16x8_t v_pc = {0}; +- uint16x8_t v_cmpab = {0}; +- uint16x8_t v_cmpac = {0}; +- uint8x8_t v_picka = {0}; +- uint8x8_t v_pickb = {0}; ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_tell_me_more.v_zlib_status = v_zlib_status; + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 0; +- v_prev.len = 0; ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-// ‼ WUFFS MULTI-FILE SECTION -arm_neon +- +-// -------- func png.decoder.filter_1 +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- return (*self->private_impl.choosy_filter_1)(self, a_curr); +-} +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- uint64_t v_filter_distance = 0; +- uint8_t v_fa = 0; +- uint64_t v_i_start = 0; +- uint64_t v_i = 0; +- +- v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); +- v_i_start = 0u; +- while (v_i_start < v_filter_distance) { +- v_fa = 0u; +- v_i = v_i_start; +- while (v_i < ((uint64_t)(a_curr.len))) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + v_fa)); +- v_fa = a_curr.ptr[v_i]; +- v_i += v_filter_distance; +- } +- v_i_start += 1u; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func png.decoder.filter_1_distance_3_fallback +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_3_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- wuffs_base__slice_u8 v_curr = {0}; +- uint8_t v_fa0 = 0; +- uint8_t v_fa1 = 0; +- uint8_t v_fa2 = 0; + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 3; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- } +- v_curr.len = 3; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end1_curr) { +- v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- } +- v_curr.len = 0; +- } +- return wuffs_base__make_empty_struct(); ++ return status; + } + +-// -------- func png.decoder.filter_1_distance_4_fallback ++// -------- func png.decoder.workbuf_len + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- wuffs_base__slice_u8 v_curr = {0}; +- uint8_t v_fa0 = 0; +- uint8_t v_fa1 = 0; +- uint8_t v_fa2 = 0; +- uint8_t v_fa3 = 0; +- +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_fa3 = ((uint8_t)(v_fa3 + v_curr.ptr[3u])); +- v_curr.ptr[3u] = v_fa3; +- v_curr.ptr += 4; +- } +- v_curr.len = 0; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_png__decoder__workbuf_len( ++ const wuffs_png__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func png.decoder.filter_2 +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_2( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- uint64_t v_n = 0; +- uint64_t v_i = 0; +- +- v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); +- v_i = 0u; +- while (v_i < v_n) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i])); +- v_i += 1u; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } +- return wuffs_base__make_empty_struct(); ++ ++ return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_overall_workbuf_length, self->private_impl.f_overall_workbuf_length); + } + +-// -------- func png.decoder.filter_3 ++// -------- func png.decoder.filter_and_swizzle + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3( ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle( + wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- return (*self->private_impl.choosy_filter_3)(self, a_curr, a_prev); ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf) { ++ return (*self->private_impl.choosy_filter_and_swizzle)(self, a_dst, a_workbuf); + } + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3__choosy_default( ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle__choosy_default( + wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- uint64_t v_filter_distance = 0; +- uint64_t v_n = 0; +- uint64_t v_i = 0; ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint64_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row0 = 0; ++ uint64_t v_dst_bytes_per_row1 = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ uint32_t v_y = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint8_t v_filter = 0; ++ wuffs_base__slice_u8 v_curr_row = {0}; ++ wuffs_base__slice_u8 v_prev_row = {0}; + +- v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); +- if (((uint64_t)(a_prev.len)) == 0u) { +- v_i = v_filter_distance; +- while (v_i < ((uint64_t)(a_curr.len))) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + (a_curr.ptr[(v_i - v_filter_distance)] / 2u))); +- v_i += 1u; +- } ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ } ++ v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); ++ v_dst_bytes_per_row0 = (((uint64_t)(self->private_impl.f_frame_rect_x0)) * v_dst_bytes_per_pixel); ++ v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ if (v_dst_bytes_per_row1 < ((uint64_t)(v_tab.width))) { ++ v_tab = wuffs_base__table_u8__subtable_ij(v_tab, ++ 0u, ++ 0u, ++ v_dst_bytes_per_row1, ++ ((uint64_t)(v_tab.height))); ++ } ++ if (v_dst_bytes_per_row0 < ((uint64_t)(v_tab.width))) { ++ v_tab = wuffs_base__table_u8__subtable_ij(v_tab, ++ v_dst_bytes_per_row0, ++ 0u, ++ ((uint64_t)(v_tab.width)), ++ ((uint64_t)(v_tab.height))); + } else { +- v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); +- v_i = 0u; +- while ((v_i < v_n) && (v_i < v_filter_distance)) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + (a_prev.ptr[v_i] / 2u))); +- v_i += 1u; ++ v_tab = wuffs_base__table_u8__subtable_ij(v_tab, ++ 0u, ++ 0u, ++ 0u, ++ 0u); ++ } ++ v_y = self->private_impl.f_frame_rect_y0; ++ while (v_y < self->private_impl.f_frame_rect_y1) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y); ++ if (1u > ((uint64_t)(a_workbuf.len))) { ++ return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); + } +- v_i = v_filter_distance; +- while (v_i < v_n) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(((((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)])) + ((uint32_t)(a_prev.ptr[v_i]))) / 2u))))); +- v_i += 1u; ++ v_filter = a_workbuf.ptr[0u]; ++ a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u); ++ if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) { ++ return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); ++ } ++ v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row); ++ a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row); ++ if (v_filter == 0u) { ++ } else if (v_filter == 1u) { ++ wuffs_png__decoder__filter_1(self, v_curr_row); ++ } else if (v_filter == 2u) { ++ wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row); ++ } else if (v_filter == 3u) { ++ wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row); ++ } else if (v_filter == 4u) { ++ wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row); ++ } else { ++ return wuffs_base__make_status(wuffs_png__error__bad_filter); + } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, v_curr_row); ++ v_prev_row = v_curr_row; ++ v_y += 1u; + } +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__make_status(NULL); + } + +-// -------- func png.decoder.filter_3_distance_3_fallback ++// -------- func png.decoder.filter_and_swizzle_tricky + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_3_fallback( ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle_tricky( + wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint8_t v_fa0 = 0; +- uint8_t v_fa1 = 0; +- uint8_t v_fa2 = 0; ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint64_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row1 = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ uint64_t v_src_bytes_per_pixel = 0; ++ uint32_t v_x = 0; ++ uint32_t v_y = 0; ++ uint64_t v_i = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint8_t v_filter = 0; ++ wuffs_base__slice_u8 v_s = {0}; ++ wuffs_base__slice_u8 v_curr_row = {0}; ++ wuffs_base__slice_u8 v_prev_row = {0}; ++ uint8_t v_bits_unpacked[8] = {0}; ++ uint8_t v_bits_packed = 0; ++ uint8_t v_packs_remaining = 0; ++ uint8_t v_multiplier = 0; ++ uint8_t v_shift = 0; + +- if (((uint64_t)(a_prev.len)) == 0u) { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 3; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)((v_fa0 / 2u) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)((v_fa1 / 2u) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)((v_fa2 / 2u) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- v_fa0 = ((uint8_t)((v_fa0 / 2u) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)((v_fa1 / 2u) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)((v_fa2 / 2u) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ } ++ v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); ++ v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_src_bytes_per_pixel = 1u; ++ if (self->private_impl.f_depth >= 8u) { ++ v_src_bytes_per_pixel = (((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type])) * ((uint64_t)(((uint8_t)(self->private_impl.f_depth >> 3u))))); ++ } ++ if (self->private_impl.f_chunk_type_array[0u] == 73u) { ++ v_y = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][5u])); ++ } else { ++ v_y = self->private_impl.f_frame_rect_y0; ++ } ++ while (v_y < self->private_impl.f_frame_rect_y1) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y); ++ if (v_dst_bytes_per_row1 < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row1); ++ } ++ if (1u > ((uint64_t)(a_workbuf.len))) { ++ return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); ++ } ++ v_filter = a_workbuf.ptr[0u]; ++ a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u); ++ if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) { ++ return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); ++ } ++ v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row); ++ a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row); ++ if (v_filter == 0u) { ++ } else if (v_filter == 1u) { ++ wuffs_png__decoder__filter_1(self, v_curr_row); ++ } else if (v_filter == 2u) { ++ wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row); ++ } else if (v_filter == 3u) { ++ wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row); ++ } else if (v_filter == 4u) { ++ wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row); ++ } else { ++ return wuffs_base__make_status(wuffs_png__error__bad_filter); ++ } ++ v_s = v_curr_row; ++ if (self->private_impl.f_chunk_type_array[0u] == 73u) { ++ v_x = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][2u])); ++ } else { ++ v_x = self->private_impl.f_frame_rect_x0; ++ } ++ if (self->private_impl.f_depth == 8u) { ++ while (v_x < self->private_impl.f_frame_rect_x1) { ++ v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); ++ if (v_i <= ((uint64_t)(v_dst.len))) { ++ if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) { ++ if (self->private_impl.f_color_type == 0u) { ++ if (1u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[0u]; ++ v_bits_unpacked[1u] = v_s.ptr[0u]; ++ v_bits_unpacked[2u] = v_s.ptr[0u]; ++ v_bits_unpacked[3u] = 255u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | ++ (((uint32_t)(v_bits_unpacked[1u])) << 8u) | ++ (((uint32_t)(v_bits_unpacked[2u])) << 16u) | ++ (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { ++ v_bits_unpacked[0u] = 0u; ++ v_bits_unpacked[1u] = 0u; ++ v_bits_unpacked[2u] = 0u; ++ v_bits_unpacked[3u] = 0u; ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); ++ } ++ } else { ++ if (3u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[2u]; ++ v_bits_unpacked[1u] = v_s.ptr[1u]; ++ v_bits_unpacked[2u] = v_s.ptr[0u]; ++ v_bits_unpacked[3u] = 255u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 3u); ++ if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | ++ (((uint32_t)(v_bits_unpacked[1u])) << 8u) | ++ (((uint32_t)(v_bits_unpacked[2u])) << 16u) | ++ (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { ++ v_bits_unpacked[0u] = 0u; ++ v_bits_unpacked[1u] = 0u; ++ v_bits_unpacked[2u] = 0u; ++ v_bits_unpacked[3u] = 0u; ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); ++ } ++ } ++ } else if (v_src_bytes_per_pixel <= ((uint64_t)(v_s.len))) { ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__slice_u8__subslice_j(v_s, v_src_bytes_per_pixel)); ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, v_src_bytes_per_pixel); ++ } ++ } ++ v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); + } +- v_curr.len = 3; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end1_curr) { +- v_fa0 = ((uint8_t)((v_fa0 / 2u) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)((v_fa1 / 2u) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)((v_fa2 / 2u) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; ++ } else if (self->private_impl.f_depth < 8u) { ++ v_multiplier = 1u; ++ if (self->private_impl.f_color_type == 0u) { ++ v_multiplier = WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[self->private_impl.f_depth]; + } +- v_curr.len = 0; +- } +- } else { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 3; +- v_prev.len = 3; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- v_prev.ptr += 3; ++ v_shift = ((uint8_t)(((uint8_t)(8u - self->private_impl.f_depth)) & 7u)); ++ v_packs_remaining = 0u; ++ while (v_x < self->private_impl.f_frame_rect_x1) { ++ v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); ++ if (v_i <= ((uint64_t)(v_dst.len))) { ++ if ((v_packs_remaining == 0u) && (1u <= ((uint64_t)(v_s.len)))) { ++ v_packs_remaining = WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[self->private_impl.f_depth]; ++ v_bits_packed = v_s.ptr[0u]; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ } ++ v_bits_unpacked[0u] = ((uint8_t)(((uint8_t)(v_bits_packed >> v_shift)) * v_multiplier)); ++ v_bits_packed = ((uint8_t)(v_bits_packed << self->private_impl.f_depth)); ++ v_packs_remaining = ((uint8_t)(v_packs_remaining - 1u)); ++ if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) { ++ v_bits_unpacked[1u] = v_bits_unpacked[0u]; ++ v_bits_unpacked[2u] = v_bits_unpacked[0u]; ++ v_bits_unpacked[3u] = 255u; ++ if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | ++ (((uint32_t)(v_bits_unpacked[1u])) << 8u) | ++ (((uint32_t)(v_bits_unpacked[2u])) << 16u) | ++ (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { ++ v_bits_unpacked[0u] = 0u; ++ v_bits_unpacked[1u] = 0u; ++ v_bits_unpacked[2u] = 0u; ++ v_bits_unpacked[3u] = 0u; ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); ++ } else { ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 1)); ++ } ++ } ++ v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); + } +- v_curr.len = 3; +- v_prev.len = 3; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end1_curr) { +- v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- v_prev.ptr += 3; ++ } else { ++ while (v_x < self->private_impl.f_frame_rect_x1) { ++ v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); ++ if (v_i <= ((uint64_t)(v_dst.len))) { ++ if (self->private_impl.f_color_type == 0u) { ++ if (2u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[1u]; ++ v_bits_unpacked[1u] = v_s.ptr[0u]; ++ v_bits_unpacked[2u] = v_s.ptr[1u]; ++ v_bits_unpacked[3u] = v_s.ptr[0u]; ++ v_bits_unpacked[4u] = v_s.ptr[1u]; ++ v_bits_unpacked[5u] = v_s.ptr[0u]; ++ v_bits_unpacked[6u] = 255u; ++ v_bits_unpacked[7u] = 255u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); ++ if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) | ++ (((uint64_t)(v_bits_unpacked[1u])) << 8u) | ++ (((uint64_t)(v_bits_unpacked[2u])) << 16u) | ++ (((uint64_t)(v_bits_unpacked[3u])) << 24u) | ++ (((uint64_t)(v_bits_unpacked[4u])) << 32u) | ++ (((uint64_t)(v_bits_unpacked[5u])) << 40u) | ++ (((uint64_t)(v_bits_unpacked[6u])) << 48u) | ++ (((uint64_t)(v_bits_unpacked[7u])) << 56u))) { ++ v_bits_unpacked[0u] = 0u; ++ v_bits_unpacked[1u] = 0u; ++ v_bits_unpacked[2u] = 0u; ++ v_bits_unpacked[3u] = 0u; ++ v_bits_unpacked[4u] = 0u; ++ v_bits_unpacked[5u] = 0u; ++ v_bits_unpacked[6u] = 0u; ++ v_bits_unpacked[7u] = 0u; ++ } ++ } ++ } else if (self->private_impl.f_color_type == 2u) { ++ if (6u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[5u]; ++ v_bits_unpacked[1u] = v_s.ptr[4u]; ++ v_bits_unpacked[2u] = v_s.ptr[3u]; ++ v_bits_unpacked[3u] = v_s.ptr[2u]; ++ v_bits_unpacked[4u] = v_s.ptr[1u]; ++ v_bits_unpacked[5u] = v_s.ptr[0u]; ++ v_bits_unpacked[6u] = 255u; ++ v_bits_unpacked[7u] = 255u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 6u); ++ if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) | ++ (((uint64_t)(v_bits_unpacked[1u])) << 8u) | ++ (((uint64_t)(v_bits_unpacked[2u])) << 16u) | ++ (((uint64_t)(v_bits_unpacked[3u])) << 24u) | ++ (((uint64_t)(v_bits_unpacked[4u])) << 32u) | ++ (((uint64_t)(v_bits_unpacked[5u])) << 40u) | ++ (((uint64_t)(v_bits_unpacked[6u])) << 48u) | ++ (((uint64_t)(v_bits_unpacked[7u])) << 56u))) { ++ v_bits_unpacked[0u] = 0u; ++ v_bits_unpacked[1u] = 0u; ++ v_bits_unpacked[2u] = 0u; ++ v_bits_unpacked[3u] = 0u; ++ v_bits_unpacked[4u] = 0u; ++ v_bits_unpacked[5u] = 0u; ++ v_bits_unpacked[6u] = 0u; ++ v_bits_unpacked[7u] = 0u; ++ } ++ } ++ } else if (self->private_impl.f_color_type == 4u) { ++ if (4u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[1u]; ++ v_bits_unpacked[1u] = v_s.ptr[0u]; ++ v_bits_unpacked[2u] = v_s.ptr[1u]; ++ v_bits_unpacked[3u] = v_s.ptr[0u]; ++ v_bits_unpacked[4u] = v_s.ptr[1u]; ++ v_bits_unpacked[5u] = v_s.ptr[0u]; ++ v_bits_unpacked[6u] = v_s.ptr[3u]; ++ v_bits_unpacked[7u] = v_s.ptr[2u]; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ } else { ++ if (8u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[5u]; ++ v_bits_unpacked[1u] = v_s.ptr[4u]; ++ v_bits_unpacked[2u] = v_s.ptr[3u]; ++ v_bits_unpacked[3u] = v_s.ptr[2u]; ++ v_bits_unpacked[4u] = v_s.ptr[1u]; ++ v_bits_unpacked[5u] = v_s.ptr[0u]; ++ v_bits_unpacked[6u] = v_s.ptr[7u]; ++ v_bits_unpacked[7u] = v_s.ptr[6u]; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u); ++ } ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 8)); ++ } ++ v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); + } +- v_curr.len = 0; +- v_prev.len = 0; + } ++ v_prev_row = v_curr_row; ++ v_y += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3u]); + } +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__make_status(NULL); + } + +-// -------- func png.decoder.filter_3_distance_4_fallback ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_qoi__error__bad_footer[] = "#qoi: bad footer"; ++const char wuffs_qoi__error__bad_header[] = "#qoi: bad header"; ++const char wuffs_qoi__error__truncated_input[] = "#qoi: truncated input"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint8_t v_fa0 = 0; +- uint8_t v_fa1 = 0; +- uint8_t v_fa2 = 0; +- uint8_t v_fa3 = 0; ++static wuffs_base__status ++wuffs_qoi__decoder__do_decode_image_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_qoi__decoder__do_decode_frame_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_qoi__decoder__do_decode_frame( ++ wuffs_qoi__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_qoi__decoder__from_src_to_buffer( ++ wuffs_qoi__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_qoi__decoder__from_buffer_to_dst( ++ wuffs_qoi__decoder* self, ++ wuffs_base__pixel_buffer* a_dst); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_qoi__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_qoi__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_qoi__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_qoi__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_qoi__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_qoi__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_qoi__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_qoi__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_qoi__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_qoi__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_qoi__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_qoi__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_qoi__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_qoi__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_qoi__decoder__initialize( ++ wuffs_qoi__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } + +- if (((uint64_t)(a_prev.len)) == 0u) { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)((v_fa0 / 2u) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)((v_fa1 / 2u) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)((v_fa2 / 2u) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_fa3 = ((uint8_t)((v_fa3 / 2u) + v_curr.ptr[3u])); +- v_curr.ptr[3u] = v_fa3; +- v_curr.ptr += 4; +- } +- v_curr.len = 0; ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif + } else { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_fa3 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa3)) + ((uint32_t)(v_prev.ptr[3u]))) / 2u))) + v_curr.ptr[3u])); +- v_curr.ptr[3u] = v_fa3; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 0; +- v_prev.len = 0; ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } +- return wuffs_base__make_empty_struct(); ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_qoi__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); + } + +-// -------- func png.decoder.filter_4 ++wuffs_qoi__decoder* ++wuffs_qoi__decoder__alloc(void) { ++ wuffs_qoi__decoder* x = ++ (wuffs_qoi__decoder*)(calloc(1, sizeof(wuffs_qoi__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_qoi__decoder__initialize( ++ x, sizeof(wuffs_qoi__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- return (*self->private_impl.choosy_filter_4)(self, a_curr, a_prev); ++size_t ++sizeof__wuffs_qoi__decoder(void) { ++ return sizeof(wuffs_qoi__decoder); + } + ++// ---------------- Function Implementations ++ ++// -------- func qoi.decoder.get_quirk ++ + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- uint64_t v_filter_distance = 0; +- uint64_t v_n = 0; +- uint64_t v_i = 0; +- uint32_t v_fa = 0; +- uint32_t v_fb = 0; +- uint32_t v_fc = 0; +- uint32_t v_pp = 0; +- uint32_t v_pa = 0; +- uint32_t v_pb = 0; +- uint32_t v_pc = 0; ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_qoi__decoder__get_quirk( ++ const wuffs_qoi__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); +- v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); +- v_i = 0u; +- while ((v_i < v_n) && (v_i < v_filter_distance)) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i])); +- v_i += 1u; ++ return 0u; ++} ++ ++// -------- func qoi.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_qoi__decoder__set_quirk( ++ wuffs_qoi__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- v_i = v_filter_distance; +- while (v_i < v_n) { +- v_fa = ((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)])); +- v_fb = ((uint32_t)(a_prev.ptr[v_i])); +- v_fc = ((uint32_t)(a_prev.ptr[(v_i - v_filter_distance)])); +- v_pp = ((uint32_t)(((uint32_t)(v_fa + v_fb)) - v_fc)); +- v_pa = ((uint32_t)(v_pp - v_fa)); +- if (v_pa >= 2147483648u) { +- v_pa = ((uint32_t)(0u - v_pa)); +- } +- v_pb = ((uint32_t)(v_pp - v_fb)); +- if (v_pb >= 2147483648u) { +- v_pb = ((uint32_t)(0u - v_pb)); +- } +- v_pc = ((uint32_t)(v_pp - v_fc)); +- if (v_pc >= 2147483648u) { +- v_pc = ((uint32_t)(0u - v_pc)); +- } +- if ((v_pa <= v_pb) && (v_pa <= v_pc)) { +- } else if (v_pb <= v_pc) { +- v_fa = v_fb; +- } else { +- v_fa = v_fc; +- } +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(v_fa)))); +- v_i += 1u; ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } +- return wuffs_base__make_empty_struct(); ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func png.decoder.filter_4_distance_3_fallback ++// -------- func qoi.decoder.decode_image_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint32_t v_fa0 = 0; +- uint32_t v_fa1 = 0; +- uint32_t v_fa2 = 0; +- uint32_t v_fb0 = 0; +- uint32_t v_fb1 = 0; +- uint32_t v_fb2 = 0; +- uint32_t v_fc0 = 0; +- uint32_t v_fc1 = 0; +- uint32_t v_fc2 = 0; +- uint32_t v_pp0 = 0; +- uint32_t v_pp1 = 0; +- uint32_t v_pp2 = 0; +- uint32_t v_pa0 = 0; +- uint32_t v_pa1 = 0; +- uint32_t v_pa2 = 0; +- uint32_t v_pb0 = 0; +- uint32_t v_pb1 = 0; +- uint32_t v_pb2 = 0; +- uint32_t v_pc0 = 0; +- uint32_t v_pc1 = 0; +- uint32_t v_pc2 = 0; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_qoi__decoder__decode_image_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 3; +- v_prev.len = 3; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end0_curr) { +- v_fb0 = ((uint32_t)(v_prev.ptr[0u])); +- v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0)); +- v_pa0 = ((uint32_t)(v_pp0 - v_fa0)); +- if (v_pa0 >= 2147483648u) { +- v_pa0 = ((uint32_t)(0u - v_pa0)); +- } +- v_pb0 = ((uint32_t)(v_pp0 - v_fb0)); +- if (v_pb0 >= 2147483648u) { +- v_pb0 = ((uint32_t)(0u - v_pb0)); +- } +- v_pc0 = ((uint32_t)(v_pp0 - v_fc0)); +- if (v_pc0 >= 2147483648u) { +- v_pc0 = ((uint32_t)(0u - v_pc0)); +- } +- if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) { +- } else if (v_pb0 <= v_pc0) { +- v_fa0 = v_fb0; +- } else { +- v_fa0 = v_fc0; +- } +- v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0)))); +- v_fa0 = ((uint32_t)(v_curr.ptr[0u])); +- v_fc0 = v_fb0; +- v_fb1 = ((uint32_t)(v_prev.ptr[1u])); +- v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1)); +- v_pa1 = ((uint32_t)(v_pp1 - v_fa1)); +- if (v_pa1 >= 2147483648u) { +- v_pa1 = ((uint32_t)(0u - v_pa1)); +- } +- v_pb1 = ((uint32_t)(v_pp1 - v_fb1)); +- if (v_pb1 >= 2147483648u) { +- v_pb1 = ((uint32_t)(0u - v_pb1)); +- } +- v_pc1 = ((uint32_t)(v_pp1 - v_fc1)); +- if (v_pc1 >= 2147483648u) { +- v_pc1 = ((uint32_t)(0u - v_pc1)); +- } +- if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) { +- } else if (v_pb1 <= v_pc1) { +- v_fa1 = v_fb1; +- } else { +- v_fa1 = v_fc1; +- } +- v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1)))); +- v_fa1 = ((uint32_t)(v_curr.ptr[1u])); +- v_fc1 = v_fb1; +- v_fb2 = ((uint32_t)(v_prev.ptr[2u])); +- v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2)); +- v_pa2 = ((uint32_t)(v_pp2 - v_fa2)); +- if (v_pa2 >= 2147483648u) { +- v_pa2 = ((uint32_t)(0u - v_pa2)); +- } +- v_pb2 = ((uint32_t)(v_pp2 - v_fb2)); +- if (v_pb2 >= 2147483648u) { +- v_pb2 = ((uint32_t)(0u - v_pb2)); +- } +- v_pc2 = ((uint32_t)(v_pp2 - v_fc2)); +- if (v_pc2 >= 2147483648u) { +- v_pc2 = ((uint32_t)(0u - v_pc2)); ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; + } +- if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) { +- } else if (v_pb2 <= v_pc2) { +- v_fa2 = v_fb2; +- } else { +- v_fa2 = v_fc2; ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_qoi__error__truncated_input); ++ goto exit; + } +- v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2)))); +- v_fa2 = ((uint32_t)(v_curr.ptr[2u])); +- v_fc2 = v_fb2; +- v_curr.ptr += 3; +- v_prev.ptr += 3; ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- v_curr.len = 0; +- v_prev.len = 0; ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; + } +- return wuffs_base__make_empty_struct(); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; + } + +-// -------- func png.decoder.filter_4_distance_4_fallback ++// -------- func qoi.decoder.do_decode_image_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint32_t v_fa0 = 0; +- uint32_t v_fa1 = 0; +- uint32_t v_fa2 = 0; +- uint32_t v_fa3 = 0; +- uint32_t v_fb0 = 0; +- uint32_t v_fb1 = 0; +- uint32_t v_fb2 = 0; +- uint32_t v_fb3 = 0; +- uint32_t v_fc0 = 0; +- uint32_t v_fc1 = 0; +- uint32_t v_fc2 = 0; +- uint32_t v_fc3 = 0; +- uint32_t v_pp0 = 0; +- uint32_t v_pp1 = 0; +- uint32_t v_pp2 = 0; +- uint32_t v_pp3 = 0; +- uint32_t v_pa0 = 0; +- uint32_t v_pa1 = 0; +- uint32_t v_pa2 = 0; +- uint32_t v_pa3 = 0; +- uint32_t v_pb0 = 0; +- uint32_t v_pb1 = 0; +- uint32_t v_pb2 = 0; +- uint32_t v_pb3 = 0; +- uint32_t v_pc0 = 0; +- uint32_t v_pc1 = 0; +- uint32_t v_pc2 = 0; +- uint32_t v_pc3 = 0; ++static wuffs_base__status ++wuffs_qoi__decoder__do_decode_image_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end0_curr) { +- v_fb0 = ((uint32_t)(v_prev.ptr[0u])); +- v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0)); +- v_pa0 = ((uint32_t)(v_pp0 - v_fa0)); +- if (v_pa0 >= 2147483648u) { +- v_pa0 = ((uint32_t)(0u - v_pa0)); +- } +- v_pb0 = ((uint32_t)(v_pp0 - v_fb0)); +- if (v_pb0 >= 2147483648u) { +- v_pb0 = ((uint32_t)(0u - v_pb0)); +- } +- v_pc0 = ((uint32_t)(v_pp0 - v_fc0)); +- if (v_pc0 >= 2147483648u) { +- v_pc0 = ((uint32_t)(0u - v_pc0)); +- } +- if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) { +- } else if (v_pb0 <= v_pc0) { +- v_fa0 = v_fb0; +- } else { +- v_fa0 = v_fc0; +- } +- v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0)))); +- v_fa0 = ((uint32_t)(v_curr.ptr[0u])); +- v_fc0 = v_fb0; +- v_fb1 = ((uint32_t)(v_prev.ptr[1u])); +- v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1)); +- v_pa1 = ((uint32_t)(v_pp1 - v_fa1)); +- if (v_pa1 >= 2147483648u) { +- v_pa1 = ((uint32_t)(0u - v_pa1)); +- } +- v_pb1 = ((uint32_t)(v_pp1 - v_fb1)); +- if (v_pb1 >= 2147483648u) { +- v_pb1 = ((uint32_t)(0u - v_pb1)); +- } +- v_pc1 = ((uint32_t)(v_pp1 - v_fc1)); +- if (v_pc1 >= 2147483648u) { +- v_pc1 = ((uint32_t)(0u - v_pc1)); +- } +- if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) { +- } else if (v_pb1 <= v_pc1) { +- v_fa1 = v_fb1; ++ uint32_t v_a = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- v_fa1 = v_fc1; +- } +- v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1)))); +- v_fa1 = ((uint32_t)(v_curr.ptr[1u])); +- v_fc1 = v_fb1; +- v_fb2 = ((uint32_t)(v_prev.ptr[2u])); +- v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2)); +- v_pa2 = ((uint32_t)(v_pp2 - v_fa2)); +- if (v_pa2 >= 2147483648u) { +- v_pa2 = ((uint32_t)(0u - v_pa2)); +- } +- v_pb2 = ((uint32_t)(v_pp2 - v_fb2)); +- if (v_pb2 >= 2147483648u) { +- v_pb2 = ((uint32_t)(0u - v_pb2)); +- } +- v_pc2 = ((uint32_t)(v_pp2 - v_fc2)); +- if (v_pc2 >= 2147483648u) { +- v_pc2 = ((uint32_t)(0u - v_pc2)); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } + } +- if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) { +- } else if (v_pb2 <= v_pc2) { +- v_fa2 = v_fb2; ++ v_a = t_0; ++ } ++ if (v_a != 1718185841u) { ++ status = wuffs_base__make_status(wuffs_qoi__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- v_fa2 = v_fc2; +- } +- v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2)))); +- v_fa2 = ((uint32_t)(v_curr.ptr[2u])); +- v_fc2 = v_fb2; +- v_fb3 = ((uint32_t)(v_prev.ptr[3u])); +- v_pp3 = ((uint32_t)(((uint32_t)(v_fa3 + v_fb3)) - v_fc3)); +- v_pa3 = ((uint32_t)(v_pp3 - v_fa3)); +- if (v_pa3 >= 2147483648u) { +- v_pa3 = ((uint32_t)(0u - v_pa3)); +- } +- v_pb3 = ((uint32_t)(v_pp3 - v_fb3)); +- if (v_pb3 >= 2147483648u) { +- v_pb3 = ((uint32_t)(0u - v_pb3)); +- } +- v_pc3 = ((uint32_t)(v_pp3 - v_fc3)); +- if (v_pc3 >= 2147483648u) { +- v_pc3 = ((uint32_t)(0u - v_pc3)); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); ++ } + } +- if ((v_pa3 <= v_pb3) && (v_pa3 <= v_pc3)) { +- } else if (v_pb3 <= v_pc3) { +- v_fa3 = v_fb3; ++ v_a = t_1; ++ } ++ if (v_a > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_width = v_a; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- v_fa3 = v_fc3; ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)); ++ } + } +- v_curr.ptr[3u] = ((uint8_t)(v_curr.ptr[3u] + ((uint8_t)(v_fa3)))); +- v_fa3 = ((uint32_t)(v_curr.ptr[3u])); +- v_fc3 = v_fb3; +- v_curr.ptr += 4; +- v_prev.ptr += 4; ++ v_a = t_2; + } +- v_curr.len = 0; +- v_prev.len = 0; +- } +- return wuffs_base__make_empty_struct(); +-} ++ if (v_a > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_height = v_a; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_3 = *iop_a_src++; ++ v_a = t_3; ++ } ++ if (v_a == 3u) { ++ self->private_impl.f_pixfmt = 2415954056u; ++ } else if (v_a == 4u) { ++ self->private_impl.f_pixfmt = 2164295816u; ++ } else { ++ status = wuffs_base__make_status(wuffs_qoi__error__bad_header); ++ goto exit; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src++; ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ 14u, ++ (self->private_impl.f_pixfmt == 2415954056u)); ++ } ++ self->private_impl.f_call_sequence = 32u; + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func png.decoder.filter_1_distance_4_x86_sse42 ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- wuffs_base__slice_u8 v_curr = {0}; +- __m128i v_x128 = {0}; +- __m128i v_a128 = {0}; ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_a128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_a128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- } +- v_curr.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_a128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- } +- v_curr.len = 0; ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- return wuffs_base__make_empty_struct(); ++ ++ return status; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func png.decoder.filter_3_distance_4_x86_sse42 ++// -------- func qoi.decoder.decode_frame_config + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- __m128i v_x128 = {0}; +- __m128i v_a128 = {0}; +- __m128i v_b128 = {0}; +- __m128i v_p128 = {0}; +- __m128i v_k128 = {0}; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_qoi__decoder__decode_frame_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- if (((uint64_t)(a_prev.len)) == 0u) { +- v_k128 = _mm_set1_epi8((int8_t)(254u)); +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- } +- v_curr.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- } +- v_curr.len = 0; +- } +- } else { +- v_k128 = _mm_set1_epi8((int8_t)(1u)); +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_p128 = _mm_avg_epu8(v_a128, v_b128); +- v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_p128 = _mm_avg_epu8(v_a128, v_b128); +- v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; + } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_p128 = _mm_avg_epu8(v_a128, v_b128); +- v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_qoi__error__truncated_input); ++ goto exit; + } +- v_curr.len = 0; +- v_prev.len = 0; ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func png.decoder.filter_4_distance_3_x86_sse42 ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- __m128i v_x128 = {0}; +- __m128i v_a128 = {0}; +- __m128i v_b128 = {0}; +- __m128i v_c128 = {0}; +- __m128i v_p128 = {0}; +- __m128i v_pa128 = {0}; +- __m128i v_pb128 = {0}; +- __m128i v_pc128 = {0}; +- __m128i v_smallest128 = {0}; +- __m128i v_z128 = {0}; ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + wuffs_base__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6); +- while (v_curr.ptr < i_end0_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + wuffs_base__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3); +- while (v_curr.ptr < i_end1_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 3; +- v_prev.len = 3; +- uint8_t* i_end2_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end2_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 0; +- v_prev.len = 0; ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- return wuffs_base__make_empty_struct(); ++ return status; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func png.decoder.filter_4_distance_4_x86_sse42 ++// -------- func qoi.decoder.do_decode_frame_config + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- __m128i v_x128 = {0}; +- __m128i v_a128 = {0}; +- __m128i v_b128 = {0}; +- __m128i v_c128 = {0}; +- __m128i v_p128 = {0}; +- __m128i v_pa128 = {0}; +- __m128i v_pb128 = {0}; +- __m128i v_pc128 = {0}; +- __m128i v_smallest128 = {0}; +- __m128i v_z128 = {0}; ++static wuffs_base__status ++wuffs_qoi__decoder__do_decode_frame_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_qoi__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (16u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } +- v_curr.len = 0; +- v_prev.len = 0; +- } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 +- +-// -------- func png.decoder.get_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_png__decoder__get_quirk( +- const wuffs_png__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ 14u, ++ 0u, ++ (self->private_impl.f_pixfmt == 2415954056u), ++ false, ++ 0u); ++ } ++ self->private_impl.f_call_sequence = 64u; + +- if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { +- return 1u; ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; + } +- return 0u; +-} + +-// -------- func png.decoder.set_quirk ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__set_quirk( +- wuffs_png__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- if (a_key == 1u) { +- self->private_impl.f_ignore_checksum = (a_value > 0u); +- wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, a_key, a_value); +- return wuffs_base__make_status(NULL); +- } +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ return status; + } + +-// -------- func png.decoder.decode_image_config ++// -------- func qoi.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__decode_image_config( +- wuffs_png__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++wuffs_qoi__decoder__decode_frame( ++ wuffs_qoi__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -54464,12 +67805,12 @@ wuffs_png__decoder__decode_image_config( + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } +- if (!a_src) { ++ if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { ++ (self->private_impl.active_coroutine != 3)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -54478,17 +67819,22 @@ wuffs_png__decoder__decode_image_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_png__decoder__do_decode_image_config(self, a_dst, a_src); ++ wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_qoi__error__truncated_input); + goto exit; + } + status = v_status; +@@ -54496,14 +67842,14 @@ wuffs_png__decoder__decode_image_config( + } + + ok: +- self->private_impl.p_decode_image_config[0] = 0; ++ self->private_impl.p_decode_frame = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; + + goto exit; + exit: +@@ -54513,21 +67859,21 @@ wuffs_png__decoder__decode_image_config( + return status; + } + +-// -------- func png.decoder.do_decode_image_config ++// -------- func qoi.decoder.do_decode_frame + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__do_decode_image_config( +- wuffs_png__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++wuffs_qoi__decoder__do_decode_frame( ++ wuffs_qoi__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint64_t v_magic = 0; +- uint64_t v_mark = 0; +- uint32_t v_checksum_have = 0; +- uint32_t v_checksum_want = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint64_t v_c64 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -54540,281 +67886,332 @@ wuffs_png__decoder__do_decode_image_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; +- if (coro_susp_point) { +- v_checksum_have = self->private_data.s_do_decode_image_config[0].v_checksum_have; +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if ( ! self->private_impl.f_seen_ihdr) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint64_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { +- t_0 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); +- iop_a_src += 8; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 56) { +- t_0 = ((uint64_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; +- } +- } +- v_magic = t_0; ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (v_magic != 727905341920923785u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_qoi__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint64_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { +- t_1 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); +- iop_a_src += 8; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 56) { +- t_1 = ((uint64_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; +- } +- } +- v_magic = t_1; ++ goto ok; ++ } ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y = 0u; ++ self->private_data.f_pixel[0u] = 0u; ++ self->private_data.f_pixel[1u] = 0u; ++ self->private_data.f_pixel[2u] = 0u; ++ self->private_data.f_pixel[3u] = 255u; ++ wuffs_private_impl__bulk_memset(&self->private_data.f_cache[0], 256u, 0u); ++ self->private_impl.f_remaining_pixels_times_4 = (((uint64_t)(self->private_impl.f_width)) * ((uint64_t)(self->private_impl.f_height)) * 4u); ++ while (self->private_impl.f_remaining_pixels_times_4 > 0u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (v_magic != 5927942488114331648u) { +- if (v_magic == 5278895250759221248u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_cgbi_extension); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_qoi__decoder__from_src_to_buffer(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_remaining_pixels_times_4 < ((uint64_t)(self->private_impl.f_buffer_index))) { ++ status = wuffs_base__make_status(wuffs_base__error__too_much_data); ++ goto exit; ++ } ++ self->private_impl.f_remaining_pixels_times_4 -= ((uint64_t)(self->private_impl.f_buffer_index)); ++ v_status = wuffs_qoi__decoder__from_buffer_to_dst(self, a_dst); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; ++ goto ok; + } +- self->private_impl.f_chunk_type_array[0u] = 73u; +- self->private_impl.f_chunk_type_array[1u] = 72u; +- self->private_impl.f_chunk_type_array[2u] = 68u; +- self->private_impl.f_chunk_type_array[3u] = 82u; +- wuffs_base__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, +- sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); +- while (true) { +- v_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_0 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_decode_frame.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- wuffs_base__status t_2 = wuffs_png__decoder__decode_ihdr(self, a_src); +- v_status = t_2; +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 56) { ++ t_0 = ((uint64_t)(*scratch >> 0)); ++ break; + } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); + } +- if ( ! self->private_impl.f_ignore_checksum) { +- v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); +- } +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); + } ++ v_c64 = t_0; ++ } ++ if (v_c64 != 1u) { ++ status = wuffs_base__make_status(wuffs_qoi__error__bad_footer); ++ goto exit; ++ } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func qoi.decoder.from_src_to_buffer ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_qoi__decoder__from_src_to_buffer( ++ wuffs_qoi__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint8_t v_dg = 0; ++ uint32_t v_bi = 0; ++ uint32_t v_bj = 0; ++ uint32_t v_bk = 0; ++ uint32_t v_ci = 0; ++ uint32_t v_hash4 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_from_src_to_buffer; ++ if (coro_susp_point) { ++ v_dg = self->private_data.s_from_src_to_buffer.v_dg; ++ v_bi = self->private_data.s_from_src_to_buffer.v_bi; ++ v_bk = self->private_data.s_from_src_to_buffer.v_bk; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ v_bk = 7936u; ++ if (self->private_impl.f_remaining_pixels_times_4 < 7936u) { ++ v_bk = ((uint32_t)(self->private_impl.f_remaining_pixels_times_4)); ++ } ++ while (v_bi < v_bk) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)); +- } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_checksum_want = t_3; +- } +- if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != v_checksum_want)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_checksum); +- goto exit; +- } +- self->private_impl.f_seen_ihdr = true; +- } else if (self->private_impl.f_metadata_fourcc != 0u) { +- self->private_impl.f_call_sequence = 16u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; +- } +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- continue; ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); +- if (self->private_impl.f_chunk_type == 1413563465u) { +- if ( ! self->private_impl.f_seen_actl || self->private_impl.f_seen_fctl) { +- break; ++ if (v_c8 == 254u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ self->private_data.f_pixel[2u] = t_1; + } +- self->private_impl.f_seen_idat = true; +- } else if (self->private_impl.f_chunk_type == 1413571686u) { +- if (self->private_impl.f_seen_idat && self->private_impl.f_seen_fctl) { +- break; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ self->private_data.f_pixel[1u] = t_2; + } +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- iop_a_src += 8u; +- if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) { +- self->private_impl.f_chunk_type_array[0u] = ((uint8_t)((self->private_impl.f_chunk_type >> 0u))); +- self->private_impl.f_chunk_type_array[1u] = ((uint8_t)((self->private_impl.f_chunk_type >> 8u))); +- self->private_impl.f_chunk_type_array[2u] = ((uint8_t)((self->private_impl.f_chunk_type >> 16u))); +- self->private_impl.f_chunk_type_array[3u] = ((uint8_t)((self->private_impl.f_chunk_type >> 24u))); +- wuffs_base__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, +- sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); +- } +- while (true) { +- v_mark = ((uint64_t)(iop_a_src - io0_a_src)); + { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- wuffs_base__status t_4 = wuffs_png__decoder__decode_other_chunk(self, a_src, false); +- v_status = t_4; +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ uint8_t t_3 = *iop_a_src++; ++ self->private_data.f_pixel[0u] = t_3; ++ } ++ } else if (v_c8 == 255u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_4 = *iop_a_src++; ++ self->private_data.f_pixel[2u] = t_4; + } +- if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) { +- v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ self->private_data.f_pixel[1u] = t_5; + } +- if (wuffs_base__status__is_ok(&v_status)) { +- break; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ self->private_data.f_pixel[0u] = t_6; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); +- } +- if (self->private_impl.f_metadata_fourcc != 0u) { +- self->private_impl.f_call_sequence = 16u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- uint32_t t_5; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); +- if (num_bits_5 == 24) { +- t_5 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_5 += 8u; +- *scratch |= ((uint64_t)(num_bits_5)); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_7 = *iop_a_src++; ++ self->private_data.f_pixel[3u] = t_7; + } +- v_checksum_want = t_5; +- } +- if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u) && (v_checksum_have != v_checksum_want)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_checksum); +- goto exit; +- } +- } +- if ((self->private_impl.f_color_type == 3u) && ! self->private_impl.f_seen_plte) { +- status = wuffs_base__make_status(wuffs_png__error__missing_palette); +- goto exit; +- } +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- self->private_impl.f_first_config_io_position = self->private_impl.f_frame_config_io_position; +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- self->private_impl.f_dst_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_first_config_io_position, +- ((self->private_impl.f_color_type <= 3u) && ! self->private_impl.f_seen_trns)); +- } +- if ( ! self->private_impl.f_seen_actl) { +- self->private_impl.f_num_animation_frames_value = 1u; +- self->private_impl.f_first_rect_x0 = 0u; +- self->private_impl.f_first_rect_y0 = 0u; +- self->private_impl.f_first_rect_x1 = self->private_impl.f_width; +- self->private_impl.f_first_rect_y1 = self->private_impl.f_height; +- self->private_impl.f_first_duration = 0u; +- self->private_impl.f_first_disposal = 0u; +- self->private_impl.f_first_overwrite_instead_of_blend = false; +- } +- self->private_impl.f_call_sequence = 32u; ++ } else if (((uint8_t)(v_c8 >> 6u)) == 0u) { ++ v_ci = (4u * ((uint32_t)(((uint8_t)(v_c8 & 63u))))); ++ self->private_data.f_pixel[0u] = self->private_data.f_cache[(v_ci + 0u)]; ++ self->private_data.f_pixel[1u] = self->private_data.f_cache[(v_ci + 1u)]; ++ self->private_data.f_pixel[2u] = self->private_data.f_cache[(v_ci + 2u)]; ++ self->private_data.f_pixel[3u] = self->private_data.f_cache[(v_ci + 3u)]; ++ self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u]; ++ self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u]; ++ self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u]; ++ self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u]; ++ v_bi += 4u; ++ continue; ++ } else if (((uint8_t)(v_c8 >> 6u)) == 1u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_pixel[2u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 4u)) & 3u)) + 254u)); ++ self->private_data.f_pixel[1u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 2u)) & 3u)) + 254u)); ++ self->private_data.f_pixel[0u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 0u)) & 3u)) + 254u)); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (((uint8_t)(v_c8 >> 6u)) == 2u) { ++ v_dg = ((uint8_t)(((uint8_t)(v_c8 & 63u)) + 224u)); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_8 = *iop_a_src++; ++ v_c8 = t_8; ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_pixel[2u] += ((uint8_t)(((uint8_t)(v_dg + 248u)) + ((uint8_t)(15u & ((uint8_t)(v_c8 >> 4u)))))); ++ self->private_data.f_pixel[1u] += v_dg; ++ self->private_data.f_pixel[0u] += ((uint8_t)(((uint8_t)(v_dg + 248u)) + ((uint8_t)(15u & ((uint8_t)(v_c8 >> 0u)))))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ v_bj = (v_bi + (4u * (63u & (1u + ((uint32_t)(v_c8)))))); ++ while (v_bi < v_bj) { ++ self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u]; ++ self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u]; ++ self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u]; ++ self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u]; ++ v_bi += 4u; ++ } ++ continue; ++ } ++ v_hash4 = (4u * (63u & ((((uint32_t)(self->private_data.f_pixel[2u])) * 3u) + ++ (((uint32_t)(self->private_data.f_pixel[1u])) * 5u) + ++ (((uint32_t)(self->private_data.f_pixel[0u])) * 7u) + ++ (((uint32_t)(self->private_data.f_pixel[3u])) * 11u)))); ++ self->private_data.f_cache[(v_hash4 + 0u)] = self->private_data.f_pixel[0u]; ++ self->private_data.f_cache[(v_hash4 + 1u)] = self->private_data.f_pixel[1u]; ++ self->private_data.f_cache[(v_hash4 + 2u)] = self->private_data.f_pixel[2u]; ++ self->private_data.f_cache[(v_hash4 + 3u)] = self->private_data.f_pixel[3u]; ++ self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u]; ++ self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u]; ++ self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u]; ++ self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u]; ++ v_bi += 4u; ++ } ++ self->private_impl.f_buffer_index = v_bi; + ++ goto ok; + ok: +- self->private_impl.p_do_decode_image_config[0] = 0; ++ self->private_impl.p_from_src_to_buffer = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_image_config[0].v_checksum_have = v_checksum_have; ++ self->private_impl.p_from_src_to_buffer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_from_src_to_buffer.v_dg = v_dg; ++ self->private_data.s_from_src_to_buffer.v_bi = v_bi; ++ self->private_data.s_from_src_to_buffer.v_bk = v_bk; + + goto exit; + exit: +@@ -54825,1068 +68222,1113 @@ wuffs_png__decoder__do_decode_image_config( + return status; + } + +-// -------- func png.decoder.decode_ihdr ++// -------- func qoi.decoder.from_buffer_to_dst + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__decode_ihdr( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_a32 = 0; +- uint8_t v_a8 = 0; ++wuffs_qoi__decoder__from_buffer_to_dst( ++ wuffs_qoi__decoder* self, ++ wuffs_base__pixel_buffer* a_dst) { ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ uint32_t v_bi = 0; ++ uint32_t v_rem_x = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ wuffs_base__slice_u8 v_src = {0}; ++ uint32_t v_src_length = 0; ++ uint64_t v_i = 0; + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } +- +- uint32_t coro_susp_point = self->private_impl.p_decode_ihdr[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_ihdr[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_ihdr[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- v_a32 = t_0; +- } +- if ((v_a32 == 0u) || (v_a32 > 2147483647u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; +- } else if (v_a32 > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_width = v_a32; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_ihdr[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_ihdr[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } +- } +- v_a32 = t_1; +- } +- if ((v_a32 == 0u) || (v_a32 > 2147483647u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; +- } else if (v_a32 > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_height = v_a32; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- v_a8 = t_2; +- } +- if (v_a8 > 16u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; +- } +- self->private_impl.f_depth = v_a8; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_a8 = t_3; +- } +- if ((v_a8 == 1u) || (v_a8 == 5u) || (v_a8 > 6u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; +- } +- self->private_impl.f_color_type = v_a8; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_a8 = t_4; +- } +- if (v_a8 != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ while (v_bi < self->private_impl.f_buffer_index) { ++ if (self->private_impl.f_width <= self->private_impl.f_dst_x) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += 1u; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ break; + } +- uint8_t t_5 = *iop_a_src++; +- v_a8 = t_5; +- } +- if (v_a8 != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; ++ v_rem_x = self->private_impl.f_width; ++ } else { ++ v_rem_x = (self->private_impl.f_width - self->private_impl.f_dst_x); + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_6 = *iop_a_src++; +- v_a8 = t_6; ++ v_src = wuffs_base__make_slice_u8_ij(self->private_data.f_buffer, v_bi, self->private_impl.f_buffer_index); ++ if (((uint64_t)((4u * v_rem_x))) < ((uint64_t)(v_src.len))) { ++ v_src = wuffs_base__slice_u8__subslice_j(v_src, ((uint64_t)((4u * v_rem_x)))); + } +- if (v_a8 == 0u) { +- self->private_impl.f_interlace_pass = 0u; +- } else if (v_a8 == 1u) { +- self->private_impl.f_interlace_pass = 1u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; ++ v_src_length = ((uint32_t)(((uint64_t)(v_src.len)))); ++ v_bi += v_src_length; ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); + } +- self->private_impl.f_filter_distance = 0u; +- wuffs_png__decoder__assign_filter_distance(self); +- if (self->private_impl.f_filter_distance == 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ self->private_impl.f_dst_x += (v_src_length / 4u); ++ if (v_i < ((uint64_t)(v_dst.len))) { ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), wuffs_base__pixel_buffer__palette(a_dst), v_src); + } +- self->private_impl.f_overall_workbuf_length = (((uint64_t)(self->private_impl.f_height)) * (1u + wuffs_png__decoder__calculate_bytes_per_row(self, self->private_impl.f_width))); +- wuffs_png__decoder__choose_filter_implementations(self); ++ } ++ return wuffs_base__make_status(NULL); ++} + +- goto ok; +- ok: +- self->private_impl.p_decode_ihdr[0] = 0; +- goto exit; ++// -------- func qoi.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_qoi__decoder__frame_dirty_rect( ++ const wuffs_qoi__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_ihdr[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); ++} ++ ++// -------- func qoi.decoder.num_animation_loops ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_qoi__decoder__num_animation_loops( ++ const wuffs_qoi__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func qoi.decoder.num_decoded_frame_configs ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_qoi__decoder__num_decoded_frame_configs( ++ const wuffs_qoi__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; ++} + ++// -------- func qoi.decoder.num_decoded_frames ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_qoi__decoder__num_decoded_frames( ++ const wuffs_qoi__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func qoi.decoder.restart_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_qoi__decoder__restart_frame( ++ wuffs_qoi__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if ((a_index != 0u) || (a_io_position != 14u)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func qoi.decoder.set_report_metadata ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_qoi__decoder__set_report_metadata( ++ wuffs_qoi__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func qoi.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_qoi__decoder__tell_me_more( ++ wuffs_qoi__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ ++ goto ok; ++ ok: + goto exit; + exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- + return status; + } + +-// -------- func png.decoder.assign_filter_distance ++// -------- func qoi.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_qoi__decoder__workbuf_len( ++ const wuffs_qoi__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) ++ ++// ---------------- Status Codes Implementations ++ ++// ---------------- Private Consts ++ ++static const uint32_t ++WUFFS_SHA256__INITIAL_SHA256_H[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1779033703u, 3144134277u, 1013904242u, 2773480762u, 1359893119u, 2600822924u, 528734635u, 1541459225u, ++}; ++ ++static const uint32_t ++WUFFS_SHA256__K[64] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1116352408u, 1899447441u, 3049323471u, 3921009573u, 961987163u, 1508970993u, 2453635748u, 2870763221u, ++ 3624381080u, 310598401u, 607225278u, 1426881987u, 1925078388u, 2162078206u, 2614888103u, 3248222580u, ++ 3835390401u, 4022224774u, 264347078u, 604807628u, 770255983u, 1249150122u, 1555081692u, 1996064986u, ++ 2554220882u, 2821834349u, 2952996808u, 3210313671u, 3336571891u, 3584528711u, 113926993u, 338241895u, ++ 666307205u, 773529912u, 1294757372u, 1396182291u, 1695183700u, 1986661051u, 2177026350u, 2456956037u, ++ 2730485921u, 2820302411u, 3259730800u, 3345764771u, 3516065817u, 3600352804u, 4094571909u, 275423344u, ++ 430227734u, 506948616u, 659060556u, 883997877u, 958139571u, 1322822218u, 1537002063u, 1747873779u, ++ 1955562222u, 2024104815u, 2227730452u, 2361852424u, 2428436474u, 2756734187u, 3204031479u, 3329325298u, ++}; ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_png__decoder__assign_filter_distance( +- wuffs_png__decoder* self) { +- if (self->private_impl.f_depth < 8u) { +- if ((self->private_impl.f_depth != 1u) && (self->private_impl.f_depth != 2u) && (self->private_impl.f_depth != 4u)) { +- return wuffs_base__make_empty_struct(); +- } else if (self->private_impl.f_color_type == 0u) { +- self->private_impl.f_dst_pixfmt = 536870920u; +- self->private_impl.f_src_pixfmt = 536870920u; +- } else if (self->private_impl.f_color_type == 3u) { +- self->private_impl.f_dst_pixfmt = 2198077448u; +- self->private_impl.f_src_pixfmt = 2198077448u; ++wuffs_sha256__hasher__up( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x); ++ ++// ---------------- VTables ++ ++const wuffs_base__hasher_bitvec256__func_ptrs ++wuffs_sha256__hasher__func_ptrs_for__wuffs_base__hasher_bitvec256 = { ++ (wuffs_base__bitvec256(*)(const void*))(&wuffs_sha256__hasher__checksum_bitvec256), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_sha256__hasher__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_sha256__hasher__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_sha256__hasher__update), ++ (wuffs_base__bitvec256(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_sha256__hasher__update_bitvec256), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_sha256__hasher__initialize( ++ wuffs_sha256__hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { +- return wuffs_base__make_empty_struct(); ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } +- self->private_impl.f_filter_distance = 1u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- } else if (self->private_impl.f_color_type == 0u) { +- if (self->private_impl.f_depth == 8u) { +- self->private_impl.f_dst_pixfmt = 536870920u; +- self->private_impl.f_src_pixfmt = 536870920u; +- self->private_impl.f_filter_distance = 1u; +- } else if (self->private_impl.f_depth == 16u) { +- if (self->private_impl.f_interlace_pass == 0u) { +- self->private_impl.f_dst_pixfmt = 536870923u; +- self->private_impl.f_src_pixfmt = 537919499u; +- } else { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__hasher_bitvec256.vtable_name = ++ wuffs_base__hasher_bitvec256__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_bitvec256.function_pointers = ++ (const void*)(&wuffs_sha256__hasher__func_ptrs_for__wuffs_base__hasher_bitvec256); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_sha256__hasher* ++wuffs_sha256__hasher__alloc(void) { ++ wuffs_sha256__hasher* x = ++ (wuffs_sha256__hasher*)(calloc(1, sizeof(wuffs_sha256__hasher))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_sha256__hasher__initialize( ++ x, sizeof(wuffs_sha256__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_sha256__hasher(void) { ++ return sizeof(wuffs_sha256__hasher); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func sha256.hasher.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_sha256__hasher__get_quirk( ++ const wuffs_sha256__hasher* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func sha256.hasher.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_sha256__hasher__set_quirk( ++ wuffs_sha256__hasher* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func sha256.hasher.update ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_sha256__hasher__update( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } ++ ++ uint64_t v_new_lmu = 0; ++ ++ if ((self->private_impl.f_length_modulo_u64 == 0u) && ! self->private_impl.f_length_overflows_u64) { ++ self->private_impl.f_h0 = WUFFS_SHA256__INITIAL_SHA256_H[0u]; ++ self->private_impl.f_h1 = WUFFS_SHA256__INITIAL_SHA256_H[1u]; ++ self->private_impl.f_h2 = WUFFS_SHA256__INITIAL_SHA256_H[2u]; ++ self->private_impl.f_h3 = WUFFS_SHA256__INITIAL_SHA256_H[3u]; ++ self->private_impl.f_h4 = WUFFS_SHA256__INITIAL_SHA256_H[4u]; ++ self->private_impl.f_h5 = WUFFS_SHA256__INITIAL_SHA256_H[5u]; ++ self->private_impl.f_h6 = WUFFS_SHA256__INITIAL_SHA256_H[6u]; ++ self->private_impl.f_h7 = WUFFS_SHA256__INITIAL_SHA256_H[7u]; ++ } ++ v_new_lmu = ((uint64_t)(self->private_impl.f_length_modulo_u64 + ((uint64_t)(a_x.len)))); ++ self->private_impl.f_length_overflows_u64 = ((v_new_lmu < self->private_impl.f_length_modulo_u64) || self->private_impl.f_length_overflows_u64); ++ self->private_impl.f_length_modulo_u64 = v_new_lmu; ++ if (self->private_impl.f_buf_len != 0u) { ++ while (self->private_impl.f_buf_len < 64u) { ++ if (((uint64_t)(a_x.len)) <= 0u) { ++ return wuffs_base__make_empty_struct(); + } +- self->private_impl.f_filter_distance = 2u; +- } +- } else if (self->private_impl.f_color_type == 2u) { +- if (self->private_impl.f_depth == 8u) { +- self->private_impl.f_dst_pixfmt = 2147485832u; +- self->private_impl.f_src_pixfmt = 2684356744u; +- self->private_impl.f_filter_distance = 3u; +- } else if (self->private_impl.f_depth == 16u) { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; +- self->private_impl.f_filter_distance = 6u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- } +- } else if (self->private_impl.f_color_type == 3u) { +- if (self->private_impl.f_depth == 8u) { +- self->private_impl.f_dst_pixfmt = 2198077448u; +- self->private_impl.f_src_pixfmt = 2198077448u; +- self->private_impl.f_filter_distance = 1u; +- } +- } else if (self->private_impl.f_color_type == 4u) { +- if (self->private_impl.f_depth == 8u) { +- self->private_impl.f_dst_pixfmt = 2164295816u; +- self->private_impl.f_src_pixfmt = 2164295816u; +- self->private_impl.f_filter_distance = 2u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- } else if (self->private_impl.f_depth == 16u) { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; +- self->private_impl.f_filter_distance = 4u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- } +- } else if (self->private_impl.f_color_type == 6u) { +- if (self->private_impl.f_depth == 8u) { +- self->private_impl.f_dst_pixfmt = 2164295816u; +- self->private_impl.f_src_pixfmt = 2701166728u; +- self->private_impl.f_filter_distance = 4u; +- } else if (self->private_impl.f_depth == 16u) { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; +- self->private_impl.f_filter_distance = 8u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); ++ self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u]; ++ self->private_impl.f_buf_len += 1u; ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); + } ++ self->private_impl.f_buf_len = 0u; ++ wuffs_sha256__hasher__up(self, wuffs_base__make_slice_u8(self->private_impl.f_buf_data, 64)); + } ++ wuffs_sha256__hasher__up(self, a_x); + return wuffs_base__make_empty_struct(); + } + +-// -------- func png.decoder.calculate_bytes_per_row ++// -------- func sha256.hasher.update_bitvec256 + + WUFFS_BASE__GENERATED_C_CODE +-static uint64_t +-wuffs_png__decoder__calculate_bytes_per_row( +- const wuffs_png__decoder* self, +- uint32_t a_width) { +- uint64_t v_bytes_per_channel = 0; +- +- if (self->private_impl.f_depth == 1u) { +- return ((uint64_t)(((a_width + 7u) / 8u))); +- } else if (self->private_impl.f_depth == 2u) { +- return ((uint64_t)(((a_width + 3u) / 4u))); +- } else if (self->private_impl.f_depth == 4u) { +- return ((uint64_t)(((a_width + 1u) / 2u))); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_sha256__hasher__update_bitvec256( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); + } +- v_bytes_per_channel = ((uint64_t)((self->private_impl.f_depth >> 3u))); +- return (((uint64_t)(a_width)) * v_bytes_per_channel * ((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type]))); ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); ++ } ++ ++ wuffs_sha256__hasher__update(self, a_x); ++ return wuffs_sha256__hasher__checksum_bitvec256(self); + } + +-// -------- func png.decoder.choose_filter_implementations ++// -------- func sha256.hasher.up + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_png__decoder__choose_filter_implementations( +- wuffs_png__decoder* self) { +- if (self->private_impl.f_filter_distance == 3u) { +- self->private_impl.choosy_filter_1 = ( +- &wuffs_png__decoder__filter_1_distance_3_fallback); +- self->private_impl.choosy_filter_3 = ( +- &wuffs_png__decoder__filter_3_distance_3_fallback); +- self->private_impl.choosy_filter_4 = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_3_arm_neon : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_3_x86_sse42 : +-#endif +- &wuffs_png__decoder__filter_4_distance_3_fallback); +- } else if (self->private_impl.f_filter_distance == 4u) { +- self->private_impl.choosy_filter_1 = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_1_distance_4_arm_neon : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_1_distance_4_x86_sse42 : +-#endif +- &wuffs_png__decoder__filter_1_distance_4_fallback); +- self->private_impl.choosy_filter_3 = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_3_distance_4_arm_neon : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_3_distance_4_x86_sse42 : +-#endif +- &wuffs_png__decoder__filter_3_distance_4_fallback); +- self->private_impl.choosy_filter_4 = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_4_arm_neon : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_4_x86_sse42 : +-#endif +- &wuffs_png__decoder__filter_4_distance_4_fallback); ++wuffs_sha256__hasher__up( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ wuffs_base__slice_u8 v_p = {0}; ++ uint32_t v_w[64] = {0}; ++ uint32_t v_w2 = 0; ++ uint32_t v_w15 = 0; ++ uint32_t v_s0 = 0; ++ uint32_t v_s1 = 0; ++ uint32_t v_t1 = 0; ++ uint32_t v_t2 = 0; ++ uint32_t v_a = 0; ++ uint32_t v_b = 0; ++ uint32_t v_c = 0; ++ uint32_t v_d = 0; ++ uint32_t v_e = 0; ++ uint32_t v_f = 0; ++ uint32_t v_g = 0; ++ uint32_t v_h = 0; ++ uint32_t v_i = 0; ++ uint32_t v_buf_len = 0; ++ ++ v_a = self->private_impl.f_h0; ++ v_b = self->private_impl.f_h1; ++ v_c = self->private_impl.f_h2; ++ v_d = self->private_impl.f_h3; ++ v_e = self->private_impl.f_h4; ++ v_f = self->private_impl.f_h5; ++ v_g = self->private_impl.f_h6; ++ v_h = self->private_impl.f_h7; ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 64; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64)); ++ while (v_p.ptr < i_end0_p) { ++ v_w[0u] = ((((uint32_t)(v_p.ptr[0u])) << 24u) | ++ (((uint32_t)(v_p.ptr[1u])) << 16u) | ++ (((uint32_t)(v_p.ptr[2u])) << 8u) | ++ ((uint32_t)(v_p.ptr[3u]))); ++ v_w[1u] = ((((uint32_t)(v_p.ptr[4u])) << 24u) | ++ (((uint32_t)(v_p.ptr[5u])) << 16u) | ++ (((uint32_t)(v_p.ptr[6u])) << 8u) | ++ ((uint32_t)(v_p.ptr[7u]))); ++ v_w[2u] = ((((uint32_t)(v_p.ptr[8u])) << 24u) | ++ (((uint32_t)(v_p.ptr[9u])) << 16u) | ++ (((uint32_t)(v_p.ptr[10u])) << 8u) | ++ ((uint32_t)(v_p.ptr[11u]))); ++ v_w[3u] = ((((uint32_t)(v_p.ptr[12u])) << 24u) | ++ (((uint32_t)(v_p.ptr[13u])) << 16u) | ++ (((uint32_t)(v_p.ptr[14u])) << 8u) | ++ ((uint32_t)(v_p.ptr[15u]))); ++ v_w[4u] = ((((uint32_t)(v_p.ptr[16u])) << 24u) | ++ (((uint32_t)(v_p.ptr[17u])) << 16u) | ++ (((uint32_t)(v_p.ptr[18u])) << 8u) | ++ ((uint32_t)(v_p.ptr[19u]))); ++ v_w[5u] = ((((uint32_t)(v_p.ptr[20u])) << 24u) | ++ (((uint32_t)(v_p.ptr[21u])) << 16u) | ++ (((uint32_t)(v_p.ptr[22u])) << 8u) | ++ ((uint32_t)(v_p.ptr[23u]))); ++ v_w[6u] = ((((uint32_t)(v_p.ptr[24u])) << 24u) | ++ (((uint32_t)(v_p.ptr[25u])) << 16u) | ++ (((uint32_t)(v_p.ptr[26u])) << 8u) | ++ ((uint32_t)(v_p.ptr[27u]))); ++ v_w[7u] = ((((uint32_t)(v_p.ptr[28u])) << 24u) | ++ (((uint32_t)(v_p.ptr[29u])) << 16u) | ++ (((uint32_t)(v_p.ptr[30u])) << 8u) | ++ ((uint32_t)(v_p.ptr[31u]))); ++ v_w[8u] = ((((uint32_t)(v_p.ptr[32u])) << 24u) | ++ (((uint32_t)(v_p.ptr[33u])) << 16u) | ++ (((uint32_t)(v_p.ptr[34u])) << 8u) | ++ ((uint32_t)(v_p.ptr[35u]))); ++ v_w[9u] = ((((uint32_t)(v_p.ptr[36u])) << 24u) | ++ (((uint32_t)(v_p.ptr[37u])) << 16u) | ++ (((uint32_t)(v_p.ptr[38u])) << 8u) | ++ ((uint32_t)(v_p.ptr[39u]))); ++ v_w[10u] = ((((uint32_t)(v_p.ptr[40u])) << 24u) | ++ (((uint32_t)(v_p.ptr[41u])) << 16u) | ++ (((uint32_t)(v_p.ptr[42u])) << 8u) | ++ ((uint32_t)(v_p.ptr[43u]))); ++ v_w[11u] = ((((uint32_t)(v_p.ptr[44u])) << 24u) | ++ (((uint32_t)(v_p.ptr[45u])) << 16u) | ++ (((uint32_t)(v_p.ptr[46u])) << 8u) | ++ ((uint32_t)(v_p.ptr[47u]))); ++ v_w[12u] = ((((uint32_t)(v_p.ptr[48u])) << 24u) | ++ (((uint32_t)(v_p.ptr[49u])) << 16u) | ++ (((uint32_t)(v_p.ptr[50u])) << 8u) | ++ ((uint32_t)(v_p.ptr[51u]))); ++ v_w[13u] = ((((uint32_t)(v_p.ptr[52u])) << 24u) | ++ (((uint32_t)(v_p.ptr[53u])) << 16u) | ++ (((uint32_t)(v_p.ptr[54u])) << 8u) | ++ ((uint32_t)(v_p.ptr[55u]))); ++ v_w[14u] = ((((uint32_t)(v_p.ptr[56u])) << 24u) | ++ (((uint32_t)(v_p.ptr[57u])) << 16u) | ++ (((uint32_t)(v_p.ptr[58u])) << 8u) | ++ ((uint32_t)(v_p.ptr[59u]))); ++ v_w[15u] = ((((uint32_t)(v_p.ptr[60u])) << 24u) | ++ (((uint32_t)(v_p.ptr[61u])) << 16u) | ++ (((uint32_t)(v_p.ptr[62u])) << 8u) | ++ ((uint32_t)(v_p.ptr[63u]))); ++ v_i = 16u; ++ while (v_i < 64u) { ++ v_w2 = v_w[(v_i - 2u)]; ++ v_s1 = ((v_w2 >> 10u) ^ (((uint32_t)(v_w2 << 15u)) | (v_w2 >> 17u)) ^ (((uint32_t)(v_w2 << 13u)) | (v_w2 >> 19u))); ++ v_w15 = v_w[(v_i - 15u)]; ++ v_s0 = ((v_w15 >> 3u) ^ (((uint32_t)(v_w15 << 25u)) | (v_w15 >> 7u)) ^ (((uint32_t)(v_w15 << 14u)) | (v_w15 >> 18u))); ++ v_w[v_i] = ((uint32_t)(((uint32_t)(((uint32_t)(v_s1 + v_w[(v_i - 7u)])) + v_s0)) + v_w[(v_i - 16u)])); ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 64u) { ++ v_t1 = v_h; ++ v_t1 += ((((uint32_t)(v_e << 26u)) | (v_e >> 6u)) ^ (((uint32_t)(v_e << 21u)) | (v_e >> 11u)) ^ (((uint32_t)(v_e << 7u)) | (v_e >> 25u))); ++ v_t1 += ((v_e & v_f) ^ ((4294967295u ^ v_e) & v_g)); ++ v_t1 += WUFFS_SHA256__K[v_i]; ++ v_t1 += v_w[v_i]; ++ v_t2 = ((((uint32_t)(v_a << 30u)) | (v_a >> 2u)) ^ (((uint32_t)(v_a << 19u)) | (v_a >> 13u)) ^ (((uint32_t)(v_a << 10u)) | (v_a >> 22u))); ++ v_t2 += ((v_a & v_b) ^ (v_a & v_c) ^ (v_b & v_c)); ++ v_h = v_g; ++ v_g = v_f; ++ v_f = v_e; ++ v_e = ((uint32_t)(v_d + v_t1)); ++ v_d = v_c; ++ v_c = v_b; ++ v_b = v_a; ++ v_a = ((uint32_t)(v_t1 + v_t2)); ++ v_i += 1u; ++ } ++ v_a += self->private_impl.f_h0; ++ self->private_impl.f_h0 = v_a; ++ v_b += self->private_impl.f_h1; ++ self->private_impl.f_h1 = v_b; ++ v_c += self->private_impl.f_h2; ++ self->private_impl.f_h2 = v_c; ++ v_d += self->private_impl.f_h3; ++ self->private_impl.f_h3 = v_d; ++ v_e += self->private_impl.f_h4; ++ self->private_impl.f_h4 = v_e; ++ v_f += self->private_impl.f_h5; ++ self->private_impl.f_h5 = v_f; ++ v_g += self->private_impl.f_h6; ++ self->private_impl.f_h6 = v_g; ++ v_h += self->private_impl.f_h7; ++ self->private_impl.f_h7 = v_h; ++ v_p.ptr += 64; ++ } ++ v_p.len = 1; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end1_p) { ++ self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u]; ++ v_buf_len = ((v_buf_len + 1u) & 63u); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; + } ++ self->private_impl.f_buf_len = ((uint32_t)((((uint64_t)(a_x.len)) & 63u))); + return wuffs_base__make_empty_struct(); + } + +-// -------- func png.decoder.decode_other_chunk ++// -------- func sha256.hasher.checksum_bitvec256 + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_other_chunk( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src, +- bool a_framy) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_sha256__hasher__checksum_bitvec256( ++ const wuffs_sha256__hasher* self) { ++ if (!self) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_other_chunk[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ uint32_t v_buf_len = 0; ++ uint8_t v_buf_data[64] = {0}; ++ uint64_t v_length_in_bits = 0; ++ uint32_t v_w[64] = {0}; ++ uint32_t v_w2 = 0; ++ uint32_t v_w15 = 0; ++ uint32_t v_s0 = 0; ++ uint32_t v_s1 = 0; ++ uint32_t v_t1 = 0; ++ uint32_t v_t2 = 0; ++ uint32_t v_h0 = 0; ++ uint32_t v_h1 = 0; ++ uint32_t v_h2 = 0; ++ uint32_t v_h3 = 0; ++ uint32_t v_h4 = 0; ++ uint32_t v_h5 = 0; ++ uint32_t v_h6 = 0; ++ uint32_t v_h7 = 0; ++ uint32_t v_a = 0; ++ uint32_t v_b = 0; ++ uint32_t v_c = 0; ++ uint32_t v_d = 0; ++ uint32_t v_e = 0; ++ uint32_t v_f = 0; ++ uint32_t v_g = 0; ++ uint32_t v_h = 0; ++ uint32_t v_i = 0; ++ bool v_final_block = false; + +- if ((self->private_impl.f_chunk_type == 1163152464u) && ! a_framy) { +- if (self->private_impl.f_seen_plte) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } else if (self->private_impl.f_color_type == 3u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_png__decoder__decode_plte(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else if ((self->private_impl.f_color_type == 2u) || (self->private_impl.f_color_type == 6u)) { +- } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_seen_plte = true; +- } else if ((self->private_impl.f_chunk_type & 32u) == 0u) { +- if (self->private_impl.f_chunk_type != 1413563465u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } ++ v_i = 0u; ++ while (v_i < 64u) { ++ v_buf_data[v_i] = self->private_impl.f_buf_data[v_i]; ++ v_i += 1u; ++ } ++ v_buf_len = (self->private_impl.f_buf_len & 63u); ++ if (v_buf_len < 56u) { ++ v_buf_data[v_buf_len] = 128u; ++ v_buf_len += 1u; ++ while (v_buf_len < 56u) { ++ v_buf_data[v_buf_len] = 0u; ++ v_buf_len += 1u; + } +- if (self->private_impl.f_chunk_type == 1716082789u) { +- if (self->private_impl.f_report_metadata_exif) { +- if (self->private_impl.f_seen_exif) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_png__decoder__decode_exif(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_exif = true; +- } +- } else if ((self->private_impl.f_chunk_type == 1951945833u) || (self->private_impl.f_chunk_type == 1951942004u) || (self->private_impl.f_chunk_type == 1951945850u)) { +- if (self->private_impl.f_report_metadata_kvp) { +- self->private_impl.f_metadata_flavor = 4u; +- self->private_impl.f_metadata_fourcc = 1263947851u; +- self->private_impl.f_metadata_x = 0u; +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; +- } +- } else if ( ! a_framy) { +- if (self->private_impl.f_chunk_type == 1280598881u) { +- if (self->private_impl.f_seen_actl) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_png__decoder__decode_actl(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_actl = true; +- } else if (self->private_impl.f_chunk_type == 1297238115u) { +- if (self->private_impl.f_report_metadata_chrm) { +- if (self->private_impl.f_seen_chrm) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- status = wuffs_png__decoder__decode_chrm(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_chrm = true; +- } +- } else if (self->private_impl.f_chunk_type == 1280598886u) { +- if (self->private_impl.f_seen_fctl) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- status = wuffs_png__decoder__decode_fctl(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_fctl = true; +- } else if (self->private_impl.f_chunk_type == 1095582055u) { +- if (self->private_impl.f_report_metadata_gama) { +- if (self->private_impl.f_seen_gama) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- status = wuffs_png__decoder__decode_gama(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_gama = true; +- } +- } else if (self->private_impl.f_chunk_type == 1346585449u) { +- if (self->private_impl.f_report_metadata_iccp) { +- if (self->private_impl.f_seen_iccp) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- status = wuffs_png__decoder__decode_iccp(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_iccp = true; +- } +- } else if (self->private_impl.f_chunk_type == 1111970419u) { +- if (self->private_impl.f_report_metadata_srgb) { +- if (self->private_impl.f_seen_srgb) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- status = wuffs_png__decoder__decode_srgb(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_srgb = true; +- } +- } else if (self->private_impl.f_chunk_type == 1397641844u) { +- if (self->private_impl.f_seen_trns || (self->private_impl.f_color_type > 3u) || ((self->private_impl.f_color_type == 3u) && ! self->private_impl.f_seen_plte)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_png__decoder__decode_trns(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_trns = true; +- } ++ v_final_block = true; ++ } else { ++ v_buf_data[v_buf_len] = 128u; ++ v_buf_len += 1u; ++ while (v_buf_len < 64u) { ++ v_buf_data[v_buf_len] = 0u; ++ v_buf_len += 1u; ++ } ++ } ++ v_h0 = self->private_impl.f_h0; ++ v_a = v_h0; ++ v_h1 = self->private_impl.f_h1; ++ v_b = v_h1; ++ v_h2 = self->private_impl.f_h2; ++ v_c = v_h2; ++ v_h3 = self->private_impl.f_h3; ++ v_d = v_h3; ++ v_h4 = self->private_impl.f_h4; ++ v_e = v_h4; ++ v_h5 = self->private_impl.f_h5; ++ v_f = v_h5; ++ v_h6 = self->private_impl.f_h6; ++ v_g = v_h6; ++ v_h7 = self->private_impl.f_h7; ++ v_h = v_h7; ++ while (true) { ++ if (v_final_block) { ++ v_length_in_bits = ((uint64_t)(self->private_impl.f_length_modulo_u64 * 8u)); ++ v_buf_data[56u] = ((uint8_t)((v_length_in_bits >> 56u))); ++ v_buf_data[57u] = ((uint8_t)((v_length_in_bits >> 48u))); ++ v_buf_data[58u] = ((uint8_t)((v_length_in_bits >> 40u))); ++ v_buf_data[59u] = ((uint8_t)((v_length_in_bits >> 32u))); ++ v_buf_data[60u] = ((uint8_t)((v_length_in_bits >> 24u))); ++ v_buf_data[61u] = ((uint8_t)((v_length_in_bits >> 16u))); ++ v_buf_data[62u] = ((uint8_t)((v_length_in_bits >> 8u))); ++ v_buf_data[63u] = ((uint8_t)(v_length_in_bits)); ++ } ++ v_w[0u] = ((((uint32_t)(v_buf_data[0u])) << 24u) | ++ (((uint32_t)(v_buf_data[1u])) << 16u) | ++ (((uint32_t)(v_buf_data[2u])) << 8u) | ++ ((uint32_t)(v_buf_data[3u]))); ++ v_w[1u] = ((((uint32_t)(v_buf_data[4u])) << 24u) | ++ (((uint32_t)(v_buf_data[5u])) << 16u) | ++ (((uint32_t)(v_buf_data[6u])) << 8u) | ++ ((uint32_t)(v_buf_data[7u]))); ++ v_w[2u] = ((((uint32_t)(v_buf_data[8u])) << 24u) | ++ (((uint32_t)(v_buf_data[9u])) << 16u) | ++ (((uint32_t)(v_buf_data[10u])) << 8u) | ++ ((uint32_t)(v_buf_data[11u]))); ++ v_w[3u] = ((((uint32_t)(v_buf_data[12u])) << 24u) | ++ (((uint32_t)(v_buf_data[13u])) << 16u) | ++ (((uint32_t)(v_buf_data[14u])) << 8u) | ++ ((uint32_t)(v_buf_data[15u]))); ++ v_w[4u] = ((((uint32_t)(v_buf_data[16u])) << 24u) | ++ (((uint32_t)(v_buf_data[17u])) << 16u) | ++ (((uint32_t)(v_buf_data[18u])) << 8u) | ++ ((uint32_t)(v_buf_data[19u]))); ++ v_w[5u] = ((((uint32_t)(v_buf_data[20u])) << 24u) | ++ (((uint32_t)(v_buf_data[21u])) << 16u) | ++ (((uint32_t)(v_buf_data[22u])) << 8u) | ++ ((uint32_t)(v_buf_data[23u]))); ++ v_w[6u] = ((((uint32_t)(v_buf_data[24u])) << 24u) | ++ (((uint32_t)(v_buf_data[25u])) << 16u) | ++ (((uint32_t)(v_buf_data[26u])) << 8u) | ++ ((uint32_t)(v_buf_data[27u]))); ++ v_w[7u] = ((((uint32_t)(v_buf_data[28u])) << 24u) | ++ (((uint32_t)(v_buf_data[29u])) << 16u) | ++ (((uint32_t)(v_buf_data[30u])) << 8u) | ++ ((uint32_t)(v_buf_data[31u]))); ++ v_w[8u] = ((((uint32_t)(v_buf_data[32u])) << 24u) | ++ (((uint32_t)(v_buf_data[33u])) << 16u) | ++ (((uint32_t)(v_buf_data[34u])) << 8u) | ++ ((uint32_t)(v_buf_data[35u]))); ++ v_w[9u] = ((((uint32_t)(v_buf_data[36u])) << 24u) | ++ (((uint32_t)(v_buf_data[37u])) << 16u) | ++ (((uint32_t)(v_buf_data[38u])) << 8u) | ++ ((uint32_t)(v_buf_data[39u]))); ++ v_w[10u] = ((((uint32_t)(v_buf_data[40u])) << 24u) | ++ (((uint32_t)(v_buf_data[41u])) << 16u) | ++ (((uint32_t)(v_buf_data[42u])) << 8u) | ++ ((uint32_t)(v_buf_data[43u]))); ++ v_w[11u] = ((((uint32_t)(v_buf_data[44u])) << 24u) | ++ (((uint32_t)(v_buf_data[45u])) << 16u) | ++ (((uint32_t)(v_buf_data[46u])) << 8u) | ++ ((uint32_t)(v_buf_data[47u]))); ++ v_w[12u] = ((((uint32_t)(v_buf_data[48u])) << 24u) | ++ (((uint32_t)(v_buf_data[49u])) << 16u) | ++ (((uint32_t)(v_buf_data[50u])) << 8u) | ++ ((uint32_t)(v_buf_data[51u]))); ++ v_w[13u] = ((((uint32_t)(v_buf_data[52u])) << 24u) | ++ (((uint32_t)(v_buf_data[53u])) << 16u) | ++ (((uint32_t)(v_buf_data[54u])) << 8u) | ++ ((uint32_t)(v_buf_data[55u]))); ++ v_w[14u] = ((((uint32_t)(v_buf_data[56u])) << 24u) | ++ (((uint32_t)(v_buf_data[57u])) << 16u) | ++ (((uint32_t)(v_buf_data[58u])) << 8u) | ++ ((uint32_t)(v_buf_data[59u]))); ++ v_w[15u] = ((((uint32_t)(v_buf_data[60u])) << 24u) | ++ (((uint32_t)(v_buf_data[61u])) << 16u) | ++ (((uint32_t)(v_buf_data[62u])) << 8u) | ++ ((uint32_t)(v_buf_data[63u]))); ++ v_i = 16u; ++ while (v_i < 64u) { ++ v_w2 = v_w[(v_i - 2u)]; ++ v_s1 = ((v_w2 >> 10u) ^ (((uint32_t)(v_w2 << 15u)) | (v_w2 >> 17u)) ^ (((uint32_t)(v_w2 << 13u)) | (v_w2 >> 19u))); ++ v_w15 = v_w[(v_i - 15u)]; ++ v_s0 = ((v_w15 >> 3u) ^ (((uint32_t)(v_w15 << 25u)) | (v_w15 >> 7u)) ^ (((uint32_t)(v_w15 << 14u)) | (v_w15 >> 18u))); ++ v_w[v_i] = ((uint32_t)(((uint32_t)(((uint32_t)(v_s1 + v_w[(v_i - 7u)])) + v_s0)) + v_w[(v_i - 16u)])); ++ v_i += 1u; + } +- if (self->private_impl.f_metadata_fourcc == 0u) { +- self->private_data.s_decode_other_chunk[0].scratch = self->private_impl.f_chunk_length; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (self->private_data.s_decode_other_chunk[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_other_chunk[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_other_chunk[0].scratch; ++ v_i = 0u; ++ while (v_i < 64u) { ++ v_t1 = v_h; ++ v_t1 += ((((uint32_t)(v_e << 26u)) | (v_e >> 6u)) ^ (((uint32_t)(v_e << 21u)) | (v_e >> 11u)) ^ (((uint32_t)(v_e << 7u)) | (v_e >> 25u))); ++ v_t1 += ((v_e & v_f) ^ ((4294967295u ^ v_e) & v_g)); ++ v_t1 += WUFFS_SHA256__K[v_i]; ++ v_t1 += v_w[v_i]; ++ v_t2 = ((((uint32_t)(v_a << 30u)) | (v_a >> 2u)) ^ (((uint32_t)(v_a << 19u)) | (v_a >> 13u)) ^ (((uint32_t)(v_a << 10u)) | (v_a >> 22u))); ++ v_t2 += ((v_a & v_b) ^ (v_a & v_c) ^ (v_b & v_c)); ++ v_h = v_g; ++ v_g = v_f; ++ v_f = v_e; ++ v_e = ((uint32_t)(v_d + v_t1)); ++ v_d = v_c; ++ v_c = v_b; ++ v_b = v_a; ++ v_a = ((uint32_t)(v_t1 + v_t2)); ++ v_i += 1u; ++ } ++ v_a += v_h0; ++ v_b += v_h1; ++ v_c += v_h2; ++ v_d += v_h3; ++ v_e += v_h4; ++ v_f += v_h5; ++ v_g += v_h6; ++ v_h += v_h7; ++ if (v_final_block) { ++ break; ++ } ++ v_final_block = true; ++ v_h0 = v_a; ++ v_h1 = v_b; ++ v_h2 = v_c; ++ v_h3 = v_d; ++ v_h4 = v_e; ++ v_h5 = v_f; ++ v_h6 = v_g; ++ v_h7 = v_h; ++ v_buf_len = 0u; ++ while (v_buf_len < 56u) { ++ v_buf_data[v_buf_len] = 0u; ++ v_buf_len += 1u; + } +- +- goto ok; +- ok: +- self->private_impl.p_decode_other_chunk[0] = 0; +- goto exit; + } ++ return wuffs_base__utility__make_bitvec256( ++ (((uint64_t)(v_h)) | (((uint64_t)(v_g)) << 32u)), ++ (((uint64_t)(v_f)) | (((uint64_t)(v_e)) << 32u)), ++ (((uint64_t)(v_d)) | (((uint64_t)(v_c)) << 32u)), ++ (((uint64_t)(v_b)) | (((uint64_t)(v_a)) << 32u))); ++} + +- goto suspend; +- suspend: +- self->private_impl.p_decode_other_chunk[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) + +- return status; +-} ++// ---------------- Status Codes Implementations + +-// -------- func png.decoder.decode_actl ++const char wuffs_tga__error__bad_header[] = "#tga: bad header"; ++const char wuffs_tga__error__bad_run_length_encoding[] = "#tga: bad run length encoding"; ++const char wuffs_tga__error__truncated_input[] = "#tga: truncated input"; ++const char wuffs_tga__error__unsupported_tga_file[] = "#tga: unsupported TGA file"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__decode_actl( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++wuffs_tga__decoder__do_decode_image_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_tga__decoder__do_decode_frame_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_tga__decoder__do_decode_frame( ++ wuffs_tga__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_tga__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_tga__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_tga__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_tga__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_tga__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_tga__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_tga__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_tga__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_tga__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_tga__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_tga__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_tga__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_tga__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_tga__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_tga__decoder__initialize( ++ wuffs_tga__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_tga__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_tga__decoder* ++wuffs_tga__decoder__alloc(void) { ++ wuffs_tga__decoder* x = ++ (wuffs_tga__decoder*)(calloc(1, sizeof(wuffs_tga__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_tga__decoder__initialize( ++ x, sizeof(wuffs_tga__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; + } ++ return x; ++} + +- uint32_t coro_susp_point = self->private_impl.p_decode_actl[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++size_t ++sizeof__wuffs_tga__decoder(void) { ++ return sizeof(wuffs_tga__decoder); ++} + +- if (self->private_impl.f_chunk_length != 8u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } else if (self->private_impl.f_interlace_pass > 0u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); +- goto exit; +- } +- self->private_impl.f_chunk_length = 0u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_actl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_actl[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- self->private_impl.f_num_animation_frames_value = t_0; +- } +- if (self->private_impl.f_num_animation_frames_value == 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_actl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_actl[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } +- } +- self->private_impl.f_num_animation_loops_value = t_1; +- } ++// ---------------- Function Implementations + +- goto ok; +- ok: +- self->private_impl.p_decode_actl[0] = 0; +- goto exit; ++// -------- func tga.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_tga__decoder__get_quirk( ++ const wuffs_tga__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_actl[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ return 0u; ++} + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++// -------- func tga.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__set_quirk( ++ wuffs_tga__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- return status; ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func png.decoder.decode_chrm ++// -------- func tga.decoder.decode_image_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_chrm( +- wuffs_png__decoder* self, ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_image_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint64_t v_u = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_chrm[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_chunk_length != 32u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length = 0u; +- self->private_impl.f_metadata_flavor = 5u; +- self->private_impl.f_metadata_fourcc = 1128813133u; +- self->private_impl.f_metadata_x = 0u; +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint64_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- v_u = t_0; +- } +- self->private_impl.f_metadata_x |= ((16777215u & v_u) << 0u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint64_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 24) { +- t_1 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } +- } +- v_u = t_1; +- } +- self->private_impl.f_metadata_x |= ((16777215u & v_u) << 24u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- uint64_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); +- if (num_bits_2 == 24) { +- t_2 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)); +- } +- } +- v_u = t_2; +- } +- self->private_impl.f_metadata_x |= ((uint64_t)((16777215u & v_u) << 48u)); +- self->private_impl.f_metadata_y |= ((16777215u & v_u) >> 16u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- uint64_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); +- if (num_bits_3 == 24) { +- t_3 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)); +- } +- } +- v_u = t_3; +- } +- self->private_impl.f_metadata_y |= ((16777215u & v_u) << 8u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- uint64_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_4 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); +- if (num_bits_4 == 24) { +- t_4 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)); +- } +- } +- v_u = t_4; +- } +- self->private_impl.f_metadata_y |= ((16777215u & v_u) << 32u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- uint64_t t_5; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_5 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); +- if (num_bits_5 == 24) { +- t_5 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_5 += 8u; +- *scratch |= ((uint64_t)(num_bits_5)); +- } +- } +- v_u = t_5; +- } +- self->private_impl.f_metadata_y |= ((uint64_t)((16777215u & v_u) << 56u)); +- self->private_impl.f_metadata_z |= ((16777215u & v_u) >> 8u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); +- uint64_t t_6; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_6 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); +- if (num_bits_6 == 24) { +- t_6 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_6 += 8u; +- *scratch |= ((uint64_t)(num_bits_6)); +- } ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; + } +- v_u = t_6; +- } +- self->private_impl.f_metadata_z |= ((16777215u & v_u) << 16u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); +- uint64_t t_7; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_7 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_7 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_7); +- if (num_bits_7 == 24) { +- t_7 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_7 += 8u; +- *scratch |= ((uint64_t)(num_bits_7)); +- } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ goto exit; + } +- v_u = t_7; ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- self->private_impl.f_metadata_z |= ((16777215u & v_u) << 40u); + +- goto ok; + ok: +- self->private_impl.p_decode_chrm[0] = 0; ++ self->private_impl.p_decode_image_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_chrm[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func png.decoder.decode_exif +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_exif( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- if (self->private_impl.f_chunk_length < 4u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_metadata_flavor = 3u; +- self->private_impl.f_metadata_fourcc = 1163413830u; +- self->private_impl.f_metadata_x = 0u; +- self->private_impl.f_metadata_y = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- self->private_impl.f_metadata_z = wuffs_base__u64__sat_add(self->private_impl.f_metadata_y, ((uint64_t)(self->private_impl.f_chunk_length))); +- self->private_impl.f_chunk_length = 0u; ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + +- goto ok; +- ok: + goto exit; + exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- + return status; + } + +-// -------- func png.decoder.decode_fctl ++// -------- func tga.decoder.do_decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__decode_fctl( +- wuffs_png__decoder* self, ++wuffs_tga__decoder__do_decode_image_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_x0 = 0; +- uint32_t v_y0 = 0; +- uint32_t v_x1 = 0; +- uint32_t v_y1 = 0; ++ uint32_t v_c32 = 0; ++ uint32_t v_c5 = 0; ++ uint32_t v_i = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -55899,309 +69341,577 @@ wuffs_png__decoder__decode_fctl( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_fctl[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; + if (coro_susp_point) { +- v_x0 = self->private_data.s_decode_fctl[0].v_x0; +- v_x1 = self->private_data.s_decode_fctl[0].v_x1; +- v_y1 = self->private_data.s_decode_fctl[0].v_y1; ++ v_i = self->private_data.s_do_decode_image_config.v_i; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_chunk_length != 26u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } +- self->private_impl.f_chunk_length = 0u; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_x0 = t_0; ++ uint8_t t_0 = *iop_a_src++; ++ self->private_impl.f_header_id_length = t_0; + } +- if (v_x0 != self->private_impl.f_next_animation_seq_num) { +- status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); +- goto exit; +- } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ self->private_impl.f_header_color_map_type = t_1; ++ } ++ if (self->private_impl.f_header_color_map_type > 1u) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_header); + goto exit; + } +- self->private_impl.f_next_animation_seq_num += 1u; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_x1 = t_1; ++ uint8_t t_2 = *iop_a_src++; ++ self->private_impl.f_header_image_type = t_2; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); +- if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)); +- } +- } +- v_y1 = t_2; ++ if ((self->private_impl.f_header_image_type == 1u) || ++ (self->private_impl.f_header_image_type == 2u) || ++ (self->private_impl.f_header_image_type == 3u) || ++ (self->private_impl.f_header_image_type == 9u) || ++ (self->private_impl.f_header_image_type == 10u) || ++ (self->private_impl.f_header_image_type == 11u)) { ++ } else { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_header); ++ goto exit; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint16_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_3 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ iop_a_src += 2; + } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch >> 32)); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 8) { ++ t_3 = ((uint16_t)(*scratch)); + break; + } + num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)); ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; + } + } +- v_x0 = t_3; ++ self->private_impl.f_header_color_map_first_entry_index = t_3; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_4 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint16_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ iop_a_src += 2; + } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); +- if (num_bits_4 == 24) { +- t_4 = ((uint32_t)(*scratch >> 32)); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 8) { ++ t_4 = ((uint16_t)(*scratch)); + break; + } + num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)); ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; + } + } +- v_y0 = t_4; ++ self->private_impl.f_header_color_map_length = t_4; + } +- v_x1 += v_x0; +- v_y1 += v_y0; +- if ((v_x0 >= v_x1) || +- (v_x0 > self->private_impl.f_width) || +- (v_x1 > self->private_impl.f_width) || +- (v_y0 >= v_y1) || +- (v_y0 > self->private_impl.f_height) || +- (v_y1 > self->private_impl.f_height)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ self->private_impl.f_header_color_map_entry_size = t_5; + } +- self->private_impl.f_frame_rect_x0 = v_x0; +- self->private_impl.f_frame_rect_y0 = v_y0; +- self->private_impl.f_frame_rect_x1 = v_x1; +- self->private_impl.f_frame_rect_y1 = v_y1; ++ if (self->private_impl.f_header_color_map_type != 0u) { ++ if ((self->private_impl.f_header_color_map_first_entry_index != 0u) || (self->private_impl.f_header_color_map_length > 256u)) { ++ status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); ++ goto exit; ++ } else if ((self->private_impl.f_header_color_map_entry_size != 15u) && ++ (self->private_impl.f_header_color_map_entry_size != 16u) && ++ (self->private_impl.f_header_color_map_entry_size != 24u) && ++ (self->private_impl.f_header_color_map_entry_size != 32u)) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_header); ++ goto exit; ++ } ++ } else { ++ if ((self->private_impl.f_header_color_map_first_entry_index != 0u) || (self->private_impl.f_header_color_map_length != 0u) || (self->private_impl.f_header_color_map_entry_size != 0u)) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_header); ++ goto exit; ++ } ++ } ++ self->private_data.s_do_decode_image_config.scratch = 4u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- uint32_t t_5; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ uint32_t t_6; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); +- if (num_bits_5 == 8) { +- t_5 = ((uint32_t)(*scratch >> 48)); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6; ++ if (num_bits_6 == 8) { ++ t_6 = ((uint32_t)(*scratch)); + break; + } +- num_bits_5 += 8u; +- *scratch |= ((uint64_t)(num_bits_5)); ++ num_bits_6 += 8u; ++ *scratch |= ((uint64_t)(num_bits_6)) << 56; + } + } +- v_x0 = t_5; ++ self->private_impl.f_width = t_6; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); +- uint32_t t_6; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ uint32_t t_7; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_6 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ t_7 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); +- if (num_bits_6 == 8) { +- t_6 = ((uint32_t)(*scratch >> 48)); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; ++ if (num_bits_7 == 8) { ++ t_7 = ((uint32_t)(*scratch)); + break; + } +- num_bits_6 += 8u; +- *scratch |= ((uint64_t)(num_bits_6)); ++ num_bits_7 += 8u; ++ *scratch |= ((uint64_t)(num_bits_7)) << 56; + } + } +- v_x1 = t_6; +- } +- if (v_x1 <= 0u) { +- self->private_impl.f_frame_duration = (((uint64_t)(v_x0)) * 7056000u); +- } else { +- self->private_impl.f_frame_duration = ((((uint64_t)(v_x0)) * 705600000u) / ((uint64_t)(v_x1))); ++ self->private_impl.f_height = t_7; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_7 = *iop_a_src++; +- v_x0 = t_7; ++ uint8_t t_8 = *iop_a_src++; ++ self->private_impl.f_header_pixel_depth = t_8; + } +- if (v_x0 == 0u) { +- self->private_impl.f_frame_disposal = 0u; +- } else if (v_x0 == 1u) { +- self->private_impl.f_frame_disposal = 1u; +- } else if (v_x0 == 2u) { +- self->private_impl.f_frame_disposal = 2u; +- } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ if ((self->private_impl.f_header_pixel_depth != 1u) && ++ (self->private_impl.f_header_pixel_depth != 8u) && ++ (self->private_impl.f_header_pixel_depth != 15u) && ++ (self->private_impl.f_header_pixel_depth != 16u) && ++ (self->private_impl.f_header_pixel_depth != 24u) && ++ (self->private_impl.f_header_pixel_depth != 32u)) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_header); + goto exit; + } ++ if (((uint8_t)(self->private_impl.f_header_image_type | 8u)) == 9u) { ++ self->private_impl.f_scratch_bytes_per_pixel = 1u; ++ self->private_impl.f_src_bytes_per_pixel = 1u; ++ self->private_impl.f_src_pixfmt = 2164523016u; ++ self->private_impl.f_opaque = ((self->private_impl.f_header_color_map_entry_size == 15u) || (self->private_impl.f_header_color_map_entry_size == 24u)); ++ } else if (((uint8_t)(self->private_impl.f_header_image_type | 8u)) == 10u) { ++ if ((self->private_impl.f_header_pixel_depth == 15u) || (self->private_impl.f_header_pixel_depth == 16u)) { ++ self->private_impl.f_scratch_bytes_per_pixel = 4u; ++ self->private_impl.f_src_bytes_per_pixel = 0u; ++ self->private_impl.f_src_pixfmt = 2164295816u; ++ } else if (self->private_impl.f_header_pixel_depth == 24u) { ++ self->private_impl.f_scratch_bytes_per_pixel = 3u; ++ self->private_impl.f_src_bytes_per_pixel = 3u; ++ self->private_impl.f_src_pixfmt = 2147485832u; ++ self->private_impl.f_opaque = true; ++ } else if (self->private_impl.f_header_pixel_depth == 32u) { ++ self->private_impl.f_scratch_bytes_per_pixel = 4u; ++ self->private_impl.f_src_bytes_per_pixel = 4u; ++ self->private_impl.f_src_pixfmt = 2164295816u; ++ } else { ++ status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); ++ goto exit; ++ } ++ } else { ++ if (self->private_impl.f_header_pixel_depth == 8u) { ++ self->private_impl.f_scratch_bytes_per_pixel = 1u; ++ self->private_impl.f_src_bytes_per_pixel = 1u; ++ self->private_impl.f_src_pixfmt = 536870920u; ++ self->private_impl.f_opaque = true; ++ } else { ++ status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); ++ goto exit; ++ } ++ } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_8 = *iop_a_src++; +- v_x0 = t_8; +- } +- if (v_x0 == 0u) { +- self->private_impl.f_frame_overwrite_instead_of_blend = true; +- } else if (v_x0 == 1u) { +- self->private_impl.f_frame_overwrite_instead_of_blend = false; ++ uint8_t t_9 = *iop_a_src++; ++ self->private_impl.f_header_image_descriptor = t_9; ++ } ++ if (((uint8_t)(self->private_impl.f_header_image_descriptor & 16u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); ++ goto exit; ++ } ++ self->private_data.s_do_decode_image_config.scratch = ((uint32_t)(self->private_impl.f_header_id_length)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ if (self->private_impl.f_header_color_map_type != 0u) { ++ while (v_i < ((uint32_t)(self->private_impl.f_header_color_map_length))) { ++ if (self->private_impl.f_header_color_map_entry_size == 24u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); ++ uint32_t t_10; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { ++ t_10 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); ++ iop_a_src += 3; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10; ++ if (num_bits_10 == 16) { ++ t_10 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_10 += 8u; ++ *scratch |= ((uint64_t)(num_bits_10)) << 56; ++ } ++ } ++ v_c32 = t_10; ++ } ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c32 >> 0u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c32 >> 8u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c32 >> 16u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u; ++ } else if (self->private_impl.f_header_color_map_entry_size == 32u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); ++ uint32_t t_11; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11; ++ if (num_bits_11 == 24) { ++ t_11 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_11 += 8u; ++ *scratch |= ((uint64_t)(num_bits_11)) << 56; ++ } ++ } ++ v_c32 = t_11; ++ } ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c32 >> 0u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c32 >> 8u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c32 >> 16u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = ((uint8_t)((v_c32 >> 24u))); ++ } else { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); ++ uint32_t t_12; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_12 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12; ++ if (num_bits_12 == 8) { ++ t_12 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_12 += 8u; ++ *scratch |= ((uint64_t)(num_bits_12)) << 56; ++ } ++ } ++ v_c32 = t_12; ++ } ++ v_c5 = (31u & (v_c32 >> 0u)); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 5u)); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 10u)); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u; ++ } ++ v_i += 1u; ++ } ++ while (v_i < 256u) { ++ self->private_data.f_src_palette[((v_i * 4u) + 0u)] = 0u; ++ self->private_data.f_src_palette[((v_i * 4u) + 1u)] = 0u; ++ self->private_data.f_src_palette[((v_i * 4u) + 2u)] = 0u; ++ self->private_data.f_src_palette[((v_i * 4u) + 3u)] = 255u; ++ v_i += 1u; ++ } ++ } ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_src_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ self->private_impl.f_opaque); ++ } ++ self->private_impl.f_call_sequence = 32u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_image_config.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func tga.decoder.decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_frame_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func tga.decoder.do_decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_tga__decoder__do_decode_frame_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_tga__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } +- if (self->private_impl.f_num_decoded_frame_configs_value == 0u) { +- self->private_impl.f_first_rect_x0 = self->private_impl.f_frame_rect_x0; +- self->private_impl.f_first_rect_y0 = self->private_impl.f_frame_rect_y0; +- self->private_impl.f_first_rect_x1 = self->private_impl.f_frame_rect_x1; +- self->private_impl.f_first_rect_y1 = self->private_impl.f_frame_rect_y1; +- self->private_impl.f_first_duration = self->private_impl.f_frame_duration; +- self->private_impl.f_first_disposal = self->private_impl.f_frame_disposal; +- self->private_impl.f_first_overwrite_instead_of_blend = self->private_impl.f_frame_overwrite_instead_of_blend; ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ self->private_impl.f_frame_config_io_position, ++ 0u, ++ self->private_impl.f_opaque, ++ false, ++ 4278190080u); + } ++ self->private_impl.f_call_sequence = 64u; + +- goto ok; + ok: +- self->private_impl.p_decode_fctl[0] = 0; ++ self->private_impl.p_do_decode_frame_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_fctl[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_fctl[0].v_x0 = v_x0; +- self->private_data.s_decode_fctl[0].v_x1 = v_x1; +- self->private_data.s_decode_fctl[0].v_y1 = v_y1; ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -56212,15 +69922,114 @@ wuffs_png__decoder__decode_fctl( + return status; + } + +-// -------- func png.decoder.decode_gama ++// -------- func tga.decoder.decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_frame( ++ wuffs_tga__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func tga.decoder.do_decode_frame + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__decode_gama( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { ++wuffs_tga__decoder__do_decode_frame( ++ wuffs_tga__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { + wuffs_base__status status = wuffs_base__make_status(NULL); + ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint64_t v_dst_bytes_per_pixel = 0; ++ uint32_t v_dst_x = 0; ++ uint32_t v_dst_y = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_dst_start = 0; ++ wuffs_base__slice_u8 v_src_palette = {0}; ++ uint64_t v_mark = 0; ++ uint64_t v_num_pixels64 = 0; ++ uint32_t v_num_pixels32 = 0; ++ uint32_t v_lit_length = 0; ++ uint32_t v_run_length = 0; ++ uint64_t v_num_dst_bytes = 0; ++ uint32_t v_num_src_bytes = 0; ++ uint32_t v_c32 = 0; ++ uint32_t v_c5 = 0; ++ + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -56232,516 +70041,739 @@ wuffs_png__decoder__decode_gama( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_gama[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ if (coro_susp_point) { ++ v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel; ++ v_dst_x = self->private_data.s_do_decode_frame.v_dst_x; ++ v_dst_y = self->private_data.s_do_decode_frame.v_dst_y; ++ v_mark = self->private_data.s_do_decode_frame.v_mark; ++ v_num_pixels32 = self->private_data.s_do_decode_frame.v_num_pixels32; ++ v_lit_length = self->private_data.s_do_decode_frame.v_lit_length; ++ v_run_length = self->private_data.s_do_decode_frame.v_run_length; ++ v_num_dst_bytes = self->private_data.s_do_decode_frame.v_num_dst_bytes; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_chunk_length != 4u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_tga__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (self->private_impl.f_header_color_map_type != 0u) { ++ v_src_palette = wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024); ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), ++ v_src_palette, ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); + goto exit; + } +- self->private_impl.f_chunk_length = 0u; +- self->private_impl.f_metadata_flavor = 5u; +- self->private_impl.f_metadata_fourcc = 1195461953u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint64_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_gama[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_gama[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint64_t)(*scratch >> 32)); +- break; ++ v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); ++ if (((uint8_t)(self->private_impl.f_header_image_descriptor & 32u)) == 0u) { ++ v_dst_y = ((uint32_t)(self->private_impl.f_height - 1u)); ++ } ++ if (((uint8_t)(self->private_impl.f_header_image_type & 8u)) == 0u) { ++ v_lit_length = self->private_impl.f_width; ++ } ++ label__resume__continue:; ++ while (true) { ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); ++ while (v_dst_y < self->private_impl.f_height) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y); ++ v_dst_start = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel); ++ if (v_dst_start <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_start); ++ } else { ++ v_dst = wuffs_base__utility__empty_slice_u8(); ++ } ++ while (v_dst_x < self->private_impl.f_width) { ++ if (self->private_impl.f_src_bytes_per_pixel > 0u) { ++ if (v_lit_length > 0u) { ++ v_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ v_num_pixels64 = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(self->private_impl.f_src_bytes_per_pixel))); ++ v_num_pixels32 = ((uint32_t)(wuffs_base__u64__min(v_num_pixels64, ((uint64_t)(v_lit_length))))); ++ v_num_dst_bytes = (((uint64_t)(v_num_pixels32)) * v_dst_bytes_per_pixel); ++ v_num_src_bytes = (v_num_pixels32 * self->private_impl.f_src_bytes_per_pixel); ++ self->private_data.s_do_decode_frame.scratch = v_num_src_bytes; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame.scratch; ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ if (v_num_dst_bytes <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_num_dst_bytes); ++ } else { ++ v_dst = wuffs_base__utility__empty_slice_u8(); ++ } ++ v_dst_x += v_num_pixels32; ++ v_lit_length = (((uint32_t)(v_lit_length - v_num_pixels32)) & 65535u); ++ if (v_lit_length > 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ goto label__resume__continue; ++ } ++ } else if (v_run_length > 0u) { ++ v_run_length -= 1u; ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_scratch_bytes_per_pixel)); ++ if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); ++ } ++ v_dst_x += 1u; ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ goto label__resume__continue; ++ } ++ if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) { ++ v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u); ++ iop_a_src += 1u; ++ if ((v_lit_length + v_dst_x) > self->private_impl.f_width) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); ++ goto exit; ++ } ++ } else { ++ if (self->private_impl.f_src_bytes_per_pixel == 1u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ goto label__resume__continue; ++ } ++ v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ } else if (self->private_impl.f_src_bytes_per_pixel == 3u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ goto label__resume__continue; ++ } ++ v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ goto label__resume__continue; ++ } ++ v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[3u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ } ++ if ((v_run_length + v_dst_x) > self->private_impl.f_width) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); ++ goto exit; ++ } ++ } ++ } ++ } else { ++ if (v_lit_length > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ goto label__resume__continue; ++ } ++ v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2u; ++ v_c5 = (31u & (v_c32 >> 0u)); ++ self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 5u)); ++ self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 10u)); ++ self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ self->private_data.f_scratch[3u] = 255u; ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, 4)); ++ if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); ++ } ++ v_dst_x += 1u; ++ v_lit_length -= 1u; ++ } else if (v_run_length > 0u) { ++ v_run_length -= 1u; ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_scratch_bytes_per_pixel)); ++ if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); ++ } ++ v_dst_x += 1u; ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ goto label__resume__continue; ++ } ++ if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) { ++ v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u); ++ iop_a_src += 1u; ++ if ((v_lit_length + v_dst_x) > self->private_impl.f_width) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); ++ goto exit; ++ } ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ goto label__resume__continue; ++ } ++ v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); ++ iop_a_src += 1u; ++ v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2u; ++ v_c5 = (31u & (v_c32 >> 0u)); ++ self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 5u)); ++ self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 10u)); ++ self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ self->private_data.f_scratch[3u] = 255u; ++ if ((v_run_length + v_dst_x) > self->private_impl.f_width) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); ++ goto exit; ++ } ++ } ++ } + } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ v_dst_x = 0u; ++ if (((uint8_t)(self->private_impl.f_header_image_descriptor & 32u)) == 0u) { ++ v_dst_y -= 1u; ++ } else { ++ v_dst_y += 1u; ++ } ++ if (((uint8_t)(self->private_impl.f_header_image_type & 8u)) == 0u) { ++ v_lit_length = self->private_impl.f_width; + } + } +- self->private_impl.f_metadata_x = t_0; ++ break; + } +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel = v_dst_bytes_per_pixel; ++ self->private_data.s_do_decode_frame.v_dst_x = v_dst_x; ++ self->private_data.s_do_decode_frame.v_dst_y = v_dst_y; ++ self->private_data.s_do_decode_frame.v_mark = v_mark; ++ self->private_data.s_do_decode_frame.v_num_pixels32 = v_num_pixels32; ++ self->private_data.s_do_decode_frame.v_lit_length = v_lit_length; ++ self->private_data.s_do_decode_frame.v_run_length = v_run_length; ++ self->private_data.s_do_decode_frame.v_num_dst_bytes = v_num_dst_bytes; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func tga.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_tga__decoder__frame_dirty_rect( ++ const wuffs_tga__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); ++} ++ ++// -------- func tga.decoder.num_animation_loops ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_tga__decoder__num_animation_loops( ++ const wuffs_tga__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func tga.decoder.num_decoded_frame_configs ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_tga__decoder__num_decoded_frame_configs( ++ const wuffs_tga__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func tga.decoder.num_decoded_frames ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_tga__decoder__num_decoded_frames( ++ const wuffs_tga__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func tga.decoder.restart_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__restart_frame( ++ wuffs_tga__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if (a_index != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ self->private_impl.f_frame_config_io_position = a_io_position; ++ return wuffs_base__make_status(NULL); ++} + +- goto ok; +- ok: +- self->private_impl.p_decode_gama[0] = 0; +- goto exit; ++// -------- func tga.decoder.set_report_metadata ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_tga__decoder__set_report_metadata( ++ wuffs_tga__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func tga.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__tell_me_more( ++ wuffs_tga__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- goto suspend; +- suspend: +- self->private_impl.p_decode_gama[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; + ++ goto ok; ++ ok: + goto exit; + exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- + return status; + } + +-// -------- func png.decoder.decode_iccp ++// -------- func tga.decoder.workbuf_len + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_iccp( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_tga__decoder__workbuf_len( ++ const wuffs_tga__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_iccp[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} + +- while (true) { +- if (self->private_impl.f_chunk_length <= 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c == 0u) { +- break; +- } +- } +- if (self->private_impl.f_chunk_length <= 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- if (v_c != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); +- goto exit; +- } +- self->private_impl.f_metadata_is_zlib_compressed = true; +- self->private_impl.f_metadata_flavor = 4u; +- self->private_impl.f_metadata_fourcc = 1229144912u; +- self->private_impl.f_metadata_x = 0u; +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) + +- goto ok; +- ok: +- self->private_impl.p_decode_iccp[0] = 0; +- goto exit; +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) + +- goto suspend; +- suspend: +- self->private_impl.p_decode_iccp[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++// ---------------- Status Codes Implementations + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++// ---------------- Private Consts + +- return status; +-} ++// ---------------- Private Initializer Prototypes + +-// -------- func png.decoder.decode_plte ++// ---------------- Private Function Prototypes + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_plte( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++// ---------------- VTables + +- uint32_t v_num_entries = 0; +- uint32_t v_i = 0; +- uint32_t v_argb = 0; ++// ---------------- Initializer Implementations + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_vp8__placeholder__initialize( ++ wuffs_vp8__placeholder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- +- uint32_t coro_susp_point = self->private_impl.p_decode_plte[0]; +- if (coro_susp_point) { +- v_num_entries = self->private_data.s_decode_plte[0].v_num_entries; +- v_i = self->private_data.s_decode_plte[0].v_i; ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_chunk_length > 768u) || ((self->private_impl.f_chunk_length % 3u) != 0u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- v_num_entries = (((uint32_t)(self->private_impl.f_chunk_length)) / 3u); +- self->private_impl.f_chunk_length = 0u; +- while (v_i < v_num_entries) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { +- t_0 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); +- iop_a_src += 3; +- } else { +- self->private_data.s_decode_plte[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_plte[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 16) { +- t_0 = ((uint32_t)(*scratch >> 40)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- v_argb = t_0; +- } +- v_argb |= 4278190080u; +- self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); +- self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); +- self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); +- v_i += 1u; ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +- while (v_i < 256u) { +- self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u; +- v_i += 1u; ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } +- +- goto ok; +- ok: +- self->private_impl.p_decode_plte[0] = 0; +- goto exit; + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_plte[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_plte[0].v_num_entries = v_num_entries; +- self->private_data.s_decode_plte[0].v_i = v_i; ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ return wuffs_base__make_status(NULL); ++} + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++wuffs_vp8__placeholder* ++wuffs_vp8__placeholder__alloc(void) { ++ wuffs_vp8__placeholder* x = ++ (wuffs_vp8__placeholder*)(calloc(1, sizeof(wuffs_vp8__placeholder))); ++ if (!x) { ++ return NULL; + } +- +- return status; ++ if (wuffs_vp8__placeholder__initialize( ++ x, sizeof(wuffs_vp8__placeholder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; + } + +-// -------- func png.decoder.decode_srgb +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_srgb( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++size_t ++sizeof__wuffs_vp8__placeholder(void) { ++ return sizeof(wuffs_vp8__placeholder); ++} + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++// ---------------- Function Implementations + +- uint32_t coro_susp_point = self->private_impl.p_decode_srgb[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) + +- if (self->private_impl.f_chunk_length != 1u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length = 0u; +- self->private_impl.f_metadata_flavor = 5u; +- self->private_impl.f_metadata_fourcc = 1397901122u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t t_0 = *iop_a_src++; +- self->private_impl.f_metadata_x = t_0; +- } +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) + +- goto ok; +- ok: +- self->private_impl.p_decode_srgb[0] = 0; +- goto exit; +- } ++// ---------------- Status Codes Implementations + +- goto suspend; +- suspend: +- self->private_impl.p_decode_srgb[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++const char wuffs_wbmp__error__bad_header[] = "#wbmp: bad header"; ++const char wuffs_wbmp__error__truncated_input[] = "#wbmp: truncated input"; + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++// ---------------- Private Consts + +- return status; +-} ++// ---------------- Private Initializer Prototypes + +-// -------- func png.decoder.decode_trns ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__decode_trns( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++wuffs_wbmp__decoder__do_decode_image_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- uint32_t v_i = 0; +- uint32_t v_n = 0; +- uint64_t v_u = 0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_wbmp__decoder__do_decode_frame_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_wbmp__decoder__do_decode_frame( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); + +- uint32_t coro_susp_point = self->private_impl.p_decode_trns[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_decode_trns[0].v_i; +- v_n = self->private_data.s_decode_trns[0].v_n; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// ---------------- VTables + +- if (self->private_impl.f_color_type == 0u) { +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- if (self->private_impl.f_depth <= 8u) { +- self->private_impl.f_dst_pixfmt = 2164295816u; +- self->private_impl.f_src_pixfmt = 2164295816u; +- } else { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; +- } +- if (self->private_impl.f_chunk_length != 2u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length = 0u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint64_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_trns[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_trns[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 8) { +- t_0 = ((uint64_t)(*scratch >> 48)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- v_u = t_0; +- } +- if (self->private_impl.f_depth <= 1u) { +- self->private_impl.f_remap_transparency = (((v_u & 1u) * 16777215u) | 4278190080u); +- } else if (self->private_impl.f_depth <= 2u) { +- self->private_impl.f_remap_transparency = (((v_u & 3u) * 5592405u) | 4278190080u); +- } else if (self->private_impl.f_depth <= 4u) { +- self->private_impl.f_remap_transparency = (((v_u & 15u) * 1118481u) | 4278190080u); +- } else if (self->private_impl.f_depth <= 8u) { +- self->private_impl.f_remap_transparency = (((v_u & 255u) * 65793u) | 4278190080u); +- } else { +- self->private_impl.f_remap_transparency = ((v_u * 4295032833u) | 18446462598732840960u); +- } +- } else if (self->private_impl.f_color_type == 2u) { +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- if (self->private_impl.f_depth <= 8u) { +- self->private_impl.f_dst_pixfmt = 2164295816u; +- self->private_impl.f_src_pixfmt = 2164295816u; +- } else { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; +- } +- if (self->private_impl.f_chunk_length != 6u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length = 0u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint64_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) { +- t_1 = ((uint64_t)(wuffs_base__peek_u48be__no_bounds_check(iop_a_src))); +- iop_a_src += 6; +- } else { +- self->private_data.s_decode_trns[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_trns[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 40) { +- t_1 = ((uint64_t)(*scratch >> 16)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } +- } +- v_u = t_1; +- } +- if (self->private_impl.f_depth <= 8u) { +- self->private_impl.f_remap_transparency = ((255u & (v_u >> 0u)) | +- (65280u & (v_u >> 8u)) | +- (16711680u & (v_u >> 16u)) | +- 4278190080u); +- } else { +- self->private_impl.f_remap_transparency = (v_u | 18446462598732840960u); +- } +- } else if (self->private_impl.f_color_type == 3u) { +- self->private_impl.f_dst_pixfmt = 2164523016u; +- self->private_impl.f_src_pixfmt = 2164523016u; +- if (self->private_impl.f_chunk_length > 256u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- v_n = ((uint32_t)(self->private_impl.f_chunk_length)); +- self->private_impl.f_chunk_length = 0u; +- while (v_i < v_n) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = t_2; +- } +- v_i += 1u; +- } ++const wuffs_base__image_decoder__func_ptrs ++wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_wbmp__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_wbmp__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_wbmp__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_wbmp__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_wbmp__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_wbmp__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_wbmp__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_wbmp__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_wbmp__decoder__initialize( ++ wuffs_wbmp__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } ++ } + +- goto ok; +- ok: +- self->private_impl.p_decode_trns[0] = 0; +- goto exit; ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_wbmp__decoder* ++wuffs_wbmp__decoder__alloc(void) { ++ wuffs_wbmp__decoder* x = ++ (wuffs_wbmp__decoder*)(calloc(1, sizeof(wuffs_wbmp__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_wbmp__decoder__initialize( ++ x, sizeof(wuffs_wbmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; + } ++ return x; ++} + +- goto suspend; +- suspend: +- self->private_impl.p_decode_trns[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_trns[0].v_i = v_i; +- self->private_data.s_decode_trns[0].v_n = v_n; ++size_t ++sizeof__wuffs_wbmp__decoder(void) { ++ return sizeof(wuffs_wbmp__decoder); ++} + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++// ---------------- Function Implementations ++ ++// -------- func wbmp.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_wbmp__decoder__get_quirk( ++ const wuffs_wbmp__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- return status; ++ return 0u; + } + +-// -------- func png.decoder.decode_frame_config ++// -------- func wbmp.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__decode_frame_config( +- wuffs_png__decoder* self, +- wuffs_base__frame_config* a_dst, ++wuffs_wbmp__decoder__set_quirk( ++ wuffs_wbmp__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func wbmp.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__decode_image_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); +@@ -56757,7 +70789,7 @@ wuffs_png__decoder__decode_frame_config( + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { ++ (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -56766,17 +70798,17 @@ wuffs_png__decoder__decode_frame_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame_config(self, a_dst, a_src); ++ wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_image_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); + goto exit; + } + status = v_status; +@@ -56784,14 +70816,14 @@ wuffs_png__decoder__decode_frame_config( + } + + ok: +- self->private_impl.p_decode_frame_config[0] = 0; ++ self->private_impl.p_decode_image_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: +@@ -56801,17 +70833,19 @@ wuffs_png__decoder__decode_frame_config( + return status; + } + +-// -------- func png.decoder.do_decode_frame_config ++// -------- func wbmp.decoder.do_decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__do_decode_frame_config( +- wuffs_png__decoder* self, +- wuffs_base__frame_config* a_dst, ++wuffs_wbmp__decoder__do_decode_image_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_checksum_have = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_i = 0; ++ uint32_t v_p = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -56824,392 +70858,88 @@ wuffs_png__decoder__do_decode_frame_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_do_decode_image_config.v_i; ++ v_p = self->private_data.s_do_decode_image_config.v_p; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_call_sequence & 16u) != 0u) { ++ if (self->private_impl.f_call_sequence != 0u) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; +- } else if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_png__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; +- } +- } else if (self->private_impl.f_call_sequence == 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_png__decoder__skip_frame(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- if (self->private_impl.f_metadata_fourcc != 0u) { +- self->private_impl.f_call_sequence = 48u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; + } +- if (self->private_impl.f_num_decoded_frame_configs_value == 0u) { +- self->private_impl.f_frame_rect_x0 = self->private_impl.f_first_rect_x0; +- self->private_impl.f_frame_rect_y0 = self->private_impl.f_first_rect_y0; +- self->private_impl.f_frame_rect_x1 = self->private_impl.f_first_rect_x1; +- self->private_impl.f_frame_rect_y1 = self->private_impl.f_first_rect_y1; +- self->private_impl.f_frame_config_io_position = self->private_impl.f_first_config_io_position; +- self->private_impl.f_frame_duration = self->private_impl.f_first_duration; +- self->private_impl.f_frame_disposal = self->private_impl.f_first_disposal; +- self->private_impl.f_frame_overwrite_instead_of_blend = self->private_impl.f_first_overwrite_instead_of_blend; +- } else { +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_frame_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_frame_config[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- self->private_impl.f_chunk_length = t_0; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_frame_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_frame_config[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; +- } +- } +- self->private_impl.f_chunk_type = t_1; +- } +- if (self->private_impl.f_chunk_type == 1145980233u) { +- if (self->private_impl.f_chunk_length != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_frame_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_frame_config[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; +- if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; +- } +- } +- v_checksum_have = t_2; +- } +- if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != 2187346606u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_checksum); +- goto exit; +- } +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else if (self->private_impl.f_chunk_type == 1413571686u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } else if (self->private_impl.f_chunk_type == 1280598886u) { +- self->private_impl.f_frame_config_io_position = ((uint64_t)(wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) - 8u)); +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_png__decoder__decode_fctl(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_data.s_do_decode_frame_config[0].scratch = 4u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (self->private_data.s_do_decode_frame_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame_config[0].scratch; +- break; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- status = wuffs_png__decoder__decode_other_chunk(self, a_src, true); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_metadata_fourcc != 0u) { +- self->private_impl.f_call_sequence = 48u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; +- } +- self->private_data.s_do_decode_frame_config[0].scratch = 4u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- if (self->private_data.s_do_decode_frame_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; ++ v_i = 0u; ++ while (v_i < 2u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- iop_a_src += self->private_data.s_do_decode_frame_config[0].scratch; +- self->private_impl.f_chunk_length = 0u; ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- self->private_impl.f_frame_rect_x0, +- self->private_impl.f_frame_rect_y0, +- self->private_impl.f_frame_rect_x1, +- self->private_impl.f_frame_rect_y1), +- ((wuffs_base__flicks)(self->private_impl.f_frame_duration)), +- ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)), +- self->private_impl.f_frame_config_io_position, +- self->private_impl.f_frame_disposal, +- ((self->private_impl.f_color_type <= 3u) && ! self->private_impl.f_seen_trns), +- self->private_impl.f_frame_overwrite_instead_of_blend, +- 0u); +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u); +- self->private_impl.f_call_sequence = 64u; +- +- ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func png.decoder.skip_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__skip_frame( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_seq_num = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_skip_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- self->private_impl.f_chunk_type_array[0u] = 0u; +- self->private_impl.f_chunk_type_array[1u] = 0u; +- self->private_impl.f_chunk_type_array[2u] = 0u; +- self->private_impl.f_chunk_type_array[3u] = 0u; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_wbmp__error__bad_header); ++ goto exit; + } +- self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); +- if (self->private_impl.f_chunk_type == 1413563465u) { +- if (self->private_impl.f_chunk_type_array[0u] == 102u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_type_array[0u] = 73u; +- self->private_impl.f_chunk_type_array[1u] = 68u; +- self->private_impl.f_chunk_type_array[2u] = 65u; +- self->private_impl.f_chunk_type_array[3u] = 84u; +- } else if (self->private_impl.f_chunk_type == 1413571686u) { +- if (self->private_impl.f_chunk_type_array[0u] == 73u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_type_array[0u] = 102u; +- self->private_impl.f_chunk_type_array[1u] = 100u; +- self->private_impl.f_chunk_type_array[2u] = 65u; +- self->private_impl.f_chunk_type_array[3u] = 84u; +- if (self->private_impl.f_chunk_length < 4u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 4u; +- iop_a_src += 8u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 2u) { ++ v_p = 0u; ++ while (true) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_skip_frame[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_skip_frame[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_seq_num = t_0; ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; + } +- if (v_seq_num != self->private_impl.f_next_animation_seq_num) { +- status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); +- goto exit; +- } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ v_p |= ((uint32_t)(((uint8_t)(v_c8 & 127u)))); ++ if (((uint8_t)(v_c8 >> 7u)) == 0u) { ++ break; ++ } else if (v_p > 131071u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); + goto exit; + } +- self->private_impl.f_next_animation_seq_num += 1u; +- self->private_data.s_skip_frame[0].scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 4u); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_skip_frame[0].scratch; +- self->private_impl.f_chunk_length = 0u; +- continue; +- } else if (self->private_impl.f_chunk_type_array[0u] != 0u) { +- break; +- } else if (self->private_impl.f_chunk_type == 1280598886u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; ++ v_p <<= 7u; + } +- self->private_data.s_skip_frame[0].scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if (v_i == 0u) { ++ self->private_impl.f_width = v_p; ++ } else { ++ self->private_impl.f_height = v_p; + } +- iop_a_src += self->private_data.s_skip_frame[0].scratch; +- self->private_impl.f_chunk_length = 0u; ++ v_i += 1u; ++ } ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ 2198077448u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ true); + } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); + self->private_impl.f_call_sequence = 32u; + ++ goto ok; + ok: +- self->private_impl.p_skip_frame[0] = 0; ++ self->private_impl.p_do_decode_image_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_skip_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_image_config.v_i = v_i; ++ self->private_data.s_do_decode_image_config.v_p = v_p; + + goto exit; + exit: +@@ -57220,17 +70950,14 @@ wuffs_png__decoder__skip_frame( + return status; + } + +-// -------- func png.decoder.decode_frame ++// -------- func wbmp.decoder.decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__decode_frame( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++wuffs_wbmp__decoder__decode_frame_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -57240,12 +70967,12 @@ wuffs_png__decoder__decode_frame( + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } +- if (!a_dst || !a_src) { ++ if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { ++ (self->private_impl.active_coroutine != 2)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -57254,22 +70981,17 @@ wuffs_png__decoder__decode_frame( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); ++ wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); + goto exit; + } + status = v_status; +@@ -57277,14 +70999,14 @@ wuffs_png__decoder__decode_frame( + } + + ok: +- self->private_impl.p_decode_frame[0] = 0; ++ self->private_impl.p_decode_frame_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + + goto exit; + exit: +@@ -57294,24 +71016,16 @@ wuffs_png__decoder__decode_frame( + return status; + } + +-// -------- func png.decoder.do_decode_frame ++// -------- func wbmp.decoder.do_decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__do_decode_frame( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++wuffs_wbmp__decoder__do_decode_frame_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_seq_num = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint32_t v_pass_width = 0; +- uint32_t v_pass_height = 0; +- + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -57323,210 +71037,62 @@ wuffs_png__decoder__do_decode_frame( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_call_sequence & 16u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if (self->private_impl.f_call_sequence >= 96u) { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else if (self->private_impl.f_call_sequence != 64u) { ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_png__decoder__do_decode_frame_config(self, NULL, a_src); ++ status = wuffs_wbmp__decoder__do_decode_image_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } +- } +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- continue; +- } +- self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); +- if (self->private_impl.f_chunk_type == 1413563465u) { +- self->private_impl.f_chunk_type_array[0u] = 73u; +- self->private_impl.f_chunk_type_array[1u] = 68u; +- self->private_impl.f_chunk_type_array[2u] = 65u; +- self->private_impl.f_chunk_type_array[3u] = 84u; +- iop_a_src += 8u; +- if ( ! self->private_impl.f_ignore_checksum) { +- wuffs_base__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, +- sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); +- } +- break; +- } else if (self->private_impl.f_chunk_type == 1413571686u) { +- self->private_impl.f_chunk_type_array[0u] = 102u; +- self->private_impl.f_chunk_type_array[1u] = 100u; +- self->private_impl.f_chunk_type_array[2u] = 65u; +- self->private_impl.f_chunk_type_array[3u] = 84u; +- if (self->private_impl.f_chunk_length < 4u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 4u; +- iop_a_src += 8u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_frame[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_frame[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- v_seq_num = t_0; +- } +- if (v_seq_num != self->private_impl.f_next_animation_seq_num) { +- status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); +- goto exit; +- } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); +- goto exit; +- } +- self->private_impl.f_next_animation_seq_num += 1u; +- break; +- } else if (self->private_impl.f_chunk_type == 1280598886u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_data.s_do_decode_frame[0].scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame[0].scratch; +- self->private_impl.f_chunk_length = 0u; +- } +- if (self->private_impl.f_zlib_is_dirty) { +- wuffs_base__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib, +- sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- if (self->private_impl.f_ignore_checksum) { +- wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u); +- } +- } +- self->private_impl.f_zlib_is_dirty = true; +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), +- wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), +- wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); + goto exit; + } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } +- self->private_impl.f_workbuf_hist_pos_base = 0u; +- while (true) { +- if (self->private_impl.f_chunk_type_array[0u] == 73u) { +- v_pass_width = (16777215u & ((((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][1u])) + self->private_impl.f_width) >> WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u])); +- v_pass_height = (16777215u & ((((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][4u])) + self->private_impl.f_height) >> WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3u])); +- } else { +- v_pass_width = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_x1 - self->private_impl.f_frame_rect_x0))); +- v_pass_height = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_y1 - self->private_impl.f_frame_rect_y0))); +- } +- if ((v_pass_width > 0u) && (v_pass_height > 0u)) { +- self->private_impl.f_pass_bytes_per_row = wuffs_png__decoder__calculate_bytes_per_row(self, v_pass_width); +- self->private_impl.f_pass_workbuf_length = (((uint64_t)(v_pass_height)) * (1u + self->private_impl.f_pass_bytes_per_row)); +- while (true) { +- { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_1 = wuffs_png__decoder__decode_pass(self, a_src, a_workbuf); +- v_status = t_1; +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } else if (wuffs_base__status__is_error(&v_status) || ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed))) { +- if (self->private_impl.f_workbuf_wi <= ((uint64_t)(a_workbuf.len))) { +- wuffs_png__decoder__filter_and_swizzle(self, a_dst, wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_workbuf_wi)); +- } +- if (v_status.repr == wuffs_base__suspension__short_read) { +- status = wuffs_base__make_status(wuffs_png__error__truncated_input); +- goto exit; +- } +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- } +- v_status = wuffs_png__decoder__filter_and_swizzle(self, a_dst, a_workbuf); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- self->private_impl.f_workbuf_hist_pos_base += self->private_impl.f_pass_workbuf_length; +- } +- if ((self->private_impl.f_interlace_pass == 0u) || (self->private_impl.f_interlace_pass >= 7u)) { +- break; +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_interlace_pass += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ self->private_impl.f_frame_config_io_position, ++ 0u, ++ true, ++ false, ++ 4278190080u); + } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); +- self->private_impl.f_call_sequence = 32u; ++ self->private_impl.f_call_sequence = 64u; + + ok: +- self->private_impl.p_do_decode_frame[0] = 0; ++ self->private_impl.p_do_decode_frame_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -57537,338 +71103,217 @@ wuffs_png__decoder__do_decode_frame( + return status; + } + +-// -------- func png.decoder.decode_pass ++// -------- func wbmp.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_pass( +- wuffs_png__decoder* self, ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__decode_frame( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_w = &u_w; +- uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint64_t v_w_mark = 0; +- uint64_t v_r_mark = 0; +- wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL); +- uint32_t v_checksum_have = 0; +- uint32_t v_checksum_want = 0; +- uint32_t v_seq_num = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_pass[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- self->private_impl.f_workbuf_wi = 0u; + while (true) { +- if ((self->private_impl.f_workbuf_wi > self->private_impl.f_pass_workbuf_length) || (self->private_impl.f_pass_workbuf_length > ((uint64_t)(a_workbuf.len)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); +- goto exit; +- } + { +- wuffs_base__io_buffer* o_0_v_w = v_w; +- uint8_t *o_0_iop_v_w = iop_v_w; +- uint8_t *o_0_io0_v_w = io0_v_w; +- uint8_t *o_0_io1_v_w = io1_v_w; +- uint8_t *o_0_io2_v_w = io2_v_w; +- v_w = wuffs_base__io_writer__set( +- &u_w, +- &iop_v_w, +- &io0_v_w, +- &io1_v_w, +- &io2_v_w, +- wuffs_base__slice_u8__subslice_ij(a_workbuf, +- self->private_impl.f_workbuf_wi, +- self->private_impl.f_pass_workbuf_length), +- ((uint64_t)(self->private_impl.f_workbuf_hist_pos_base + self->private_impl.f_workbuf_wi))); +- { +- const bool o_1_closed_a_src = a_src->meta.closed; +- const uint8_t *o_1_io2_a_src = io2_a_src; +- wuffs_base__io_reader__limit(&io2_a_src, iop_a_src, +- ((uint64_t)(self->private_impl.f_chunk_length))); +- if (a_src) { +- size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); +- a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); +- a_src->meta.wi = n; +- } +- v_w_mark = ((uint64_t)(iop_v_w - io0_v_w)); +- v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- { +- u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr)); +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_0 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, v_w, a_src, wuffs_base__utility__empty_slice_u8()); +- v_zlib_status = t_0; +- iop_v_w = u_w.data.ptr + u_w.meta.wi; +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- if ( ! self->private_impl.f_ignore_checksum) { +- wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__io__since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); +- } +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_base__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_workbuf_wi, wuffs_base__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w)))); +- io2_a_src = o_1_io2_a_src; +- if (a_src) { +- a_src->meta.closed = o_1_closed_a_src; +- a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); +- } +- } +- v_w = o_0_v_w; +- iop_v_w = o_0_iop_v_w; +- io0_v_w = o_0_io0_v_w; +- io1_v_w = o_0_io1_v_w; +- io2_v_w = o_0_io2_v_w; ++ wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; + } +- if (wuffs_base__status__is_ok(&v_zlib_status)) { +- if (self->private_impl.f_chunk_length > 0u) { +- status = wuffs_base__make_status(wuffs_base__error__too_much_data); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_pass[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } +- } +- v_checksum_want = t_1; +- } +- if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) { +- v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8()); +- if (v_checksum_have != v_checksum_want) { +- status = wuffs_base__make_status(wuffs_png__error__bad_checksum); +- goto exit; +- } +- } +- break; +- } else if (v_zlib_status.repr == wuffs_base__suspension__short_write) { +- if ((1u <= self->private_impl.f_interlace_pass) && (self->private_impl.f_interlace_pass <= 6u)) { +- break; +- } +- status = wuffs_base__make_status(wuffs_base__error__too_much_data); ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); + goto exit; +- } else if (v_zlib_status.repr != wuffs_base__suspension__short_read) { +- status = v_zlib_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } else if (self->private_impl.f_chunk_length == 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_pass[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); +- if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)); +- } +- } +- v_checksum_want = t_2; +- } +- if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) { +- v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8()); +- if (v_checksum_have != v_checksum_want) { +- status = wuffs_base__make_status(wuffs_png__error__bad_checksum); +- goto exit; +- } +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_pass[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch >> 32)); +- break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func wbmp.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_wbmp__decoder__do_decode_frame( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint64_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_x_in_bytes = 0; ++ uint32_t v_dst_x = 0; ++ uint32_t v_dst_y = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint8_t v_src[1] = {0}; ++ uint8_t v_c8 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ if (coro_susp_point) { ++ v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel; ++ v_dst_x = self->private_data.s_do_decode_frame.v_dst_x; ++ v_dst_y = self->private_data.s_do_decode_frame.v_dst_y; ++ memcpy(v_src, self->private_data.s_do_decode_frame.v_src, sizeof(v_src)); ++ v_c8 = self->private_data.s_do_decode_frame.v_c8; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_wbmp__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ wuffs_base__utility__make_pixel_format(536870920u), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; ++ } ++ v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); ++ if (self->private_impl.f_width > 0u) { ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ while (v_dst_y < self->private_impl.f_height) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y); ++ v_dst_x = 0u; ++ while (v_dst_x < self->private_impl.f_width) { ++ if ((v_dst_x & 7u) == 0u) { ++ while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y); ++ v_dst_x_in_bytes = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel); ++ if (v_dst_x_in_bytes <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_x_in_bytes); + } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)); + } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; + } +- self->private_impl.f_chunk_length = t_3; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; ++ if (((uint8_t)(v_c8 & 128u)) == 0u) { ++ v_src[0u] = 0u; + } else { +- self->private_data.s_decode_pass[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 24) { +- t_4 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; +- } +- } +- self->private_impl.f_chunk_type = t_4; +- } +- if (self->private_impl.f_chunk_type_array[0u] == 73u) { +- if (self->private_impl.f_chunk_type != 1413563465u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if ( ! self->private_impl.f_ignore_checksum) { +- wuffs_base__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, +- sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); +- } +- } else { +- if ((self->private_impl.f_chunk_type != 1413571686u) || (self->private_impl.f_chunk_length < 4u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 4u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- uint32_t t_5; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_pass[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; +- uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); +- if (num_bits_5 == 24) { +- t_5 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_5 += 8u; +- *scratch |= ((uint64_t)(num_bits_5)); +- } +- } +- v_seq_num = t_5; ++ v_src[0u] = 255u; + } +- if (v_seq_num != self->private_impl.f_next_animation_seq_num) { +- status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); +- goto exit; +- } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); +- goto exit; ++ v_c8 = ((uint8_t)((((uint32_t)(v_c8)) << 1u))); ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__utility__empty_slice_u8(), wuffs_base__make_slice_u8(v_src, 1)); ++ if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); + } +- self->private_impl.f_next_animation_seq_num += 1u; ++ v_dst_x += 1u; + } +- continue; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) > 0u) { +- status = wuffs_base__make_status(wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); +- } +- if (self->private_impl.f_workbuf_wi != self->private_impl.f_pass_workbuf_length) { +- status = wuffs_base__make_status(wuffs_base__error__not_enough_data); +- goto exit; +- } else if (0u < ((uint64_t)(a_workbuf.len))) { +- if (a_workbuf.ptr[0u] == 4u) { +- a_workbuf.ptr[0u] = 1u; ++ v_dst_y += 1u; + } + } ++ self->private_impl.f_call_sequence = 96u; + + ok: +- self->private_impl.p_decode_pass[0] = 0; ++ self->private_impl.p_do_decode_frame = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_pass[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel = v_dst_bytes_per_pixel; ++ self->private_data.s_do_decode_frame.v_dst_x = v_dst_x; ++ self->private_data.s_do_decode_frame.v_dst_y = v_dst_y; ++ memcpy(self->private_data.s_do_decode_frame.v_src, v_src, sizeof(v_src)); ++ self->private_data.s_do_decode_frame.v_c8 = v_c8; + + goto exit; + exit: +@@ -57879,12 +71324,12 @@ wuffs_png__decoder__decode_pass( + return status; + } + +-// -------- func png.decoder.frame_dirty_rect ++// -------- func wbmp.decoder.frame_dirty_rect + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_png__decoder__frame_dirty_rect( +- const wuffs_png__decoder* self) { ++wuffs_wbmp__decoder__frame_dirty_rect( ++ const wuffs_wbmp__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_rect_ie_u32(); + } +@@ -57894,18 +71339,18 @@ wuffs_png__decoder__frame_dirty_rect( + } + + return wuffs_base__utility__make_rect_ie_u32( +- self->private_impl.f_frame_rect_x0, +- self->private_impl.f_frame_rect_y0, +- self->private_impl.f_frame_rect_x1, +- self->private_impl.f_frame_rect_y1); ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); + } + +-// -------- func png.decoder.num_animation_loops ++// -------- func wbmp.decoder.num_animation_loops + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_png__decoder__num_animation_loops( +- const wuffs_png__decoder* self) { ++wuffs_wbmp__decoder__num_animation_loops( ++ const wuffs_wbmp__decoder* self) { + if (!self) { + return 0; + } +@@ -57914,15 +71359,15 @@ wuffs_png__decoder__num_animation_loops( + return 0; + } + +- return self->private_impl.f_num_animation_loops_value; ++ return 0u; + } + +-// -------- func png.decoder.num_decoded_frame_configs ++// -------- func wbmp.decoder.num_decoded_frame_configs + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_png__decoder__num_decoded_frame_configs( +- const wuffs_png__decoder* self) { ++wuffs_wbmp__decoder__num_decoded_frame_configs( ++ const wuffs_wbmp__decoder* self) { + if (!self) { + return 0; + } +@@ -57931,15 +71376,18 @@ wuffs_png__decoder__num_decoded_frame_configs( + return 0; + } + +- return ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)); ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; + } + +-// -------- func png.decoder.num_decoded_frames ++// -------- func wbmp.decoder.num_decoded_frames + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_png__decoder__num_decoded_frames( +- const wuffs_png__decoder* self) { ++wuffs_wbmp__decoder__num_decoded_frames( ++ const wuffs_wbmp__decoder* self) { + if (!self) { + return 0; + } +@@ -57948,15 +71396,18 @@ wuffs_png__decoder__num_decoded_frames( + return 0; + } + +- return ((uint64_t)(self->private_impl.f_num_decoded_frames_value)); ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; + } + +-// -------- func png.decoder.restart_frame ++// -------- func wbmp.decoder.restart_frame + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__restart_frame( +- wuffs_png__decoder* self, ++wuffs_wbmp__decoder__restart_frame( ++ wuffs_wbmp__decoder* self, + uint64_t a_index, + uint64_t a_io_position) { + if (!self) { +@@ -57971,154 +71422,514 @@ wuffs_png__decoder__restart_frame( + + if (self->private_impl.f_call_sequence < 32u) { + return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } else if ((a_index >= ((uint64_t)(self->private_impl.f_num_animation_frames_value))) || ((a_index == 0u) && (a_io_position != self->private_impl.f_first_config_io_position))) { ++ } ++ if (a_index != 0u) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + self->private_impl.f_call_sequence = 40u; +- if (self->private_impl.f_interlace_pass >= 1u) { +- self->private_impl.f_interlace_pass = 1u; +- } + self->private_impl.f_frame_config_io_position = a_io_position; +- self->private_impl.f_num_decoded_frame_configs_value = ((uint32_t)(a_index)); +- self->private_impl.f_num_decoded_frames_value = self->private_impl.f_num_decoded_frame_configs_value; + return wuffs_base__make_status(NULL); + } + +-// -------- func png.decoder.set_report_metadata ++// -------- func wbmp.decoder.set_report_metadata + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_png__decoder__set_report_metadata( +- wuffs_png__decoder* self, ++wuffs_wbmp__decoder__set_report_metadata( ++ wuffs_wbmp__decoder* self, + uint32_t a_fourcc, + bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func wbmp.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__tell_me_more( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { + if (!self) { +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- if (a_fourcc == 1128813133u) { +- self->private_impl.f_report_metadata_chrm = a_report; +- } else if (a_fourcc == 1163413830u) { +- self->private_impl.f_report_metadata_exif = a_report; +- } else if (a_fourcc == 1195461953u) { +- self->private_impl.f_report_metadata_gama = a_report; +- } else if (a_fourcc == 1229144912u) { +- self->private_impl.f_report_metadata_iccp = a_report; +- } else if (a_fourcc == 1263947808u) { +- self->private_impl.f_report_metadata_kvp = a_report; +- } else if (a_fourcc == 1397901122u) { +- self->private_impl.f_report_metadata_srgb = a_report; ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func wbmp.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_wbmp__decoder__workbuf_len( ++ const wuffs_wbmp__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_webp__error__bad_huffman_code_over_subscribed[] = "#webp: bad Huffman code (over-subscribed)"; ++const char wuffs_webp__error__bad_huffman_code_under_subscribed[] = "#webp: bad Huffman code (under-subscribed)"; ++const char wuffs_webp__error__bad_huffman_code[] = "#webp: bad Huffman code"; ++const char wuffs_webp__error__bad_back_reference[] = "#webp: bad back-reference"; ++const char wuffs_webp__error__bad_color_cache[] = "#webp: bad color cache"; ++const char wuffs_webp__error__bad_header[] = "#webp: bad header"; ++const char wuffs_webp__error__bad_transform[] = "#webp: bad transform"; ++const char wuffs_webp__error__short_chunk[] = "#webp: short chunk"; ++const char wuffs_webp__error__truncated_input[] = "#webp: truncated input"; ++const char wuffs_webp__error__unsupported_number_of_huffman_groups[] = "#webp: unsupported number of Huffman groups"; ++const char wuffs_webp__error__unsupported_transform_after_color_indexing_transform[] = "#webp: unsupported transform after color indexing transform"; ++const char wuffs_webp__error__unsupported_webp_file[] = "#webp: unsupported WebP file"; ++const char wuffs_webp__error__internal_error_inconsistent_huffman_code[] = "#webp: internal error: inconsistent Huffman code"; ++const char wuffs_webp__error__internal_error_inconsistent_dst_buffer[] = "#webp: internal error: inconsistent dst buffer"; ++const char wuffs_webp__error__internal_error_inconsistent_n_bits[] = "#webp: internal error: inconsistent n_bits"; ++ ++// ---------------- Private Consts ++ ++static const uint8_t ++WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 17u, 18u, 0u, 1u, 2u, 3u, 4u, 5u, ++ 16u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, ++ 13u, 14u, 15u, ++}; ++ ++static const uint8_t ++WUFFS_WEBP__REPEAT_N_BITS[4] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 2u, 3u, 7u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_WEBP__REPEAT_COUNTS[4] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 3u, 3u, 11u, 0u, ++}; ++ ++static const uint16_t ++WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[5] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1612u, 0u, 511u, 1022u, 1533u, ++}; ++ ++static const uint8_t ++WUFFS_WEBP__DISTANCE_MAP[120] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 24u, 7u, 23u, 25u, 40u, 6u, 39u, 41u, ++ 22u, 26u, 38u, 42u, 56u, 5u, 55u, 57u, ++ 21u, 27u, 54u, 58u, 37u, 43u, 72u, 4u, ++ 71u, 73u, 20u, 28u, 53u, 59u, 70u, 74u, ++ 36u, 44u, 88u, 69u, 75u, 52u, 60u, 3u, ++ 87u, 89u, 19u, 29u, 86u, 90u, 35u, 45u, ++ 68u, 76u, 85u, 91u, 51u, 61u, 104u, 2u, ++ 103u, 105u, 18u, 30u, 102u, 106u, 34u, 46u, ++ 84u, 92u, 67u, 77u, 101u, 107u, 50u, 62u, ++ 120u, 1u, 119u, 121u, 83u, 93u, 17u, 31u, ++ 100u, 108u, 66u, 78u, 118u, 122u, 33u, 47u, ++ 117u, 123u, 49u, 63u, 99u, 109u, 82u, 94u, ++ 0u, 116u, 124u, 65u, 79u, 16u, 32u, 98u, ++ 110u, 48u, 115u, 125u, 81u, 95u, 64u, 114u, ++ 126u, 97u, 111u, 80u, 113u, 127u, 96u, 112u, ++}; ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_huffman_groups( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_n_huffman_groups); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_huffman_tree( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_hg, ++ uint32_t a_ht); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_huffman_tree_simple( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_hg, ++ uint32_t a_ht); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_code_length_code_lengths( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__build_code_lengths_huffman_nodes( ++ wuffs_webp__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__build_huffman_nodes( ++ wuffs_webp__decoder* self, ++ uint32_t a_hg, ++ uint32_t a_ht); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__build_code_lengths( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_pixels_slow( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_dst, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_width, ++ uint32_t a_height, ++ wuffs_base__slice_u8 a_tile_data, ++ uint32_t a_tile_size_log2); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_predictor( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix, ++ wuffs_base__slice_u8 a_tile_data); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_webp__decoder__absolute_difference( ++ const wuffs_webp__decoder* self, ++ uint32_t a_a, ++ uint32_t a_b); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_webp__decoder__mode12( ++ const wuffs_webp__decoder* self, ++ uint8_t a_l, ++ uint8_t a_t, ++ uint8_t a_tl); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_webp__decoder__mode13( ++ const wuffs_webp__decoder* self, ++ uint8_t a_l, ++ uint8_t a_t, ++ uint8_t a_tl); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_cross_color( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix, ++ wuffs_base__slice_u8 a_tile_data); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_subtract_green( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_color_indexing( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_image_config( ++ wuffs_webp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_image_config_limited( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_image_config_limited_vp8l( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_frame_config( ++ wuffs_webp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_frame( ++ wuffs_webp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_transform( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_color_cache_parameters( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_hg_table( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_width, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_pixels( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_dst, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_width, ++ uint32_t a_height, ++ wuffs_base__slice_u8 a_tile_data, ++ uint32_t a_tile_size_log2); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__swizzle( ++ wuffs_webp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_src, ++ wuffs_base__pixel_blend a_blend); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_webp__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_webp__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_webp__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_webp__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_webp__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_webp__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_webp__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_webp__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_webp__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_webp__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_webp__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_webp__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_webp__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_webp__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_webp__decoder__initialize( ++ wuffs_webp__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_webp__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_webp__decoder* ++wuffs_webp__decoder__alloc(void) { ++ wuffs_webp__decoder* x = ++ (wuffs_webp__decoder*)(calloc(1, sizeof(wuffs_webp__decoder))); ++ if (!x) { ++ return NULL; + } +- return wuffs_base__make_empty_struct(); ++ if (wuffs_webp__decoder__initialize( ++ x, sizeof(wuffs_webp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; + } + +-// -------- func png.decoder.tell_me_more ++size_t ++sizeof__wuffs_webp__decoder(void) { ++ return sizeof(wuffs_webp__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func webp.decoder.decode_huffman_groups + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__tell_me_more( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; ++static wuffs_base__status ++wuffs_webp__decoder__decode_huffman_groups( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_n_huffman_groups) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_hg = 0; ++ uint32_t v_ht = 0; + +- uint32_t coro_susp_point = self->private_impl.p_tell_me_more[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_huffman_groups; ++ if (coro_susp_point) { ++ v_hg = self->private_data.s_decode_huffman_groups.v_hg; ++ v_ht = self->private_data.s_decode_huffman_groups.v_ht; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_png__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_png__error__truncated_input); +- goto exit; ++ v_hg = 0u; ++ while (v_hg < a_n_huffman_groups) { ++ v_ht = 0u; ++ while (v_ht < 5u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_webp__decoder__decode_huffman_tree(self, a_src, v_hg, v_ht); ++ if (status.repr) { ++ goto suspend; ++ } ++ v_ht += 1u; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ v_hg += 1u; + } + ++ goto ok; + ok: +- self->private_impl.p_tell_me_more[0] = 0; ++ self->private_impl.p_decode_huffman_groups = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; ++ self->private_impl.p_decode_huffman_groups = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_huffman_groups.v_hg = v_hg; ++ self->private_data.s_decode_huffman_groups.v_ht = v_ht; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } + return status; + } + +-// -------- func png.decoder.do_tell_me_more ++// -------- func webp.decoder.decode_huffman_tree + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__do_tell_me_more( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { ++wuffs_webp__decoder__decode_huffman_tree( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_hg, ++ uint32_t a_ht) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint16_t v_c2 = 0; +- wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_w = &u_w; +- uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint64_t v_num_written = 0; +- uint64_t v_w_mark = 0; +- uint64_t v_r_mark = 0; +- wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL); ++ uint8_t v_c8 = 0; ++ uint32_t v_use_simple = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -58130,462 +71941,105 @@ wuffs_png__decoder__do_tell_me_more( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more[0]; +- if (coro_susp_point) { +- v_zlib_status = self->private_data.s_do_tell_me_more[0].v_zlib_status; +- } ++ uint32_t coro_susp_point = self->private_impl.p_decode_huffman_tree; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_call_sequence & 16u) == 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } +- if (self->private_impl.f_metadata_fourcc == 0u) { +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; ++ if (a_ht >= 4u) { ++ self->private_impl.f_ht_n_symbols = 40u; ++ } else if (a_ht > 0u) { ++ self->private_impl.f_ht_n_symbols = 256u; ++ } else if (self->private_impl.f_color_cache_bits == 0u) { ++ self->private_impl.f_ht_n_symbols = 280u; ++ } else { ++ self->private_impl.f_ht_n_symbols = (280u + (((uint32_t)(1u)) << self->private_impl.f_color_cache_bits)); + } +- do { +- if (self->private_impl.f_metadata_flavor == 3u) { +- while (true) { +- if (wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_y) { +- status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); +- goto exit; +- } else if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- self->private_impl.f_metadata_flavor, +- self->private_impl.f_metadata_fourcc, +- self->private_impl.f_metadata_x, +- self->private_impl.f_metadata_y, +- self->private_impl.f_metadata_z); +- } +- if (self->private_impl.f_metadata_y >= self->private_impl.f_metadata_z) { +- goto label__goto_done__break; +- } +- self->private_impl.f_metadata_y = self->private_impl.f_metadata_z; +- status = wuffs_base__make_status(wuffs_base__suspension__even_more_information); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- if (self->private_impl.f_metadata_is_zlib_compressed) { +- if (self->private_impl.f_zlib_is_dirty) { +- wuffs_base__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib, +- sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- if (self->private_impl.f_ignore_checksum) { +- wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u); +- } +- } +- self->private_impl.f_zlib_is_dirty = true; +- self->private_impl.f_ztxt_hist_pos = 0u; ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_use_simple = (self->private_impl.f_bits & 1u); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ if (v_use_simple != 0u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- label__loop__continue:; +- while (true) { +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- self->private_impl.f_metadata_flavor, +- self->private_impl.f_metadata_fourcc, +- self->private_impl.f_metadata_x, +- self->private_impl.f_metadata_y, +- self->private_impl.f_metadata_z); +- } +- if (self->private_impl.f_metadata_flavor != 4u) { +- break; +- } +- if (self->private_impl.f_metadata_is_zlib_compressed) { +- if (self->private_impl.f_chunk_type == 1346585449u) { +- { +- const bool o_0_closed_a_src = a_src->meta.closed; +- const uint8_t *o_0_io2_a_src = io2_a_src; +- wuffs_base__io_reader__limit(&io2_a_src, iop_a_src, +- ((uint64_t)(self->private_impl.f_chunk_length))); +- if (a_src) { +- size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); +- a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); +- a_src->meta.wi = n; +- } +- v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_0 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, a_dst, a_src, wuffs_base__utility__empty_slice_u8()); +- v_zlib_status = t_0; +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_base__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); +- io2_a_src = o_0_io2_a_src; +- if (a_src) { +- a_src->meta.closed = o_0_closed_a_src; +- a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); +- } +- } +- if (wuffs_base__status__is_ok(&v_zlib_status)) { +- self->private_impl.f_metadata_is_zlib_compressed = false; +- break; +- } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { +- status = v_zlib_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- status = v_zlib_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- } else if (self->private_impl.f_chunk_type == 1951945833u) { +- { +- const bool o_1_closed_a_src = a_src->meta.closed; +- const uint8_t *o_1_io2_a_src = io2_a_src; +- wuffs_base__io_reader__limit(&io2_a_src, iop_a_src, +- ((uint64_t)(self->private_impl.f_chunk_length))); +- if (a_src) { +- size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); +- a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); +- a_src->meta.wi = n; +- } +- v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_1 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, a_dst, a_src, wuffs_base__utility__empty_slice_u8()); +- v_zlib_status = t_1; +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_base__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); +- io2_a_src = o_1_io2_a_src; +- if (a_src) { +- a_src->meta.closed = o_1_closed_a_src; +- a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); +- } +- } +- if (wuffs_base__status__is_ok(&v_zlib_status)) { +- self->private_impl.f_metadata_is_zlib_compressed = false; +- break; +- } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { +- status = v_zlib_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- status = v_zlib_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- } else if (self->private_impl.f_chunk_type == 1951945850u) { +- if (self->private_impl.f_ztxt_ri == self->private_impl.f_ztxt_wi) { +- { +- wuffs_base__io_buffer* o_2_v_w = v_w; +- uint8_t *o_2_iop_v_w = iop_v_w; +- uint8_t *o_2_io0_v_w = io0_v_w; +- uint8_t *o_2_io1_v_w = io1_v_w; +- uint8_t *o_2_io2_v_w = io2_v_w; +- v_w = wuffs_base__io_writer__set( +- &u_w, +- &iop_v_w, +- &io0_v_w, +- &io1_v_w, +- &io2_v_w, +- wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024), +- self->private_impl.f_ztxt_hist_pos); +- { +- const bool o_3_closed_a_src = a_src->meta.closed; +- const uint8_t *o_3_io2_a_src = io2_a_src; +- wuffs_base__io_reader__limit(&io2_a_src, iop_a_src, +- ((uint64_t)(self->private_impl.f_chunk_length))); +- if (a_src) { +- size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); +- a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); +- a_src->meta.wi = n; +- } +- v_w_mark = ((uint64_t)(iop_v_w - io0_v_w)); +- v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- { +- u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr)); +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_2 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, v_w, a_src, wuffs_base__utility__empty_slice_u8()); +- v_zlib_status = t_2; +- iop_v_w = u_w.data.ptr + u_w.meta.wi; +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_base__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); +- v_num_written = wuffs_base__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w))); +- io2_a_src = o_3_io2_a_src; +- if (a_src) { +- a_src->meta.closed = o_3_closed_a_src; +- a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); +- } +- } +- v_w = o_2_v_w; +- iop_v_w = o_2_iop_v_w; +- io0_v_w = o_2_io0_v_w; +- io1_v_w = o_2_io1_v_w; +- io2_v_w = o_2_io2_v_w; +- } +- if (v_num_written > 1024u) { +- status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- self->private_impl.f_ztxt_ri = 0u; +- self->private_impl.f_ztxt_wi = ((uint32_t)(v_num_written)); +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_ztxt_hist_pos, v_num_written); +- } +- while (self->private_impl.f_ztxt_ri < self->private_impl.f_ztxt_wi) { +- v_c2 = WUFFS_PNG__LATIN_1[self->private_data.f_dst_palette[self->private_impl.f_ztxt_ri]]; +- if (v_c2 == 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1); +- goto exit; +- } else if (v_c2 <= 127u) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- goto label__loop__continue; +- } +- self->private_impl.f_ztxt_ri += 1u; +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c2))), iop_a_dst += 1); +- } else { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- goto label__loop__continue; +- } +- self->private_impl.f_ztxt_ri += 1u; +- (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c2), iop_a_dst += 2); +- } +- } +- if (wuffs_base__status__is_ok(&v_zlib_status)) { +- self->private_impl.f_metadata_is_zlib_compressed = false; +- break; +- } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { +- status = v_zlib_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } else if (v_zlib_status.repr != wuffs_base__suspension__short_write) { +- status = v_zlib_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- } +- } else { +- status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_chunk_type); +- goto exit; +- } +- } else if ((self->private_impl.f_chunk_type == 1951945833u) && (self->private_impl.f_metadata_fourcc == 1263947862u)) { +- while (true) { +- if (self->private_impl.f_chunk_length <= 0u) { +- goto label__loop__break; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); +- goto label__loop__continue; +- } else if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- goto label__loop__continue; +- } +- self->private_impl.f_chunk_length -= 1u; +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_c), iop_a_dst += 1); +- } +- } else { +- while (true) { +- if (self->private_impl.f_chunk_length <= 0u) { +- if (self->private_impl.f_metadata_fourcc == 1263947851u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- goto label__loop__break; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); +- goto label__loop__continue; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (v_c == 0u) { +- self->private_impl.f_chunk_length -= 1u; +- iop_a_src += 1u; +- goto label__loop__break; +- } +- v_c2 = WUFFS_PNG__LATIN_1[v_c]; +- if (v_c2 == 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1); +- goto exit; +- } else if (v_c2 <= 127u) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); +- goto label__loop__continue; +- } +- self->private_impl.f_chunk_length -= 1u; +- iop_a_src += 1u; +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c2))), iop_a_dst += 1); +- } else { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); +- goto label__loop__continue; +- } +- self->private_impl.f_chunk_length -= 1u; +- iop_a_src += 1u; +- (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c2), iop_a_dst += 2); +- } +- } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_webp__decoder__decode_huffman_tree_simple(self, a_src, a_hg, a_ht); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_webp__decoder__decode_code_length_code_lengths(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ v_status = wuffs_webp__decoder__build_code_lengths_huffman_nodes(self); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; + } ++ goto ok; + } +- label__loop__break:; +- if (self->private_impl.f_metadata_fourcc == 1263947851u) { +- self->private_impl.f_metadata_fourcc = 1263947862u; +- if (self->private_impl.f_chunk_type == 1951945833u) { +- if (self->private_impl.f_chunk_length <= 1u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 2u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; +- } +- if (v_c == 0u) { +- self->private_impl.f_metadata_is_zlib_compressed = false; +- } else if (v_c == 1u) { +- self->private_impl.f_metadata_is_zlib_compressed = true; +- } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; +- } +- if ((v_c != 0u) && self->private_impl.f_metadata_is_zlib_compressed) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); +- goto exit; +- } +- self->private_impl.f_metadata_fourcc -= 2u; +- while (self->private_impl.f_metadata_fourcc != 1263947862u) { +- self->private_impl.f_metadata_fourcc += 1u; +- while (true) { +- if (self->private_impl.f_chunk_length <= 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; +- } +- if (v_c == 0u) { +- break; +- } +- } +- } +- } else if (self->private_impl.f_chunk_type == 1951945850u) { +- if (self->private_impl.f_chunk_length <= 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_6 = *iop_a_src++; +- v_c = t_6; +- } +- if (v_c != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); +- goto exit; +- } +- self->private_impl.f_metadata_is_zlib_compressed = true; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_webp__decoder__build_code_lengths(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ v_status = wuffs_webp__decoder__build_huffman_nodes(self, a_hg, a_ht); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; + } +- self->private_impl.f_call_sequence &= 239u; +- status = wuffs_base__make_status(NULL); + goto ok; + } +- } while (0); +- label__goto_done__break:; +- if (self->private_impl.f_chunk_length != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_data.s_do_tell_me_more[0].scratch = 4u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- if (self->private_data.s_do_tell_me_more[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_tell_me_more[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; + } +- iop_a_src += self->private_data.s_do_tell_me_more[0].scratch; +- self->private_impl.f_metadata_flavor = 0u; +- self->private_impl.f_metadata_fourcc = 0u; +- self->private_impl.f_metadata_x = 0u; +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; +- self->private_impl.f_call_sequence &= 239u; +- status = wuffs_base__make_status(NULL); +- goto ok; + + ok: +- self->private_impl.p_do_tell_me_more[0] = 0; ++ self->private_impl.p_decode_huffman_tree = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_tell_me_more[0].v_zlib_status = v_zlib_status; ++ self->private_impl.p_decode_huffman_tree = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -58593,563 +72047,1574 @@ wuffs_png__decoder__do_tell_me_more( + return status; + } + +-// -------- func png.decoder.history_retain_length ++// -------- func webp.decoder.decode_huffman_tree_simple + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_png__decoder__history_retain_length( +- const wuffs_png__decoder* self) { +- if (!self) { +- return 0; ++static wuffs_base__status ++wuffs_webp__decoder__decode_huffman_tree_simple( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_hg, ++ uint32_t a_ht) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_use_second_symbol = 0; ++ uint32_t v_first_symbol_n_bits = 0; ++ uint32_t v_symbol0 = 0; ++ uint32_t v_symbol1 = 0; ++ uint32_t v_base_offset = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_huffman_tree_simple; ++ if (coro_susp_point) { ++ v_use_second_symbol = self->private_data.s_decode_huffman_tree_simple.v_use_second_symbol; ++ v_first_symbol_n_bits = self->private_data.s_decode_huffman_tree_simple.v_first_symbol_n_bits; ++ v_symbol0 = self->private_data.s_decode_huffman_tree_simple.v_symbol0; ++ v_base_offset = self->private_data.s_decode_huffman_tree_simple.v_base_offset; + } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- return 0u; ++ if (self->private_impl.f_n_bits < 2u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (self->private_impl.f_n_bits >= 2u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_use_second_symbol = (self->private_impl.f_bits & 1u); ++ v_first_symbol_n_bits = ((((self->private_impl.f_bits & 2u) >> 1u) * 7u) + 1u); ++ self->private_impl.f_bits >>= 2u; ++ self->private_impl.f_n_bits -= 2u; ++ if (self->private_impl.f_n_bits < v_first_symbol_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= v_first_symbol_n_bits) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_symbol0 = (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_first_symbol_n_bits) - 1u)); ++ self->private_impl.f_bits >>= v_first_symbol_n_bits; ++ self->private_impl.f_n_bits -= v_first_symbol_n_bits; ++ v_base_offset = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[a_ht])); ++ if (v_use_second_symbol != 0u) { ++ if (self->private_impl.f_n_bits < 8u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (self->private_impl.f_n_bits >= 8u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_symbol1 = (self->private_impl.f_bits & 255u); ++ self->private_impl.f_bits >>= 8u; ++ self->private_impl.f_n_bits -= 8u; ++ self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 0u)] = ((uint16_t)((v_base_offset + 1u))); ++ self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 1u)] = ((uint16_t)((v_symbol0 | 32768u))); ++ self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 2u)] = ((uint16_t)((v_symbol1 | 32768u))); ++ } else { ++ self->private_data.f_huffman_nodes[a_hg][v_base_offset] = ((uint16_t)((v_symbol0 | 32768u))); ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_huffman_tree_simple = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_huffman_tree_simple = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_huffman_tree_simple.v_use_second_symbol = v_use_second_symbol; ++ self->private_data.s_decode_huffman_tree_simple.v_first_symbol_n_bits = v_first_symbol_n_bits; ++ self->private_data.s_decode_huffman_tree_simple.v_symbol0 = v_symbol0; ++ self->private_data.s_decode_huffman_tree_simple.v_base_offset = v_base_offset; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; + } + +-// -------- func png.decoder.workbuf_len ++// -------- func webp.decoder.decode_code_length_code_lengths + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_png__decoder__workbuf_len( +- const wuffs_png__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++static wuffs_base__status ++wuffs_webp__decoder__decode_code_length_code_lengths( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_n_codes = 0; ++ uint32_t v_i = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_code_length_code_lengths; ++ if (coro_susp_point) { ++ v_n_codes = self->private_data.s_decode_code_length_code_lengths.v_n_codes; ++ v_i = self->private_data.s_decode_code_length_code_lengths.v_i; + } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_overall_workbuf_length, self->private_impl.f_overall_workbuf_length); ++ if (self->private_impl.f_n_bits < 4u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (self->private_impl.f_n_bits >= 4u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_n_codes = ((self->private_impl.f_bits & 15u) + 4u); ++ self->private_impl.f_bits >>= 4u; ++ self->private_impl.f_n_bits -= 4u; ++ v_i = 0u; ++ while (v_i < v_n_codes) { ++ if (self->private_impl.f_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= 3u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ self->private_impl.f_code_length_code_lengths[WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[v_i]] = ((uint8_t)((self->private_impl.f_bits & 7u))); ++ self->private_impl.f_bits >>= 3u; ++ self->private_impl.f_n_bits -= 3u; ++ v_i += 1u; ++ } ++ while (v_i < 19u) { ++ self->private_impl.f_code_length_code_lengths[WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[v_i]] = 0u; ++ v_i += 1u; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_code_length_code_lengths = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_code_length_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_code_length_code_lengths.v_n_codes = v_n_codes; ++ self->private_data.s_decode_code_length_code_lengths.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; + } + +-// -------- func png.decoder.filter_and_swizzle ++// -------- func webp.decoder.build_code_lengths_huffman_nodes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf) { +- return (*self->private_impl.choosy_filter_and_swizzle)(self, a_dst, a_workbuf); ++wuffs_webp__decoder__build_code_lengths_huffman_nodes( ++ wuffs_webp__decoder* self) { ++ uint32_t v_code_bits = 0; ++ uint32_t v_code_len = 0; ++ uint32_t v_symbol = 0; ++ uint32_t v_histogram[8] = {0}; ++ uint32_t v_n_used_symbols = 0; ++ uint32_t v_last_used_symbol = 0; ++ uint32_t v_subscription_weight = 0; ++ uint32_t v_subscription_total = 0; ++ uint32_t v_curr_code = 0; ++ uint32_t v_next_codes[9] = {0}; ++ uint32_t v_n_branches = 0; ++ uint32_t v_h = 0; ++ uint32_t v_children = 0; ++ uint16_t v_node = 0; ++ ++ v_symbol = 0u; ++ while (v_symbol < 19u) { ++ v_code_len = ((uint32_t)(self->private_impl.f_code_length_code_lengths[v_symbol])); ++ if (v_code_len != 0u) { ++ v_histogram[v_code_len] += 1u; ++ v_n_used_symbols += 1u; ++ v_last_used_symbol = v_symbol; ++ } ++ v_symbol += 1u; ++ } ++ if (v_n_used_symbols < 1u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code); ++ } else if (v_n_used_symbols == 1u) { ++ self->private_data.f_code_lengths_huffman_nodes[0u] = ((uint16_t)((v_last_used_symbol | 32768u))); ++ return wuffs_base__make_status(NULL); ++ } ++ v_subscription_weight = 16384u; ++ v_code_len = 1u; ++ while (true) { ++ v_curr_code = ((uint32_t)(((uint32_t)(v_curr_code + v_histogram[v_code_len])) << 1u)); ++ v_next_codes[(v_code_len + 1u)] = v_curr_code; ++ v_subscription_total += ((uint32_t)(v_subscription_weight * v_histogram[v_code_len])); ++ v_subscription_weight >>= 1u; ++ if (v_code_len >= 7u) { ++ break; ++ } ++ v_code_len += 1u; ++ } ++ if (v_subscription_total > 32768u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_over_subscribed); ++ } else if (v_subscription_total < 32768u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_under_subscribed); ++ } ++ self->private_data.f_code_lengths_huffman_nodes[0u] = 0u; ++ v_symbol = 0u; ++ while (v_symbol < 19u) { ++ v_code_len = ((uint32_t)(self->private_impl.f_code_length_code_lengths[v_symbol])); ++ if (v_code_len > 0u) { ++ v_code_bits = v_next_codes[v_code_len]; ++ v_next_codes[v_code_len] += 1u; ++ v_code_bits <<= (32u - v_code_len); ++ v_h = 0u; ++ while (v_code_len > 0u) { ++ v_node = self->private_data.f_code_lengths_huffman_nodes[v_h]; ++ if (v_node == 0u) { ++ v_children = ((uint32_t)(1u + ((uint32_t)(2u * v_n_branches)))); ++ v_children = wuffs_base__u32__min(v_children, 35u); ++ self->private_data.f_code_lengths_huffman_nodes[v_h] = ((uint16_t)(v_children)); ++ self->private_data.f_code_lengths_huffman_nodes[(v_children + 0u)] = 0u; ++ self->private_data.f_code_lengths_huffman_nodes[(v_children + 1u)] = 0u; ++ v_h = (v_children + (v_code_bits >> 31u)); ++ v_n_branches += 1u; ++ } else { ++ v_children = ((uint32_t)(v_node)); ++ v_h = (wuffs_base__u32__min(v_children, 35u) + (v_code_bits >> 31u)); ++ } ++ v_code_bits <<= 1u; ++ v_code_len -= 1u; ++ } ++ self->private_data.f_code_lengths_huffman_nodes[v_h] = ((uint16_t)((v_symbol | 32768u))); ++ } ++ v_symbol += 1u; ++ } ++ return wuffs_base__make_status(NULL); + } + ++// -------- func webp.decoder.build_huffman_nodes ++ + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint64_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row0 = 0; +- uint64_t v_dst_bytes_per_row1 = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- uint32_t v_y = 0; +- wuffs_base__slice_u8 v_dst = {0}; +- uint8_t v_filter = 0; +- wuffs_base__slice_u8 v_curr_row = {0}; +- wuffs_base__slice_u8 v_prev_row = {0}; +- +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++wuffs_webp__decoder__build_huffman_nodes( ++ wuffs_webp__decoder* self, ++ uint32_t a_hg, ++ uint32_t a_ht) { ++ uint32_t v_base_offset = 0; ++ uint32_t v_code_bits = 0; ++ uint32_t v_code_len = 0; ++ uint32_t v_symbol = 0; ++ uint32_t v_histogram[16] = {0}; ++ uint32_t v_n_used_symbols = 0; ++ uint32_t v_last_used_symbol = 0; ++ uint32_t v_subscription_weight = 0; ++ uint32_t v_subscription_total = 0; ++ uint32_t v_curr_code = 0; ++ uint32_t v_next_codes[17] = {0}; ++ uint32_t v_n_branches = 0; ++ uint32_t v_h = 0; ++ uint32_t v_children = 0; ++ uint16_t v_node = 0; ++ ++ v_base_offset = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[a_ht])); ++ v_symbol = 0u; ++ while (v_symbol < self->private_impl.f_ht_n_symbols) { ++ v_code_len = ((uint32_t)(((uint16_t)(self->private_data.f_code_lengths[v_symbol] & 15u)))); ++ if (v_code_len != 0u) { ++ v_histogram[v_code_len] += 1u; ++ v_n_used_symbols += 1u; ++ v_last_used_symbol = v_symbol; ++ } ++ v_symbol += 1u; ++ } ++ if (v_n_used_symbols < 1u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code); ++ } else if (v_n_used_symbols == 1u) { ++ self->private_data.f_huffman_nodes[a_hg][v_base_offset] = ((uint16_t)((v_last_used_symbol | 32768u))); ++ return wuffs_base__make_status(NULL); + } +- v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); +- v_dst_bytes_per_row0 = (((uint64_t)(self->private_impl.f_frame_rect_x0)) * v_dst_bytes_per_pixel); +- v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- if (v_dst_bytes_per_row1 < ((uint64_t)(v_tab.width))) { +- v_tab = wuffs_base__table_u8__subtable_ij(v_tab, +- 0u, +- 0u, +- v_dst_bytes_per_row1, +- ((uint64_t)(v_tab.height))); ++ v_subscription_weight = 16384u; ++ v_code_len = 1u; ++ while (true) { ++ v_curr_code = ((uint32_t)(((uint32_t)(v_curr_code + v_histogram[v_code_len])) << 1u)); ++ v_next_codes[(v_code_len + 1u)] = v_curr_code; ++ v_subscription_total += ((uint32_t)(v_subscription_weight * v_histogram[v_code_len])); ++ v_subscription_weight >>= 1u; ++ if (v_code_len >= 15u) { ++ break; ++ } ++ v_code_len += 1u; ++ } ++ if (v_subscription_total > 32768u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_over_subscribed); ++ } else if (v_subscription_total < 32768u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_under_subscribed); ++ } ++ self->private_data.f_huffman_nodes[a_hg][v_base_offset] = 0u; ++ v_symbol = 0u; ++ while (v_symbol < self->private_impl.f_ht_n_symbols) { ++ v_code_len = ((uint32_t)(((uint16_t)(self->private_data.f_code_lengths[v_symbol] & 15u)))); ++ if (v_code_len != 0u) { ++ v_code_bits = v_next_codes[v_code_len]; ++ v_next_codes[v_code_len] += 1u; ++ v_code_bits <<= (32u - v_code_len); ++ v_h = v_base_offset; ++ while (v_code_len > 0u) { ++ v_node = self->private_data.f_huffman_nodes[a_hg][v_h]; ++ if (v_node == 0u) { ++ v_children = ((uint32_t)(v_base_offset + ((uint32_t)(1u + ((uint32_t)(2u * v_n_branches)))))); ++ v_children = wuffs_base__u32__min(v_children, 6265u); ++ self->private_data.f_huffman_nodes[a_hg][v_h] = ((uint16_t)(v_children)); ++ self->private_data.f_huffman_nodes[a_hg][(v_children + 0u)] = 0u; ++ self->private_data.f_huffman_nodes[a_hg][(v_children + 1u)] = 0u; ++ v_h = (v_children + (v_code_bits >> 31u)); ++ v_n_branches += 1u; ++ } else { ++ v_children = ((uint32_t)(v_node)); ++ v_h = (wuffs_base__u32__min(v_children, 6265u) + (v_code_bits >> 31u)); ++ } ++ v_code_bits <<= 1u; ++ v_code_len -= 1u; ++ } ++ self->private_data.f_huffman_nodes[a_hg][v_h] = ((uint16_t)((v_symbol | 32768u))); ++ } ++ v_symbol += 1u; + } +- if (v_dst_bytes_per_row0 < ((uint64_t)(v_tab.width))) { +- v_tab = wuffs_base__table_u8__subtable_ij(v_tab, +- v_dst_bytes_per_row0, +- 0u, +- ((uint64_t)(v_tab.width)), +- ((uint64_t)(v_tab.height))); +- } else { +- v_tab = wuffs_base__table_u8__subtable_ij(v_tab, +- 0u, +- 0u, +- 0u, +- 0u); ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func webp.decoder.build_code_lengths ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__build_code_lengths( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_use_length = 0; ++ uint32_t v_length_n_bits = 0; ++ uint32_t v_length = 0; ++ uint16_t v_prev_code_length = 0; ++ uint32_t v_h = 0; ++ uint32_t v_s = 0; ++ uint32_t v_s_max = 0; ++ uint16_t v_node = 0; ++ uint32_t v_symbol = 0; ++ uint16_t v_repeat_value = 0; ++ uint32_t v_repeat_n_bits = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- v_y = self->private_impl.f_frame_rect_y0; +- while (v_y < self->private_impl.f_frame_rect_y1) { +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_y); +- if (1u > ((uint64_t)(a_workbuf.len))) { +- return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); ++ ++ uint32_t coro_susp_point = self->private_impl.p_build_code_lengths; ++ if (coro_susp_point) { ++ v_length_n_bits = self->private_data.s_build_code_lengths.v_length_n_bits; ++ v_prev_code_length = self->private_data.s_build_code_lengths.v_prev_code_length; ++ v_s = self->private_data.s_build_code_lengths.v_s; ++ v_s_max = self->private_data.s_build_code_lengths.v_s_max; ++ v_node = self->private_data.s_build_code_lengths.v_node; ++ v_repeat_value = self->private_data.s_build_code_lengths.v_repeat_value; ++ v_repeat_n_bits = self->private_data.s_build_code_lengths.v_repeat_n_bits; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; + } +- v_filter = a_workbuf.ptr[0u]; +- a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u); +- if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) { +- return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); ++ v_use_length = (self->private_impl.f_bits & 1u); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ self->private_impl.f_ht_code_lengths_remaining = self->private_impl.f_ht_n_symbols; ++ if (v_use_length != 0u) { ++ if (self->private_impl.f_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= 3u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_length_n_bits = (((self->private_impl.f_bits & 7u) * 2u) + 2u); ++ self->private_impl.f_bits >>= 3u; ++ self->private_impl.f_n_bits -= 3u; ++ while (self->private_impl.f_n_bits < v_length_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (self->private_impl.f_n_bits >= v_length_n_bits) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_length = ((self->private_impl.f_bits & ((((uint32_t)(1u)) << v_length_n_bits) - 1u)) + 2u); ++ self->private_impl.f_bits >>= v_length_n_bits; ++ self->private_impl.f_n_bits -= v_length_n_bits; ++ if (v_length > self->private_impl.f_ht_n_symbols) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_huffman_code); ++ goto exit; ++ } ++ self->private_impl.f_ht_code_lengths_remaining = v_length; + } +- v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row); +- a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row); +- if (v_filter == 0u) { +- } else if (v_filter == 1u) { +- wuffs_png__decoder__filter_1(self, v_curr_row); +- } else if (v_filter == 2u) { +- wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row); +- } else if (v_filter == 3u) { +- wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row); +- } else if (v_filter == 4u) { +- wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row); +- } else { +- return wuffs_base__make_status(wuffs_png__error__bad_filter); ++ v_prev_code_length = 8u; ++ while (v_s < self->private_impl.f_ht_n_symbols) { ++ if (self->private_impl.f_ht_code_lengths_remaining <= 0u) { ++ while (v_s < self->private_impl.f_ht_n_symbols) { ++ self->private_data.f_code_lengths[v_s] = 0u; ++ v_s += 1u; ++ } ++ break; ++ } ++ self->private_impl.f_ht_code_lengths_remaining -= 1u; ++ v_h = 0u; ++ while (true) { ++ v_node = self->private_data.f_code_lengths_huffman_nodes[v_h]; ++ if (v_node >= 32768u) { ++ break; ++ } else if (v_node > 35u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_huffman_code); ++ goto exit; ++ } ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_h = (((uint32_t)(v_node)) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ } ++ v_symbol = ((uint32_t)(((uint16_t)(v_node & 32767u)))); ++ if (v_symbol == 0u) { ++ self->private_data.f_code_lengths[v_s] = 0u; ++ v_s += 1u; ++ continue; ++ } else if (v_symbol < 16u) { ++ v_prev_code_length = ((uint16_t)(v_symbol)); ++ self->private_data.f_code_lengths[v_s] = v_prev_code_length; ++ v_s += 1u; ++ continue; ++ } else if (v_symbol == 16u) { ++ v_repeat_value = v_prev_code_length; ++ } else { ++ v_repeat_value = 0u; ++ } ++ v_repeat_n_bits = ((uint32_t)(WUFFS_WEBP__REPEAT_N_BITS[(v_symbol & 3u)])); ++ v_s_max = ((uint32_t)(((uint32_t)(WUFFS_WEBP__REPEAT_COUNTS[(v_symbol & 3u)])) + v_s)); ++ if (self->private_impl.f_n_bits < v_repeat_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if (self->private_impl.f_n_bits >= v_repeat_n_bits) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_s_max += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_repeat_n_bits) - 1u)); ++ self->private_impl.f_bits >>= v_repeat_n_bits; ++ self->private_impl.f_n_bits -= v_repeat_n_bits; ++ if (v_s_max > self->private_impl.f_ht_n_symbols) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_huffman_code); ++ goto exit; ++ } ++ while (v_s < v_s_max) { ++ self->private_data.f_code_lengths[v_s] = v_repeat_value; ++ v_s += 1u; ++ } + } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, v_curr_row); +- v_prev_row = v_curr_row; +- v_y += 1u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_build_code_lengths = 0; ++ goto exit; + } +- return wuffs_base__make_status(NULL); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_build_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_build_code_lengths.v_length_n_bits = v_length_n_bits; ++ self->private_data.s_build_code_lengths.v_prev_code_length = v_prev_code_length; ++ self->private_data.s_build_code_lengths.v_s = v_s; ++ self->private_data.s_build_code_lengths.v_s_max = v_s_max; ++ self->private_data.s_build_code_lengths.v_node = v_node; ++ self->private_data.s_build_code_lengths.v_repeat_value = v_repeat_value; ++ self->private_data.s_build_code_lengths.v_repeat_n_bits = v_repeat_n_bits; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; + } + +-// -------- func png.decoder.filter_and_swizzle_tricky ++// -------- func webp.decoder.decode_pixels_slow + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle_tricky( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint64_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row1 = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- uint64_t v_src_bytes_per_pixel = 0; ++wuffs_webp__decoder__decode_pixels_slow( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_dst, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_width, ++ uint32_t a_height, ++ wuffs_base__slice_u8 a_tile_data, ++ uint32_t a_tile_size_log2) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint64_t v_p = 0; ++ uint64_t v_p_max = 0; ++ uint32_t v_tile_size_log2 = 0; ++ uint32_t v_width_in_tiles = 0; + uint32_t v_x = 0; + uint32_t v_y = 0; +- uint64_t v_i = 0; +- wuffs_base__slice_u8 v_dst = {0}; +- uint8_t v_filter = 0; +- wuffs_base__slice_u8 v_s = {0}; +- wuffs_base__slice_u8 v_curr_row = {0}; +- wuffs_base__slice_u8 v_prev_row = {0}; +- uint8_t v_bits_unpacked[8] = {0}; +- uint8_t v_bits_packed = 0; +- uint8_t v_packs_remaining = 0; +- uint8_t v_multiplier = 0; +- uint8_t v_shift = 0; ++ uint32_t v_i = 0; ++ uint32_t v_hg = 0; ++ uint32_t v_h = 0; ++ uint16_t v_node = 0; ++ uint32_t v_pixel_g = 0; ++ uint32_t v_color = 0; ++ wuffs_base__slice_u8 v_dst_pixel = {0}; ++ uint32_t v_back_ref_len_n_bits = 0; ++ uint32_t v_back_ref_len_minus_1 = 0; ++ uint32_t v_back_ref_dist_n_bits = 0; ++ uint32_t v_back_ref_dist_sym = 0; ++ uint32_t v_back_ref_dist_premap_minus_1 = 0; ++ uint32_t v_back_ref_dist_minus_1 = 0; ++ uint32_t v_dm = 0; ++ uint32_t v_dx = 0; ++ uint32_t v_dy = 0; ++ uint64_t v_p_end = 0; ++ uint64_t v_dist4 = 0; ++ uint64_t v_q = 0; ++ wuffs_base__slice_u8 v_color_cache_pixels = {0}; ++ uint64_t v_color_cache_p = 0; ++ uint32_t v_color_cache_shift = 0; + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +- } +- v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); +- v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- v_src_bytes_per_pixel = 1u; +- if (self->private_impl.f_depth >= 8u) { +- v_src_bytes_per_pixel = (((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type])) * ((uint64_t)((self->private_impl.f_depth >> 3u)))); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (self->private_impl.f_chunk_type_array[0u] == 73u) { +- v_y = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][5u])); +- } else { +- v_y = self->private_impl.f_frame_rect_y0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_pixels_slow; ++ if (coro_susp_point) { ++ v_p = self->private_data.s_decode_pixels_slow.v_p; ++ v_p_max = self->private_data.s_decode_pixels_slow.v_p_max; ++ v_tile_size_log2 = self->private_data.s_decode_pixels_slow.v_tile_size_log2; ++ v_width_in_tiles = self->private_data.s_decode_pixels_slow.v_width_in_tiles; ++ v_x = self->private_data.s_decode_pixels_slow.v_x; ++ v_y = self->private_data.s_decode_pixels_slow.v_y; ++ v_hg = self->private_data.s_decode_pixels_slow.v_hg; ++ v_node = self->private_data.s_decode_pixels_slow.v_node; ++ v_color = self->private_data.s_decode_pixels_slow.v_color; ++ v_back_ref_len_n_bits = self->private_data.s_decode_pixels_slow.v_back_ref_len_n_bits; ++ v_back_ref_len_minus_1 = self->private_data.s_decode_pixels_slow.v_back_ref_len_minus_1; ++ v_back_ref_dist_n_bits = self->private_data.s_decode_pixels_slow.v_back_ref_dist_n_bits; ++ v_back_ref_dist_premap_minus_1 = self->private_data.s_decode_pixels_slow.v_back_ref_dist_premap_minus_1; ++ v_color_cache_p = self->private_data.s_decode_pixels_slow.v_color_cache_p; + } +- while (v_y < self->private_impl.f_frame_rect_y1) { +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_y); +- if (v_dst_bytes_per_row1 < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row1); +- } +- if (1u > ((uint64_t)(a_workbuf.len))) { +- return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); +- } +- v_filter = a_workbuf.ptr[0u]; +- a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u); +- if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) { +- return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); +- } +- v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row); +- a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row); +- if (v_filter == 0u) { +- } else if (v_filter == 1u) { +- wuffs_png__decoder__filter_1(self, v_curr_row); +- } else if (v_filter == 2u) { +- wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row); +- } else if (v_filter == 3u) { +- wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row); +- } else if (v_filter == 4u) { +- wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row); +- } else { +- return wuffs_base__make_status(wuffs_png__error__bad_filter); ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ v_p_max = ((uint64_t)((4u * a_width * a_height))); ++ if (((uint64_t)(a_dst.len)) < v_p_max) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer); ++ goto exit; + } +- v_s = v_curr_row; +- if (self->private_impl.f_chunk_type_array[0u] == 73u) { +- v_x = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][2u])); ++ if (a_tile_size_log2 != 0u) { ++ v_tile_size_log2 = a_tile_size_log2; ++ v_width_in_tiles = ((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2); + } else { +- v_x = self->private_impl.f_frame_rect_x0; ++ v_tile_size_log2 = 31u; ++ v_width_in_tiles = 1u; + } +- if (self->private_impl.f_depth == 8u) { +- while (v_x < self->private_impl.f_frame_rect_x1) { +- v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); +- if (v_i <= ((uint64_t)(v_dst.len))) { +- if (self->private_impl.f_color_type == 4u) { +- if (2u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[0u]; +- v_bits_unpacked[1u] = v_s.ptr[0u]; +- v_bits_unpacked[2u] = v_s.ptr[0u]; +- v_bits_unpacked[3u] = v_s.ptr[1u]; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); +- } +- } else if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) { +- if (self->private_impl.f_color_type == 0u) { +- if (1u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[0u]; +- v_bits_unpacked[1u] = v_s.ptr[0u]; +- v_bits_unpacked[2u] = v_s.ptr[0u]; +- v_bits_unpacked[3u] = 255u; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); +- if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | +- (((uint32_t)(v_bits_unpacked[1u])) << 8u) | +- (((uint32_t)(v_bits_unpacked[2u])) << 16u) | +- (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { +- v_bits_unpacked[0u] = 0u; +- v_bits_unpacked[1u] = 0u; +- v_bits_unpacked[2u] = 0u; +- v_bits_unpacked[3u] = 0u; +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); ++ while (v_p < v_p_max) { ++ v_i = ((uint32_t)(((uint32_t)(((uint32_t)(((uint32_t)((v_y >> v_tile_size_log2) * v_width_in_tiles)) + (v_x >> v_tile_size_log2))) * 4u)) + 1u)); ++ if (((uint64_t)(v_i)) < ((uint64_t)(a_tile_data.len))) { ++ v_hg = ((uint32_t)(a_tile_data.ptr[((uint64_t)(v_i))])); ++ } ++ v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[0u])); ++ while (true) { ++ v_node = self->private_data.f_huffman_nodes[v_hg][v_h]; ++ if (v_node >= 32768u) { ++ break; ++ } else if (v_node > 6265u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_huffman_code); ++ goto exit; ++ } ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_h = (((uint32_t)(v_node)) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ } ++ v_pixel_g = ((uint32_t)(((uint16_t)(v_node & 32767u)))); ++ if (v_pixel_g < 256u) { ++ v_color = (v_pixel_g << 8u); ++ v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[1u])); ++ while (true) { ++ v_node = self->private_data.f_huffman_nodes[v_hg][v_h]; ++ if (v_node >= 32768u) { ++ break; ++ } ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- } else { +- if (3u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[2u]; +- v_bits_unpacked[1u] = v_s.ptr[1u]; +- v_bits_unpacked[2u] = v_s.ptr[0u]; +- v_bits_unpacked[3u] = 255u; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 3u); +- if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | +- (((uint32_t)(v_bits_unpacked[1u])) << 8u) | +- (((uint32_t)(v_bits_unpacked[2u])) << 16u) | +- (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { +- v_bits_unpacked[0u] = 0u; +- v_bits_unpacked[1u] = 0u; +- v_bits_unpacked[2u] = 0u; +- v_bits_unpacked[3u] = 0u; +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ } ++ v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 16u); ++ v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[2u])); ++ while (true) { ++ v_node = self->private_data.f_huffman_nodes[v_hg][v_h]; ++ if (v_node >= 32768u) { ++ break; ++ } ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; + } +- } else if (v_src_bytes_per_pixel <= ((uint64_t)(v_s.len))) { +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__slice_u8__subslice_j(v_s, v_src_bytes_per_pixel)); +- v_s = wuffs_base__slice_u8__subslice_i(v_s, v_src_bytes_per_pixel); ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; + } ++ v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; + } +- v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); +- } +- } else if (self->private_impl.f_depth < 8u) { +- v_multiplier = 1u; +- if (self->private_impl.f_color_type == 0u) { +- v_multiplier = WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[self->private_impl.f_depth]; +- } +- v_shift = ((8u - self->private_impl.f_depth) & 7u); +- v_packs_remaining = 0u; +- while (v_x < self->private_impl.f_frame_rect_x1) { +- v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); +- if (v_i <= ((uint64_t)(v_dst.len))) { +- if ((v_packs_remaining == 0u) && (1u <= ((uint64_t)(v_s.len)))) { +- v_packs_remaining = WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[self->private_impl.f_depth]; +- v_bits_packed = v_s.ptr[0u]; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 0u); ++ v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[3u])); ++ while (true) { ++ v_node = self->private_data.f_huffman_nodes[v_hg][v_h]; ++ if (v_node >= 32768u) { ++ break; + } +- v_bits_unpacked[0u] = ((uint8_t)((v_bits_packed >> v_shift) * v_multiplier)); +- v_bits_packed = ((uint8_t)(v_bits_packed << self->private_impl.f_depth)); +- v_packs_remaining = ((uint8_t)(v_packs_remaining - 1u)); +- if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) { +- v_bits_unpacked[1u] = v_bits_unpacked[0u]; +- v_bits_unpacked[2u] = v_bits_unpacked[0u]; +- v_bits_unpacked[3u] = 255u; +- if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | +- (((uint32_t)(v_bits_unpacked[1u])) << 8u) | +- (((uint32_t)(v_bits_unpacked[2u])) << 16u) | +- (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { +- v_bits_unpacked[0u] = 0u; +- v_bits_unpacked[1u] = 0u; +- v_bits_unpacked[2u] = 0u; +- v_bits_unpacked[3u] = 0u; ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; + } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); +- } else { +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 1)); ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; + } ++ v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; + } +- v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); +- } +- } else { +- while (v_x < self->private_impl.f_frame_rect_x1) { +- v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); +- if (v_i <= ((uint64_t)(v_dst.len))) { +- if (self->private_impl.f_color_type == 0u) { +- if (2u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[1u]; +- v_bits_unpacked[1u] = v_s.ptr[0u]; +- v_bits_unpacked[2u] = v_s.ptr[1u]; +- v_bits_unpacked[3u] = v_s.ptr[0u]; +- v_bits_unpacked[4u] = v_s.ptr[1u]; +- v_bits_unpacked[5u] = v_s.ptr[0u]; +- v_bits_unpacked[6u] = 255u; +- v_bits_unpacked[7u] = 255u; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); +- if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) | +- (((uint64_t)(v_bits_unpacked[1u])) << 8u) | +- (((uint64_t)(v_bits_unpacked[2u])) << 16u) | +- (((uint64_t)(v_bits_unpacked[3u])) << 24u) | +- (((uint64_t)(v_bits_unpacked[4u])) << 32u) | +- (((uint64_t)(v_bits_unpacked[5u])) << 40u) | +- (((uint64_t)(v_bits_unpacked[6u])) << 48u) | +- (((uint64_t)(v_bits_unpacked[7u])) << 56u))) { +- v_bits_unpacked[0u] = 0u; +- v_bits_unpacked[1u] = 0u; +- v_bits_unpacked[2u] = 0u; +- v_bits_unpacked[3u] = 0u; +- v_bits_unpacked[4u] = 0u; +- v_bits_unpacked[5u] = 0u; +- v_bits_unpacked[6u] = 0u; +- v_bits_unpacked[7u] = 0u; ++ v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 24u); ++ } else if (v_pixel_g < 280u) { ++ if (v_pixel_g < 260u) { ++ v_back_ref_len_minus_1 = (v_pixel_g - 256u); ++ } else { ++ v_back_ref_len_n_bits = ((v_pixel_g - 258u) >> 1u); ++ v_back_ref_len_minus_1 = ((((uint32_t)(2u)) + (v_pixel_g & 1u)) << v_back_ref_len_n_bits); ++ while (self->private_impl.f_n_bits < v_back_ref_len_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; + } +- } else if (self->private_impl.f_color_type == 2u) { +- if (6u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[5u]; +- v_bits_unpacked[1u] = v_s.ptr[4u]; +- v_bits_unpacked[2u] = v_s.ptr[3u]; +- v_bits_unpacked[3u] = v_s.ptr[2u]; +- v_bits_unpacked[4u] = v_s.ptr[1u]; +- v_bits_unpacked[5u] = v_s.ptr[0u]; +- v_bits_unpacked[6u] = 255u; +- v_bits_unpacked[7u] = 255u; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 6u); +- if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) | +- (((uint64_t)(v_bits_unpacked[1u])) << 8u) | +- (((uint64_t)(v_bits_unpacked[2u])) << 16u) | +- (((uint64_t)(v_bits_unpacked[3u])) << 24u) | +- (((uint64_t)(v_bits_unpacked[4u])) << 32u) | +- (((uint64_t)(v_bits_unpacked[5u])) << 40u) | +- (((uint64_t)(v_bits_unpacked[6u])) << 48u) | +- (((uint64_t)(v_bits_unpacked[7u])) << 56u))) { +- v_bits_unpacked[0u] = 0u; +- v_bits_unpacked[1u] = 0u; +- v_bits_unpacked[2u] = 0u; +- v_bits_unpacked[3u] = 0u; +- v_bits_unpacked[4u] = 0u; +- v_bits_unpacked[5u] = 0u; +- v_bits_unpacked[6u] = 0u; +- v_bits_unpacked[7u] = 0u; ++ if (self->private_impl.f_n_bits >= v_back_ref_len_n_bits) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_back_ref_len_minus_1 += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_back_ref_len_n_bits) - 1u)); ++ self->private_impl.f_bits >>= v_back_ref_len_n_bits; ++ self->private_impl.f_n_bits -= v_back_ref_len_n_bits; ++ } ++ v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[4u])); ++ while (true) { ++ v_node = self->private_data.f_huffman_nodes[v_hg][v_h]; ++ if (v_node >= 32768u) { ++ break; ++ } ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; + } +- } else if (self->private_impl.f_color_type == 4u) { +- if (4u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[1u]; +- v_bits_unpacked[1u] = v_s.ptr[0u]; +- v_bits_unpacked[2u] = v_s.ptr[1u]; +- v_bits_unpacked[3u] = v_s.ptr[0u]; +- v_bits_unpacked[4u] = v_s.ptr[1u]; +- v_bits_unpacked[5u] = v_s.ptr[0u]; +- v_bits_unpacked[6u] = v_s.ptr[3u]; +- v_bits_unpacked[7u] = v_s.ptr[2u]; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ } ++ v_back_ref_dist_sym = ((uint32_t)(((uint16_t)(v_node & 32767u)))); ++ if (v_back_ref_dist_sym < 4u) { ++ v_back_ref_dist_premap_minus_1 = v_back_ref_dist_sym; ++ } else if (v_back_ref_dist_sym < 40u) { ++ v_back_ref_dist_n_bits = ((v_back_ref_dist_sym - 2u) >> 1u); ++ v_back_ref_dist_premap_minus_1 = ((((uint32_t)(2u)) + (v_back_ref_dist_sym & 1u)) << v_back_ref_dist_n_bits); ++ while (self->private_impl.f_n_bits < v_back_ref_dist_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; + } +- } else { +- if (8u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[5u]; +- v_bits_unpacked[1u] = v_s.ptr[4u]; +- v_bits_unpacked[2u] = v_s.ptr[3u]; +- v_bits_unpacked[3u] = v_s.ptr[2u]; +- v_bits_unpacked[4u] = v_s.ptr[1u]; +- v_bits_unpacked[5u] = v_s.ptr[0u]; +- v_bits_unpacked[6u] = v_s.ptr[7u]; +- v_bits_unpacked[7u] = v_s.ptr[6u]; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u); ++ if (self->private_impl.f_n_bits >= v_back_ref_dist_n_bits) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; + } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; + } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 8)); ++ v_back_ref_dist_premap_minus_1 += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_back_ref_dist_n_bits) - 1u)); ++ self->private_impl.f_bits >>= v_back_ref_dist_n_bits; ++ self->private_impl.f_n_bits -= v_back_ref_dist_n_bits; + } +- v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); ++ if (v_back_ref_dist_premap_minus_1 >= 120u) { ++ v_back_ref_dist_minus_1 = (v_back_ref_dist_premap_minus_1 - 120u); ++ } else { ++ v_dm = ((uint32_t)(WUFFS_WEBP__DISTANCE_MAP[v_back_ref_dist_premap_minus_1])); ++ v_dy = (v_dm >> 4u); ++ v_dx = ((uint32_t)(7u - (v_dm & 15u))); ++ v_back_ref_dist_minus_1 = ((uint32_t)((a_width * v_dy) + v_dx)); ++ } ++ v_p_end = (v_p + ((uint64_t)(((v_back_ref_len_minus_1 + 1u) * 4u)))); ++ v_dist4 = ((((uint64_t)(v_back_ref_dist_minus_1)) * 4u) + 4u); ++ if ((v_p_end > v_p_max) || (v_p_end > ((uint64_t)(a_dst.len))) || (v_p < v_dist4)) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_back_reference); ++ goto exit; ++ } ++ v_q = (v_p - v_dist4); ++ while ((v_q < v_p) && (v_p < v_p_end)) { ++ a_dst.ptr[v_p] = a_dst.ptr[v_q]; ++ v_p += 1u; ++ v_q += 1u; ++ } ++ v_x += (v_back_ref_len_minus_1 + 1u); ++ while (v_x >= a_width) { ++ v_x -= a_width; ++ v_y += 1u; ++ } ++ continue; ++ } else { ++ if ((v_color_cache_p > v_p) || (v_p > ((uint64_t)(a_dst.len)))) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer); ++ goto exit; ++ } ++ v_color_cache_pixels = wuffs_base__slice_u8__subslice_ij(a_dst, v_color_cache_p, v_p); ++ v_color_cache_p = v_p; ++ v_color_cache_shift = ((32u - self->private_impl.f_color_cache_bits) & 31u); ++ while (((uint64_t)(v_color_cache_pixels.len)) >= 4u) { ++ v_color = wuffs_base__peek_u32le__no_bounds_check(v_color_cache_pixels.ptr); ++ self->private_data.f_color_cache[((((uint32_t)(v_color * 506832829u)) >> v_color_cache_shift) & 2047u)] = v_color; ++ v_color_cache_pixels = wuffs_base__slice_u8__subslice_i(v_color_cache_pixels, 4u); ++ } ++ v_color = self->private_data.f_color_cache[((v_pixel_g - 280u) & 2047u)]; ++ } ++ if (v_p > ((uint64_t)(a_dst.len))) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer); ++ goto exit; ++ } ++ v_dst_pixel = wuffs_base__slice_u8__subslice_i(a_dst, v_p); ++ if (((uint64_t)(v_dst_pixel.len)) < 4u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer); ++ goto exit; ++ } ++ wuffs_base__poke_u32le__no_bounds_check(v_dst_pixel.ptr, v_color); ++ v_p += 4u; ++ v_x += 1u; ++ if (v_x == a_width) { ++ v_x = 0u; ++ v_y += 1u; + } + } +- v_prev_row = v_curr_row; +- v_y += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3u]); +- } +- return wuffs_base__make_status(NULL); +-} + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) ++ goto ok; ++ ok: ++ self->private_impl.p_decode_pixels_slow = 0; ++ goto exit; ++ } + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_pixels_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_pixels_slow.v_p = v_p; ++ self->private_data.s_decode_pixels_slow.v_p_max = v_p_max; ++ self->private_data.s_decode_pixels_slow.v_tile_size_log2 = v_tile_size_log2; ++ self->private_data.s_decode_pixels_slow.v_width_in_tiles = v_width_in_tiles; ++ self->private_data.s_decode_pixels_slow.v_x = v_x; ++ self->private_data.s_decode_pixels_slow.v_y = v_y; ++ self->private_data.s_decode_pixels_slow.v_hg = v_hg; ++ self->private_data.s_decode_pixels_slow.v_node = v_node; ++ self->private_data.s_decode_pixels_slow.v_color = v_color; ++ self->private_data.s_decode_pixels_slow.v_back_ref_len_n_bits = v_back_ref_len_n_bits; ++ self->private_data.s_decode_pixels_slow.v_back_ref_len_minus_1 = v_back_ref_len_minus_1; ++ self->private_data.s_decode_pixels_slow.v_back_ref_dist_n_bits = v_back_ref_dist_n_bits; ++ self->private_data.s_decode_pixels_slow.v_back_ref_dist_premap_minus_1 = v_back_ref_dist_premap_minus_1; ++ self->private_data.s_decode_pixels_slow.v_color_cache_p = v_color_cache_p; + +-// ---------------- Status Codes Implementations ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +-const char wuffs_tga__error__bad_header[] = "#tga: bad header"; +-const char wuffs_tga__error__bad_run_length_encoding[] = "#tga: bad run length encoding"; +-const char wuffs_tga__error__truncated_input[] = "#tga: truncated input"; +-const char wuffs_tga__error__unsupported_tga_file[] = "#tga: unsupported TGA file"; ++ return status; ++} + +-// ---------------- Private Consts ++// -------- func webp.decoder.apply_transform_predictor + +-// ---------------- Private Initializer Prototypes ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_predictor( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix, ++ wuffs_base__slice_u8 a_tile_data) { ++ uint64_t v_w4 = 0; ++ wuffs_base__slice_u8 v_prev_row = {0}; ++ wuffs_base__slice_u8 v_curr_row = {0}; ++ uint32_t v_tile_size_log2 = 0; ++ uint32_t v_tiles_per_row = 0; ++ uint32_t v_mask = 0; ++ uint32_t v_y = 0; ++ uint32_t v_x = 0; ++ uint64_t v_t = 0; ++ wuffs_base__slice_u8 v_tile_data = {0}; ++ uint8_t v_mode = 0; ++ uint32_t v_l0 = 0; ++ uint32_t v_l1 = 0; ++ uint32_t v_l2 = 0; ++ uint32_t v_l3 = 0; ++ uint32_t v_c0 = 0; ++ uint32_t v_c1 = 0; ++ uint32_t v_c2 = 0; ++ uint32_t v_c3 = 0; ++ uint32_t v_t0 = 0; ++ uint32_t v_t1 = 0; ++ uint32_t v_t2 = 0; ++ uint32_t v_t3 = 0; ++ uint32_t v_sum_l = 0; ++ uint32_t v_sum_t = 0; ++ ++ if ((self->private_impl.f_width <= 0u) || (self->private_impl.f_height <= 0u)) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_w4 = ((uint64_t)((self->private_impl.f_width * 4u))); ++ v_curr_row = wuffs_base__utility__empty_slice_u8(); ++ if (v_w4 <= ((uint64_t)(a_pix.len))) { ++ v_curr_row = wuffs_base__slice_u8__subslice_j(a_pix, v_w4); ++ } ++ if (((uint64_t)(v_curr_row.len)) >= 4u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[3u] += 255u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ while (((uint64_t)(v_curr_row.len)) >= 8u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += v_curr_row.ptr[0u]; ++ v_curr_row.ptr[5u] += v_curr_row.ptr[1u]; ++ v_curr_row.ptr[6u] += v_curr_row.ptr[2u]; ++ v_curr_row.ptr[7u] += v_curr_row.ptr[3u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_curr_row = wuffs_base__slice_u8__subslice_i(v_curr_row, 4u); ++ } ++ v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[0u])); ++ v_tiles_per_row = ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2); ++ v_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u); ++ v_y = 1u; ++ while (v_y < self->private_impl.f_height) { ++ v_t = ((uint64_t)((4u * (v_y >> v_tile_size_log2) * v_tiles_per_row))); ++ v_tile_data = wuffs_base__utility__empty_slice_u8(); ++ if (v_t <= ((uint64_t)(a_tile_data.len))) { ++ v_tile_data = wuffs_base__slice_u8__subslice_i(a_tile_data, v_t); ++ if (((uint64_t)(v_tile_data.len)) >= 4u) { ++ v_mode = ((uint8_t)(v_tile_data.ptr[1u] & 15u)); ++ v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u); ++ } ++ } ++ if (v_w4 <= ((uint64_t)(a_pix.len))) { ++ v_prev_row = a_pix; ++ a_pix = wuffs_base__slice_u8__subslice_i(a_pix, v_w4); ++ v_curr_row = a_pix; ++ } ++ if ((((uint64_t)(v_prev_row.len)) >= 4u) && (((uint64_t)(v_curr_row.len)) >= 4u)) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[0u] += v_prev_row.ptr[0u]; ++ v_curr_row.ptr[1u] += v_prev_row.ptr[1u]; ++ v_curr_row.ptr[2u] += v_prev_row.ptr[2u]; ++ v_curr_row.ptr[3u] += v_prev_row.ptr[3u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ v_x = 1u; ++ while (v_x < self->private_impl.f_width) { ++ if (((v_x & v_mask) == 0u) && (((uint64_t)(v_tile_data.len)) >= 4u)) { ++ v_mode = ((uint8_t)(v_tile_data.ptr[1u] & 15u)); ++ v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u); ++ } ++ if ((((uint64_t)(v_prev_row.len)) < 12u) || (((uint64_t)(v_curr_row.len)) < 8u)) { ++ break; ++ } ++ if (v_mode == 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[7u] += 255u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 1u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += v_curr_row.ptr[0u]; ++ v_curr_row.ptr[5u] += v_curr_row.ptr[1u]; ++ v_curr_row.ptr[6u] += v_curr_row.ptr[2u]; ++ v_curr_row.ptr[7u] += v_curr_row.ptr[3u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 2u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += v_prev_row.ptr[4u]; ++ v_curr_row.ptr[5u] += v_prev_row.ptr[5u]; ++ v_curr_row.ptr[6u] += v_prev_row.ptr[6u]; ++ v_curr_row.ptr[7u] += v_prev_row.ptr[7u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 3u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += v_prev_row.ptr[8u]; ++ v_curr_row.ptr[5u] += v_prev_row.ptr[9u]; ++ v_curr_row.ptr[6u] += v_prev_row.ptr[10u]; ++ v_curr_row.ptr[7u] += v_prev_row.ptr[11u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 4u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += v_prev_row.ptr[0u]; ++ v_curr_row.ptr[5u] += v_prev_row.ptr[1u]; ++ v_curr_row.ptr[6u] += v_prev_row.ptr[2u]; ++ v_curr_row.ptr[7u] += v_prev_row.ptr[3u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 5u) { ++ v_l0 = ((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u); ++ v_l1 = ((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u); ++ v_l2 = ((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u); ++ v_l3 = ((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((v_l0 + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((v_l1 + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((v_l2 + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((v_l3 + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 6u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[0u]))) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[1u]))) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[2u]))) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[3u]))) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 7u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 8u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 9u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[4u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[5u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[6u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[7u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 10u) { ++ v_l0 = ((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[0u]))) / 2u); ++ v_l1 = ((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[1u]))) / 2u); ++ v_l2 = ((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[2u]))) / 2u); ++ v_l3 = ((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[3u]))) / 2u); ++ v_t0 = ((((uint32_t)(v_prev_row.ptr[4u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u); ++ v_t1 = ((((uint32_t)(v_prev_row.ptr[5u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u); ++ v_t2 = ((((uint32_t)(v_prev_row.ptr[6u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u); ++ v_t3 = ((((uint32_t)(v_prev_row.ptr[7u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((v_l0 + v_t0) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((v_l1 + v_t1) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((v_l2 + v_t2) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((v_l3 + v_t3) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 11u) { ++ v_l0 = ((uint32_t)(v_curr_row.ptr[0u])); ++ v_l1 = ((uint32_t)(v_curr_row.ptr[1u])); ++ v_l2 = ((uint32_t)(v_curr_row.ptr[2u])); ++ v_l3 = ((uint32_t)(v_curr_row.ptr[3u])); ++ v_c0 = ((uint32_t)(v_prev_row.ptr[0u])); ++ v_c1 = ((uint32_t)(v_prev_row.ptr[1u])); ++ v_c2 = ((uint32_t)(v_prev_row.ptr[2u])); ++ v_c3 = ((uint32_t)(v_prev_row.ptr[3u])); ++ v_t0 = ((uint32_t)(v_prev_row.ptr[4u])); ++ v_t1 = ((uint32_t)(v_prev_row.ptr[5u])); ++ v_t2 = ((uint32_t)(v_prev_row.ptr[6u])); ++ v_t3 = ((uint32_t)(v_prev_row.ptr[7u])); ++ v_sum_l = (wuffs_webp__decoder__absolute_difference(self, v_c0, v_t0) + ++ wuffs_webp__decoder__absolute_difference(self, v_c1, v_t1) + ++ wuffs_webp__decoder__absolute_difference(self, v_c2, v_t2) + ++ wuffs_webp__decoder__absolute_difference(self, v_c3, v_t3)); ++ v_sum_t = (wuffs_webp__decoder__absolute_difference(self, v_c0, v_l0) + ++ wuffs_webp__decoder__absolute_difference(self, v_c1, v_l1) + ++ wuffs_webp__decoder__absolute_difference(self, v_c2, v_l2) + ++ wuffs_webp__decoder__absolute_difference(self, v_c3, v_l3)); ++ if (v_sum_l < v_sum_t) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(v_l0)); ++ v_curr_row.ptr[5u] += ((uint8_t)(v_l1)); ++ v_curr_row.ptr[6u] += ((uint8_t)(v_l2)); ++ v_curr_row.ptr[7u] += ((uint8_t)(v_l3)); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(v_t0)); ++ v_curr_row.ptr[5u] += ((uint8_t)(v_t1)); ++ v_curr_row.ptr[6u] += ((uint8_t)(v_t2)); ++ v_curr_row.ptr[7u] += ((uint8_t)(v_t3)); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ } else if (v_mode == 12u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[0u], v_prev_row.ptr[4u], v_prev_row.ptr[0u]); ++ v_curr_row.ptr[5u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[1u], v_prev_row.ptr[5u], v_prev_row.ptr[1u]); ++ v_curr_row.ptr[6u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[2u], v_prev_row.ptr[6u], v_prev_row.ptr[2u]); ++ v_curr_row.ptr[7u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[3u], v_prev_row.ptr[7u], v_prev_row.ptr[3u]); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 13u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[0u], v_prev_row.ptr[4u], v_prev_row.ptr[0u]); ++ v_curr_row.ptr[5u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[1u], v_prev_row.ptr[5u], v_prev_row.ptr[1u]); ++ v_curr_row.ptr[6u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[2u], v_prev_row.ptr[6u], v_prev_row.ptr[2u]); ++ v_curr_row.ptr[7u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[3u], v_prev_row.ptr[7u], v_prev_row.ptr[3u]); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ v_curr_row = wuffs_base__slice_u8__subslice_i(v_curr_row, 4u); ++ v_prev_row = wuffs_base__slice_u8__subslice_i(v_prev_row, 4u); ++ v_x += 1u; ++ } ++ v_y += 1u; ++ } ++ return wuffs_base__make_empty_struct(); ++} + +-// ---------------- Private Function Prototypes ++// -------- func webp.decoder.absolute_difference + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_tga__decoder__do_decode_image_config( +- wuffs_tga__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); ++static uint32_t ++wuffs_webp__decoder__absolute_difference( ++ const wuffs_webp__decoder* self, ++ uint32_t a_a, ++ uint32_t a_b) { ++ if (a_a < a_b) { ++ return (a_b - a_a); ++ } ++ return (a_a - a_b); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_tga__decoder__do_decode_frame_config( +- wuffs_tga__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); ++// -------- func webp.decoder.mode12 + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_tga__decoder__do_decode_frame( +- wuffs_tga__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++static uint8_t ++wuffs_webp__decoder__mode12( ++ const wuffs_webp__decoder* self, ++ uint8_t a_l, ++ uint8_t a_t, ++ uint8_t a_tl) { ++ uint32_t v_v = 0; + +-// ---------------- VTables ++ v_v = ((uint32_t)((((uint32_t)(a_l)) + ((uint32_t)(a_t))) - ((uint32_t)(a_tl)))); ++ if (v_v < 256u) { ++ return ((uint8_t)(v_v)); ++ } else if (v_v < 512u) { ++ return 255u; ++ } ++ return 0u; ++} + +-const wuffs_base__image_decoder__func_ptrs +-wuffs_tga__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_tga__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_tga__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_tga__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_tga__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_tga__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_tga__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_tga__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_tga__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_tga__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_tga__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_tga__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_tga__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_tga__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_tga__decoder__workbuf_len), +-}; ++// -------- func webp.decoder.mode13 + +-// ---------------- Initializer Implementations ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_webp__decoder__mode13( ++ const wuffs_webp__decoder* self, ++ uint8_t a_l, ++ uint8_t a_t, ++ uint8_t a_tl) { ++ uint32_t v_x = 0; ++ uint32_t v_y = 0; ++ uint32_t v_z = 0; ++ uint32_t v_v = 0; + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_tga__decoder__initialize( +- wuffs_tga__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ v_x = ((((uint32_t)(a_l)) + ((uint32_t)(a_t))) / 2u); ++ v_y = ((uint32_t)(a_tl)); ++ v_z = ((uint32_t)(v_x - v_y)); ++ v_v = ((uint32_t)(v_x + wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(v_z + (v_z >> 31u))), 1u))); ++ if (v_v < 256u) { ++ return ((uint8_t)(v_v)); ++ } else if (v_v < 512u) { ++ return 255u; + } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ return 0u; ++} ++ ++// -------- func webp.decoder.apply_transform_cross_color ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_cross_color( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix, ++ wuffs_base__slice_u8 a_tile_data) { ++ uint32_t v_tile_size_log2 = 0; ++ uint32_t v_tiles_per_row = 0; ++ uint32_t v_mask = 0; ++ uint32_t v_y = 0; ++ uint32_t v_x = 0; ++ uint64_t v_t = 0; ++ wuffs_base__slice_u8 v_tile_data = {0}; ++ uint32_t v_g2r = 0; ++ uint32_t v_g2b = 0; ++ uint32_t v_r2b = 0; ++ uint8_t v_b = 0; ++ uint8_t v_g = 0; ++ uint8_t v_r = 0; ++ ++ v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[1u])); ++ v_tiles_per_row = ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2); ++ v_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u); ++ v_y = 0u; ++ while (v_y < self->private_impl.f_height) { ++ v_t = ((uint64_t)((4u * (v_y >> v_tile_size_log2) * v_tiles_per_row))); ++ v_tile_data = wuffs_base__utility__empty_slice_u8(); ++ if (v_t <= ((uint64_t)(a_tile_data.len))) { ++ v_tile_data = wuffs_base__slice_u8__subslice_i(a_tile_data, v_t); ++ } ++ v_x = 0u; ++ while (v_x < self->private_impl.f_width) { ++ if (((v_x & v_mask) == 0u) && (((uint64_t)(v_tile_data.len)) >= 4u)) { ++ v_g2r = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[0u]); ++ v_g2b = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[1u]); ++ v_r2b = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[2u]); ++ v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u); ++ } ++ if (((uint64_t)(a_pix.len)) >= 4u) { ++ v_b = a_pix.ptr[0u]; ++ v_g = a_pix.ptr[1u]; ++ v_r = a_pix.ptr[2u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_r += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_g) * v_g2r)) >> 5u))); ++ v_b += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_g) * v_g2b)) >> 5u))); ++ v_b += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_r) * v_r2b)) >> 5u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ a_pix.ptr[0u] = v_b; ++ a_pix.ptr[2u] = v_r; ++ a_pix = wuffs_base__slice_u8__subslice_i(a_pix, 4u); ++ } ++ v_x += 1u; ++ } ++ v_y += 1u; + } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func webp.decoder.apply_transform_subtract_green ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_subtract_green( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix) { ++ wuffs_base__slice_u8 v_p = {0}; ++ uint8_t v_g = 0; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) ++ { ++ wuffs_base__slice_u8 i_slice_p = a_pix; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 4; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 4) * 4)); ++ while (v_p.ptr < i_end0_p) { ++ v_g = v_p.ptr[1u]; ++#if defined(__GNUC__) + #pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#pragma GCC diagnostic ignored "-Wconversion" + #endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) ++ v_p.ptr[0u] += v_g; ++ v_p.ptr[2u] += v_g; ++#if defined(__GNUC__) + #pragma GCC diagnostic pop + #endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ v_p.ptr += 4; + } ++ v_p.len = 0; + } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_tga__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); ++ return wuffs_base__make_empty_struct(); + } + +-wuffs_tga__decoder* +-wuffs_tga__decoder__alloc(void) { +- wuffs_tga__decoder* x = +- (wuffs_tga__decoder*)(calloc(sizeof(wuffs_tga__decoder), 1)); +- if (!x) { +- return NULL; ++// -------- func webp.decoder.apply_transform_color_indexing ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_color_indexing( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix) { ++ uint32_t v_tile_size_log2 = 0; ++ uint32_t v_bits_per_pixel = 0; ++ uint32_t v_x_mask = 0; ++ uint32_t v_s_mask = 0; ++ uint64_t v_src_index = 0; ++ uint32_t v_y = 0; ++ uint64_t v_di = 0; ++ uint64_t v_dj = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint32_t v_x = 0; ++ uint32_t v_s = 0; ++ uint32_t v_p = 0; ++ uint8_t v_p0 = 0; ++ uint8_t v_p1 = 0; ++ uint8_t v_p2 = 0; ++ uint8_t v_p3 = 0; ++ ++ v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[3u])); ++ if (v_tile_size_log2 == 0u) { ++ { ++ wuffs_base__slice_u8 i_slice_dst = a_pix; ++ v_dst.ptr = i_slice_dst.ptr; ++ v_dst.len = 4; ++ const uint8_t* i_end0_dst = wuffs_private_impl__ptr_u8_plus_len(v_dst.ptr, (((i_slice_dst.len - (size_t)(v_dst.ptr - i_slice_dst.ptr)) / 4) * 4)); ++ while (v_dst.ptr < i_end0_dst) { ++ v_p = (((uint32_t)(v_dst.ptr[1u])) * 4u); ++ v_p0 = self->private_data.f_palette[(v_p + 0u)]; ++ v_p1 = self->private_data.f_palette[(v_p + 1u)]; ++ v_p2 = self->private_data.f_palette[(v_p + 2u)]; ++ v_p3 = self->private_data.f_palette[(v_p + 3u)]; ++ v_dst.ptr[0u] = v_p0; ++ v_dst.ptr[1u] = v_p1; ++ v_dst.ptr[2u] = v_p2; ++ v_dst.ptr[3u] = v_p3; ++ v_dst.ptr += 4; ++ } ++ v_dst.len = 0; ++ } ++ return wuffs_base__make_empty_struct(); + } +- if (wuffs_tga__decoder__initialize( +- x, sizeof(wuffs_tga__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ v_bits_per_pixel = (((uint32_t)(8u)) >> v_tile_size_log2); ++ v_x_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u); ++ v_s_mask = ((((uint32_t)(1u)) << v_bits_per_pixel) - 1u); ++ v_src_index = ((uint64_t)((self->private_impl.f_workbuf_offset_for_color_indexing + 1u))); ++ v_y = 0u; ++ while (v_y < self->private_impl.f_height) { ++ v_di = ((uint64_t)((4u * (v_y + 0u) * self->private_impl.f_width))); ++ v_dj = ((uint64_t)((4u * (v_y + 1u) * self->private_impl.f_width))); ++ if ((v_di > v_dj) || (v_dj > ((uint64_t)(a_pix.len)))) { ++ break; ++ } ++ v_dst = wuffs_base__slice_u8__subslice_ij(a_pix, v_di, v_dj); ++ v_x = 0u; ++ while (((uint64_t)(v_dst.len)) >= 4u) { ++ if (((v_x & v_x_mask) == 0u) && (v_src_index < ((uint64_t)(a_pix.len)))) { ++ v_s = ((uint32_t)(a_pix.ptr[v_src_index])); ++ v_src_index += 4u; ++ } ++ v_p = ((v_s & v_s_mask) * 4u); ++ v_s >>= v_bits_per_pixel; ++ v_p0 = self->private_data.f_palette[(v_p + 0u)]; ++ v_p1 = self->private_data.f_palette[(v_p + 1u)]; ++ v_p2 = self->private_data.f_palette[(v_p + 2u)]; ++ v_p3 = self->private_data.f_palette[(v_p + 3u)]; ++ v_dst.ptr[0u] = v_p0; ++ v_dst.ptr[1u] = v_p1; ++ v_dst.ptr[2u] = v_p2; ++ v_dst.ptr[3u] = v_p3; ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, 4u); ++ v_x += 1u; ++ } ++ v_y += 1u; + } +- return x; +-} +- +-size_t +-sizeof__wuffs_tga__decoder(void) { +- return sizeof(wuffs_tga__decoder); ++ return wuffs_base__make_empty_struct(); + } + +-// ---------------- Function Implementations +- +-// -------- func tga.decoder.get_quirk ++// -------- func webp.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__get_quirk( +- const wuffs_tga__decoder* self, ++wuffs_webp__decoder__get_quirk( ++ const wuffs_webp__decoder* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -59162,12 +73627,12 @@ wuffs_tga__decoder__get_quirk( + return 0u; + } + +-// -------- func tga.decoder.set_quirk ++// -------- func webp.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__set_quirk( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__set_quirk( ++ wuffs_webp__decoder* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -59183,12 +73648,12 @@ wuffs_tga__decoder__set_quirk( + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func tga.decoder.decode_image_config ++// -------- func webp.decoder.decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_image_config( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__decode_image_config( ++ wuffs_webp__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { +@@ -59214,17 +73679,17 @@ wuffs_tga__decoder__decode_image_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_image_config(self, a_dst, a_src); ++ wuffs_base__status t_0 = wuffs_webp__decoder__do_decode_image_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_webp__error__truncated_input); + goto exit; + } + status = v_status; +@@ -59232,13 +73697,13 @@ wuffs_tga__decoder__decode_image_config( + } + + ok: +- self->private_impl.p_decode_image_config[0] = 0; ++ self->private_impl.p_decode_image_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; +@@ -59249,19 +73714,19 @@ wuffs_tga__decoder__decode_image_config( + return status; + } + +-// -------- func tga.decoder.do_decode_image_config ++// -------- func webp.decoder.do_decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_tga__decoder__do_decode_image_config( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__do_decode_image_config( ++ wuffs_webp__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_c = 0; +- uint32_t v_c5 = 0; +- uint32_t v_i = 0; ++ uint32_t v_c32 = 0; ++ uint64_t v_r_mark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -59274,10 +73739,7 @@ wuffs_tga__decoder__do_decode_image_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_do_decode_image_config[0].v_i; +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +@@ -59287,411 +73749,446 @@ wuffs_tga__decoder__do_decode_image_config( + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- self->private_impl.f_header_id_length = t_0; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- self->private_impl.f_header_color_map_type = t_1; +- } +- if (self->private_impl.f_header_color_map_type > 1u) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_header); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- self->private_impl.f_header_image_type = t_2; +- } +- if ((self->private_impl.f_header_image_type == 1u) || +- (self->private_impl.f_header_image_type == 2u) || +- (self->private_impl.f_header_image_type == 3u) || +- (self->private_impl.f_header_image_type == 9u) || +- (self->private_impl.f_header_image_type == 10u) || +- (self->private_impl.f_header_image_type == 11u)) { +- } else { +- status = wuffs_base__make_status(wuffs_tga__error__bad_header); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- uint16_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_3 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- iop_a_src += 2; ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; +- if (num_bits_3 == 8) { +- t_3 = ((uint16_t)(*scratch)); ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); + break; + } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; + } + } +- self->private_impl.f_header_color_map_first_entry_index = t_3; ++ v_c32 = t_0; ++ } ++ if (v_c32 != 1179011410u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint16_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- iop_a_src += 2; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 8) { +- t_4 = ((uint16_t)(*scratch)); ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); + break; + } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; + } + } +- self->private_impl.f_header_color_map_length = t_4; ++ self->private_impl.f_riff_chunk_length = t_1; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_5 = *iop_a_src++; +- self->private_impl.f_header_color_map_entry_size = t_5; ++ if ((self->private_impl.f_riff_chunk_length & 1u) != 0u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; + } +- if (self->private_impl.f_header_color_map_type != 0u) { +- if ((self->private_impl.f_header_color_map_first_entry_index != 0u) || (self->private_impl.f_header_color_map_length > 256u)) { +- status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); +- goto exit; +- } else if ((self->private_impl.f_header_color_map_entry_size != 15u) && +- (self->private_impl.f_header_color_map_entry_size != 16u) && +- (self->private_impl.f_header_color_map_entry_size != 24u) && +- (self->private_impl.f_header_color_map_entry_size != 32u)) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_header); +- goto exit; ++ while (true) { ++ { ++ const bool o_0_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_0_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_riff_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; ++ } ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_webp__decoder__do_decode_image_config_limited(self, a_src); ++ v_status = t_2; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_riff_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ io2_a_src = o_0_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_0_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); ++ } + } +- } else { +- if ((self->private_impl.f_header_color_map_first_entry_index != 0u) || (self->private_impl.f_header_color_map_length != 0u) || (self->private_impl.f_header_color_map_entry_size != 0u)) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_header); ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if ( ! wuffs_base__status__is_suspension(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } else if ((v_status.repr == wuffs_base__suspension__short_read) && (self->private_impl.f_riff_chunk_length == 0u)) { ++ status = wuffs_base__make_status(wuffs_webp__error__short_chunk); + goto exit; + } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); + } +- self->private_data.s_do_decode_image_config[0].scratch = 4u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ false); + } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; ++ self->private_impl.f_call_sequence = 32u; ++ ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func webp.decoder.do_decode_image_config_limited ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_image_config_limited( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_c32 = 0; ++ uint64_t v_r_mark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config_limited; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- uint32_t t_6; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ self->private_data.s_do_decode_image_config_limited.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56)); ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6; +- if (num_bits_6 == 8) { +- t_6 = ((uint32_t)(*scratch)); ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); + break; + } +- num_bits_6 += 8u; +- *scratch |= ((uint64_t)(num_bits_6)) << 56; ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; + } + } +- self->private_impl.f_width = t_6; ++ v_c32 = t_0; ++ } ++ if (v_c32 != 1346520407u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- uint32_t t_7; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_7 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ self->private_data.s_do_decode_image_config_limited.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; +- if (num_bits_7 == 8) { +- t_7 = ((uint32_t)(*scratch)); ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); + break; + } +- num_bits_7 += 8u; +- *scratch |= ((uint64_t)(num_bits_7)) << 56; ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; + } + } +- self->private_impl.f_height = t_7; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_8 = *iop_a_src++; +- self->private_impl.f_header_pixel_depth = t_8; ++ v_c32 = t_1; + } +- if ((self->private_impl.f_header_pixel_depth != 1u) && +- (self->private_impl.f_header_pixel_depth != 8u) && +- (self->private_impl.f_header_pixel_depth != 15u) && +- (self->private_impl.f_header_pixel_depth != 16u) && +- (self->private_impl.f_header_pixel_depth != 24u) && +- (self->private_impl.f_header_pixel_depth != 32u)) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_header); ++ if (v_c32 == 540561494u) { ++ status = wuffs_base__make_status(wuffs_webp__error__unsupported_webp_file); + goto exit; +- } +- if ((self->private_impl.f_header_image_type | 8u) == 9u) { +- self->private_impl.f_scratch_bytes_per_pixel = 1u; +- self->private_impl.f_src_bytes_per_pixel = 1u; +- self->private_impl.f_src_pixfmt = 2164523016u; +- self->private_impl.f_opaque = ((self->private_impl.f_header_color_map_entry_size == 15u) || (self->private_impl.f_header_color_map_entry_size == 24u)); +- } else if ((self->private_impl.f_header_image_type | 8u) == 10u) { +- if ((self->private_impl.f_header_pixel_depth == 15u) || (self->private_impl.f_header_pixel_depth == 16u)) { +- self->private_impl.f_scratch_bytes_per_pixel = 4u; +- self->private_impl.f_src_bytes_per_pixel = 0u; +- self->private_impl.f_src_pixfmt = 2164295816u; +- } else if (self->private_impl.f_header_pixel_depth == 24u) { +- self->private_impl.f_scratch_bytes_per_pixel = 3u; +- self->private_impl.f_src_bytes_per_pixel = 3u; +- self->private_impl.f_src_pixfmt = 2147485832u; +- self->private_impl.f_opaque = true; +- } else if (self->private_impl.f_header_pixel_depth == 32u) { +- self->private_impl.f_scratch_bytes_per_pixel = 4u; +- self->private_impl.f_src_bytes_per_pixel = 4u; +- self->private_impl.f_src_pixfmt = 2164295816u; +- } else { +- status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); +- goto exit; ++ } else if (v_c32 == 1278758998u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config_limited.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ self->private_impl.f_sub_chunk_length = t_2; + } +- } else { +- if (self->private_impl.f_header_pixel_depth == 8u) { +- self->private_impl.f_scratch_bytes_per_pixel = 1u; +- self->private_impl.f_src_bytes_per_pixel = 1u; +- self->private_impl.f_src_pixfmt = 536870920u; +- self->private_impl.f_opaque = true; +- } else { +- status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); ++ if (self->private_impl.f_sub_chunk_length < 4u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); + goto exit; + } +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_9 = *iop_a_src++; +- self->private_impl.f_header_image_descriptor = t_9; +- } +- if ((self->private_impl.f_header_image_descriptor & 16u) != 0u) { +- status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); +- goto exit; +- } +- self->private_data.s_do_decode_image_config[0].scratch = ((uint32_t)(self->private_impl.f_header_id_length)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- if (self->private_impl.f_header_color_map_type != 0u) { +- while (v_i < ((uint32_t)(self->private_impl.f_header_color_map_length))) { +- if (self->private_impl.f_header_color_map_entry_size == 24u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); +- uint32_t t_10; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { +- t_10 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); +- iop_a_src += 3; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10; +- if (num_bits_10 == 16) { +- t_10 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_10 += 8u; +- *scratch |= ((uint64_t)(num_bits_10)) << 56; +- } +- } +- v_c = t_10; ++ self->private_impl.f_sub_chunk_has_padding = ((self->private_impl.f_sub_chunk_length & 1u) != 0u); ++ while (true) { ++ { ++ const bool o_0_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_0_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_sub_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; + } +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c >> 0u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c >> 8u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c >> 16u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u; +- } else if (self->private_impl.f_header_color_map_entry_size == 32u) { ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); +- uint32_t t_11; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11; +- if (num_bits_11 == 24) { +- t_11 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_11 += 8u; +- *scratch |= ((uint64_t)(num_bits_11)) << 56; +- } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_c = t_11; +- } +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c >> 0u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c >> 8u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c >> 16u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = ((uint8_t)((v_c >> 24u))); +- } else { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); +- uint32_t t_12; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_12 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12; +- if (num_bits_12 == 8) { +- t_12 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_12 += 8u; +- *scratch |= ((uint64_t)(num_bits_12)) << 56; +- } ++ wuffs_base__status t_3 = wuffs_webp__decoder__do_decode_image_config_limited_vp8l(self, a_src); ++ v_status = t_3; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- v_c = t_12; + } +- v_c5 = (31u & (v_c >> 0u)); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 5u)); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 10u)); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u; ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_sub_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ io2_a_src = o_0_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_0_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if ( ! wuffs_base__status__is_suspension(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } else if ((v_status.repr == wuffs_base__suspension__short_read) && (self->private_impl.f_sub_chunk_length == 0u)) { ++ status = wuffs_base__make_status(wuffs_webp__error__short_chunk); ++ goto exit; + } +- v_i += 1u; ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); + } +- while (v_i < 256u) { +- self->private_data.f_src_palette[((v_i * 4u) + 0u)] = 0u; +- self->private_data.f_src_palette[((v_i * 4u) + 1u)] = 0u; +- self->private_data.f_src_palette[((v_i * 4u) + 2u)] = 0u; +- self->private_data.f_src_palette[((v_i * 4u) + 3u)] = 255u; +- v_i += 1u; ++ } else if (v_c32 == 1480085590u) { ++ status = wuffs_base__make_status(wuffs_webp__error__unsupported_webp_file); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; ++ } ++ ++ ok: ++ self->private_impl.p_do_decode_image_config_limited = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config_limited = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func webp.decoder.do_decode_image_config_limited_vp8l ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_image_config_limited_vp8l( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_c32 = 0; ++ uint32_t v_transform_size = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config_limited_vp8l; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint32_t t_0 = *iop_a_src++; ++ v_c32 = t_0; + } +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- self->private_impl.f_src_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- self->private_impl.f_opaque); ++ if (v_c32 != 47u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; + } +- self->private_impl.f_call_sequence = 32u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config_limited_vp8l.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited_vp8l.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_c32 = t_1; ++ } ++ self->private_impl.f_width = ((v_c32 & 16383u) + 1u); ++ v_c32 >>= 14u; ++ self->private_impl.f_height = ((v_c32 & 16383u) + 1u); ++ v_c32 >>= 14u; ++ self->private_impl.f_pixfmt = 2415954056u; ++ if ((v_c32 & 1u) != 0u) { ++ self->private_impl.f_pixfmt = 2164295816u; ++ } ++ v_c32 >>= 1u; ++ if (v_c32 != 0u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; ++ } ++ v_transform_size = (4u * ((self->private_impl.f_width + 3u) >> 2u) * ((self->private_impl.f_height + 3u) >> 2u)); ++ self->private_impl.f_workbuf_offset_for_transform[0u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (0u * v_transform_size)); ++ self->private_impl.f_workbuf_offset_for_transform[1u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (1u * v_transform_size)); ++ self->private_impl.f_workbuf_offset_for_transform[2u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (2u * v_transform_size)); ++ self->private_impl.f_workbuf_offset_for_transform[3u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (3u * v_transform_size)); + + goto ok; + ok: +- self->private_impl.p_do_decode_image_config[0] = 0; ++ self->private_impl.p_do_decode_image_config_limited_vp8l = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_image_config[0].v_i = v_i; ++ self->private_impl.p_do_decode_image_config_limited_vp8l = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -59702,12 +74199,12 @@ wuffs_tga__decoder__do_decode_image_config( + return status; + } + +-// -------- func tga.decoder.decode_frame_config ++// -------- func webp.decoder.decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_frame_config( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__decode_frame_config( ++ wuffs_webp__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { +@@ -59733,17 +74230,17 @@ wuffs_tga__decoder__decode_frame_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_frame_config(self, a_dst, a_src); ++ wuffs_base__status t_0 = wuffs_webp__decoder__do_decode_frame_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_webp__error__truncated_input); + goto exit; + } + status = v_status; +@@ -59751,13 +74248,13 @@ wuffs_tga__decoder__decode_frame_config( + } + + ok: +- self->private_impl.p_decode_frame_config[0] = 0; ++ self->private_impl.p_decode_frame_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + + goto exit; +@@ -59768,12 +74265,12 @@ wuffs_tga__decoder__decode_frame_config( + return status; + } + +-// -------- func tga.decoder.do_decode_frame_config ++// -------- func webp.decoder.do_decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_tga__decoder__do_decode_frame_config( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__do_decode_frame_config( ++ wuffs_webp__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); +@@ -59789,7 +74286,7 @@ wuffs_tga__decoder__do_decode_frame_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +@@ -59799,7 +74296,7 @@ wuffs_tga__decoder__do_decode_frame_config( + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_tga__decoder__do_decode_image_config(self, NULL, a_src); ++ status = wuffs_webp__decoder__do_decode_image_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +@@ -59831,20 +74328,20 @@ wuffs_tga__decoder__do_decode_frame_config( + 0u, + self->private_impl.f_frame_config_io_position, + 0u, +- self->private_impl.f_opaque, + false, +- 4278190080u); ++ false, ++ 0u); + } + self->private_impl.f_call_sequence = 64u; + + ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; ++ self->private_impl.p_do_decode_frame_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -59855,12 +74352,12 @@ wuffs_tga__decoder__do_decode_frame_config( + return status; + } + +-// -------- func tga.decoder.decode_frame ++// -------- func webp.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_frame( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__decode_frame( ++ wuffs_webp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, +@@ -59889,13 +74386,13 @@ wuffs_tga__decoder__decode_frame( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_frame(self, ++ wuffs_base__status t_0 = wuffs_webp__decoder__do_decode_frame(self, + a_dst, + a_src, + a_blend, +@@ -59904,64 +74401,627 @@ wuffs_tga__decoder__decode_frame( + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_webp__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func webp.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_frame( ++ wuffs_webp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_has_more = 0; ++ uint32_t v_width = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ wuffs_base__slice_u8 v_tile_data = {0}; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ wuffs_base__slice_u8 v_pix = {0}; ++ uint32_t v_which = 0; ++ uint32_t v_transform_type = 0; ++ uint64_t v_ti = 0; ++ uint64_t v_tj = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ if (coro_susp_point) { ++ v_width = self->private_data.s_do_decode_frame.v_width; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_webp__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ self->private_impl.f_seen_transform[0u] = false; ++ self->private_impl.f_seen_transform[1u] = false; ++ self->private_impl.f_seen_transform[2u] = false; ++ self->private_impl.f_seen_transform[3u] = false; ++ self->private_impl.f_n_transforms = 0u; ++ while (true) { ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_has_more = (self->private_impl.f_bits & 1u); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ if (v_has_more == 0u) { ++ break; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_webp__decoder__decode_transform(self, a_src, a_workbuf); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ v_width = self->private_impl.f_width; ++ if (self->private_impl.f_seen_transform[3u]) { ++ v_width = self->private_impl.f_color_indexing_width; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_overall_color_cache_bits = self->private_impl.f_color_cache_bits; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ status = wuffs_webp__decoder__decode_hg_table(self, a_src, v_width, a_workbuf); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_color_cache_bits = self->private_impl.f_overall_color_cache_bits; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, self->private_impl.f_overall_n_huffman_groups); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ while (true) { ++ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_color_indexing)) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u]))) || ++ (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || ++ (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len))) || ++ (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ v_dst = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_color_indexing)), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u]))); ++ v_tile_data = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_1 = wuffs_webp__decoder__decode_pixels(self, ++ v_dst, ++ a_src, ++ v_width, ++ self->private_impl.f_height, ++ v_tile_data, ++ self->private_impl.f_overall_tile_size_log2); ++ v_status = t_1; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ } ++ if (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(a_workbuf.len))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ v_pix = wuffs_base__slice_u8__subslice_j(a_workbuf, ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u]))); ++ v_which = self->private_impl.f_n_transforms; ++ while (v_which > 0u) { ++ v_which -= 1u; ++ v_transform_type = ((uint32_t)(self->private_impl.f_transform_type[v_which])); ++ v_tile_data = wuffs_base__utility__empty_slice_u8(); ++ if (v_transform_type < 2u) { ++ v_ti = ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])); ++ v_tj = ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)])); ++ if ((v_ti <= v_tj) && (v_tj <= ((uint64_t)(a_workbuf.len)))) { ++ v_tile_data = wuffs_base__slice_u8__subslice_ij(a_workbuf, v_ti, v_tj); ++ } ++ } ++ if (v_transform_type == 0u) { ++ wuffs_webp__decoder__apply_transform_predictor(self, v_pix, v_tile_data); ++ } else if (v_transform_type == 1u) { ++ wuffs_webp__decoder__apply_transform_cross_color(self, v_pix, v_tile_data); ++ } else if (v_transform_type == 2u) { ++ wuffs_webp__decoder__apply_transform_subtract_green(self, v_pix); ++ } else { ++ wuffs_webp__decoder__apply_transform_color_indexing(self, v_pix); ++ v_width = self->private_impl.f_width; ++ } ++ } ++ v_status = wuffs_webp__decoder__swizzle(self, a_dst, v_pix, a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_frame.v_width = v_width; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func webp.decoder.decode_transform ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_transform( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint8_t v_c8 = 0; ++ uint32_t v_transform_type = 0; ++ uint32_t v_tile_size_log2 = 0; ++ wuffs_base__slice_u8 v_p = {0}; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_transform; ++ if (coro_susp_point) { ++ v_transform_type = self->private_data.s_decode_transform.v_transform_type; ++ v_tile_size_log2 = self->private_data.s_decode_transform.v_tile_size_log2; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_n_bits < 2u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (self->private_impl.f_n_bits >= 2u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_transform_type = (self->private_impl.f_bits & 3u); ++ self->private_impl.f_bits >>= 2u; ++ self->private_impl.f_n_bits -= 2u; ++ if (self->private_impl.f_seen_transform[v_transform_type] || (self->private_impl.f_n_transforms >= 4u)) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_transform); ++ goto exit; ++ } else if (self->private_impl.f_seen_transform[3u]) { ++ status = wuffs_base__make_status(wuffs_webp__error__unsupported_transform_after_color_indexing_transform); ++ goto exit; ++ } ++ self->private_impl.f_seen_transform[v_transform_type] = true; ++ self->private_impl.f_transform_type[self->private_impl.f_n_transforms] = ((uint8_t)(v_transform_type)); ++ self->private_impl.f_n_transforms += 1u; ++ if (v_transform_type < 2u) { ++ if (self->private_impl.f_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= 3u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_tile_size_log2 = ((self->private_impl.f_bits & 7u) + 2u); ++ self->private_impl.f_transform_tile_size_log2[v_transform_type] = ((uint8_t)(v_tile_size_log2)); ++ self->private_impl.f_bits >>= 3u; ++ self->private_impl.f_n_bits -= 3u; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ while (true) { ++ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)])) > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_webp__decoder__decode_pixels(self, ++ wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]))), ++ a_src, ++ ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2), ++ ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2), ++ wuffs_base__utility__empty_slice_u8(), ++ 0u); ++ v_status = t_2; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ } ++ } else if (v_transform_type == 2u) { ++ } else { ++ if (self->private_impl.f_n_bits < 8u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if (self->private_impl.f_n_bits >= 8u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ self->private_impl.f_color_indexing_palette_size = ((self->private_impl.f_bits & 255u) + 1u); ++ self->private_impl.f_bits >>= 8u; ++ self->private_impl.f_n_bits -= 8u; ++ if (self->private_impl.f_color_indexing_palette_size <= 2u) { ++ self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 7u) / 8u); ++ self->private_impl.f_transform_tile_size_log2[3u] = 3u; ++ } else if (self->private_impl.f_color_indexing_palette_size <= 4u) { ++ self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 3u) / 4u); ++ self->private_impl.f_transform_tile_size_log2[3u] = 2u; ++ } else if (self->private_impl.f_color_indexing_palette_size <= 16u) { ++ self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 1u) / 2u); ++ self->private_impl.f_transform_tile_size_log2[3u] = 1u; ++ } else { ++ self->private_impl.f_color_indexing_width = self->private_impl.f_width; ++ self->private_impl.f_transform_tile_size_log2[3u] = 0u; ++ } ++ if (self->private_impl.f_width >= self->private_impl.f_color_indexing_width) { ++ self->private_impl.f_workbuf_offset_for_color_indexing = (4u * (self->private_impl.f_width - self->private_impl.f_color_indexing_width) * self->private_impl.f_height); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_webp__decoder__decode_pixels(self, ++ wuffs_base__make_slice_u8(self->private_data.f_palette, (4u * self->private_impl.f_color_indexing_palette_size)), ++ a_src, ++ self->private_impl.f_color_indexing_palette_size, ++ 1u, ++ wuffs_base__utility__empty_slice_u8(), ++ 0u); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ wuffs_private_impl__bulk_memset(&self->private_data.f_palette[(4u * self->private_impl.f_color_indexing_palette_size)], (1024u - (4u * self->private_impl.f_color_indexing_palette_size)), 0u); ++ v_p = wuffs_base__make_slice_u8(self->private_data.f_palette, (4u * self->private_impl.f_color_indexing_palette_size)); ++ while (((uint64_t)(v_p.len)) >= 8u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_p.ptr[4u] += v_p.ptr[0u]; ++ v_p.ptr[5u] += v_p.ptr[1u]; ++ v_p.ptr[6u] += v_p.ptr[2u]; ++ v_p.ptr[7u] += v_p.ptr[3u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_p = wuffs_base__slice_u8__subslice_i(v_p, 4u); ++ } ++ } ++ ++ ok: ++ self->private_impl.p_decode_transform = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_transform = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_transform.v_transform_type = v_transform_type; ++ self->private_data.s_decode_transform.v_tile_size_log2 = v_tile_size_log2; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func webp.decoder.decode_color_cache_parameters ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_color_cache_parameters( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_use_color_cache = 0; ++ uint32_t v_color_cache_bits = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_color_cache_parameters; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_use_color_cache = (self->private_impl.f_bits & 1u); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ self->private_impl.f_color_cache_bits = 0u; ++ if (v_use_color_cache != 0u) { ++ if (self->private_impl.f_n_bits < 4u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= 4u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_color_cache_bits = (self->private_impl.f_bits & 15u); ++ self->private_impl.f_bits >>= 4u; ++ self->private_impl.f_n_bits -= 4u; ++ if ((v_color_cache_bits < 1u) || (11u < v_color_cache_bits)) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_color_cache); + goto exit; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ self->private_impl.f_color_cache_bits = v_color_cache_bits; + } + ++ goto ok; + ok: +- self->private_impl.p_decode_frame[0] = 0; ++ self->private_impl.p_decode_color_cache_parameters = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ self->private_impl.p_decode_color_cache_parameters = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func tga.decoder.do_decode_frame ++// -------- func webp.decoder.decode_hg_table + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_tga__decoder__do_decode_frame( +- wuffs_tga__decoder* self, +- wuffs_base__pixel_buffer* a_dst, ++wuffs_webp__decoder__decode_hg_table( ++ wuffs_webp__decoder* self, + wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++ uint32_t a_width, ++ wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint64_t v_dst_bytes_per_pixel = 0; +- uint32_t v_dst_x = 0; +- uint32_t v_dst_y = 0; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_dst_start = 0; +- wuffs_base__slice_u8 v_src_palette = {0}; +- uint64_t v_mark = 0; +- uint64_t v_num_pixels64 = 0; +- uint32_t v_num_pixels32 = 0; +- uint32_t v_lit_length = 0; +- uint32_t v_run_length = 0; +- uint64_t v_num_dst_bytes = 0; +- uint32_t v_num_src_bytes = 0; +- uint32_t v_c = 0; +- uint32_t v_c5 = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_use_hg_table = 0; ++ uint32_t v_tile_size_log2 = 0; ++ wuffs_base__slice_u8 v_hg_pixels = {0}; ++ uint64_t v_n = 0; ++ wuffs_base__slice_u8 v_p = {0}; ++ uint32_t v_hg_plus_1 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -59974,276 +75034,155 @@ wuffs_tga__decoder__do_decode_frame( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_hg_table; + if (coro_susp_point) { +- v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame[0].v_dst_bytes_per_pixel; +- v_dst_x = self->private_data.s_do_decode_frame[0].v_dst_x; +- v_dst_y = self->private_data.s_do_decode_frame[0].v_dst_y; +- v_mark = self->private_data.s_do_decode_frame[0].v_mark; +- v_num_pixels32 = self->private_data.s_do_decode_frame[0].v_num_pixels32; +- v_lit_length = self->private_data.s_do_decode_frame[0].v_lit_length; +- v_run_length = self->private_data.s_do_decode_frame[0].v_run_length; +- v_num_dst_bytes = self->private_data.s_do_decode_frame[0].v_num_dst_bytes; ++ v_tile_size_log2 = self->private_data.s_decode_hg_table.v_tile_size_log2; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_tga__decoder__do_decode_frame_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_use_hg_table = (self->private_impl.f_bits & 1u); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ if (v_use_hg_table == 0u) { ++ self->private_impl.f_overall_n_huffman_groups = 1u; ++ self->private_impl.f_overall_tile_size_log2 = 0u; ++ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; + } +- if (status.repr) { +- goto suspend; ++ v_hg_pixels = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))); ++ if (((uint64_t)(v_hg_pixels.len)) >= 4u) { ++ v_hg_pixels.ptr[0u] = 0u; ++ v_hg_pixels.ptr[1u] = 0u; ++ v_hg_pixels.ptr[2u] = 0u; ++ v_hg_pixels.ptr[3u] = 0u; + } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ status = wuffs_base__make_status(NULL); + goto ok; + } +- if (self->private_impl.f_header_color_map_type != 0u) { +- v_src_palette = wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024); +- } +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), +- wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), +- v_src_palette, +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ if (self->private_impl.f_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= 3u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); + goto exit; + } +- goto ok; ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; + } +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; ++ v_tile_size_log2 = ((self->private_impl.f_bits & 7u) + 2u); ++ self->private_impl.f_bits >>= 3u; ++ self->private_impl.f_n_bits -= 3u; ++ self->private_impl.f_overall_tile_size_log2 = v_tile_size_log2; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); +- if ((self->private_impl.f_header_image_descriptor & 32u) == 0u) { +- v_dst_y = ((uint32_t)(self->private_impl.f_height - 1u)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- if ((self->private_impl.f_header_image_type & 8u) == 0u) { +- v_lit_length = self->private_impl.f_width; ++ if (status.repr) { ++ goto suspend; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; + } +- label__resume__continue:; + while (true) { +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); +- while (v_dst_y < self->private_impl.f_height) { +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_dst_y); +- v_dst_start = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel); +- if (v_dst_start <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_start); +- } else { +- v_dst = wuffs_base__utility__empty_slice_u8(); +- } +- while (v_dst_x < self->private_impl.f_width) { +- if (self->private_impl.f_src_bytes_per_pixel > 0u) { +- if (v_lit_length > 0u) { +- v_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- v_num_pixels64 = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(self->private_impl.f_src_bytes_per_pixel))); +- v_num_pixels32 = ((uint32_t)(wuffs_base__u64__min(v_num_pixels64, ((uint64_t)(v_lit_length))))); +- v_num_dst_bytes = (((uint64_t)(v_num_pixels32)) * v_dst_bytes_per_pixel); +- v_num_src_bytes = (v_num_pixels32 * self->private_impl.f_src_bytes_per_pixel); +- self->private_data.s_do_decode_frame[0].scratch = v_num_src_bytes; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame[0].scratch; +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); +- if (v_num_dst_bytes <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_num_dst_bytes); +- } else { +- v_dst = wuffs_base__utility__empty_slice_u8(); +- } +- v_dst_x += v_num_pixels32; +- v_lit_length = (((uint32_t)(v_lit_length - v_num_pixels32)) & 65535u); +- if (v_lit_length > 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- goto label__resume__continue; +- } +- } else if (v_run_length > 0u) { +- v_run_length -= 1u; +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_scratch_bytes_per_pixel)); +- if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); +- } +- v_dst_x += 1u; +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- goto label__resume__continue; +- } +- if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) { +- v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u); +- iop_a_src += 1u; +- if ((v_lit_length + v_dst_x) > self->private_impl.f_width) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); +- goto exit; +- } +- } else { +- if (self->private_impl.f_src_bytes_per_pixel == 1u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- goto label__resume__continue; +- } +- v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); +- iop_a_src += 1u; +- self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- } else if (self->private_impl.f_src_bytes_per_pixel == 3u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- goto label__resume__continue; +- } +- v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); +- iop_a_src += 1u; +- self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); +- goto label__resume__continue; +- } +- v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); +- iop_a_src += 1u; +- self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- self->private_data.f_scratch[3u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- } +- if ((v_run_length + v_dst_x) > self->private_impl.f_width) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); +- goto exit; +- } +- } +- } +- } else { +- if (v_lit_length > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- goto label__resume__continue; +- } +- v_c = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2u; +- v_c5 = (31u & (v_c >> 0u)); +- self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 5u)); +- self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 10u)); +- self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- self->private_data.f_scratch[3u] = 255u; +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, 4)); +- if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); +- } +- v_dst_x += 1u; +- v_lit_length -= 1u; +- } else if (v_run_length > 0u) { +- v_run_length -= 1u; +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_scratch_bytes_per_pixel)); +- if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); +- } +- v_dst_x += 1u; +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); +- goto label__resume__continue; +- } +- if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) { +- v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u); +- iop_a_src += 1u; +- if ((v_lit_length + v_dst_x) > self->private_impl.f_width) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); +- goto exit; +- } +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); +- goto label__resume__continue; +- } +- v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); +- iop_a_src += 1u; +- v_c = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2u; +- v_c5 = (31u & (v_c >> 0u)); +- self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 5u)); +- self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 10u)); +- self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- self->private_data.f_scratch[3u] = 255u; +- if ((v_run_length + v_dst_x) > self->private_impl.f_width) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); +- goto exit; +- } +- } +- } +- } +- } +- v_dst_x = 0u; +- if ((self->private_impl.f_header_image_descriptor & 32u) == 0u) { +- v_dst_y -= 1u; +- } else { +- v_dst_y += 1u; ++ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if ((self->private_impl.f_header_image_type & 8u) == 0u) { +- v_lit_length = self->private_impl.f_width; ++ wuffs_base__status t_2 = wuffs_webp__decoder__decode_pixels(self, ++ wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))), ++ a_src, ++ ((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2), ++ ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2), ++ wuffs_base__utility__empty_slice_u8(), ++ 0u); ++ v_status = t_2; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } +- break; ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ } ++ self->private_impl.f_overall_n_huffman_groups = 1u; ++ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ v_hg_pixels = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))); ++ v_n = ((uint64_t)((((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2) * ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2) * 4u))); ++ if (v_n > ((uint64_t)(v_hg_pixels.len))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ v_p = wuffs_base__slice_u8__subslice_j(v_hg_pixels, v_n); ++ while (((uint64_t)(v_p.len)) >= 4u) { ++ if (v_p.ptr[2u] != 0u) { ++ status = wuffs_base__make_status(wuffs_webp__error__unsupported_number_of_huffman_groups); ++ goto exit; ++ } ++ v_hg_plus_1 = (((uint32_t)(v_p.ptr[1u])) + 1u); ++ if (self->private_impl.f_overall_n_huffman_groups < v_hg_plus_1) { ++ self->private_impl.f_overall_n_huffman_groups = v_hg_plus_1; ++ } ++ v_p = wuffs_base__slice_u8__subslice_i(v_p, 4u); + } +- self->private_impl.f_call_sequence = 96u; + + ok: +- self->private_impl.p_do_decode_frame[0] = 0; ++ self->private_impl.p_decode_hg_table = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_frame[0].v_dst_bytes_per_pixel = v_dst_bytes_per_pixel; +- self->private_data.s_do_decode_frame[0].v_dst_x = v_dst_x; +- self->private_data.s_do_decode_frame[0].v_dst_y = v_dst_y; +- self->private_data.s_do_decode_frame[0].v_mark = v_mark; +- self->private_data.s_do_decode_frame[0].v_num_pixels32 = v_num_pixels32; +- self->private_data.s_do_decode_frame[0].v_lit_length = v_lit_length; +- self->private_data.s_do_decode_frame[0].v_run_length = v_run_length; +- self->private_data.s_do_decode_frame[0].v_num_dst_bytes = v_num_dst_bytes; ++ self->private_impl.p_decode_hg_table = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_hg_table.v_tile_size_log2 = v_tile_size_log2; + + goto exit; + exit: +@@ -60254,12 +75193,117 @@ wuffs_tga__decoder__do_decode_frame( + return status; + } + +-// -------- func tga.decoder.frame_dirty_rect ++// -------- func webp.decoder.decode_pixels ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_pixels( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_dst, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_width, ++ uint32_t a_height, ++ wuffs_base__slice_u8 a_tile_data, ++ uint32_t a_tile_size_log2) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_i = 0; ++ uint32_t v_n = 0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_pixels; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ v_i = 0u; ++ v_n = (((uint32_t)(1u)) << self->private_impl.f_color_cache_bits); ++ while (v_i < v_n) { ++ self->private_data.f_color_cache[v_i] = 0u; ++ v_i += 1u; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_webp__decoder__decode_pixels_slow(self, ++ a_dst, ++ a_src, ++ a_width, ++ a_height, ++ a_tile_data, ++ a_tile_size_log2); ++ if (status.repr) { ++ goto suspend; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_pixels = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_pixels = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func webp.decoder.swizzle ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__swizzle( ++ wuffs_webp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_src, ++ wuffs_base__pixel_blend a_blend) { ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ uint64_t v_src_bytes_per_row = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint32_t v_y = 0; ++ ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_palette, 1024)), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ return wuffs_private_impl__status__ensure_not_a_suspension(v_status); ++ } ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_palette, 1024)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_src_bytes_per_row = ((uint64_t)((self->private_impl.f_width * 4u))); ++ while (v_src_bytes_per_row <= ((uint64_t)(a_src.len))) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__slice_u8__subslice_j(a_src, v_src_bytes_per_row)); ++ a_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_bytes_per_row); ++ v_y += 1u; ++ } ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func webp.decoder.frame_dirty_rect + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_tga__decoder__frame_dirty_rect( +- const wuffs_tga__decoder* self) { ++wuffs_webp__decoder__frame_dirty_rect( ++ const wuffs_webp__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_rect_ie_u32(); + } +@@ -60275,12 +75319,12 @@ wuffs_tga__decoder__frame_dirty_rect( + self->private_impl.f_height); + } + +-// -------- func tga.decoder.num_animation_loops ++// -------- func webp.decoder.num_animation_loops + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_tga__decoder__num_animation_loops( +- const wuffs_tga__decoder* self) { ++wuffs_webp__decoder__num_animation_loops( ++ const wuffs_webp__decoder* self) { + if (!self) { + return 0; + } +@@ -60292,12 +75336,12 @@ wuffs_tga__decoder__num_animation_loops( + return 0u; + } + +-// -------- func tga.decoder.num_decoded_frame_configs ++// -------- func webp.decoder.num_decoded_frame_configs + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__num_decoded_frame_configs( +- const wuffs_tga__decoder* self) { ++wuffs_webp__decoder__num_decoded_frame_configs( ++ const wuffs_webp__decoder* self) { + if (!self) { + return 0; + } +@@ -60312,12 +75356,12 @@ wuffs_tga__decoder__num_decoded_frame_configs( + return 0u; + } + +-// -------- func tga.decoder.num_decoded_frames ++// -------- func webp.decoder.num_decoded_frames + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__num_decoded_frames( +- const wuffs_tga__decoder* self) { ++wuffs_webp__decoder__num_decoded_frames( ++ const wuffs_webp__decoder* self) { + if (!self) { + return 0; + } +@@ -60332,12 +75376,12 @@ wuffs_tga__decoder__num_decoded_frames( + return 0u; + } + +-// -------- func tga.decoder.restart_frame ++// -------- func webp.decoder.restart_frame + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__restart_frame( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__restart_frame( ++ wuffs_webp__decoder* self, + uint64_t a_index, + uint64_t a_io_position) { + if (!self) { +@@ -60353,31 +75397,30 @@ wuffs_tga__decoder__restart_frame( + if (self->private_impl.f_call_sequence < 32u) { + return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + } +- if (a_index != 0u) { ++ if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + self->private_impl.f_call_sequence = 40u; +- self->private_impl.f_frame_config_io_position = a_io_position; + return wuffs_base__make_status(NULL); + } + +-// -------- func tga.decoder.set_report_metadata ++// -------- func webp.decoder.set_report_metadata + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_tga__decoder__set_report_metadata( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__set_report_metadata( ++ wuffs_webp__decoder* self, + uint32_t a_fourcc, + bool a_report) { + return wuffs_base__make_empty_struct(); + } + +-// -------- func tga.decoder.tell_me_more ++// -------- func webp.decoder.tell_me_more + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__tell_me_more( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__tell_me_more( ++ wuffs_webp__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { +@@ -60415,29 +75458,12 @@ wuffs_tga__decoder__tell_me_more( + return status; + } + +-// -------- func tga.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__history_retain_length( +- const wuffs_tga__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func tga.decoder.workbuf_len ++// -------- func webp.decoder.workbuf_len + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_tga__decoder__workbuf_len( +- const wuffs_tga__decoder* self) { ++wuffs_webp__decoder__workbuf_len( ++ const wuffs_webp__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } +@@ -60446,92 +75472,66 @@ wuffs_tga__decoder__workbuf_len( + return wuffs_base__utility__empty_range_ii_u64(); + } + +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ return wuffs_base__utility__make_range_ii_u64(((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[3u])), ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[3u]))); + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) + + // ---------------- Status Codes Implementations + +-const char wuffs_wbmp__error__bad_header[] = "#wbmp: bad header"; +-const char wuffs_wbmp__error__truncated_input[] = "#wbmp: truncated input"; +- + // ---------------- Private Consts + +-// ---------------- Private Initializer Prototypes ++#define WUFFS_XXHASH32__XXH_PRIME32_1 2654435761u + +-// ---------------- Private Function Prototypes ++#define WUFFS_XXHASH32__XXH_PRIME32_2 2246822519u + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_image_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); ++#define WUFFS_XXHASH32__XXH_PRIME32_3 3266489917u + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_frame_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); ++#define WUFFS_XXHASH32__XXH_PRIME32_4 668265263u ++ ++#define WUFFS_XXHASH32__XXH_PRIME32_5 374761393u ++ ++#define WUFFS_XXHASH32__INITIAL_V0 606290984u ++ ++#define WUFFS_XXHASH32__INITIAL_V1 2246822519u ++ ++#define WUFFS_XXHASH32__INITIAL_V2 0u ++ ++#define WUFFS_XXHASH32__INITIAL_V3 1640531535u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_frame( +- wuffs_wbmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++static wuffs_base__empty_struct ++wuffs_xxhash32__hasher__up( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x); + + // ---------------- VTables + +-const wuffs_base__image_decoder__func_ptrs +-wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_wbmp__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_wbmp__decoder__frame_dirty_rect), ++const wuffs_base__hasher_u32__func_ptrs ++wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = { ++ (uint32_t(*)(const void*))(&wuffs_xxhash32__hasher__checksum_u32), + (uint64_t(*)(const void*, +- uint32_t))(&wuffs_wbmp__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_wbmp__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_wbmp__decoder__restart_frame), ++ uint32_t))(&wuffs_xxhash32__hasher__get_quirk), + (wuffs_base__status(*)(void*, + uint32_t, +- uint64_t))(&wuffs_wbmp__decoder__set_quirk), ++ uint64_t))(&wuffs_xxhash32__hasher__set_quirk), + (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_wbmp__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_wbmp__decoder__workbuf_len), ++ wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update), ++ (uint32_t(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update_u32), + }; + + // ---------------- Initializer Implementations + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_wbmp__decoder__initialize( +- wuffs_wbmp__decoder* self, ++wuffs_xxhash32__hasher__initialize( ++ wuffs_xxhash32__hasher* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ +@@ -60569,22 +75569,22 @@ wuffs_wbmp__decoder__initialize( + } + + self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = ++ wuffs_base__hasher_u32__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = ++ (const void*)(&wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32); + return wuffs_base__make_status(NULL); + } + +-wuffs_wbmp__decoder* +-wuffs_wbmp__decoder__alloc(void) { +- wuffs_wbmp__decoder* x = +- (wuffs_wbmp__decoder*)(calloc(sizeof(wuffs_wbmp__decoder), 1)); ++wuffs_xxhash32__hasher* ++wuffs_xxhash32__hasher__alloc(void) { ++ wuffs_xxhash32__hasher* x = ++ (wuffs_xxhash32__hasher*)(calloc(1, sizeof(wuffs_xxhash32__hasher))); + if (!x) { + return NULL; + } +- if (wuffs_wbmp__decoder__initialize( +- x, sizeof(wuffs_wbmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ if (wuffs_xxhash32__hasher__initialize( ++ x, sizeof(wuffs_xxhash32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } +@@ -60592,18 +75592,18 @@ wuffs_wbmp__decoder__alloc(void) { + } + + size_t +-sizeof__wuffs_wbmp__decoder(void) { +- return sizeof(wuffs_wbmp__decoder); ++sizeof__wuffs_xxhash32__hasher(void) { ++ return sizeof(wuffs_xxhash32__hasher); + } + + // ---------------- Function Implementations + +-// -------- func wbmp.decoder.get_quirk ++// -------- func xxhash32.hasher.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__get_quirk( +- const wuffs_wbmp__decoder* self, ++wuffs_xxhash32__hasher__get_quirk( ++ const wuffs_xxhash32__hasher* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -60616,12 +75616,12 @@ wuffs_wbmp__decoder__get_quirk( + return 0u; + } + +-// -------- func wbmp.decoder.set_quirk ++// -------- func xxhash32.hasher.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__set_quirk( +- wuffs_wbmp__decoder* self, ++wuffs_xxhash32__hasher__set_quirk( ++ wuffs_xxhash32__hasher* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -60637,627 +75637,387 @@ wuffs_wbmp__decoder__set_quirk( + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func wbmp.decoder.decode_image_config ++// -------- func xxhash32.hasher.update + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_image_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_xxhash32__hasher__update( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } +- +- ok: +- self->private_impl.p_decode_image_config[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_empty_struct(); + } +- return status; +-} +- +-// -------- func wbmp.decoder.do_decode_image_config +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_image_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint32_t v_i = 0; +- uint32_t v_p = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ wuffs_base__slice_u8 v_remaining = {0}; + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_do_decode_image_config[0].v_i; +- v_p = self->private_data.s_do_decode_image_config[0].v_p; ++ if ((self->private_impl.f_length_modulo_u32 == 0u) && ! self->private_impl.f_length_overflows_u32) { ++ self->private_impl.f_v0 = 606290984u; ++ self->private_impl.f_v1 = 2246822519u; ++ self->private_impl.f_v2 = 0u; ++ self->private_impl.f_v3 = 1640531535u; + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } +- v_i = 0u; +- while (v_i < 2u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c != 0u) { +- status = wuffs_base__make_status(wuffs_wbmp__error__bad_header); +- goto exit; +- } +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < 2u) { +- v_p = 0u; +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- v_p |= ((uint32_t)((v_c & 127u))); +- if ((v_c >> 7u) == 0u) { +- break; +- } else if (v_p > 131071u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- v_p <<= 7u; +- } +- if (v_i == 0u) { +- self->private_impl.f_width = v_p; +- } else { +- self->private_impl.f_height = v_p; +- } +- v_i += 1u; +- } +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- 2198077448u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- true); ++ while (((uint64_t)(a_x.len)) > 0u) { ++ v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); ++ if (((uint64_t)(a_x.len)) > 16777216u) { ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 16777216u); ++ a_x = wuffs_base__slice_u8__subslice_j(a_x, 16777216u); + } +- self->private_impl.f_call_sequence = 32u; +- +- goto ok; +- ok: +- self->private_impl.p_do_decode_image_config[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_image_config[0].v_i = v_i; +- self->private_data.s_do_decode_image_config[0].v_p = v_p; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ wuffs_xxhash32__hasher__up(self, a_x); ++ a_x = v_remaining; + } +- +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func wbmp.decoder.decode_frame_config ++// -------- func xxhash32.hasher.update_u32 + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_frame_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_xxhash32__hasher__update_u32( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return 0; + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } +- +- ok: +- self->private_impl.p_decode_frame_config[0] = 0; +- goto exit; ++ return 0; + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; ++ wuffs_xxhash32__hasher__update(self, a_x); ++ return wuffs_xxhash32__hasher__checksum_u32(self); + } + +-// -------- func wbmp.decoder.do_decode_frame_config ++// -------- func xxhash32.hasher.up + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_frame_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++static wuffs_base__empty_struct ++wuffs_xxhash32__hasher__up( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_new_lmu = 0; ++ uint32_t v_buf_u32 = 0; ++ uint32_t v_buf_len = 0; ++ uint32_t v_v0 = 0; ++ uint32_t v_v1 = 0; ++ uint32_t v_v2 = 0; ++ uint32_t v_v3 = 0; ++ wuffs_base__slice_u8 v_p = {0}; + +- if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_wbmp__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; +- } +- } else if (self->private_impl.f_call_sequence == 64u) { +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ v_new_lmu = ((uint32_t)(self->private_impl.f_length_modulo_u32 + ((uint32_t)(((uint64_t)(a_x.len)))))); ++ self->private_impl.f_length_overflows_u32 = ((v_new_lmu < self->private_impl.f_length_modulo_u32) || self->private_impl.f_length_overflows_u32); ++ self->private_impl.f_length_modulo_u32 = v_new_lmu; ++ while (true) { ++ if (self->private_impl.f_buf_len >= 16u) { ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u)); ++ v_v0 = ((uint32_t)(self->private_impl.f_v0 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u)); ++ self->private_impl.f_v0 = ((uint32_t)(v_v0 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u)); ++ v_v1 = ((uint32_t)(self->private_impl.f_v1 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u)); ++ self->private_impl.f_v1 = ((uint32_t)(v_v1 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u)); ++ v_v2 = ((uint32_t)(self->private_impl.f_v2 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u)); ++ self->private_impl.f_v2 = ((uint32_t)(v_v2 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[12u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[13u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[14u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[15u])) << 24u)); ++ v_v3 = ((uint32_t)(self->private_impl.f_v3 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u)); ++ self->private_impl.f_v3 = ((uint32_t)(v_v3 * 2654435761u)); ++ self->private_impl.f_buf_len = 0u; ++ break; + } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height), +- ((wuffs_base__flicks)(0u)), +- 0u, +- self->private_impl.f_frame_config_io_position, +- 0u, +- true, +- false, +- 4278190080u); ++ if (((uint64_t)(a_x.len)) <= 0u) { ++ return wuffs_base__make_empty_struct(); + } +- self->private_impl.f_call_sequence = 64u; +- +- ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; +- goto exit; ++ self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_buf_len += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); + } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ v_buf_len = ((uint32_t)(((uint8_t)(self->private_impl.f_buf_len & 15u)))); ++ v_v0 = self->private_impl.f_v0; ++ v_v1 = self->private_impl.f_v1; ++ v_v2 = self->private_impl.f_v2; ++ v_v3 = self->private_impl.f_v3; ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 16; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16)); ++ while (v_p.ptr < i_end0_p) { ++ v_buf_u32 = (((uint32_t)(v_p.ptr[0u])) | ++ (((uint32_t)(v_p.ptr[1u])) << 8u) | ++ (((uint32_t)(v_p.ptr[2u])) << 16u) | ++ (((uint32_t)(v_p.ptr[3u])) << 24u)); ++ v_v0 = ((uint32_t)(v_v0 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u)); ++ v_v0 = ((uint32_t)(v_v0 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(v_p.ptr[4u])) | ++ (((uint32_t)(v_p.ptr[5u])) << 8u) | ++ (((uint32_t)(v_p.ptr[6u])) << 16u) | ++ (((uint32_t)(v_p.ptr[7u])) << 24u)); ++ v_v1 = ((uint32_t)(v_v1 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u)); ++ v_v1 = ((uint32_t)(v_v1 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(v_p.ptr[8u])) | ++ (((uint32_t)(v_p.ptr[9u])) << 8u) | ++ (((uint32_t)(v_p.ptr[10u])) << 16u) | ++ (((uint32_t)(v_p.ptr[11u])) << 24u)); ++ v_v2 = ((uint32_t)(v_v2 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u)); ++ v_v2 = ((uint32_t)(v_v2 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(v_p.ptr[12u])) | ++ (((uint32_t)(v_p.ptr[13u])) << 8u) | ++ (((uint32_t)(v_p.ptr[14u])) << 16u) | ++ (((uint32_t)(v_p.ptr[15u])) << 24u)); ++ v_v3 = ((uint32_t)(v_v3 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u)); ++ v_v3 = ((uint32_t)(v_v3 * 2654435761u)); ++ v_p.ptr += 16; ++ } ++ v_p.len = 1; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end1_p) { ++ self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u]; ++ v_buf_len = ((v_buf_len + 1u) & 15u); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; + } +- +- return status; ++ self->private_impl.f_buf_len = ((uint8_t)(v_buf_len)); ++ self->private_impl.f_v0 = v_v0; ++ self->private_impl.f_v1 = v_v1; ++ self->private_impl.f_v2 = v_v2; ++ self->private_impl.f_v3 = v_v3; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func wbmp.decoder.decode_frame ++// -------- func xxhash32.hasher.checksum_u32 + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_frame( +- wuffs_wbmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_xxhash32__hasher__checksum_u32( ++ const wuffs_xxhash32__hasher* self) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return 0; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ uint32_t v_ret = 0; ++ uint32_t v_i = 0; ++ uint32_t v_n = 0; ++ uint32_t v_buf_u32 = 0; ++ ++ if ((self->private_impl.f_length_modulo_u32 >= 16u) || self->private_impl.f_length_overflows_u32) { ++ v_ret += (((uint32_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 31u)); ++ v_ret += (((uint32_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 25u)); ++ v_ret += (((uint32_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 20u)); ++ v_ret += (((uint32_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 14u)); ++ v_ret += self->private_impl.f_length_modulo_u32; ++ } else { ++ v_ret += 374761393u; ++ v_ret += self->private_impl.f_length_modulo_u32; ++ } ++ v_n = 16u; ++ v_n = wuffs_base__u32__min(v_n, ((uint32_t)(self->private_impl.f_buf_len))); ++ if (4u <= v_n) { ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u)); ++ v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); ++ v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); ++ v_ret *= 668265263u; ++ v_i = 4u; ++ } ++ if (8u <= v_n) { ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u)); ++ v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); ++ v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); ++ v_ret *= 668265263u; ++ v_i = 8u; + } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ if (12u <= v_n) { ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u)); ++ v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); ++ v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); ++ v_ret *= 668265263u; ++ v_i = 12u; + } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ while (v_i < v_n) { ++ v_ret += ((uint32_t)(((uint32_t)(self->private_impl.f_buf_data[v_i])) * 374761393u)); ++ v_ret = (((uint32_t)(v_ret << 11u)) | (v_ret >> 21u)); ++ v_ret *= 2654435761u; ++ v_i += 1u; + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ v_ret ^= (v_ret >> 15u); ++ v_ret *= 2246822519u; ++ v_ret ^= (v_ret >> 13u); ++ v_ret *= 3266489917u; ++ v_ret ^= (v_ret >> 16u); ++ return v_ret; ++} + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) + +- ok: +- self->private_impl.p_decode_frame[0] = 0; +- goto exit; +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++// ---------------- Status Codes Implementations + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} ++// ---------------- Private Consts + +-// -------- func wbmp.decoder.do_decode_frame ++#define WUFFS_XXHASH64__XXH_PRIME64_1 11400714785074694791u + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_frame( +- wuffs_wbmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++#define WUFFS_XXHASH64__XXH_PRIME64_2 14029467366897019727u + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint64_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_x_in_bytes = 0; +- uint32_t v_dst_x = 0; +- uint32_t v_dst_y = 0; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint8_t v_src[1] = {0}; +- uint8_t v_c = 0; ++#define WUFFS_XXHASH64__XXH_PRIME64_3 1609587929392839161u + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++#define WUFFS_XXHASH64__XXH_PRIME64_4 9650029242287828579u + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; +- if (coro_susp_point) { +- v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame[0].v_dst_bytes_per_pixel; +- v_dst_x = self->private_data.s_do_decode_frame[0].v_dst_x; +- v_dst_y = self->private_data.s_do_decode_frame[0].v_dst_y; +- memcpy(v_src, self->private_data.s_do_decode_frame[0].v_src, sizeof(v_src)); +- v_c = self->private_data.s_do_decode_frame[0].v_c; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++#define WUFFS_XXHASH64__XXH_PRIME64_5 2870177450012600261u + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_wbmp__decoder__do_decode_frame_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette(a_dst), +- wuffs_base__utility__make_pixel_format(536870920u), +- wuffs_base__utility__empty_slice_u8(), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); +- if (self->private_impl.f_width > 0u) { +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- while (v_dst_y < self->private_impl.f_height) { +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_dst_y); +- v_dst_x = 0u; +- while (v_dst_x < self->private_impl.f_width) { +- if ((v_dst_x & 7u) == 0u) { +- while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_dst_y); +- v_dst_x_in_bytes = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel); +- if (v_dst_x_in_bytes <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_x_in_bytes); +- } +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- } +- if ((v_c & 128u) == 0u) { +- v_src[0u] = 0u; +- } else { +- v_src[0u] = 255u; +- } +- v_c = ((uint8_t)((((uint32_t)(v_c)) << 1u))); +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__utility__empty_slice_u8(), wuffs_base__make_slice_u8(v_src, 1)); +- if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); +- } +- v_dst_x += 1u; +- } +- v_dst_y += 1u; +- } +- } +- self->private_impl.f_call_sequence = 96u; ++#define WUFFS_XXHASH64__INITIAL_V0 6983438078262162902u + +- ok: +- self->private_impl.p_do_decode_frame[0] = 0; +- goto exit; +- } ++#define WUFFS_XXHASH64__INITIAL_V1 14029467366897019727u + +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_frame[0].v_dst_bytes_per_pixel = v_dst_bytes_per_pixel; +- self->private_data.s_do_decode_frame[0].v_dst_x = v_dst_x; +- self->private_data.s_do_decode_frame[0].v_dst_y = v_dst_y; +- memcpy(self->private_data.s_do_decode_frame[0].v_src, v_src, sizeof(v_src)); +- self->private_data.s_do_decode_frame[0].v_c = v_c; ++#define WUFFS_XXHASH64__INITIAL_V2 0u + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++#define WUFFS_XXHASH64__INITIAL_V3 7046029288634856825u + +- return status; +-} ++// ---------------- Private Initializer Prototypes + +-// -------- func wbmp.decoder.frame_dirty_rect ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_wbmp__decoder__frame_dirty_rect( +- const wuffs_wbmp__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } ++static wuffs_base__empty_struct ++wuffs_xxhash64__hasher__up( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x); + +- return wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height); +-} ++// ---------------- VTables + +-// -------- func wbmp.decoder.num_animation_loops ++const wuffs_base__hasher_u64__func_ptrs ++wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64 = { ++ (uint64_t(*)(const void*))(&wuffs_xxhash64__hasher__checksum_u64), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_xxhash64__hasher__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_xxhash64__hasher__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update), ++ (uint64_t(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update_u64), ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_wbmp__decoder__num_animation_loops( +- const wuffs_wbmp__decoder* self) { ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_xxhash64__hasher__initialize( ++ wuffs_xxhash64__hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ + if (!self) { +- return 0; ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + +- return 0u; +-} ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } + +-// -------- func wbmp.decoder.num_decoded_frame_configs ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__hasher_u64.vtable_name = ++ wuffs_base__hasher_u64__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_u64.function_pointers = ++ (const void*)(&wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64); ++ return wuffs_base__make_status(NULL); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__num_decoded_frame_configs( +- const wuffs_wbmp__decoder* self) { +- if (!self) { +- return 0; ++wuffs_xxhash64__hasher* ++wuffs_xxhash64__hasher__alloc(void) { ++ wuffs_xxhash64__hasher* x = ++ (wuffs_xxhash64__hasher*)(calloc(1, sizeof(wuffs_xxhash64__hasher))); ++ if (!x) { ++ return NULL; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (wuffs_xxhash64__hasher__initialize( ++ x, sizeof(wuffs_xxhash64__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; + } ++ return x; ++} + +- if (self->private_impl.f_call_sequence > 32u) { +- return 1u; +- } +- return 0u; ++size_t ++sizeof__wuffs_xxhash64__hasher(void) { ++ return sizeof(wuffs_xxhash64__hasher); + } + +-// -------- func wbmp.decoder.num_decoded_frames ++// ---------------- Function Implementations ++ ++// -------- func xxhash64.hasher.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__num_decoded_frames( +- const wuffs_wbmp__decoder* self) { ++wuffs_xxhash64__hasher__get_quirk( ++ const wuffs_xxhash64__hasher* self, ++ uint32_t a_key) { + if (!self) { + return 0; + } +@@ -61266,20 +76026,17 @@ wuffs_wbmp__decoder__num_decoded_frames( + return 0; + } + +- if (self->private_impl.f_call_sequence > 64u) { +- return 1u; +- } + return 0u; + } + +-// -------- func wbmp.decoder.restart_frame ++// -------- func xxhash64.hasher.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__restart_frame( +- wuffs_wbmp__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { ++wuffs_xxhash64__hasher__set_quirk( ++ wuffs_xxhash64__hasher* self, ++ uint32_t a_key, ++ uint64_t a_value) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -61290,77 +76047,206 @@ wuffs_wbmp__decoder__restart_frame( + : wuffs_base__error__initialize_not_called); + } + +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } +- if (a_index != 0u) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- self->private_impl.f_call_sequence = 40u; +- self->private_impl.f_frame_config_io_position = a_io_position; +- return wuffs_base__make_status(NULL); ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func wbmp.decoder.set_report_metadata ++// -------- func xxhash64.hasher.update + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_wbmp__decoder__set_report_metadata( +- wuffs_wbmp__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { ++wuffs_xxhash64__hasher__update( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } ++ ++ if ((self->private_impl.f_length_modulo_u64 == 0u) && ! self->private_impl.f_length_overflows_u64) { ++ self->private_impl.f_v0 = 6983438078262162902u; ++ self->private_impl.f_v1 = 14029467366897019727u; ++ self->private_impl.f_v2 = 0u; ++ self->private_impl.f_v3 = 7046029288634856825u; ++ } ++ wuffs_xxhash64__hasher__up(self, a_x); + return wuffs_base__make_empty_struct(); + } + +-// -------- func wbmp.decoder.tell_me_more ++// -------- func xxhash64.hasher.update_u64 + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__tell_me_more( +- wuffs_wbmp__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xxhash64__hasher__update_u64( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return 0; + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ return 0; + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); + +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; ++ wuffs_xxhash64__hasher__update(self, a_x); ++ return wuffs_xxhash64__hasher__checksum_u64(self); ++} + +- goto ok; +- ok: +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++// -------- func xxhash64.hasher.up ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_xxhash64__hasher__up( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint64_t v_new_lmu = 0; ++ uint64_t v_buf_u64 = 0; ++ uint32_t v_buf_len = 0; ++ uint64_t v_v0 = 0; ++ uint64_t v_v1 = 0; ++ uint64_t v_v2 = 0; ++ uint64_t v_v3 = 0; ++ wuffs_base__slice_u8 v_p = {0}; ++ ++ v_new_lmu = ((uint64_t)(self->private_impl.f_length_modulo_u64 + ((uint64_t)(a_x.len)))); ++ self->private_impl.f_length_overflows_u64 = ((v_new_lmu < self->private_impl.f_length_modulo_u64) || self->private_impl.f_length_overflows_u64); ++ self->private_impl.f_length_modulo_u64 = v_new_lmu; ++ while (true) { ++ if (self->private_impl.f_buf_len >= 32u) { ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u)); ++ v_v0 = ((uint64_t)(self->private_impl.f_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); ++ self->private_impl.f_v0 = ((uint64_t)(v_v0 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u)); ++ v_v1 = ((uint64_t)(self->private_impl.f_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); ++ self->private_impl.f_v1 = ((uint64_t)(v_v1 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u)); ++ v_v2 = ((uint64_t)(self->private_impl.f_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); ++ self->private_impl.f_v2 = ((uint64_t)(v_v2 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[24u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[25u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[26u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[27u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[28u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[29u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[30u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[31u])) << 56u)); ++ v_v3 = ((uint64_t)(self->private_impl.f_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); ++ self->private_impl.f_v3 = ((uint64_t)(v_v3 * 11400714785074694791u)); ++ self->private_impl.f_buf_len = 0u; ++ break; ++ } ++ if (((uint64_t)(a_x.len)) <= 0u) { ++ return wuffs_base__make_empty_struct(); ++ } ++ self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u]; ++ self->private_impl.f_buf_len += 1u; ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); ++ } ++ v_buf_len = (self->private_impl.f_buf_len & 31u); ++ v_v0 = self->private_impl.f_v0; ++ v_v1 = self->private_impl.f_v1; ++ v_v2 = self->private_impl.f_v2; ++ v_v3 = self->private_impl.f_v3; ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 32; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32)); ++ while (v_p.ptr < i_end0_p) { ++ v_buf_u64 = (((uint64_t)(v_p.ptr[0u])) | ++ (((uint64_t)(v_p.ptr[1u])) << 8u) | ++ (((uint64_t)(v_p.ptr[2u])) << 16u) | ++ (((uint64_t)(v_p.ptr[3u])) << 24u) | ++ (((uint64_t)(v_p.ptr[4u])) << 32u) | ++ (((uint64_t)(v_p.ptr[5u])) << 40u) | ++ (((uint64_t)(v_p.ptr[6u])) << 48u) | ++ (((uint64_t)(v_p.ptr[7u])) << 56u)); ++ v_v0 = ((uint64_t)(v_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); ++ v_v0 = ((uint64_t)(v_v0 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(v_p.ptr[8u])) | ++ (((uint64_t)(v_p.ptr[9u])) << 8u) | ++ (((uint64_t)(v_p.ptr[10u])) << 16u) | ++ (((uint64_t)(v_p.ptr[11u])) << 24u) | ++ (((uint64_t)(v_p.ptr[12u])) << 32u) | ++ (((uint64_t)(v_p.ptr[13u])) << 40u) | ++ (((uint64_t)(v_p.ptr[14u])) << 48u) | ++ (((uint64_t)(v_p.ptr[15u])) << 56u)); ++ v_v1 = ((uint64_t)(v_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); ++ v_v1 = ((uint64_t)(v_v1 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(v_p.ptr[16u])) | ++ (((uint64_t)(v_p.ptr[17u])) << 8u) | ++ (((uint64_t)(v_p.ptr[18u])) << 16u) | ++ (((uint64_t)(v_p.ptr[19u])) << 24u) | ++ (((uint64_t)(v_p.ptr[20u])) << 32u) | ++ (((uint64_t)(v_p.ptr[21u])) << 40u) | ++ (((uint64_t)(v_p.ptr[22u])) << 48u) | ++ (((uint64_t)(v_p.ptr[23u])) << 56u)); ++ v_v2 = ((uint64_t)(v_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); ++ v_v2 = ((uint64_t)(v_v2 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(v_p.ptr[24u])) | ++ (((uint64_t)(v_p.ptr[25u])) << 8u) | ++ (((uint64_t)(v_p.ptr[26u])) << 16u) | ++ (((uint64_t)(v_p.ptr[27u])) << 24u) | ++ (((uint64_t)(v_p.ptr[28u])) << 32u) | ++ (((uint64_t)(v_p.ptr[29u])) << 40u) | ++ (((uint64_t)(v_p.ptr[30u])) << 48u) | ++ (((uint64_t)(v_p.ptr[31u])) << 56u)); ++ v_v3 = ((uint64_t)(v_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); ++ v_v3 = ((uint64_t)(v_v3 * 11400714785074694791u)); ++ v_p.ptr += 32; ++ } ++ v_p.len = 1; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end1_p) { ++ self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u]; ++ v_buf_len = ((v_buf_len + 1u) & 31u); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; + } +- return status; ++ self->private_impl.f_buf_len = v_buf_len; ++ self->private_impl.f_v0 = v_v0; ++ self->private_impl.f_v1 = v_v1; ++ self->private_impl.f_v2 = v_v2; ++ self->private_impl.f_v3 = v_v3; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func wbmp.decoder.history_retain_length ++// -------- func xxhash64.hasher.checksum_u64 + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__history_retain_length( +- const wuffs_wbmp__decoder* self) { ++wuffs_xxhash64__hasher__checksum_u64( ++ const wuffs_xxhash64__hasher* self) { + if (!self) { + return 0; + } +@@ -61369,83 +76255,307 @@ wuffs_wbmp__decoder__history_retain_length( + return 0; + } + +- return 0u; +-} +- +-// -------- func wbmp.decoder.workbuf_len ++ uint64_t v_ret = 0; ++ uint64_t v_v0 = 0; ++ uint64_t v_v1 = 0; ++ uint64_t v_v2 = 0; ++ uint64_t v_v3 = 0; ++ uint32_t v_i = 0; ++ uint32_t v_i8 = 0; ++ uint32_t v_n = 0; ++ uint32_t v_buf_u32 = 0; ++ uint64_t v_buf_u64 = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_wbmp__decoder__workbuf_len( +- const wuffs_wbmp__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ if ((self->private_impl.f_length_modulo_u64 >= 32u) || self->private_impl.f_length_overflows_u64) { ++ v_ret += (((uint64_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 63u)); ++ v_ret += (((uint64_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 57u)); ++ v_ret += (((uint64_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 52u)); ++ v_ret += (((uint64_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 46u)); ++ v_v0 = ((uint64_t)(self->private_impl.f_v0 * 14029467366897019727u)); ++ v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); ++ v_v0 *= 11400714785074694791u; ++ v_v1 = ((uint64_t)(self->private_impl.f_v1 * 14029467366897019727u)); ++ v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); ++ v_v1 *= 11400714785074694791u; ++ v_v2 = ((uint64_t)(self->private_impl.f_v2 * 14029467366897019727u)); ++ v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); ++ v_v2 *= 11400714785074694791u; ++ v_v3 = ((uint64_t)(self->private_impl.f_v3 * 14029467366897019727u)); ++ v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); ++ v_v3 *= 11400714785074694791u; ++ v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v0) * 11400714785074694791u)) + 9650029242287828579u)); ++ v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v1) * 11400714785074694791u)) + 9650029242287828579u)); ++ v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v2) * 11400714785074694791u)) + 9650029242287828579u)); ++ v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v3) * 11400714785074694791u)) + 9650029242287828579u)); ++ v_ret += self->private_impl.f_length_modulo_u64; ++ } else { ++ v_ret += 2870177450012600261u; ++ v_ret += self->private_impl.f_length_modulo_u64; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ v_n = 32u; ++ v_n = wuffs_base__u32__min(v_n, self->private_impl.f_buf_len); ++ if (8u <= v_n) { ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u)); ++ v_buf_u64 *= 14029467366897019727u; ++ v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); ++ v_buf_u64 *= 11400714785074694791u; ++ v_ret ^= v_buf_u64; ++ v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); ++ v_ret *= 11400714785074694791u; ++ v_ret += 9650029242287828579u; ++ v_i = 8u; + } +- +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ if (16u <= v_n) { ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u)); ++ v_buf_u64 *= 14029467366897019727u; ++ v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); ++ v_buf_u64 *= 11400714785074694791u; ++ v_ret ^= v_buf_u64; ++ v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); ++ v_ret *= 11400714785074694791u; ++ v_ret += 9650029242287828579u; ++ v_i = 16u; ++ } ++ if (24u <= v_n) { ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u)); ++ v_buf_u64 *= 14029467366897019727u; ++ v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); ++ v_buf_u64 *= 11400714785074694791u; ++ v_ret ^= v_buf_u64; ++ v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); ++ v_ret *= 11400714785074694791u; ++ v_ret += 9650029242287828579u; ++ v_i = 24u; ++ } ++ if ((v_n & 4u) != 0u) { ++ v_i8 = (v_i & 24u); ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 0u)])) | ++ (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 1u)])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 2u)])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 3u)])) << 24u)); ++ v_ret ^= ((uint64_t)(((uint64_t)(v_buf_u32)) * 11400714785074694791u)); ++ v_ret = (((uint64_t)(v_ret << 23u)) | (v_ret >> 41u)); ++ v_ret *= 14029467366897019727u; ++ v_ret += 1609587929392839161u; ++ v_i = (v_i8 + 4u); ++ } ++ while (v_i < v_n) { ++ v_ret ^= ((uint64_t)(((uint64_t)(self->private_impl.f_buf_data[v_i])) * 2870177450012600261u)); ++ v_ret = (((uint64_t)(v_ret << 11u)) | (v_ret >> 53u)); ++ v_ret *= 11400714785074694791u; ++ v_i += 1u; ++ } ++ v_ret ^= (v_ret >> 33u); ++ v_ret *= 14029467366897019727u; ++ v_ret ^= (v_ret >> 29u); ++ v_ret *= 1609587929392839161u; ++ v_ret ^= (v_ret >> 32u); ++ return ((uint64_t)(v_ret)); + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) + + // ---------------- Status Codes Implementations + +-// ---------------- Private Consts ++const char wuffs_xz__error__bad_bcj_offset[] = "#xz: bad BCJ offset"; ++const char wuffs_xz__error__bad_block_header[] = "#xz: bad block header"; ++const char wuffs_xz__error__bad_checksum[] = "#xz: bad checksum"; ++const char wuffs_xz__error__bad_filter[] = "#xz: bad filter"; ++const char wuffs_xz__error__bad_footer[] = "#xz: bad footer"; ++const char wuffs_xz__error__bad_header[] = "#xz: bad header"; ++const char wuffs_xz__error__bad_header_concatenated_stream[] = "#xz: bad header (concatenated stream)"; ++const char wuffs_xz__error__bad_index[] = "#xz: bad index"; ++const char wuffs_xz__error__bad_padding[] = "#xz: bad padding"; ++const char wuffs_xz__error__truncated_input[] = "#xz: truncated input"; ++const char wuffs_xz__error__unsupported_checksum_algorithm[] = "#xz: unsupported checksum algorithm"; ++const char wuffs_xz__error__unsupported_filter[] = "#xz: unsupported filter"; ++const char wuffs_xz__error__unsupported_filter_combination[] = "#xz: unsupported filter combination"; ++const char wuffs_xz__error__internal_error_inconsistent_bcj_filter_state[] = "#xz: internal error: inconsistent BCJ filter state"; + +-#define WUFFS_XXHASH32__XXH_PRIME32_1 2654435761 ++// ---------------- Private Consts + +-#define WUFFS_XXHASH32__XXH_PRIME32_2 2246822519 ++static const bool ++WUFFS_XZ__FILTER_04_X86_MASK_TO_ALLOWED_STATUS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1u, 1u, 1u, 0u, 1u, 0u, 0u, 0u, ++}; + +-#define WUFFS_XXHASH32__XXH_PRIME32_3 3266489917 ++static const uint8_t ++WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 1u, 2u, 2u, 3u, 3u, 3u, 3u, ++}; + +-#define WUFFS_XXHASH32__XXH_PRIME32_4 668265263 ++static const uint32_t ++WUFFS_XZ__FILTER_04_X86_MASK_TO_XOR_OPERAND[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 4294967295u, 16777215u, 65535u, 65535u, 255u, 255u, 255u, 255u, ++}; + +-#define WUFFS_XXHASH32__XXH_PRIME32_5 374761393 ++static const uint8_t ++WUFFS_XZ__FILTER_06_IA64_BRANCH_TABLE[32] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 4u, 4u, 6u, 6u, 0u, 0u, 7u, 7u, ++ 4u, 4u, 0u, 0u, 4u, 4u, 0u, 0u, ++}; + +-#define WUFFS_XXHASH32__INITIAL_V0 606290984 ++#define WUFFS_XZ__QUIRKS_BASE 2021322752u + +-#define WUFFS_XXHASH32__INITIAL_V1 2246822519 ++static const uint8_t ++WUFFS_XZ__CHECKSUM_LENGTH[4] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 4u, 8u, 32u, ++}; + +-#define WUFFS_XXHASH32__INITIAL_V2 0 ++static const uint8_t ++WUFFS_XZ__ZEROES[3] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, ++}; + +-#define WUFFS_XXHASH32__INITIAL_V3 1640531535 ++static const uint8_t ++WUFFS_XZ__BCJ_OFFSET_ALIGNMENT[12] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 1u, 4u, 16u, 4u, ++ 2u, 4u, 4u, 2u, ++}; + + // ---------------- Private Initializer Prototypes + + // ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_xxhash32__hasher__up( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x); ++static uint8_t ++wuffs_xz__decoder__apply_non_final_filters( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_non_final_filters__choosy_default( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_04_x86( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_05_powerpc( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_06_ia64( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_07_arm( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_08_armthumb( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_09_sparc( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_0a_arm64( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_0b_riscv( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__do_transform_io( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__decode_block_header_with_padding( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__decode_block_header_sans_padding( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__verify_index( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__verify_footer( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src); + + // ---------------- VTables + +-const wuffs_base__hasher_u32__func_ptrs +-wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = { +- (uint32_t(*)(const void*))(&wuffs_xxhash32__hasher__checksum_u32), ++const wuffs_base__io_transformer__func_ptrs ++wuffs_xz__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_xz__decoder__dst_history_retain_length), + (uint64_t(*)(const void*, +- uint32_t))(&wuffs_xxhash32__hasher__get_quirk), ++ uint32_t))(&wuffs_xz__decoder__get_quirk), + (wuffs_base__status(*)(void*, + uint32_t, +- uint64_t))(&wuffs_xxhash32__hasher__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update), +- (uint32_t(*)(void*, +- wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update_u32), ++ uint64_t))(&wuffs_xz__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_xz__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_xz__decoder__workbuf_len), + }; + + // ---------------- Initializer Implementations + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_xxhash32__hasher__initialize( +- wuffs_xxhash32__hasher* self, ++wuffs_xz__decoder__initialize( ++ wuffs_xz__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ +@@ -61482,23 +76592,53 @@ wuffs_xxhash32__hasher__initialize( + } + } + ++ self->private_impl.choosy_apply_non_final_filters = &wuffs_xz__decoder__apply_non_final_filters__choosy_default; ++ ++ { ++ wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( ++ &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_crc64__ecma_hasher__initialize( ++ &self->private_data.f_crc64, sizeof(self->private_data.f_crc64), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_sha256__hasher__initialize( ++ &self->private_data.f_sha256, sizeof(self->private_data.f_sha256), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_lzma__decoder__initialize( ++ &self->private_data.f_lzma, sizeof(self->private_data.f_lzma), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } + self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = +- wuffs_base__hasher_u32__vtable_name; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = +- (const void*)(&wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32); ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_xz__decoder__func_ptrs_for__wuffs_base__io_transformer); + return wuffs_base__make_status(NULL); + } + +-wuffs_xxhash32__hasher* +-wuffs_xxhash32__hasher__alloc(void) { +- wuffs_xxhash32__hasher* x = +- (wuffs_xxhash32__hasher*)(calloc(sizeof(wuffs_xxhash32__hasher), 1)); ++wuffs_xz__decoder* ++wuffs_xz__decoder__alloc(void) { ++ wuffs_xz__decoder* x = ++ (wuffs_xz__decoder*)(calloc(1, sizeof(wuffs_xz__decoder))); + if (!x) { + return NULL; + } +- if (wuffs_xxhash32__hasher__initialize( +- x, sizeof(wuffs_xxhash32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ if (wuffs_xz__decoder__initialize( ++ x, sizeof(wuffs_xz__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } +@@ -61506,18 +76646,511 @@ wuffs_xxhash32__hasher__alloc(void) { + } + + size_t +-sizeof__wuffs_xxhash32__hasher(void) { +- return sizeof(wuffs_xxhash32__hasher); ++sizeof__wuffs_xz__decoder(void) { ++ return sizeof(wuffs_xz__decoder); + } + + // ---------------- Function Implementations + +-// -------- func xxhash32.hasher.get_quirk ++// -------- func xz.decoder.apply_non_final_filters ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_non_final_filters( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ return (*self->private_impl.choosy_apply_non_final_filters)(self, a_dst_slice); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_non_final_filters__choosy_default( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ uint32_t v_f = 0; ++ uint64_t v_i = 0; ++ uint32_t v_filter_id = 0; ++ uint32_t v_delta_dist = 0; ++ uint32_t v_delta_pos = 0; ++ uint8_t v_c8 = 0; ++ ++ if (self->private_impl.f_num_non_final_filters <= 0u) { ++ return 0u; ++ } ++ v_f = (self->private_impl.f_num_non_final_filters - 1u); ++ while (true) { ++ v_filter_id = (self->private_impl.f_filters[v_f] & 127u); ++ if (v_filter_id == 3u) { ++ v_delta_dist = (((self->private_impl.f_filters[v_f] >> 8u) & 255u) + 1u); ++ v_delta_pos = (self->private_impl.f_filters[v_f] >> 24u); ++ v_i = 0u; ++ while (v_i < ((uint64_t)(a_dst_slice.len))) { ++ v_c8 = a_dst_slice.ptr[v_i]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_c8 += self->private_data.f_filter_data[v_f][(((uint32_t)(v_delta_dist + v_delta_pos)) & 255u)]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_data.f_filter_data[v_f][(v_delta_pos & 255u)] = v_c8; ++ v_delta_pos -= 1u; ++ a_dst_slice.ptr[v_i] = v_c8; ++ v_i += 1u; ++ } ++ self->private_impl.f_filters[v_f] &= 65535u; ++ self->private_impl.f_filters[v_f] |= ((uint32_t)(v_delta_pos << 24u)); ++ } ++ if (v_f <= 0u) { ++ break; ++ } ++ v_f -= 1u; ++ } ++ return 0u; ++} ++ ++// -------- func xz.decoder.apply_filter_04_x86 ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_04_x86( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint64_t v_i = 0; ++ uint64_t v_prev_pos = 0; ++ uint32_t v_prev_mask = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_src = 0; ++ uint32_t v_dst = 0; ++ uint32_t v_bit_num = 0; ++ ++ v_s = a_dst_slice; ++ v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 5u)); ++ v_prev_pos = 18446744073709551615u; ++ v_prev_mask = self->private_impl.f_bcj_x86_prev_mask; ++ while (((uint64_t)(v_s.len)) >= 5u) { ++ if (((uint8_t)(v_s.ptr[0u] & 254u)) != 232u) { ++ v_i += 1u; ++ v_p += 1u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ continue; ++ } ++ v_prev_pos = ((uint64_t)(v_i - v_prev_pos)); ++ if (v_prev_pos > 3u) { ++ v_prev_mask = 0u; ++ } else if (v_prev_pos > 0u) { ++ v_prev_mask = (((uint32_t)(v_prev_mask << (v_prev_pos - 1u))) & 7u); ++ if (v_prev_mask != 0u) { ++ v_c8 = v_s.ptr[((uint8_t)(4u - WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[(v_prev_mask & 7u)]))]; ++ if ( ! WUFFS_XZ__FILTER_04_X86_MASK_TO_ALLOWED_STATUS[(v_prev_mask & 7u)] || (v_c8 == 0u) || (v_c8 == 255u)) { ++ v_prev_pos = v_i; ++ v_prev_mask = (((uint32_t)(v_prev_mask << 1u)) | 1u); ++ v_i += 1u; ++ v_p += 1u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ continue; ++ } ++ } ++ } ++ v_prev_pos = v_i; ++ v_c8 = v_s.ptr[4u]; ++ if ((v_c8 != 0u) && (v_c8 != 255u)) { ++ v_prev_mask = (((uint32_t)(v_prev_mask << 1u)) | 1u); ++ v_i += 1u; ++ v_p += 1u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ continue; ++ } ++ v_src = ((((uint32_t)(v_s.ptr[1u])) << 0u) | ++ (((uint32_t)(v_s.ptr[2u])) << 8u) | ++ (((uint32_t)(v_s.ptr[3u])) << 16u) | ++ (((uint32_t)(v_s.ptr[4u])) << 24u)); ++ while (true) { ++ v_dst = ((uint32_t)(v_src - v_p)); ++ if (v_prev_mask == 0u) { ++ break; ++ } ++ v_bit_num = ((uint32_t)(WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[(v_prev_mask & 7u)])); ++ v_c8 = ((uint8_t)((v_dst >> (24u - (v_bit_num * 8u))))); ++ if ((v_c8 != 0u) && (v_c8 != 255u)) { ++ break; ++ } ++ v_src = (v_dst ^ WUFFS_XZ__FILTER_04_X86_MASK_TO_XOR_OPERAND[(v_prev_mask & 7u)]); ++ } ++ v_dst &= 33554431u; ++ v_dst |= ((uint32_t)(0u - (v_dst & 16777216u))); ++ v_s.ptr[1u] = ((uint8_t)((v_dst >> 0u))); ++ v_s.ptr[2u] = ((uint8_t)((v_dst >> 8u))); ++ v_s.ptr[3u] = ((uint8_t)((v_dst >> 16u))); ++ v_s.ptr[4u] = ((uint8_t)((v_dst >> 24u))); ++ v_i += 5u; ++ v_p += 5u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 5u); ++ } ++ v_prev_pos = ((uint64_t)(v_i - v_prev_pos)); ++ if (v_prev_pos > 3u) { ++ self->private_impl.f_bcj_x86_prev_mask = 0u; ++ } else if (v_prev_pos > 0u) { ++ self->private_impl.f_bcj_x86_prev_mask = ((uint32_t)(v_prev_mask << (v_prev_pos - 1u))); ++ } ++ self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 5u)); ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_05_powerpc ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_05_powerpc( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ ++ v_s = a_dst_slice; ++ v_p = self->private_impl.f_bcj_pos; ++ while (((uint64_t)(v_s.len)) >= 4u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 24u) | ++ (((uint32_t)(v_s.ptr[1u])) << 16u) | ++ (((uint32_t)(v_s.ptr[2u])) << 8u) | ++ (((uint32_t)(v_s.ptr[3u])) << 0u)); ++ if ((v_x & 4227858435u) == 1207959553u) { ++ v_x = ((((uint32_t)((v_x & 67108860u) - v_p)) & 67108860u) | 1207959553u); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 24u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 0u))); ++ } ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ self->private_impl.f_bcj_pos = v_p; ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_06_ia64 ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_06_ia64( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_mask = 0; ++ uint32_t v_slot = 0; ++ uint32_t v_bit_pos = 0; ++ uint32_t v_byte_pos = 0; ++ uint32_t v_bit_res = 0; ++ uint64_t v_x = 0; ++ uint32_t v_j = 0; ++ uint64_t v_norm = 0; ++ uint32_t v_addr = 0; ++ ++ v_s = a_dst_slice; ++ v_p = self->private_impl.f_bcj_pos; ++ while (((uint64_t)(v_s.len)) >= 16u) { ++ v_mask = ((uint32_t)(WUFFS_XZ__FILTER_06_IA64_BRANCH_TABLE[((uint8_t)(v_s.ptr[0u] & 31u))])); ++ v_slot = 0u; ++ while (true) { ++ do { ++ if (((v_mask >> v_slot) & 1u) == 0u) { ++ break; ++ } ++ v_bit_pos = ((v_slot * 41u) + 5u); ++ v_byte_pos = (v_bit_pos >> 3u); ++ v_bit_res = (v_bit_pos & 7u); ++ v_x = 0u; ++ v_j = 0u; ++ while (v_j < 6u) { ++ v_x |= (((uint64_t)(v_s.ptr[(v_j + v_byte_pos)])) << (8u * v_j)); ++ v_j += 1u; ++ } ++ v_norm = (v_x >> v_bit_res); ++ if ((((v_norm >> 37u) & 15u) != 5u) || (((v_norm >> 9u) & 7u) != 0u)) { ++ break; ++ } ++ v_addr = ((uint32_t)(((v_norm >> 13u) & 1048575u))); ++ v_addr |= (((uint32_t)(((v_norm >> 36u) & 1u))) << 20u); ++ v_addr <<= 4u; ++ v_addr -= v_p; ++ v_addr >>= 4u; ++ v_norm &= 18446743996400148479u; ++ v_norm |= (((uint64_t)((v_addr & 1048575u))) << 13u); ++ v_norm |= (((uint64_t)((v_addr & 1048576u))) << 16u); ++ v_x &= ((((uint64_t)(1u)) << v_bit_res) - 1u); ++ v_x |= ((uint64_t)(v_norm << v_bit_res)); ++ v_j = 0u; ++ while (v_j < 6u) { ++ v_s.ptr[(v_j + v_byte_pos)] = ((uint8_t)((v_x >> (8u * v_j)))); ++ v_j += 1u; ++ } ++ } while (0); ++ if (v_slot >= 2u) { ++ break; ++ } ++ v_slot += 1u; ++ } ++ v_p += 16u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 16u); ++ } ++ self->private_impl.f_bcj_pos = v_p; ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_07_arm ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_07_arm( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ ++ v_s = a_dst_slice; ++ v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 8u)); ++ while (((uint64_t)(v_s.len)) >= 4u) { ++ if (v_s.ptr[3u] == 235u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) | ++ (((uint32_t)(v_s.ptr[1u])) << 8u) | ++ (((uint32_t)(v_s.ptr[2u])) << 16u) | ++ (((uint32_t)(v_s.ptr[3u])) << 24u)); ++ v_x = (((uint32_t)(((v_x & 16777215u) << 2u) - v_p)) >> 2u); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 0u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 16u))); ++ } ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 8u)); ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_08_armthumb ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_08_armthumb( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ uint32_t v_y = 0; ++ ++ v_s = a_dst_slice; ++ v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 4u)); ++ while (((uint64_t)(v_s.len)) >= 4u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) | ++ (((uint32_t)(v_s.ptr[1u])) << 8u) | ++ (((uint32_t)(v_s.ptr[2u])) << 16u) | ++ (((uint32_t)(v_s.ptr[3u])) << 24u)); ++ if ((v_x & 4160813056u) != 4160811008u) { ++ v_p += 2u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); ++ continue; ++ } ++ v_y = ((((uint32_t)(((uint8_t)(v_s.ptr[0u] & 255u)))) << 11u) | ++ (((uint32_t)(((uint8_t)(v_s.ptr[1u] & 7u)))) << 19u) | ++ (((uint32_t)(((uint8_t)(v_s.ptr[2u] & 255u)))) << 0u) | ++ (((uint32_t)(((uint8_t)(v_s.ptr[3u] & 7u)))) << 8u)); ++ v_y = (((uint32_t)(((uint32_t)(v_y << 1u)) - v_p)) >> 1u); ++ v_s.ptr[0u] = ((uint8_t)((v_y >> 11u))); ++ v_s.ptr[1u] = ((uint8_t)((((v_y >> 19u) & 7u) | 240u))); ++ v_s.ptr[2u] = ((uint8_t)((v_y >> 0u))); ++ v_s.ptr[3u] = ((uint8_t)((((v_y >> 8u) & 7u) | 248u))); ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 4u)); ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_09_sparc ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_09_sparc( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ ++ v_s = a_dst_slice; ++ v_p = self->private_impl.f_bcj_pos; ++ while (((uint64_t)(v_s.len)) >= 4u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 24u) | ++ (((uint32_t)(v_s.ptr[1u])) << 16u) | ++ (((uint32_t)(v_s.ptr[2u])) << 8u) | ++ (((uint32_t)(v_s.ptr[3u])) << 0u)); ++ if (((v_x >> 22u) == 256u) || ((v_x >> 22u) == 511u)) { ++ v_x = (((uint32_t)(((uint32_t)(v_x << 2u)) - v_p)) >> 2u); ++ v_x = ((1073741824u - (v_x & 4194304u)) | 1073741824u | (v_x & 4194303u)); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 24u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 0u))); ++ } ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ self->private_impl.f_bcj_pos = v_p; ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_0a_arm64 ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_0a_arm64( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ uint32_t v_y = 0; ++ ++ v_s = a_dst_slice; ++ v_p = self->private_impl.f_bcj_pos; ++ while (((uint64_t)(v_s.len)) >= 4u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) | ++ (((uint32_t)(v_s.ptr[1u])) << 8u) | ++ (((uint32_t)(v_s.ptr[2u])) << 16u) | ++ (((uint32_t)(v_s.ptr[3u])) << 24u)); ++ if ((v_x >> 26u) == 37u) { ++ v_y = ((uint32_t)(v_x - (v_p >> 2u))); ++ v_x = (2483027968u | (v_y & 67108863u)); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 0u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 24u))); ++ } else if ((v_x & 2667577344u) == 2415919104u) { ++ v_y = (((v_x >> 29u) & 3u) | ((v_x >> 3u) & 2097148u)); ++ if ((((uint32_t)(v_y + 131072u)) & 1835008u) == 0u) { ++ v_y -= (v_p >> 12u); ++ v_x &= 2415919135u; ++ v_x |= ((v_y & 3u) << 29u); ++ v_x |= ((v_y & 262140u) << 3u); ++ v_x |= (((uint32_t)(0u - (v_y & 131072u))) & 14680064u); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 0u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 24u))); ++ } ++ } ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ self->private_impl.f_bcj_pos = v_p; ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_0b_riscv ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_0b_riscv( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ uint32_t v_x27 = 0; ++ uint32_t v_y = 0; ++ uint32_t v_addr = 0; ++ ++ v_s = a_dst_slice; ++ v_p = self->private_impl.f_bcj_pos; ++ while (((uint64_t)(v_s.len)) >= 8u) { ++ if (v_s.ptr[0u] == 239u) { ++ if (((uint8_t)(v_s.ptr[1u] & 13u)) != 0u) { ++ v_p += 2u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); ++ continue; ++ } ++ v_addr = ((((uint32_t)(((uint8_t)(v_s.ptr[1u] & 240u)))) << 13u) | (((uint32_t)(v_s.ptr[2u])) << 9u) | (((uint32_t)(v_s.ptr[3u])) << 1u)); ++ v_addr -= v_p; ++ v_s.ptr[1u] = ((uint8_t)(((uint8_t)(v_s.ptr[1u] & 15u)) | ((uint8_t)(((v_addr >> 8u) & 240u))))); ++ v_s.ptr[2u] = ((uint8_t)((((v_addr >> 16u) & 15u) | ((v_addr >> 7u) & 16u) | (((uint32_t)(v_addr << 4u)) & 224u)))); ++ v_s.ptr[3u] = ((uint8_t)((((v_addr >> 4u) & 127u) | ((v_addr >> 13u) & 128u)))); ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ continue; ++ } else if (((uint8_t)(v_s.ptr[0u] & 127u)) == 23u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) | ++ (((uint32_t)(v_s.ptr[1u])) << 8u) | ++ (((uint32_t)(v_s.ptr[2u])) << 16u) | ++ (((uint32_t)(v_s.ptr[3u])) << 24u)); ++ if ((v_x & 3712u) != 0u) { ++ v_y = ((((uint32_t)(v_s.ptr[4u])) << 0u) | ++ (((uint32_t)(v_s.ptr[5u])) << 8u) | ++ (((uint32_t)(v_s.ptr[6u])) << 16u) | ++ (((uint32_t)(v_s.ptr[7u])) << 24u)); ++ if (((((uint32_t)(v_x << 8u)) ^ ((uint32_t)(v_y - 3u))) & 1015811u) != 0u) { ++ v_p += 6u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 6u); ++ continue; ++ } ++ v_addr = ((v_x & 4294963200u) | (v_y >> 20u)); ++ v_x = (279u | ((uint32_t)(v_y << 12u))); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 0u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 24u))); ++ v_s.ptr[4u] = ((uint8_t)((v_addr >> 0u))); ++ v_s.ptr[5u] = ((uint8_t)((v_addr >> 8u))); ++ v_s.ptr[6u] = ((uint8_t)((v_addr >> 16u))); ++ v_s.ptr[7u] = ((uint8_t)((v_addr >> 24u))); ++ v_p += 8u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u); ++ continue; ++ } ++ v_x27 = (v_x >> 27u); ++ if (((uint32_t)(((uint32_t)(v_x - 12567u)) << 18u)) >= (v_x27 & 29u)) { ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ continue; ++ } ++ v_addr = ((((uint32_t)(v_s.ptr[4u])) << 24u) | ++ (((uint32_t)(v_s.ptr[5u])) << 16u) | ++ (((uint32_t)(v_s.ptr[6u])) << 8u) | ++ (((uint32_t)(v_s.ptr[7u])) << 0u)); ++ v_addr -= v_p; ++ v_y = ((v_x >> 12u) | ((uint32_t)(v_addr << 20u))); ++ v_x = (23u | (v_x27 << 7u) | (((uint32_t)(v_addr + 2048u)) & 4294963200u)); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 0u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 24u))); ++ v_s.ptr[4u] = ((uint8_t)((v_y >> 0u))); ++ v_s.ptr[5u] = ((uint8_t)((v_y >> 8u))); ++ v_s.ptr[6u] = ((uint8_t)((v_y >> 16u))); ++ v_s.ptr[7u] = ((uint8_t)((v_y >> 24u))); ++ v_p += 8u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u); ++ continue; ++ } ++ v_p += 2u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); ++ } ++ self->private_impl.f_bcj_pos = v_p; ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash32__hasher__get_quirk( +- const wuffs_xxhash32__hasher* self, ++wuffs_xz__decoder__get_quirk( ++ const wuffs_xz__decoder* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -61527,15 +77160,24 @@ wuffs_xxhash32__hasher__get_quirk( + return 0; + } + ++ if (a_key == 1u) { ++ if (self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } ++ } else if (a_key == 2021322752u) { ++ if (self->private_impl.f_standalone_format) { ++ return 1u; ++ } ++ } + return 0u; + } + +-// -------- func xxhash32.hasher.set_quirk ++// -------- func xz.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_xxhash32__hasher__set_quirk( +- wuffs_xxhash32__hasher* self, ++wuffs_xz__decoder__set_quirk( ++ wuffs_xz__decoder* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -61548,747 +77190,1667 @@ wuffs_xxhash32__hasher__set_quirk( + : wuffs_base__error__initialize_not_called); + } + ++ if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } else if (a_key == 2021322752u) { ++ self->private_impl.f_standalone_format = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func xxhash32.hasher.update ++// -------- func xz.decoder.dst_history_retain_length + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_xxhash32__hasher__update( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_xz__decoder__dst_history_retain_length( ++ const wuffs_xz__decoder* self) { + if (!self) { +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_lzma__decoder__dst_history_retain_length(&self->private_data.f_lzma); ++} ++ ++// -------- func xz.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_xz__decoder__workbuf_len( ++ const wuffs_xz__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_lzma__decoder__workbuf_len(&self->private_data.f_lzma); ++} ++ ++// -------- func xz.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_xz__decoder__transform_io( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_xz__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_xz__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_transform_io = 0; ++ goto exit; + } + +- wuffs_base__slice_u8 v_remaining = {0}; ++ goto suspend; ++ suspend: ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + +- if ((self->private_impl.f_length_modulo_u32 == 0u) && ! self->private_impl.f_length_overflows_u32) { +- self->private_impl.f_v0 = 606290984u; +- self->private_impl.f_v1 = 2246822519u; +- self->private_impl.f_v2 = 0u; +- self->private_impl.f_v3 = 1640531535u; +- } +- while (((uint64_t)(a_x.len)) > 0u) { +- v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); +- if (((uint64_t)(a_x.len)) > 16777216u) { +- v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 16777216u); +- a_x = wuffs_base__slice_u8__subslice_j(a_x, 16777216u); +- } +- wuffs_xxhash32__hasher__up(self, a_x); +- a_x = v_remaining; ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- return wuffs_base__make_empty_struct(); ++ return status; + } + +-// -------- func xxhash32.hasher.update_u32 ++// -------- func xz.decoder.do_transform_io + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_xxhash32__hasher__update_u32( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return 0; +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; +- } ++static wuffs_base__status ++wuffs_xz__decoder__do_transform_io( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_xxhash32__hasher__update(self, a_x); +- return wuffs_xxhash32__hasher__checksum_u32(self); +-} ++ uint64_t v_header_magic = 0; ++ uint64_t v_dmark = 0; ++ uint64_t v_smark = 0; ++ uint8_t v_i8 = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_checksum32_have = 0; ++ uint32_t v_checksum32_want = 0; ++ uint64_t v_checksum64_have = 0; ++ uint64_t v_checksum64_want = 0; ++ wuffs_base__bitvec256 v_checksum256_have = {0}; ++ uint64_t v_compressed_size = 0; ++ uint64_t v_uncompressed_size = 0; ++ uint32_t v_hash = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_c32 = 0; ++ uint16_t v_footer_magic = 0; + +-// -------- func xxhash32.hasher.up ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_xxhash32__hasher__up( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_new_lmu = 0; +- uint32_t v_buf_u32 = 0; +- uint32_t v_buf_len = 0; +- uint32_t v_v0 = 0; +- uint32_t v_v1 = 0; +- uint32_t v_v2 = 0; +- uint32_t v_v3 = 0; +- wuffs_base__slice_u8 v_p = {0}; ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; ++ if (coro_susp_point) { ++ v_checksum32_have = self->private_data.s_do_transform_io.v_checksum32_have; ++ v_checksum32_want = self->private_data.s_do_transform_io.v_checksum32_want; ++ v_checksum256_have = self->private_data.s_do_transform_io.v_checksum256_have; ++ v_compressed_size = self->private_data.s_do_transform_io.v_compressed_size; ++ v_uncompressed_size = self->private_data.s_do_transform_io.v_uncompressed_size; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- v_new_lmu = ((uint32_t)(self->private_impl.f_length_modulo_u32 + ((uint32_t)(((uint64_t)(a_x.len)))))); +- self->private_impl.f_length_overflows_u32 = ((v_new_lmu < self->private_impl.f_length_modulo_u32) || self->private_impl.f_length_overflows_u32); +- self->private_impl.f_length_modulo_u32 = v_new_lmu; +- while (true) { +- if (self->private_impl.f_buf_len >= 16u) { +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) | +- (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u)); +- v_v0 = ((uint32_t)(self->private_impl.f_v0 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u)); +- self->private_impl.f_v0 = ((uint32_t)(v_v0 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) | +- (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u)); +- v_v1 = ((uint32_t)(self->private_impl.f_v1 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u)); +- self->private_impl.f_v1 = ((uint32_t)(v_v1 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) | +- (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u)); +- v_v2 = ((uint32_t)(self->private_impl.f_v2 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u)); +- self->private_impl.f_v2 = ((uint32_t)(v_v2 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[12u])) | +- (((uint32_t)(self->private_impl.f_buf_data[13u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[14u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[15u])) << 24u)); +- v_v3 = ((uint32_t)(self->private_impl.f_v3 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u)); +- self->private_impl.f_v3 = ((uint32_t)(v_v3 * 2654435761u)); +- self->private_impl.f_buf_len = 0u; +- break; +- } +- if (((uint64_t)(a_x.len)) <= 0u) { +- return wuffs_base__make_empty_struct(); +- } +- self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u]; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))); ++ iop_a_src += 6; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 40) { ++ t_0 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_header_magic = t_0; ++ } ++ if (v_header_magic != 388031461373u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint64_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) { ++ t_1 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))); ++ iop_a_src += 6; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 40) { ++ t_1 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_header_magic = t_1; ++ } ++ if (v_header_magic == 72400582410240u) { ++ self->private_impl.f_checksummer = 0u; ++ } else if (v_header_magic == 60327687946496u) { ++ self->private_impl.f_checksummer = 1u; ++ } else if (v_header_magic == 77742513456128u) { ++ self->private_impl.f_checksummer = 2u; ++ } else if (v_header_magic == 177077137508864u) { ++ self->private_impl.f_checksummer = 3u; ++ } else if ((v_header_magic & 61695u) != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_header); ++ goto exit; ++ } else { ++ v_header_magic = (15u & (v_header_magic >> 8u)); ++ if ((v_header_magic != 0u) && ++ (v_header_magic != 1u) && ++ (v_header_magic != 4u) && ++ (v_header_magic != 10u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__unsupported_checksum_algorithm); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ self->private_impl.f_flags = ((uint16_t)(v_header_magic)); ++ self->private_impl.f_num_actual_blocks = 0u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ continue; ++ } else if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) == 0u) { ++ break; ++ } ++ self->private_impl.f_num_actual_blocks += 1u; ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ self->private_impl.f_compressed_size_for_index = 4u; ++ while (true) { ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_xz__decoder__decode_block_header_with_padding(self, a_src); ++ v_status = t_2; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_size_for_index, wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)))); ++ if ( ! self->private_impl.f_ignore_checksum) { ++ v_checksum32_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ } ++ } ++ v_checksum32_want = t_3; ++ } ++ if (self->private_impl.f_ignore_checksum) { ++ } else if (v_checksum32_have != v_checksum32_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } else { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_private_impl__ignore_status(wuffs_crc64__ecma_hasher__initialize(&self->private_data.f_crc64, ++ sizeof (wuffs_crc64__ecma_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_private_impl__ignore_status(wuffs_sha256__hasher__initialize(&self->private_data.f_sha256, ++ sizeof (wuffs_sha256__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ v_compressed_size = 0u; ++ v_uncompressed_size = 0u; ++ while (true) { ++ if (((uint64_t)(self->private_impl.f_bcj_undo_index)) > ((uint64_t)(io2_a_dst - iop_a_dst))) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ continue; ++ } ++ v_dmark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ if (self->private_impl.f_num_non_final_filters == 0u) { ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_4 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf); ++ v_status = t_4; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ } else { ++ if (self->private_impl.f_bcj_undo_index > 0u) { ++ wuffs_private_impl__io_writer__copy_from_slice(&iop_a_dst, io2_a_dst,wuffs_base__make_slice_u8(self->private_data.f_filter_data[0u], self->private_impl.f_bcj_undo_index)); ++ self->private_impl.f_bcj_undo_index = 0u; ++ } ++ { ++ uint8_t* o_0_io0_a_dst = io0_a_dst; ++ uint8_t* o_0_io1_a_dst = io1_a_dst; ++ io0_a_dst = iop_a_dst; ++ io1_a_dst = iop_a_dst; ++ wuffs_base__io_buffer o_0_a_dst; ++ if (a_dst) { ++ memcpy(&o_0_a_dst, a_dst, sizeof(*a_dst)); ++ size_t wi0 = a_dst->meta.wi; ++ a_dst->data.ptr += wi0; ++ a_dst->data.len -= wi0; ++ a_dst->meta.ri = 0; ++ a_dst->meta.wi = 0; ++ a_dst->meta.pos = wuffs_base__u64__sat_add(a_dst->meta.pos, wi0); ++ } ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_5 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf); ++ v_status = t_5; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (a_dst) { ++ memcpy(a_dst, &o_0_a_dst, sizeof(*a_dst)); ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ io0_a_dst = o_0_io0_a_dst; ++ io1_a_dst = o_0_io1_a_dst; ++ } ++ } ++ self->private_impl.f_bcj_undo_index = wuffs_xz__decoder__apply_non_final_filters(self, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ if ((self->private_impl.f_bcj_undo_index > 0u) && ! wuffs_base__status__is_ok(&v_status)) { ++ v_i8 = ((uint8_t)(self->private_impl.f_bcj_undo_index - 1u)); ++ while (true) { ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_xz__error__internal_error_inconsistent_bcj_filter_state); ++ goto exit; ++ } ++ self->private_data.f_filter_data[0u][v_i8] = iop_a_dst[-1]; ++ iop_a_dst--; ++ if (v_i8 <= 0u) { ++ break; ++ } + #if defined(__GNUC__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wconversion" + #endif +- self->private_impl.f_buf_len += 1u; ++ v_i8 -= 1u; + #if defined(__GNUC__) + #pragma GCC diagnostic pop + #endif +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); +- } +- v_buf_len = ((uint32_t)((self->private_impl.f_buf_len & 15u))); +- v_v0 = self->private_impl.f_v0; +- v_v1 = self->private_impl.f_v1; +- v_v2 = self->private_impl.f_v2; +- v_v3 = self->private_impl.f_v3; +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 16; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16); +- while (v_p.ptr < i_end0_p) { +- v_buf_u32 = (((uint32_t)(v_p.ptr[0u])) | +- (((uint32_t)(v_p.ptr[1u])) << 8u) | +- (((uint32_t)(v_p.ptr[2u])) << 16u) | +- (((uint32_t)(v_p.ptr[3u])) << 24u)); +- v_v0 = ((uint32_t)(v_v0 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u)); +- v_v0 = ((uint32_t)(v_v0 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(v_p.ptr[4u])) | +- (((uint32_t)(v_p.ptr[5u])) << 8u) | +- (((uint32_t)(v_p.ptr[6u])) << 16u) | +- (((uint32_t)(v_p.ptr[7u])) << 24u)); +- v_v1 = ((uint32_t)(v_v1 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u)); +- v_v1 = ((uint32_t)(v_v1 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(v_p.ptr[8u])) | +- (((uint32_t)(v_p.ptr[9u])) << 8u) | +- (((uint32_t)(v_p.ptr[10u])) << 16u) | +- (((uint32_t)(v_p.ptr[11u])) << 24u)); +- v_v2 = ((uint32_t)(v_v2 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u)); +- v_v2 = ((uint32_t)(v_v2 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(v_p.ptr[12u])) | +- (((uint32_t)(v_p.ptr[13u])) << 8u) | +- (((uint32_t)(v_p.ptr[14u])) << 16u) | +- (((uint32_t)(v_p.ptr[15u])) << 24u)); +- v_v3 = ((uint32_t)(v_v3 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u)); +- v_v3 = ((uint32_t)(v_v3 * 2654435761u)); +- v_p.ptr += 16; +- } +- v_p.len = 1; +- uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end1_p) { +- self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u]; +- v_buf_len = ((v_buf_len + 1u) & 15u); +- v_p.ptr += 1; ++ } ++ } ++ } ++ v_compressed_size += wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src))); ++ v_uncompressed_size += wuffs_private_impl__io__count_since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst))); ++ if (self->private_impl.f_ignore_checksum) { ++ } else if (self->private_impl.f_checksummer == 1u) { ++ wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ } else if (self->private_impl.f_checksummer == 2u) { ++ wuffs_crc64__ecma_hasher__update(&self->private_data.f_crc64, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ } else if (self->private_impl.f_checksummer == 3u) { ++ wuffs_sha256__hasher__update(&self->private_data.f_sha256, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ } ++ if ((self->private_impl.f_block_has_compressed_size && (self->private_impl.f_block_compressed_size != v_compressed_size)) || (self->private_impl.f_block_has_uncompressed_size && (self->private_impl.f_block_uncompressed_size != v_uncompressed_size))) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_size_for_index, v_compressed_size); ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_size_for_index, ((uint64_t)(WUFFS_XZ__CHECKSUM_LENGTH[self->private_impl.f_checksummer]))); ++ self->private_impl.f_verification_have_total_sizes[0u] += self->private_impl.f_compressed_size_for_index; ++ v_hash = ((uint32_t)((self->private_impl.f_compressed_size_for_index ^ (self->private_impl.f_compressed_size_for_index >> 32u)))); ++ v_hash *= 3432918353u; ++ v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u)); ++ v_hash *= 461845907u; ++ v_hash ^= self->private_impl.f_verification_have_hashed_sizes[0u]; ++ v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u)); ++ self->private_impl.f_verification_have_hashed_sizes[0u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u)); ++ self->private_impl.f_verification_have_total_sizes[1u] += v_uncompressed_size; ++ v_hash = ((uint32_t)((v_uncompressed_size ^ (v_uncompressed_size >> 32u)))); ++ v_hash *= 3432918353u; ++ v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u)); ++ v_hash *= 461845907u; ++ v_hash ^= self->private_impl.f_verification_have_hashed_sizes[1u]; ++ v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u)); ++ self->private_impl.f_verification_have_hashed_sizes[1u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u)); ++ while ((v_compressed_size & 3u) != 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_padding); ++ goto exit; ++ } ++ v_compressed_size += 1u; ++ } ++ self->private_impl.f_lzma_needs_reset = true; ++ if (self->private_impl.f_ignore_checksum) { ++ self->private_data.s_do_transform_io.scratch = ((uint32_t)(WUFFS_XZ__CHECKSUM_LENGTH[self->private_impl.f_checksummer])); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_transform_io.scratch; ++ } else if (self->private_impl.f_checksummer == 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ uint32_t t_7; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; ++ if (num_bits_7 == 24) { ++ t_7 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_7 += 8u; ++ *scratch |= ((uint64_t)(num_bits_7)) << 56; ++ } ++ } ++ v_checksum32_want = t_7; ++ } ++ v_checksum32_have = wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32); ++ if (v_checksum32_have != v_checksum32_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ } else if (self->private_impl.f_checksummer == 2u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ uint64_t t_8; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_8 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; ++ if (num_bits_8 == 56) { ++ t_8 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_8 += 8u; ++ *scratch |= ((uint64_t)(num_bits_8)) << 56; ++ } ++ } ++ v_checksum64_want = t_8; ++ } ++ v_checksum64_have = wuffs_crc64__ecma_hasher__checksum_u64(&self->private_data.f_crc64); ++ if (v_checksum64_have != v_checksum64_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ } else if (self->private_impl.f_checksummer == 3u) { ++ v_checksum256_have = wuffs_sha256__hasher__checksum_bitvec256(&self->private_data.f_sha256); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); ++ uint64_t t_9; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_9 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_9 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_9); ++ if (num_bits_9 == 56) { ++ t_9 = ((uint64_t)(*scratch >> 0)); ++ break; ++ } ++ num_bits_9 += 8u; ++ *scratch |= ((uint64_t)(num_bits_9)); ++ } ++ } ++ v_checksum64_want = t_9; ++ } ++ if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 3u) != v_checksum64_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); ++ uint64_t t_10; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_10 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_10 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_10); ++ if (num_bits_10 == 56) { ++ t_10 = ((uint64_t)(*scratch >> 0)); ++ break; ++ } ++ num_bits_10 += 8u; ++ *scratch |= ((uint64_t)(num_bits_10)); ++ } ++ } ++ v_checksum64_want = t_10; ++ } ++ if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 2u) != v_checksum64_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); ++ uint64_t t_11; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_11 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_11 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_11); ++ if (num_bits_11 == 56) { ++ t_11 = ((uint64_t)(*scratch >> 0)); ++ break; ++ } ++ num_bits_11 += 8u; ++ *scratch |= ((uint64_t)(num_bits_11)); ++ } ++ } ++ v_checksum64_want = t_11; ++ } ++ if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 1u) != v_checksum64_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); ++ uint64_t t_12; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_12 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_12 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_12); ++ if (num_bits_12 == 56) { ++ t_12 = ((uint64_t)(*scratch >> 0)); ++ break; ++ } ++ num_bits_12 += 8u; ++ *scratch |= ((uint64_t)(num_bits_12)); ++ } ++ } ++ v_checksum64_want = t_12; ++ } ++ if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 0u) != v_checksum64_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ } ++ } ++ self->private_impl.f_backwards_size = 0u; ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ while (true) { ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_13 = wuffs_xz__decoder__verify_index(self, a_src); ++ v_status = t_13; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_backwards_size, wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)))); ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(25); ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_XZ__ZEROES), (3u & ((uint64_t)(0u - (3u & self->private_impl.f_backwards_size)))))); ++ } ++ while ((self->private_impl.f_backwards_size & 3u) != 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_14 = *iop_a_src++; ++ v_c8 = t_14; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ self->private_impl.f_backwards_size += 1u; ++ } ++ self->private_impl.f_backwards_size >>= 2u; ++ if ((self->private_impl.f_backwards_size == 0u) || (self->private_impl.f_backwards_size > 4294967295u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27); ++ uint32_t t_15; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_15 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_15 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_15; ++ if (num_bits_15 == 24) { ++ t_15 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_15 += 8u; ++ *scratch |= ((uint64_t)(num_bits_15)) << 56; ++ } ++ } ++ v_checksum32_want = t_15; ++ } ++ if (self->private_impl.f_ignore_checksum) { ++ } else if (v_checksum32_want != wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } else { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29); ++ uint32_t t_16; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_16 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_16 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_16; ++ if (num_bits_16 == 24) { ++ t_16 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_16 += 8u; ++ *scratch |= ((uint64_t)(num_bits_16)) << 56; ++ } ++ } ++ v_checksum32_want = t_16; ++ } ++ while (true) { ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_17 = wuffs_xz__decoder__verify_footer(self, a_src); ++ v_status = t_17; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(31); ++ } ++ if ( ! self->private_impl.f_ignore_checksum && (v_checksum32_want != wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32))) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32); ++ uint16_t t_18; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_18 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_18 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_18; ++ if (num_bits_18 == 8) { ++ t_18 = ((uint16_t)(*scratch)); ++ break; ++ } ++ num_bits_18 += 8u; ++ *scratch |= ((uint64_t)(num_bits_18)) << 56; ++ } ++ } ++ v_footer_magic = t_18; ++ } ++ if (v_footer_magic != 23129u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_footer); ++ goto exit; ++ } ++ if ( ! self->private_impl.f_standalone_format) { ++ break; ++ } ++ while (true) { ++ while (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ if (a_src && a_src->meta.closed) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) == 0u) { ++ goto label__streams__break; ++ } else { ++ status = wuffs_base__make_status(wuffs_xz__error__truncated_input); ++ goto exit; ++ } ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(34); ++ } ++ v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ if (v_c32 == 1484404733u) { ++ break; ++ } else if (v_c32 != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_header_concatenated_stream); ++ goto exit; ++ } ++ iop_a_src += 4u; ++ } ++ self->private_impl.f_started_verify_index = false; + } +- v_p.len = 0; +- } +- self->private_impl.f_buf_len = ((uint8_t)(v_buf_len)); +- self->private_impl.f_v0 = v_v0; +- self->private_impl.f_v1 = v_v1; +- self->private_impl.f_v2 = v_v2; +- self->private_impl.f_v3 = v_v3; +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func xxhash32.hasher.checksum_u32 ++ label__streams__break:; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_xxhash32__hasher__checksum_u32( +- const wuffs_xxhash32__hasher* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ ok: ++ self->private_impl.p_do_transform_io = 0; ++ goto exit; + } + +- uint32_t v_ret = 0; +- uint32_t v_i = 0; +- uint32_t v_n = 0; +- uint32_t v_buf_u32 = 0; ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_transform_io.v_checksum32_have = v_checksum32_have; ++ self->private_data.s_do_transform_io.v_checksum32_want = v_checksum32_want; ++ self->private_data.s_do_transform_io.v_checksum256_have = v_checksum256_have; ++ self->private_data.s_do_transform_io.v_compressed_size = v_compressed_size; ++ self->private_data.s_do_transform_io.v_uncompressed_size = v_uncompressed_size; + +- if ((self->private_impl.f_length_modulo_u32 >= 16u) || self->private_impl.f_length_overflows_u32) { +- v_ret += (((uint32_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 31u)); +- v_ret += (((uint32_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 25u)); +- v_ret += (((uint32_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 20u)); +- v_ret += (((uint32_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 14u)); +- v_ret += self->private_impl.f_length_modulo_u32; +- } else { +- v_ret += 374761393u; +- v_ret += self->private_impl.f_length_modulo_u32; +- } +- v_n = 16u; +- v_n = wuffs_base__u32__min(v_n, ((uint32_t)(self->private_impl.f_buf_len))); +- if (4u <= v_n) { +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) | +- (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u)); +- v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); +- v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); +- v_ret *= 668265263u; +- v_i = 4u; +- } +- if (8u <= v_n) { +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) | +- (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u)); +- v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); +- v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); +- v_ret *= 668265263u; +- v_i = 8u; +- } +- if (12u <= v_n) { +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) | +- (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u)); +- v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); +- v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); +- v_ret *= 668265263u; +- v_i = 12u; ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } +- while (v_i < v_n) { +- v_ret += ((uint32_t)(((uint32_t)(self->private_impl.f_buf_data[v_i])) * 374761393u)); +- v_ret = (((uint32_t)(v_ret << 11u)) | (v_ret >> 21u)); +- v_ret *= 2654435761u; +- v_i += 1u; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_ret ^= (v_ret >> 15u); +- v_ret *= 2246822519u; +- v_ret ^= (v_ret >> 13u); +- v_ret *= 3266489917u; +- v_ret ^= (v_ret >> 16u); +- return v_ret; +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) +- +-// ---------------- Status Codes Implementations + +-// ---------------- Private Consts ++ return status; ++} + +-#define WUFFS_XXHASH64__XXH_PRIME64_1 11400714785074694791 ++// -------- func xz.decoder.decode_block_header_with_padding + +-#define WUFFS_XXHASH64__XXH_PRIME64_2 14029467366897019727 ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__decode_block_header_with_padding( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-#define WUFFS_XXHASH64__XXH_PRIME64_3 1609587929392839161 ++ uint8_t v_c8 = 0; ++ uint64_t v_padded_size_have = 0; ++ uint64_t v_padded_size_want = 0; ++ uint64_t v_smark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +-#define WUFFS_XXHASH64__XXH_PRIME64_4 9650029242287828579 ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-#define WUFFS_XXHASH64__XXH_PRIME64_5 2870177450012600261 ++ uint32_t coro_susp_point = self->private_impl.p_decode_block_header_with_padding; ++ if (coro_susp_point) { ++ v_padded_size_have = self->private_data.s_decode_block_header_with_padding.v_padded_size_have; ++ v_padded_size_want = self->private_data.s_decode_block_header_with_padding.v_padded_size_want; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-#define WUFFS_XXHASH64__INITIAL_V0 6983438078262162902 ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ v_padded_size_want = ((uint64_t)((((uint64_t)(v_c8)) * 4u) - 1u)); ++ while (true) { ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_1 = wuffs_xz__decoder__decode_block_header_sans_padding(self, a_src); ++ v_status = t_1; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&v_padded_size_have, wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)))); ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } ++ if (v_padded_size_have > v_padded_size_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ while (v_padded_size_have < v_padded_size_want) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ v_padded_size_have += 1u; ++ } + +-#define WUFFS_XXHASH64__INITIAL_V1 14029467366897019727 ++ ok: ++ self->private_impl.p_decode_block_header_with_padding = 0; ++ goto exit; ++ } + +-#define WUFFS_XXHASH64__INITIAL_V2 0 ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_block_header_with_padding = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_block_header_with_padding.v_padded_size_have = v_padded_size_have; ++ self->private_data.s_decode_block_header_with_padding.v_padded_size_want = v_padded_size_want; + +-#define WUFFS_XXHASH64__INITIAL_V3 7046029288634856825 ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +-// ---------------- Private Initializer Prototypes ++ return status; ++} + +-// ---------------- Private Function Prototypes ++// -------- func xz.decoder.decode_block_header_sans_padding + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_xxhash64__hasher__up( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x); +- +-// ---------------- VTables +- +-const wuffs_base__hasher_u64__func_ptrs +-wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64 = { +- (uint64_t(*)(const void*))(&wuffs_xxhash64__hasher__checksum_u64), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_xxhash64__hasher__get_quirk), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_xxhash64__hasher__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update), +- (uint64_t(*)(void*, +- wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update_u64), +-}; ++static wuffs_base__status ++wuffs_xz__decoder__decode_block_header_sans_padding( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// ---------------- Initializer Implementations ++ uint8_t v_c8 = 0; ++ uint32_t v_c32 = 0; ++ uint32_t v_alignment = 0; ++ uint8_t v_flags = 0; ++ uint8_t v_filter_id = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_shift = 0; ++ uint32_t v_f = 0; ++ uint32_t v_k = 0; + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_xxhash64__hasher__initialize( +- wuffs_xxhash64__hasher* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_block_header_sans_padding; ++ if (coro_susp_point) { ++ v_flags = self->private_data.s_decode_block_header_sans_padding.v_flags; ++ v_filter_id = self->private_data.s_decode_block_header_sans_padding.v_filter_id; ++ v_shift = self->private_data.s_decode_block_header_sans_padding.v_shift; ++ v_f = self->private_data.s_decode_block_header_sans_padding.v_f; + } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_flags = t_0; + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ self->private_impl.f_num_non_final_filters = ((uint32_t)(((uint8_t)(v_flags & 3u)))); ++ if (((uint8_t)(v_flags & 60u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ self->private_impl.f_block_has_compressed_size = (((uint8_t)(v_flags & 64u)) != 0u); ++ if (self->private_impl.f_block_has_compressed_size) { ++ self->private_impl.f_block_compressed_size = 0u; ++ v_shift = 0u; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (v_shift <= 56u) { ++ self->private_impl.f_block_compressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift); ++ if (v_c8 >= 128u) { ++ v_shift += 7u; ++ continue; ++ } else if ((v_c8 == 0u) && (v_shift > 0u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ break; ++ } else if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ self->private_impl.f_block_compressed_size |= (((uint64_t)(1u)) << 63u); ++ break; ++ } ++ } ++ self->private_impl.f_block_has_uncompressed_size = (((uint8_t)(v_flags & 128u)) != 0u); ++ if (self->private_impl.f_block_has_uncompressed_size) { ++ self->private_impl.f_block_uncompressed_size = 0u; ++ v_shift = 0u; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (v_shift <= 56u) { ++ self->private_impl.f_block_uncompressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift); ++ if (v_c8 >= 128u) { ++ v_shift += 7u; ++ continue; ++ } else if ((v_c8 == 0u) && (v_shift > 0u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ break; ++ } else if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ self->private_impl.f_block_uncompressed_size |= (((uint64_t)(1u)) << 63u); ++ break; ++ } ++ } ++ self->private_impl.f_bcj_x86_prev_mask = 0u; ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_non_final_filters__choosy_default); ++ v_f = 0u; ++ while (v_f < self->private_impl.f_num_non_final_filters) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_filter_id = t_3; ++ } ++ if (v_filter_id == 33u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_filter); ++ goto exit; ++ } else if (v_filter_id == 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_filter); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ self->private_impl.f_filters[v_f] = ((((uint32_t)(v_c8)) << 8u) | 3u); ++ v_k = 0u; ++ while (v_k < 256u) { ++ self->private_data.f_filter_data[v_f][v_k] = 0u; ++ v_k += 1u; ++ } ++ } else if ((v_filter_id < 3u) || (11u < v_filter_id)) { ++ status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter); ++ goto exit; ++ } else if (v_f != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter_combination); ++ goto exit; ++ } else { ++ self->private_impl.f_filters[v_f] = ((uint32_t)(v_filter_id)); ++ if (v_filter_id == 4u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_04_x86); ++ } else if (v_filter_id == 5u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_05_powerpc); ++ } else if (v_filter_id == 6u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_06_ia64); ++ } else if (v_filter_id == 7u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_07_arm); ++ } else if (v_filter_id == 8u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_08_armthumb); ++ } else if (v_filter_id == 9u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_09_sparc); ++ } else if (v_filter_id == 10u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_0a_arm64); ++ } else { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_0b_riscv); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ if (v_c8 == 0u) { ++ self->private_impl.f_bcj_pos = 0u; ++ } else if (v_c8 == 4u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ uint32_t t_7; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_block_header_sans_padding.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_block_header_sans_padding.scratch; ++ uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; ++ if (num_bits_7 == 24) { ++ t_7 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_7 += 8u; ++ *scratch |= ((uint64_t)(num_bits_7)) << 56; ++ } ++ } ++ v_c32 = t_7; ++ } ++ v_alignment = ((uint32_t)(WUFFS_XZ__BCJ_OFFSET_ALIGNMENT[v_filter_id])); ++ if (v_alignment > 0u) { ++ if ((v_c32 % v_alignment) != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_bcj_offset); ++ goto exit; ++ } ++ } ++ self->private_impl.f_bcj_pos = v_c32; ++ } else { ++ status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter); ++ goto exit; ++ } ++ } ++ v_f += 1u; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_8 = *iop_a_src++; ++ v_filter_id = t_8; ++ } ++ if (v_filter_id == 33u) { ++ if (self->private_impl.f_lzma_needs_reset) { ++ wuffs_private_impl__ignore_status(wuffs_lzma__decoder__initialize(&self->private_data.f_lzma, ++ sizeof (wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_9 = *iop_a_src++; ++ v_c8 = t_9; ++ } ++ if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_filter); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_10 = *iop_a_src++; ++ v_c8 = t_10; ++ } ++ v_status = wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1348001793u, (2u | (((uint64_t)(v_c8)) << 8u))); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_filter); ++ goto exit; ++ } ++ } else if ((v_filter_id < 3u) || (11u < v_filter_id)) { ++ status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter); ++ goto exit; + } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ status = wuffs_base__make_status(wuffs_xz__error__bad_filter); ++ goto exit; + } +- } + +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__hasher_u64.vtable_name = +- wuffs_base__hasher_u64__vtable_name; +- self->private_impl.vtable_for__wuffs_base__hasher_u64.function_pointers = +- (const void*)(&wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_xxhash64__hasher* +-wuffs_xxhash64__hasher__alloc(void) { +- wuffs_xxhash64__hasher* x = +- (wuffs_xxhash64__hasher*)(calloc(sizeof(wuffs_xxhash64__hasher), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_xxhash64__hasher__initialize( +- x, sizeof(wuffs_xxhash64__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ goto ok; ++ ok: ++ self->private_impl.p_decode_block_header_sans_padding = 0; ++ goto exit; + } +- return x; +-} +- +-size_t +-sizeof__wuffs_xxhash64__hasher(void) { +- return sizeof(wuffs_xxhash64__hasher); +-} + +-// ---------------- Function Implementations +- +-// -------- func xxhash64.hasher.get_quirk ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_block_header_sans_padding = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_block_header_sans_padding.v_flags = v_flags; ++ self->private_data.s_decode_block_header_sans_padding.v_filter_id = v_filter_id; ++ self->private_data.s_decode_block_header_sans_padding.v_shift = v_shift; ++ self->private_data.s_decode_block_header_sans_padding.v_f = v_f; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__get_quirk( +- const wuffs_xxhash64__hasher* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return 0u; ++ return status; + } + +-// -------- func xxhash64.hasher.set_quirk ++// -------- func xz.decoder.verify_index + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_xxhash64__hasher__set_quirk( +- wuffs_xxhash64__hasher* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +-} ++static wuffs_base__status ++wuffs_xz__decoder__verify_index( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// -------- func xxhash64.hasher.update ++ uint8_t v_c8 = 0; ++ uint32_t v_shift = 0; ++ uint32_t v_hash = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_xxhash64__hasher__update( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- if ((self->private_impl.f_length_modulo_u64 == 0u) && ! self->private_impl.f_length_overflows_u64) { +- self->private_impl.f_v0 = 6983438078262162902u; +- self->private_impl.f_v1 = 14029467366897019727u; +- self->private_impl.f_v2 = 0u; +- self->private_impl.f_v3 = 7046029288634856825u; ++ uint32_t coro_susp_point = self->private_impl.p_verify_index; ++ if (coro_susp_point) { ++ v_shift = self->private_data.s_verify_index.v_shift; + } +- wuffs_xxhash64__hasher__up(self, a_x); +- return wuffs_base__make_empty_struct(); +-} ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-// -------- func xxhash64.hasher.update_u64 ++ if ( ! self->private_impl.f_started_verify_index) { ++ self->private_impl.f_started_verify_index = true; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ self->private_impl.f_num_index_blocks = 0u; ++ v_shift = 0u; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (v_shift <= 56u) { ++ self->private_impl.f_num_index_blocks |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift); ++ if (v_c8 >= 128u) { ++ v_shift += 7u; ++ continue; ++ } else if ((v_c8 == 0u) && (v_shift > 0u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ break; ++ } else if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ self->private_impl.f_num_index_blocks |= (((uint64_t)(1u)) << 63u); ++ break; ++ } ++ if (self->private_impl.f_num_index_blocks != self->private_impl.f_num_actual_blocks) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ } ++ while (self->private_impl.f_num_index_blocks > 0u) { ++ self->private_impl.f_num_index_blocks -= 1u; ++ self->private_impl.f_index_block_compressed_size = 0u; ++ v_shift = 0u; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (v_shift <= 56u) { ++ self->private_impl.f_index_block_compressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift); ++ if (v_c8 >= 128u) { ++ v_shift += 7u; ++ continue; ++ } else if ((v_c8 == 0u) && (v_shift > 0u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ break; ++ } else if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ self->private_impl.f_index_block_compressed_size |= (((uint64_t)(1u)) << 63u); ++ break; ++ } ++ self->private_impl.f_index_block_uncompressed_size = 0u; ++ v_shift = 0u; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if (v_shift <= 56u) { ++ self->private_impl.f_index_block_uncompressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift); ++ if (v_c8 >= 128u) { ++ v_shift += 7u; ++ continue; ++ } else if ((v_c8 == 0u) && (v_shift > 0u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ break; ++ } else if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ self->private_impl.f_index_block_uncompressed_size |= (((uint64_t)(1u)) << 63u); ++ break; ++ } ++ self->private_impl.f_verification_want_total_sizes[0u] += self->private_impl.f_index_block_compressed_size; ++ v_hash = ((uint32_t)((self->private_impl.f_index_block_compressed_size ^ (self->private_impl.f_index_block_compressed_size >> 32u)))); ++ v_hash *= 3432918353u; ++ v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u)); ++ v_hash *= 461845907u; ++ v_hash ^= self->private_impl.f_verification_want_hashed_sizes[0u]; ++ v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u)); ++ self->private_impl.f_verification_want_hashed_sizes[0u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u)); ++ self->private_impl.f_verification_want_total_sizes[1u] += self->private_impl.f_index_block_uncompressed_size; ++ v_hash = ((uint32_t)((self->private_impl.f_index_block_uncompressed_size ^ (self->private_impl.f_index_block_uncompressed_size >> 32u)))); ++ v_hash *= 3432918353u; ++ v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u)); ++ v_hash *= 461845907u; ++ v_hash ^= self->private_impl.f_verification_want_hashed_sizes[1u]; ++ v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u)); ++ self->private_impl.f_verification_want_hashed_sizes[1u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u)); ++ } ++ if ((self->private_impl.f_verification_have_hashed_sizes[0u] != self->private_impl.f_verification_want_hashed_sizes[0u]) || ++ (self->private_impl.f_verification_have_hashed_sizes[1u] != self->private_impl.f_verification_want_hashed_sizes[1u]) || ++ (self->private_impl.f_verification_have_total_sizes[0u] != self->private_impl.f_verification_want_total_sizes[0u]) || ++ (self->private_impl.f_verification_have_total_sizes[1u] != self->private_impl.f_verification_want_total_sizes[1u])) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__update_u64( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return 0; ++ goto ok; ++ ok: ++ self->private_impl.p_verify_index = 0; ++ goto exit; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_verify_index = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_verify_index.v_shift = v_shift; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- wuffs_xxhash64__hasher__update(self, a_x); +- return wuffs_xxhash64__hasher__checksum_u64(self); ++ return status; + } + +-// -------- func xxhash64.hasher.up ++// -------- func xz.decoder.verify_footer + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_xxhash64__hasher__up( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint64_t v_new_lmu = 0; +- uint64_t v_buf_u64 = 0; +- uint32_t v_buf_len = 0; +- uint64_t v_v0 = 0; +- uint64_t v_v1 = 0; +- uint64_t v_v2 = 0; +- uint64_t v_v3 = 0; +- wuffs_base__slice_u8 v_p = {0}; ++static wuffs_base__status ++wuffs_xz__decoder__verify_footer( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- v_new_lmu = ((uint64_t)(self->private_impl.f_length_modulo_u64 + ((uint64_t)(a_x.len)))); +- self->private_impl.f_length_overflows_u64 = ((v_new_lmu < self->private_impl.f_length_modulo_u64) || self->private_impl.f_length_overflows_u64); +- self->private_impl.f_length_modulo_u64 = v_new_lmu; +- while (true) { +- if (self->private_impl.f_buf_len >= 32u) { +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) | +- (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u)); +- v_v0 = ((uint64_t)(self->private_impl.f_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); +- self->private_impl.f_v0 = ((uint64_t)(v_v0 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) | +- (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u)); +- v_v1 = ((uint64_t)(self->private_impl.f_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); +- self->private_impl.f_v1 = ((uint64_t)(v_v1 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) | +- (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u)); +- v_v2 = ((uint64_t)(self->private_impl.f_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); +- self->private_impl.f_v2 = ((uint64_t)(v_v2 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[24u])) | +- (((uint64_t)(self->private_impl.f_buf_data[25u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[26u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[27u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[28u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[29u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[30u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[31u])) << 56u)); +- v_v3 = ((uint64_t)(self->private_impl.f_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); +- self->private_impl.f_v3 = ((uint64_t)(v_v3 * 11400714785074694791u)); +- self->private_impl.f_buf_len = 0u; +- break; ++ uint32_t v_c32 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_verify_footer; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_verify_footer.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_verify_footer.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_c32 = t_0; + } +- if (((uint64_t)(a_x.len)) <= 0u) { +- return wuffs_base__make_empty_struct(); ++ if (v_c32 != ((uint32_t)(self->private_impl.f_backwards_size))) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_footer); ++ goto exit; + } +- self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u]; +- self->private_impl.f_buf_len += 1u; +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); +- } +- v_buf_len = (self->private_impl.f_buf_len & 31u); +- v_v0 = self->private_impl.f_v0; +- v_v1 = self->private_impl.f_v1; +- v_v2 = self->private_impl.f_v2; +- v_v3 = self->private_impl.f_v3; +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 32; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32); +- while (v_p.ptr < i_end0_p) { +- v_buf_u64 = (((uint64_t)(v_p.ptr[0u])) | +- (((uint64_t)(v_p.ptr[1u])) << 8u) | +- (((uint64_t)(v_p.ptr[2u])) << 16u) | +- (((uint64_t)(v_p.ptr[3u])) << 24u) | +- (((uint64_t)(v_p.ptr[4u])) << 32u) | +- (((uint64_t)(v_p.ptr[5u])) << 40u) | +- (((uint64_t)(v_p.ptr[6u])) << 48u) | +- (((uint64_t)(v_p.ptr[7u])) << 56u)); +- v_v0 = ((uint64_t)(v_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); +- v_v0 = ((uint64_t)(v_v0 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(v_p.ptr[8u])) | +- (((uint64_t)(v_p.ptr[9u])) << 8u) | +- (((uint64_t)(v_p.ptr[10u])) << 16u) | +- (((uint64_t)(v_p.ptr[11u])) << 24u) | +- (((uint64_t)(v_p.ptr[12u])) << 32u) | +- (((uint64_t)(v_p.ptr[13u])) << 40u) | +- (((uint64_t)(v_p.ptr[14u])) << 48u) | +- (((uint64_t)(v_p.ptr[15u])) << 56u)); +- v_v1 = ((uint64_t)(v_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); +- v_v1 = ((uint64_t)(v_v1 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(v_p.ptr[16u])) | +- (((uint64_t)(v_p.ptr[17u])) << 8u) | +- (((uint64_t)(v_p.ptr[18u])) << 16u) | +- (((uint64_t)(v_p.ptr[19u])) << 24u) | +- (((uint64_t)(v_p.ptr[20u])) << 32u) | +- (((uint64_t)(v_p.ptr[21u])) << 40u) | +- (((uint64_t)(v_p.ptr[22u])) << 48u) | +- (((uint64_t)(v_p.ptr[23u])) << 56u)); +- v_v2 = ((uint64_t)(v_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); +- v_v2 = ((uint64_t)(v_v2 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(v_p.ptr[24u])) | +- (((uint64_t)(v_p.ptr[25u])) << 8u) | +- (((uint64_t)(v_p.ptr[26u])) << 16u) | +- (((uint64_t)(v_p.ptr[27u])) << 24u) | +- (((uint64_t)(v_p.ptr[28u])) << 32u) | +- (((uint64_t)(v_p.ptr[29u])) << 40u) | +- (((uint64_t)(v_p.ptr[30u])) << 48u) | +- (((uint64_t)(v_p.ptr[31u])) << 56u)); +- v_v3 = ((uint64_t)(v_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); +- v_v3 = ((uint64_t)(v_v3 * 11400714785074694791u)); +- v_p.ptr += 32; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_verify_footer.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_verify_footer.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 8) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_c32 = t_1; + } +- v_p.len = 1; +- uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end1_p) { +- self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u]; +- v_buf_len = ((v_buf_len + 1u) & 31u); +- v_p.ptr += 1; ++ if (v_c32 != ((uint32_t)(self->private_impl.f_flags))) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_footer); ++ goto exit; + } +- v_p.len = 0; +- } +- self->private_impl.f_buf_len = v_buf_len; +- self->private_impl.f_v0 = v_v0; +- self->private_impl.f_v1 = v_v1; +- self->private_impl.f_v2 = v_v2; +- self->private_impl.f_v3 = v_v3; +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func xxhash64.hasher.checksum_u64 + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__checksum_u64( +- const wuffs_xxhash64__hasher* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ goto ok; ++ ok: ++ self->private_impl.p_verify_footer = 0; ++ goto exit; + } + +- uint64_t v_ret = 0; +- uint64_t v_v0 = 0; +- uint64_t v_v1 = 0; +- uint64_t v_v2 = 0; +- uint64_t v_v3 = 0; +- uint32_t v_i = 0; +- uint32_t v_i8 = 0; +- uint32_t v_n = 0; +- uint32_t v_buf_u32 = 0; +- uint64_t v_buf_u64 = 0; ++ goto suspend; ++ suspend: ++ self->private_impl.p_verify_footer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +- if ((self->private_impl.f_length_modulo_u64 >= 32u) || self->private_impl.f_length_overflows_u64) { +- v_ret += (((uint64_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 63u)); +- v_ret += (((uint64_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 57u)); +- v_ret += (((uint64_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 52u)); +- v_ret += (((uint64_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 46u)); +- v_v0 = ((uint64_t)(self->private_impl.f_v0 * 14029467366897019727u)); +- v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); +- v_v0 *= 11400714785074694791u; +- v_v1 = ((uint64_t)(self->private_impl.f_v1 * 14029467366897019727u)); +- v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); +- v_v1 *= 11400714785074694791u; +- v_v2 = ((uint64_t)(self->private_impl.f_v2 * 14029467366897019727u)); +- v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); +- v_v2 *= 11400714785074694791u; +- v_v3 = ((uint64_t)(self->private_impl.f_v3 * 14029467366897019727u)); +- v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); +- v_v3 *= 11400714785074694791u; +- v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v0) * 11400714785074694791u)) + 9650029242287828579u)); +- v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v1) * 11400714785074694791u)) + 9650029242287828579u)); +- v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v2) * 11400714785074694791u)) + 9650029242287828579u)); +- v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v3) * 11400714785074694791u)) + 9650029242287828579u)); +- v_ret += self->private_impl.f_length_modulo_u64; +- } else { +- v_ret += 2870177450012600261u; +- v_ret += self->private_impl.f_length_modulo_u64; +- } +- v_n = 32u; +- v_n = wuffs_base__u32__min(v_n, self->private_impl.f_buf_len); +- if (8u <= v_n) { +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) | +- (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u)); +- v_buf_u64 *= 14029467366897019727u; +- v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); +- v_buf_u64 *= 11400714785074694791u; +- v_ret ^= v_buf_u64; +- v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); +- v_ret *= 11400714785074694791u; +- v_ret += 9650029242287828579u; +- v_i = 8u; +- } +- if (16u <= v_n) { +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) | +- (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u)); +- v_buf_u64 *= 14029467366897019727u; +- v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); +- v_buf_u64 *= 11400714785074694791u; +- v_ret ^= v_buf_u64; +- v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); +- v_ret *= 11400714785074694791u; +- v_ret += 9650029242287828579u; +- v_i = 16u; +- } +- if (24u <= v_n) { +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) | +- (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u)); +- v_buf_u64 *= 14029467366897019727u; +- v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); +- v_buf_u64 *= 11400714785074694791u; +- v_ret ^= v_buf_u64; +- v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); +- v_ret *= 11400714785074694791u; +- v_ret += 9650029242287828579u; +- v_i = 24u; +- } +- if ((v_n & 4u) != 0u) { +- v_i8 = (v_i & 24u); +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 0u)])) | +- (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 1u)])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 2u)])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 3u)])) << 24u)); +- v_ret ^= ((uint64_t)(((uint64_t)(v_buf_u32)) * 11400714785074694791u)); +- v_ret = (((uint64_t)(v_ret << 23u)) | (v_ret >> 41u)); +- v_ret *= 14029467366897019727u; +- v_ret += 1609587929392839161u; +- v_i = (v_i8 + 4u); +- } +- while (v_i < v_n) { +- v_ret ^= ((uint64_t)(((uint64_t)(self->private_impl.f_buf_data[v_i])) * 2870177450012600261u)); +- v_ret = (((uint64_t)(v_ret << 11u)) | (v_ret >> 53u)); +- v_ret *= 11400714785074694791u; +- v_i += 1u; ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_ret ^= (v_ret >> 33u); +- v_ret *= 14029467366897019727u; +- v_ret ^= (v_ret >> 29u); +- v_ret *= 1609587929392839161u; +- v_ret ^= (v_ret >> 32u); +- return ((uint64_t)(v_ret)); ++ ++ return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) + + #if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -62309,16 +78871,12 @@ DynIOBuffer::DynIOBuffer(uint64_t max_incl) + : m_buf(wuffs_base__empty_io_buffer()), m_max_incl(max_incl) {} + + DynIOBuffer::~DynIOBuffer() { +- if (m_buf.data.ptr) { +- free(m_buf.data.ptr); +- } ++ free(m_buf.data.ptr); + } + + void // + DynIOBuffer::drop() { +- if (m_buf.data.ptr) { +- free(m_buf.data.ptr); +- } ++ free(m_buf.data.ptr); + m_buf = wuffs_base__empty_io_buffer(); + } + +@@ -62329,13 +78887,16 @@ DynIOBuffer::grow(uint64_t min_incl) { + return ((min_incl == 0) && (m_max_incl == 0)) + ? DynIOBuffer::GrowResult::OK + : DynIOBuffer::GrowResult::FailedMaxInclExceeded; ++ } else if (n > SIZE_MAX) { ++ return DynIOBuffer::GrowResult::FailedOutOfMemory; + } else if (n > m_buf.data.len) { +- uint8_t* ptr = static_cast(realloc(m_buf.data.ptr, n)); ++ uint8_t* ptr = ++ static_cast(realloc(m_buf.data.ptr, static_cast(n))); + if (!ptr) { + return DynIOBuffer::GrowResult::FailedOutOfMemory; + } + m_buf.data.ptr = ptr; +- m_buf.data.len = n; ++ m_buf.data.len = static_cast(n); + } + return DynIOBuffer::GrowResult::OK; + } +@@ -62382,7 +78943,7 @@ Input::BringsItsOwnIOBuffer() { + FileInput::FileInput(FILE* f) : m_f(f) {} + + std::string // +-FileInput::CopyIn(IOBuffer* dst, uint64_t history_retain_length) { ++FileInput::CopyIn(IOBuffer* dst) { + if (!m_f) { + return "wuffs_aux::sync_io::FileInput: nullptr file"; + } else if (!dst) { +@@ -62390,7 +78951,7 @@ FileInput::CopyIn(IOBuffer* dst, uint64_t history_retain_length) { + } else if (dst->meta.closed) { + return "wuffs_aux::sync_io::FileInput: end of file"; + } else { +- dst->compact_retaining(history_retain_length); ++ dst->compact(); + size_t n = fread(dst->writer_pointer(), 1, dst->writer_length(), m_f); + dst->meta.wi += n; + dst->meta.closed = feof(m_f); +@@ -62418,7 +78979,7 @@ MemoryInput::BringsItsOwnIOBuffer() { + } + + std::string // +-MemoryInput::CopyIn(IOBuffer* dst, uint64_t history_retain_length) { ++MemoryInput::CopyIn(IOBuffer* dst) { + if (!dst) { + return "wuffs_aux::sync_io::MemoryInput: nullptr IOBuffer"; + } else if (dst->meta.closed) { +@@ -62428,7 +78989,7 @@ MemoryInput::CopyIn(IOBuffer* dst, uint64_t history_retain_length) { + // to it. + return "wuffs_aux::sync_io::MemoryInput: overlapping buffers"; + } else { +- dst->compact_retaining(history_retain_length); ++ dst->compact(); + size_t nd = dst->writer_length(); + size_t ns = m_io.reader_length(); + size_t n = (nd < ns) ? nd : ns; +@@ -62483,7 +79044,7 @@ AdvanceIOBufferTo(const ErrorMessages& error_messages, + if (!input.BringsItsOwnIOBuffer()) { + io_buf.compact(); + } +- std::string error_message = input.CopyIn(&io_buf, 0); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return error_message; + } +@@ -62566,7 +79127,7 @@ HandleMetadata( + } else if (!input.BringsItsOwnIOBuffer()) { + io_buf.compact(); + } +- std::string error_message = input.CopyIn(&io_buf, 0); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return error_message; + } +@@ -62627,15 +79188,13 @@ DecodeCborCallbacks::Done(DecodeCborResult& result, + sync_io::Input& input, + IOBuffer& buffer) {} + +-DecodeCborArgQuirks::DecodeCborArgQuirks(wuffs_base__slice_u32 repr0) +- : repr(repr0) {} +- +-DecodeCborArgQuirks::DecodeCborArgQuirks(uint32_t* ptr0, size_t len0) +- : repr(wuffs_base__make_slice_u32(ptr0, len0)) {} ++DecodeCborArgQuirks::DecodeCborArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0) ++ : ptr(ptr0), len(len0) {} + + DecodeCborArgQuirks // + DecodeCborArgQuirks::DefaultValue() { +- return DecodeCborArgQuirks(wuffs_base__empty_slice_u32()); ++ return DecodeCborArgQuirks(nullptr, 0); + } + + DecodeCborResult // +@@ -62664,8 +79223,8 @@ DecodeCbor(DecodeCborCallbacks& callbacks, + ret_error_message = "wuffs_aux::DecodeCbor: out of memory"; + goto done; + } +- for (size_t i = 0; i < quirks.repr.len; i++) { +- dec->set_quirk(quirks.repr.ptr[i], 1); ++ for (size_t i = 0; i < quirks.len; i++) { ++ dec->set_quirk(quirks.ptr[i].first, quirks.ptr[i].second); + } + + // Prepare the wuffs_base__tok_buffer. 256 tokens is 2KiB. +@@ -62710,14 +79269,14 @@ DecodeCbor(DecodeCborCallbacks& callbacks, + "wuffs_aux::DecodeCbor: internal error: io_buf is closed"; + goto done; + } +- io_buf->compact_retaining(dec->history_retain_length()); ++ io_buf->compact(); + if (io_buf->meta.wi >= io_buf->data.len) { + ret_error_message = + "wuffs_aux::DecodeCbor: internal error: io_buf is full"; + goto done; + } + cursor_index = io_buf->meta.ri; +- io_error_message = input.CopyIn(io_buf, dec->history_retain_length()); ++ io_error_message = input.CopyIn(io_buf); + } else { + ret_error_message = tok_status.message(); + goto done; +@@ -62796,7 +79355,7 @@ DecodeCbor(DecodeCborCallbacks& callbacks, + goto done; + } + depth++; +- if (depth > WUFFS_CBOR__DECODER_DEPTH_MAX_INCL) { ++ if (depth > (int32_t)WUFFS_CBOR__DECODER_DEPTH_MAX_INCL) { + ret_error_message = + "wuffs_aux::DecodeCbor: internal error: bad depth"; + goto done; +@@ -63052,6 +79611,11 @@ DecodeImageCallbacks::SelectDecoder(uint32_t fourcc, + } + #endif + ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) ++ case WUFFS_BASE__FOURCC__QOI: ++ return wuffs_qoi__decoder::alloc_as__wuffs_base__image_decoder(); ++#endif ++ + #if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) + case WUFFS_BASE__FOURCC__TGA: + return wuffs_tga__decoder::alloc_as__wuffs_base__image_decoder(); +@@ -63061,6 +79625,11 @@ DecodeImageCallbacks::SelectDecoder(uint32_t fourcc, + case WUFFS_BASE__FOURCC__WBMP: + return wuffs_wbmp__decoder::alloc_as__wuffs_base__image_decoder(); + #endif ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) ++ case WUFFS_BASE__FOURCC__WEBP: ++ return wuffs_webp__decoder::alloc_as__wuffs_base__image_decoder(); ++#endif + } + + return wuffs_base__image_decoder::unique_ptr(nullptr); +@@ -63091,7 +79660,7 @@ DecodeImageCallbacks::AllocPixbuf(const wuffs_base__image_config& image_config, + return AllocPixbufResult(DecodeImage_UnsupportedPixelConfiguration); + } + void* ptr = +- allow_uninitialized_memory ? malloc((size_t)len) : calloc((size_t)len, 1); ++ allow_uninitialized_memory ? malloc((size_t)len) : calloc(1, (size_t)len); + if (!ptr) { + return AllocPixbufResult(DecodeImage_OutOfMemory); + } +@@ -63116,7 +79685,7 @@ DecodeImageCallbacks::AllocWorkbuf(wuffs_base__range_ii_u64 len_range, + return AllocWorkbufResult(DecodeImage_OutOfMemory); + } + void* ptr = +- allow_uninitialized_memory ? malloc((size_t)len) : calloc((size_t)len, 1); ++ allow_uninitialized_memory ? malloc((size_t)len) : calloc(1, (size_t)len); + if (!ptr) { + return AllocWorkbufResult(DecodeImage_OutOfMemory); + } +@@ -63153,15 +79722,13 @@ const char DecodeImage_UnsupportedPixelConfiguration[] = // + const char DecodeImage_UnsupportedPixelFormat[] = // + "wuffs_aux::DecodeImage: unsupported pixel format"; + +-DecodeImageArgQuirks::DecodeImageArgQuirks(wuffs_base__slice_u32 repr0) +- : repr(repr0) {} +- +-DecodeImageArgQuirks::DecodeImageArgQuirks(uint32_t* ptr0, size_t len0) +- : repr(wuffs_base__make_slice_u32(ptr0, len0)) {} ++DecodeImageArgQuirks::DecodeImageArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0) ++ : ptr(ptr0), len(len0) {} + + DecodeImageArgQuirks // + DecodeImageArgQuirks::DefaultValue() { +- return DecodeImageArgQuirks(wuffs_base__empty_slice_u32()); ++ return DecodeImageArgQuirks(nullptr, 0); + } + + DecodeImageArgFlags::DecodeImageArgFlags(uint64_t repr0) : repr(repr0) {} +@@ -63259,7 +79826,8 @@ DecodeImage0(wuffs_base__image_decoder::unique_ptr& image_decoder, + DecodeImageCallbacks& callbacks, + sync_io::Input& input, + wuffs_base__io_buffer& io_buf, +- wuffs_base__slice_u32 quirks, ++ const QuirkKeyValuePair* quirks_ptr, ++ const size_t quirks_len, + uint64_t flags, + wuffs_base__pixel_blend pixel_blend, + wuffs_base__color_u32_argb_premul background_color, +@@ -63301,7 +79869,7 @@ redirect: + fourcc = 0; + break; + } +- std::string error_message = input.CopyIn(&io_buf, 0); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } +@@ -63342,8 +79910,8 @@ redirect: + } + + // Apply quirks. +- for (size_t i = 0; i < quirks.len; i++) { +- image_decoder->set_quirk(quirks.ptr[i], 1); ++ for (size_t i = 0; i < quirks_len; i++) { ++ image_decoder->set_quirk(quirks_ptr[i].first, quirks_ptr[i].second); + } + + // Apply flags. +@@ -63397,8 +79965,7 @@ redirect: + } else if (io_buf.meta.closed) { + return DecodeImageResult(DecodeImage_UnexpectedEndOfFile); + } else { +- std::string error_message = +- input.CopyIn(&io_buf, image_decoder->history_retain_length()); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } +@@ -63480,8 +80047,7 @@ redirect: + } else if (io_buf.meta.closed) { + return DecodeImageResult(DecodeImage_UnexpectedEndOfFile); + } else { +- std::string error_message = +- input.CopyIn(&io_buf, image_decoder->history_retain_length()); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } +@@ -63510,8 +80076,7 @@ redirect: + message = DecodeImage_UnexpectedEndOfFile; + break; + } else { +- std::string error_message = +- input.CopyIn(&io_buf, image_decoder->history_retain_length()); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + message = std::move(error_message); + break; +@@ -63539,8 +80104,7 @@ redirect: + } else if (io_buf.meta.closed) { + return DecodeImageResult(DecodeImage_UnexpectedEndOfFile); + } else { +- std::string error_message = +- input.CopyIn(&io_buf, image_decoder->history_retain_length()); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } +@@ -63574,10 +80138,10 @@ DecodeImage(DecodeImageCallbacks& callbacks, + } + + wuffs_base__image_decoder::unique_ptr image_decoder(nullptr); +- DecodeImageResult result = +- DecodeImage0(image_decoder, callbacks, input, *io_buf, quirks.repr, +- flags.repr, pixel_blend.repr, background_color.repr, +- max_incl_dimension.repr, max_incl_metadata_length.repr); ++ DecodeImageResult result = DecodeImage0( ++ image_decoder, callbacks, input, *io_buf, quirks.ptr, quirks.len, ++ flags.repr, pixel_blend.repr, background_color.repr, ++ max_incl_dimension.repr, max_incl_metadata_length.repr); + callbacks.Done(result, input, *io_buf, std::move(image_decoder)); + return result; + } +@@ -63612,15 +80176,13 @@ const char DecodeJson_BadJsonPointer[] = // + const char DecodeJson_NoMatch[] = // + "wuffs_aux::DecodeJson: no match"; + +-DecodeJsonArgQuirks::DecodeJsonArgQuirks(wuffs_base__slice_u32 repr0) +- : repr(repr0) {} +- +-DecodeJsonArgQuirks::DecodeJsonArgQuirks(uint32_t* ptr0, size_t len0) +- : repr(wuffs_base__make_slice_u32(ptr0, len0)) {} ++DecodeJsonArgQuirks::DecodeJsonArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0) ++ : ptr(ptr0), len(len0) {} + + DecodeJsonArgQuirks // + DecodeJsonArgQuirks::DefaultValue() { +- return DecodeJsonArgQuirks(wuffs_base__empty_slice_u32()); ++ return DecodeJsonArgQuirks(nullptr, 0); + } + + DecodeJsonArgJsonPointer::DecodeJsonArgJsonPointer(std::string repr0) +@@ -63633,58 +80195,58 @@ DecodeJsonArgJsonPointer::DefaultValue() { + + // -------- + +-#define WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN \ +- while (tok_buf.meta.ri >= tok_buf.meta.wi) { \ +- if (tok_status.repr == nullptr) { \ +- goto done; \ +- } else if (tok_status.repr == wuffs_base__suspension__short_write) { \ +- tok_buf.compact(); \ +- } else if (tok_status.repr == wuffs_base__suspension__short_read) { \ +- if (!io_error_message.empty()) { \ +- ret_error_message = std::move(io_error_message); \ +- goto done; \ +- } else if (cursor_index != io_buf->meta.ri) { \ +- ret_error_message = \ +- "wuffs_aux::DecodeJson: internal error: bad cursor_index"; \ +- goto done; \ +- } else if (io_buf->meta.closed) { \ +- ret_error_message = \ +- "wuffs_aux::DecodeJson: internal error: io_buf is closed"; \ +- goto done; \ +- } \ +- io_buf->compact_retaining(dec->history_retain_length()); \ +- if (io_buf->meta.wi >= io_buf->data.len) { \ +- ret_error_message = \ +- "wuffs_aux::DecodeJson: internal error: io_buf is full"; \ +- goto done; \ +- } \ +- cursor_index = io_buf->meta.ri; \ +- io_error_message = input.CopyIn(io_buf, dec->history_retain_length()); \ +- } else { \ +- ret_error_message = tok_status.message(); \ +- goto done; \ +- } \ +- tok_status = \ +- dec->decode_tokens(&tok_buf, io_buf, wuffs_base__empty_slice_u8()); \ +- if ((tok_buf.meta.ri > tok_buf.meta.wi) || \ +- (tok_buf.meta.wi > tok_buf.data.len) || \ +- (io_buf->meta.ri > io_buf->meta.wi) || \ +- (io_buf->meta.wi > io_buf->data.len)) { \ +- ret_error_message = \ +- "wuffs_aux::DecodeJson: internal error: bad buffer indexes"; \ +- goto done; \ +- } \ +- } \ +- wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++]; \ +- uint64_t token_len = token.length(); \ +- if ((io_buf->meta.ri < cursor_index) || \ +- ((io_buf->meta.ri - cursor_index) < token_len)) { \ +- ret_error_message = \ +- "wuffs_aux::DecodeJson: internal error: bad token indexes"; \ +- goto done; \ +- } \ +- uint8_t* token_ptr = io_buf->data.ptr + cursor_index; \ +- (void)(token_ptr); \ ++#define WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN \ ++ while (tok_buf.meta.ri >= tok_buf.meta.wi) { \ ++ if (tok_status.repr == nullptr) { \ ++ goto done; \ ++ } else if (tok_status.repr == wuffs_base__suspension__short_write) { \ ++ tok_buf.compact(); \ ++ } else if (tok_status.repr == wuffs_base__suspension__short_read) { \ ++ if (!io_error_message.empty()) { \ ++ ret_error_message = std::move(io_error_message); \ ++ goto done; \ ++ } else if (cursor_index != io_buf->meta.ri) { \ ++ ret_error_message = \ ++ "wuffs_aux::DecodeJson: internal error: bad cursor_index"; \ ++ goto done; \ ++ } else if (io_buf->meta.closed) { \ ++ ret_error_message = \ ++ "wuffs_aux::DecodeJson: internal error: io_buf is closed"; \ ++ goto done; \ ++ } \ ++ io_buf->compact(); \ ++ if (io_buf->meta.wi >= io_buf->data.len) { \ ++ ret_error_message = \ ++ "wuffs_aux::DecodeJson: internal error: io_buf is full"; \ ++ goto done; \ ++ } \ ++ cursor_index = io_buf->meta.ri; \ ++ io_error_message = input.CopyIn(io_buf); \ ++ } else { \ ++ ret_error_message = tok_status.message(); \ ++ goto done; \ ++ } \ ++ tok_status = \ ++ dec->decode_tokens(&tok_buf, io_buf, wuffs_base__empty_slice_u8()); \ ++ if ((tok_buf.meta.ri > tok_buf.meta.wi) || \ ++ (tok_buf.meta.wi > tok_buf.data.len) || \ ++ (io_buf->meta.ri > io_buf->meta.wi) || \ ++ (io_buf->meta.wi > io_buf->data.len)) { \ ++ ret_error_message = \ ++ "wuffs_aux::DecodeJson: internal error: bad buffer indexes"; \ ++ goto done; \ ++ } \ ++ } \ ++ wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++]; \ ++ uint64_t token_len = token.length(); \ ++ if ((io_buf->meta.ri < cursor_index) || \ ++ ((io_buf->meta.ri - cursor_index) < token_len)) { \ ++ ret_error_message = \ ++ "wuffs_aux::DecodeJson: internal error: bad token indexes"; \ ++ goto done; \ ++ } \ ++ uint8_t* token_ptr = io_buf->data.ptr + cursor_index; \ ++ (void)(token_ptr); \ + cursor_index += static_cast(token_len) + + // -------- +@@ -63965,11 +80527,11 @@ DecodeJson(DecodeJsonCallbacks& callbacks, + goto done; + } + bool allow_tilde_n_tilde_r_tilde_t = false; +- for (size_t i = 0; i < quirks.repr.len; i++) { +- dec->set_quirk(quirks.repr.ptr[i], 1); +- if (quirks.repr.ptr[i] == ++ for (size_t i = 0; i < quirks.len; i++) { ++ dec->set_quirk(quirks.ptr[i].first, quirks.ptr[i].second); ++ if (quirks.ptr[i].first == + WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T) { +- allow_tilde_n_tilde_r_tilde_t = true; ++ allow_tilde_n_tilde_r_tilde_t = (quirks.ptr[i].second != 0); + } + } + +@@ -64025,7 +80587,7 @@ DecodeJson(DecodeJsonCallbacks& callbacks, + goto done; + } + depth++; +- if (depth > WUFFS_JSON__DECODER_DEPTH_MAX_INCL) { ++ if (depth > (int32_t)WUFFS_JSON__DECODER_DEPTH_MAX_INCL) { + ret_error_message = + "wuffs_aux::DecodeJson: internal error: bad depth"; + goto done; +-- +2.39.2 + diff --git a/patches/coreboot-24.02.01/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch b/patches/coreboot-24.02.01/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch deleted file mode 100644 index a31118c14..000000000 --- a/patches/coreboot-24.02.01/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 00d695849a5fb503d87203e3515f761fa8dac850 Mon Sep 17 00:00:00 2001 -From: Jonathon Hall -Date: Mon, 15 Jul 2024 16:37:40 -0400 -Subject: [PATCH] bootsplash: Increase heap from 1 MB to 4 MB when bootsplash - is enabled - -Since commit 1d029b40c9de ("lib/jpeg: Replace decoder with Wuffs' -implementation"), a relatively large heap allocation is needed to -decode many JPEGs for use as work area. The prior decoder did not need -this, but also had many limitations in the JPEGs it could decode. - -A 1024x768 non-progressive JPEG used in Heads needs 1179648 bytes of -work area; about 1.2 MB. While the work area will also depend on the -subsampling of each channel, it's generally proportional to the image -size. - -Increasing the heap size to 4 MB when bootsplash is enabled should be -enough to decode bootsplashes up to 1920x1080 with some headroom. - -Change-Id: Ia4348d39effbc16c1b42ab01bcf1e4ec5d652fa9 -Signed-off-by: Jonathon Hall ---- - src/device/Kconfig | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/src/device/Kconfig b/src/device/Kconfig -index 243e23e52a..4dd03eba21 100644 ---- a/src/device/Kconfig -+++ b/src/device/Kconfig -@@ -501,6 +501,11 @@ config BOOTSPLASH - image in the 'General' section or add it manually to CBFS, using, - for example, cbfstool. - -+# The bootsplash JPEG decoder requires heap space approximately proportional to -+# the image size. This usually needs a larger heap. -+config HEAP_SIZE -+ default 0x400000 if BOOTSPLASH -+ - config LINEAR_FRAMEBUFFER_MAX_WIDTH - int "Maximum width in pixels" - depends on LINEAR_FRAMEBUFFER && MAINBOARD_USE_LIBGFXINIT --- -2.39.2 - diff --git a/patches/coreboot-24.02.01/0002-lib_jpeg-avoidcalling-malloc-and-free.patch b/patches/coreboot-24.02.01/0002-lib_jpeg-avoidcalling-malloc-and-free.patch new file mode 100644 index 000000000..fa1310628 --- /dev/null +++ b/patches/coreboot-24.02.01/0002-lib_jpeg-avoidcalling-malloc-and-free.patch @@ -0,0 +1,91 @@ +From efad423f8472c1b9c130842e3d92625500f82d5d Mon Sep 17 00:00:00 2001 +From: Nigel Tao +Date: Tue, 13 Aug 2024 22:29:21 +1000 +Subject: [PATCH] lib/jpeg: avoid calling malloc and free + +Since commit 1d029b40c9de ("lib/jpeg: Replace decoder with Wuffs' +implementation"), a relatively large heap allocation is needed to decode +many JPEGs for use as work area. The prior decoder did not need this, +but also had many limitations in the JPEGs it could decode, was not as +memory-safe and quickly crashed under fuzzing. + +This commit keeps using Wuffs' JPEG decoder, but it no longer requires +any heap allocation (and thus configuring the heap size depending on how +big a bootsplash image you want to support). + +Change-Id: Ie4c52520cbce498539517c4898ff765365a6beba +Signed-off-by: Nigel Tao +Reviewed-on: https://review.coreboot.org/c/coreboot/+/83895 +Tested-by: build bot (Jenkins) +Reviewed-by: Nico Huber +Reviewed-by: Felix Singer +Reviewed-by: Jonathon Hall +--- + src/lib/jpeg.c | 36 +++++++++++++++++++++--------------- + 1 file changed, 21 insertions(+), 15 deletions(-) + +diff --git a/src/lib/jpeg.c b/src/lib/jpeg.c +index 242cf0ca8e..617ab0b22a 100644 +--- a/src/lib/jpeg.c ++++ b/src/lib/jpeg.c +@@ -1,9 +1,7 @@ + /* SPDX-License-Identifier: GPL-2.0-only */ + + /* +- * Provide a simple API around the Wuffs JPEG decoder +- * Uses the heap (and lots of it) for the image-size specific +- * work buffer, so ramstage-only. ++ * Provide a simple API around the Wuffs JPEG decoder. + */ + + #include +@@ -85,6 +83,24 @@ int jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *pic, + return JPEG_DECODE_FAILED; + } + ++ /* Opting in to lower quality means that we can pass an empty slice as the ++ * "work buffer" argument to wuffs_jpeg__decoder__decode_frame below. ++ * ++ * Decoding progressive (not sequential) JPEGs would still require dynamic ++ * memory allocation (and the amount of work buffer required depends on the ++ * image dimensions), but we choose to just reject progressive JPEGs. It is ++ * simpler than sometimes calling malloc (which can fail, especially for ++ * large allocations) and free. ++ * ++ * More commentary about these quirks is at ++ * https://github.com/google/wuffs/blob/beaf45650085a16780b5f708b72daaeb1aa865c8/std/jpeg/decode_quirks.wuffs ++ */ ++ wuffs_jpeg__decoder__set_quirk( ++ &dec, WUFFS_BASE__QUIRK_QUALITY, ++ WUFFS_BASE__QUIRK_QUALITY__VALUE__LOWER_QUALITY); ++ wuffs_jpeg__decoder__set_quirk( ++ &dec, WUFFS_JPEG__QUIRK_REJECT_PROGRESSIVE_JPEGS, 1); ++ + wuffs_base__image_config imgcfg; + wuffs_base__io_buffer src = wuffs_base__ptr_u8__reader(filedata, filesize, true); + status = wuffs_jpeg__decoder__decode_image_config(&dec, &imgcfg, &src); +@@ -104,19 +120,9 @@ int jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *pic, + return JPEG_DECODE_FAILED; + } + +- uint64_t workbuf_len_min_incl = wuffs_jpeg__decoder__workbuf_len(&dec).min_incl; +- uint8_t *workbuf_array = malloc(workbuf_len_min_incl); +- if ((workbuf_array == NULL) && workbuf_len_min_incl) { +- return JPEG_DECODE_FAILED; +- } +- +- wuffs_base__slice_u8 workbuf = +- wuffs_base__make_slice_u8(workbuf_array, workbuf_len_min_incl); + status = wuffs_jpeg__decoder__decode_frame(&dec, &pixbuf, &src, +- WUFFS_BASE__PIXEL_BLEND__SRC, workbuf, NULL); +- +- free(workbuf_array); +- ++ WUFFS_BASE__PIXEL_BLEND__SRC, ++ wuffs_base__empty_slice_u8(), NULL); + if (status.repr) { + return JPEG_DECODE_FAILED; + } +-- +2.39.2 + diff --git a/patches/coreboot-system76-unreleased/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch b/patches/coreboot-system76-unreleased/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch new file mode 100644 index 000000000..7208d5ebc --- /dev/null +++ b/patches/coreboot-system76-unreleased/0001-vc_wuffs-upgrade-to-Wuffs_0.4.0-alpha.8.patch @@ -0,0 +1,111421 @@ +From b598d05d389e137baa10e277a37fca2c363fb295 Mon Sep 17 00:00:00 2001 +From: Nigel Tao +Date: Tue, 13 Aug 2024 22:10:52 +1000 +Subject: [PATCH] vc/wuffs: upgrade to Wuffs 0.4.0-alpha.8 + +We were previously at Wuffs 0.4.0-alpha.2. The C file was copied from +https://github.com/google/wuffs-mirror-release-c and its hash matches +https://github.com/google/wuffs-mirror-release-c/blob/90e4d81a6a8b7b601e8e568da32a105d7f7705e5/sync.txt#L9-L10 + +$ sha256sum src/vendorcode/wuffs/wuffs-v0.4.c +6c22caff4af929112601379a73f72461bc4719a5215366bcc90d599cbc442bb6 src/vendorcode/wuffs/wuffs-v0.4.c + +Change-Id: Ie90d989384e0db2b23d7d1b3d9a57920ac8a95a2 +Signed-off-by: Nigel Tao +Reviewed-on: https://review.coreboot.org/c/coreboot/+/83894 +Reviewed-by: Felix Singer +Reviewed-by: Nico Huber +Tested-by: build bot (Jenkins) +--- + src/vendorcode/wuffs/wuffs-v0.4.c | 101194 ++++++++++++++++----------- + 1 file changed, 58878 insertions(+), 42316 deletions(-) + +diff --git a/src/vendorcode/wuffs/wuffs-v0.4.c b/src/vendorcode/wuffs/wuffs-v0.4.c +index bce9eb9798..0c6616a652 100644 +--- a/src/vendorcode/wuffs/wuffs-v0.4.c ++++ b/src/vendorcode/wuffs/wuffs-v0.4.c +@@ -81,15 +81,43 @@ extern "C" { + // each major.minor branch, the commit count should increase monotonically. + // + // WUFFS_VERSION was overridden by "wuffs gen -version" based on revision +-// ae8531f7f846fbbe3a7340bf88499ad294a1367b committed on 2023-10-07. ++// 5d69840f8e7ca481551b02c7e8d4c5fb69521bb9 committed on 2024-08-12. + #define WUFFS_VERSION 0x000040000 + #define WUFFS_VERSION_MAJOR 0 + #define WUFFS_VERSION_MINOR 4 + #define WUFFS_VERSION_PATCH 0 +-#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.2" +-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3603 +-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20231007 +-#define WUFFS_VERSION_STRING "0.4.0-alpha.2+3603.20231007" ++#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.8" ++#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3796 ++#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20240812 ++#define WUFFS_VERSION_STRING "0.4.0-alpha.8+3796.20240812" ++ ++// ---------------- Private Implementation Macros Re-definition Check ++ ++// Users (those who #include the "wuffs-vM.N.c" file) should not define any ++// WUFFS_PRIVATE_IMPL__ETC macros, only WUFFS_CONFIG__ETC macros (and ++// WUFFS_IMPLEMENTATION). Mucking about with the private implementation macros ++// is not supported and may break when upgrading to newer Wuffs versions. ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) || \ ++ defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) || \ ++ defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) || \ ++ defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) || \ ++ defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) || \ ++ defined(WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) || \ ++ defined(WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) || \ ++ defined(WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) || \ ++ defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U16) || \ ++ defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32) || \ ++ defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64) || \ ++ defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U8) ++ ++#if defined(__GNUC__) || defined(__clang__) ++#warning "Defining WUFFS_PRIVATE_IMPL__ETC yourself is not supported" ++#elif defined(_MSC_VER) ++#pragma message("Defining WUFFS_PRIVATE_IMPL__ETC yourself is not supported") ++#endif ++ ++#endif + + // ---------------- Configuration + +@@ -117,11 +145,11 @@ extern "C" { + // intrinsics. Look for __ARM_FEATURE_CRC32 instead. + #if defined(__ARM_FEATURE_CRC32) + #include +-#define WUFFS_BASE__CPU_ARCH__ARM_CRC32 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32 + #endif // defined(__ARM_FEATURE_CRC32) + #if defined(__ARM_NEON) + #include +-#define WUFFS_BASE__CPU_ARCH__ARM_NEON ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON + #endif // defined(__ARM_NEON) + #endif // defined(__ARM_FEATURE_UNALIGNED) etc + +@@ -129,26 +157,82 @@ extern "C" { + // POPCNT. This is checked at runtime via cpuid, not at compile time. + // + // Likewise, "cpu_arch >= x86_avx2" also requires PCLMUL, POPCNT and SSE4.2. +-#if defined(__i386__) || defined(__x86_64__) ++// ++// ---- ++// ++// Technically, we could use the SSE family on 32-bit x86, not just 64-bit x86. ++// But some intrinsics don't compile in 32-bit mode. It's not worth the hassle. ++// https://github.com/google/wuffs/issues/145 ++#if defined(__x86_64__) + #if !defined(__native_client__) + #include + #include +-// X86_FAMILY means X86 (32-bit) or X86_64 (64-bit, obviously). +-#define WUFFS_BASE__CPU_ARCH__X86_FAMILY +-#if defined(__x86_64__) +-#define WUFFS_BASE__CPU_ARCH__X86_64 +-#endif // defined(__x86_64__) ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3 + #endif // !defined(__native_client__) +-#endif // defined(__i386__) || defined(__x86_64__) ++#endif // defined(__x86_64__) + + #elif defined(_MSC_VER) // (#if-chain ref AVOID_CPU_ARCH_1) + +-#if defined(_M_IX86) || defined(_M_X64) +-#if defined(__AVX__) || defined(__clang__) ++#if defined(_M_X64) ++ ++// On X86_64, Microsoft Visual C/C++ (MSVC) only supports SSE2 by default. ++// There are /arch:SSE2, /arch:AVX and /arch:AVX2 compiler flags (the AVX2 one ++// is roughly equivalent to X86_64_V3), but there is no /arch:SSE42 compiler ++// flag that's equivalent to X86_64_V2. ++// ++// For getting maximum performance with X86_64 MSVC and Wuffs, pass /arch:AVX2 ++// (and then test on the oldest hardware you intend to support). ++// ++// Absent that compiler flag, either define one of the three macros listed ++// below or else the X86_64 SIMD code will be disabled and you'll get a #pragma ++// message stating this library "performs best with /arch:AVX2". This message ++// is harmless and ignorable, in that the non-SIMD code is still correct and ++// reasonably performant, but is a reminder that when combining Wuffs and MSVC, ++// some compiler configuration is required for maximum performance. ++// ++// - WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY ++// - WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V2 (enables SSE4.2 and below) ++// - WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V3 (enables AVX2 and below) ++// ++// Defining the first one (WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY) ++// or defining none of those three (the default state) are equivalent (in that ++// both disable the SIMD code paths), other than that pragma message. ++// ++// When defining these WUFFS_CONFIG__ENABLE_ETC macros with MSVC, be aware that ++// some users report it leading to ICEs (Internal Compiler Errors), but other ++// users report no problems at all (and improved performance). It's unclear ++// exactly what combination of SIMD code and MSVC configuration lead to ICEs. ++// Do your own testing with your own MSVC version and configuration. ++// ++// https://github.com/google/wuffs/issues/148 ++// https://github.com/google/wuffs/issues/151 ++// https://developercommunity.visualstudio.com/t/fatal--error-C1001:-Internal-compiler-er/10703305 ++// ++// Clang (including clang-cl) and GCC don't need this WUFFS_CONFIG__ETC macro ++// machinery, or having the Wuffs-the-library user to fiddle with compiler ++// flags, because they support "__attribute__((target(arg)))". ++#if defined(__AVX2__) || defined(__clang__) || \ ++ defined(WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V3) ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3 ++#elif defined(WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V2) ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64 ++#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2 ++#elif !defined(WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY) ++#pragma message("Wuffs with MSVC+X64 performs best with /arch:AVX2") ++#endif // defined(__AVX2__) || defined(__clang__) || etc ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) ++ ++#if defined(WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY) ++#error "MSVC_CPU_ARCH simultaneously enabled and disabled" ++#endif + +-// We need for the __cpuid function. + #include +-// That's not enough for X64 SIMD, with clang-cl, if we want to use ++// intrin.h isn't enough for X64 SIMD, with clang-cl, if we want to use + // "__attribute__((target(arg)))" without e.g. "/arch:AVX". + // + // Some web pages suggest that is all you need, as it pulls in +@@ -157,25 +241,9 @@ extern "C" { + #include // AVX, AVX2, FMA, POPCNT + #include // SSE4.2 + #include // AES, PCLMUL +-// X86_FAMILY means X86 (32-bit) or X86_64 (64-bit, obviously). +-#define WUFFS_BASE__CPU_ARCH__X86_FAMILY +-#if defined(_M_X64) +-#define WUFFS_BASE__CPU_ARCH__X86_64 +-#endif // defined(_M_X64) +- +-#else // defined(__AVX__) || defined(__clang__) +- +-// clang-cl (which defines both __clang__ and _MSC_VER) supports +-// "__attribute__((target(arg)))". +-// +-// For MSVC's cl.exe (unlike clang or gcc), SIMD capability is a compile-time +-// property of the source file (e.g. a /arch:AVX or -mavx compiler flag), not +-// of individual functions (that can be conditionally selected at runtime). +-#pragma message("Wuffs with MSVC+IX86/X64 needs /arch:AVX for best performance") +- +-#endif // defined(__AVX__) || defined(__clang__) +-#endif // defined(_M_IX86) || defined(_M_X64) + ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) ++#endif // defined(_M_X64) + #endif // (#if-chain ref AVOID_CPU_ARCH_1) + #endif // (#if-chain ref AVOID_CPU_ARCH_0) + +@@ -198,20 +266,20 @@ extern "C" { + + static inline bool // + wuffs_base__cpu_arch__have_arm_crc32(void) { +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) + return true; + #else + return false; +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) + } + + static inline bool // + wuffs_base__cpu_arch__have_arm_neon(void) { +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + return true; + #else + return false; +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + } + + static inline bool // +@@ -220,7 +288,7 @@ wuffs_base__cpu_arch__have_x86_avx2(void) { + defined(__AVX2__) + return true; + #else +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + // GCC defines these macros but MSVC does not. + // - bit_AVX2 = (1 << 5) + const unsigned int avx2_ebx7 = 0x00000020; +@@ -258,9 +326,9 @@ wuffs_base__cpu_arch__have_x86_avx2(void) { + } + } + #else +-#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler" ++#error "WUFFS_PRIVATE_IMPL__CPU_ARCH__ETC combined with an unsupported compiler" + #endif // defined(__GNUC__); defined(_MSC_VER) +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + return false; + #endif // defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__) && + // defined(__AVX2__) +@@ -271,7 +339,7 @@ wuffs_base__cpu_arch__have_x86_bmi2(void) { + #if defined(__BMI2__) + return true; + #else +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + // GCC defines these macros but MSVC does not. + // - bit_BMI2 = (1 << 8) + const unsigned int bmi2_ebx7 = 0x00000100; +@@ -293,9 +361,9 @@ wuffs_base__cpu_arch__have_x86_bmi2(void) { + return true; + } + #else +-#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler" ++#error "WUFFS_PRIVATE_IMPL__CPU_ARCH__ETC combined with an unsupported compiler" + #endif // defined(__GNUC__); defined(_MSC_VER) +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + return false; + #endif // defined(__BMI2__) + } +@@ -305,7 +373,7 @@ wuffs_base__cpu_arch__have_x86_sse42(void) { + #if defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__) + return true; + #else +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + // GCC defines these macros but MSVC does not. + // - bit_PCLMUL = (1 << 1) + // - bit_POPCNT = (1 << 23) +@@ -329,9 +397,9 @@ wuffs_base__cpu_arch__have_x86_sse42(void) { + return true; + } + #else +-#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler" ++#error "WUFFS_PRIVATE_IMPL__CPU_ARCH__ETC combined with an unsupported compiler" + #endif // defined(__GNUC__); defined(_MSC_VER) +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) + return false; + #endif // defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__) + } +@@ -350,9 +418,15 @@ wuffs_base__cpu_arch__have_x86_sse42(void) { + // The "defined(__clang__)" isn't redundant. While vanilla clang defines + // __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. + #if defined(__GNUC__) || defined(__clang__) ++#define WUFFS_BASE__FORCE_INLINE __attribute__((__always_inline__)) + #define WUFFS_BASE__POTENTIALLY_UNUSED __attribute__((unused)) + #define WUFFS_BASE__WARN_UNUSED_RESULT __attribute__((warn_unused_result)) ++#elif defined(_MSC_VER) ++#define WUFFS_BASE__FORCE_INLINE __forceinline ++#define WUFFS_BASE__POTENTIALLY_UNUSED ++#define WUFFS_BASE__WARN_UNUSED_RESULT + #else ++#define WUFFS_BASE__FORCE_INLINE + #define WUFFS_BASE__POTENTIALLY_UNUSED + #define WUFFS_BASE__WARN_UNUSED_RESULT + #endif +@@ -415,6 +489,37 @@ struct wuffs_unique_ptr_deleter { + + // -------- + ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wcast-qual" ++#endif ++ ++static inline uint8_t* // ++wuffs_base__strip_const_from_u8_ptr(const uint8_t* ptr) { ++ return (uint8_t*)ptr; ++} ++ ++static inline uint16_t* // ++wuffs_base__strip_const_from_u16_ptr(const uint16_t* ptr) { ++ return (uint16_t*)ptr; ++} ++ ++static inline uint32_t* // ++wuffs_base__strip_const_from_u32_ptr(const uint32_t* ptr) { ++ return (uint32_t*)ptr; ++} ++ ++static inline uint64_t* // ++wuffs_base__strip_const_from_u64_ptr(const uint64_t* ptr) { ++ return (uint64_t*)ptr; ++} ++ ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ ++// -------- ++ + // wuffs_base__empty_struct is used when a Wuffs function returns an empty + // struct. In C, if a function f returns void, you can't say "x = f()", but in + // Wuffs, if a function g returns empty, you can say "y = g()". +@@ -483,6 +588,7 @@ extern const char wuffs_base__suspension__even_more_information[]; + extern const char wuffs_base__suspension__mispositioned_read[]; + extern const char wuffs_base__suspension__mispositioned_write[]; + extern const char wuffs_base__suspension__short_read[]; ++extern const char wuffs_base__suspension__short_workbuf[]; + extern const char wuffs_base__suspension__short_write[]; + extern const char wuffs_base__error__bad_i_o_position[]; + extern const char wuffs_base__error__bad_argument_length_too_short[]; +@@ -496,9 +602,11 @@ extern const char wuffs_base__error__bad_vtable[]; + extern const char wuffs_base__error__bad_workbuf_length[]; + extern const char wuffs_base__error__bad_wuffs_version[]; + extern const char wuffs_base__error__cannot_return_a_suspension[]; ++extern const char wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist[]; + extern const char wuffs_base__error__disabled_by_previous_error[]; + extern const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[]; + extern const char wuffs_base__error__initialize_not_called[]; ++extern const char wuffs_base__error__insufficient_history[]; + extern const char wuffs_base__error__interleaved_coroutine_calls[]; + extern const char wuffs_base__error__no_more_information[]; + extern const char wuffs_base__error__not_enough_data[]; +@@ -728,6 +836,9 @@ typedef struct wuffs_base__transform__output__struct { + // Lempel–Ziv 4. + #define WUFFS_BASE__FOURCC__LZ4 0x4C5A3420 + ++// Lzip. ++#define WUFFS_BASE__FOURCC__LZIP 0x4C5A4950 ++ + // Lempel–Ziv Markov-chain Algorithm. + #define WUFFS_BASE__FOURCC__LZMA 0x4C5A4D41 + +@@ -839,6 +950,8 @@ typedef struct wuffs_base__transform__output__struct { + + #define WUFFS_BASE__QUIRK_IGNORE_CHECKSUM 1 + ++#define WUFFS_BASE__QUIRK_QUALITY 2 ++ + // -------- + + // Flicks are a unit of time. One flick (frame-tick) is 1 / 705_600_000 of a +@@ -1092,6 +1205,96 @@ wuffs_base__multiply_u64(uint64_t x, uint64_t y) { + + // -------- + ++typedef struct wuffs_base__bitvec256__struct { ++ // elements_u64[0] holds the LSBs (least significant bits) and ++ // elements_u64[3] holds the MSBs (most significant bits). ++ uint64_t elements_u64[4]; ++} wuffs_base__bitvec256; ++ ++static inline wuffs_base__bitvec256 // ++wuffs_base__make_bitvec256(uint64_t e00, ++ uint64_t e01, ++ uint64_t e02, ++ uint64_t e03) { ++ wuffs_base__bitvec256 res; ++ res.elements_u64[0] = e00; ++ res.elements_u64[1] = e01; ++ res.elements_u64[2] = e02; ++ res.elements_u64[3] = e03; ++ return res; ++} ++ ++static inline uint64_t // ++wuffs_base__bitvec256__get_u64(const wuffs_base__bitvec256* b, uint32_t i) { ++ return b->elements_u64[i & 3]; ++} ++ ++// -------- ++ ++// wuffs_base__optional_u63 is like a std::optional, but for C (not ++// just C++) and the value can only hold 63 bits (not 64). ++// ++// Do not manipulate repr directly; it is a private implementation detail. ++typedef struct wuffs_base__optional_u63__struct { ++ uint64_t repr; ++ ++#ifdef __cplusplus ++ inline bool has_value() const; ++ inline uint64_t value() const; ++ inline uint64_t value_or(uint64_t default_value) const; ++#endif // __cplusplus ++ ++} wuffs_base__optional_u63; ++ ++// wuffs_base__make_optional_u63 ignores value when has_value is false. ++// ++// Preconditions: ++// - value < (1 << 63). ++static inline wuffs_base__optional_u63 // ++wuffs_base__make_optional_u63(bool has_value, uint64_t value) { ++ wuffs_base__optional_u63 res; ++ res.repr = has_value ? ((value << 1u) | 1u) : 0u; ++ return res; ++} ++ ++static inline bool // ++wuffs_base__optional_u63__has_value(const wuffs_base__optional_u63* o) { ++ return o->repr; ++} ++ ++// wuffs_base__optional_u63__value returns zero when o does not have a value. ++static inline uint64_t // ++wuffs_base__optional_u63__value(const wuffs_base__optional_u63* o) { ++ return o->repr >> 1u; ++} ++ ++static inline uint64_t // ++wuffs_base__optional_u63__value_or(const wuffs_base__optional_u63* o, ++ uint64_t default_value) { ++ return o->repr ? (o->repr >> 1u) : default_value; ++} ++ ++#ifdef __cplusplus ++ ++inline bool // ++wuffs_base__optional_u63::has_value() const { ++ return wuffs_base__optional_u63__has_value(this); ++} ++ ++inline uint64_t // ++wuffs_base__optional_u63::value() const { ++ return wuffs_base__optional_u63__value(this); ++} ++ ++inline uint64_t // ++wuffs_base__optional_u63::value_or(uint64_t default_value) const { ++ return wuffs_base__optional_u63__value_or(this, default_value); ++} ++ ++#endif // __cplusplus ++ ++// -------- ++ + // The "defined(__clang__)" isn't redundant. While vanilla clang defines + // __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. + #if (defined(__GNUC__) || defined(__clang__)) && (__SIZEOF_LONG__ == 8) +@@ -1529,7 +1732,7 @@ wuffs_base__make_slice_u64(uint64_t* ptr, size_t len) { + static inline wuffs_base__slice_u8 // + wuffs_base__make_slice_u8_ij(uint8_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u8 ret; +- ret.ptr = ptr + i; ++ ret.ptr = ptr ? (ptr + i) : NULL; + ret.len = (j >= i) ? (j - i) : 0; + return ret; + } +@@ -1537,7 +1740,7 @@ wuffs_base__make_slice_u8_ij(uint8_t* ptr, size_t i, size_t j) { + static inline wuffs_base__slice_u16 // + wuffs_base__make_slice_u16_ij(uint16_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u16 ret; +- ret.ptr = ptr + i; ++ ret.ptr = ptr ? (ptr + i) : NULL; + ret.len = (j >= i) ? (j - i) : 0; + return ret; + } +@@ -1545,7 +1748,7 @@ wuffs_base__make_slice_u16_ij(uint16_t* ptr, size_t i, size_t j) { + static inline wuffs_base__slice_u32 // + wuffs_base__make_slice_u32_ij(uint32_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u32 ret; +- ret.ptr = ptr + i; ++ ret.ptr = ptr ? (ptr + i) : NULL; + ret.len = (j >= i) ? (j - i) : 0; + return ret; + } +@@ -1553,7 +1756,7 @@ wuffs_base__make_slice_u32_ij(uint32_t* ptr, size_t i, size_t j) { + static inline wuffs_base__slice_u64 // + wuffs_base__make_slice_u64_ij(uint64_t* ptr, size_t i, size_t j) { + wuffs_base__slice_u64 ret; +- ret.ptr = ptr + i; ++ ret.ptr = ptr ? (ptr + i) : NULL; + ret.len = (j >= i) ? (j - i) : 0; + return ret; + } +@@ -1696,7 +1899,7 @@ wuffs_base__slice_u8__subslice_i(wuffs_base__slice_u8 s, uint64_t i) { + if ((i <= SIZE_MAX) && (i <= s.len)) { + return wuffs_base__make_slice_u8(s.ptr + i, ((size_t)(s.len - i))); + } +- return wuffs_base__make_slice_u8(NULL, 0); ++ return wuffs_base__empty_slice_u8(); + } + + // wuffs_base__slice_u8__subslice_j returns s[:j]. +@@ -1707,7 +1910,7 @@ wuffs_base__slice_u8__subslice_j(wuffs_base__slice_u8 s, uint64_t j) { + if ((j <= SIZE_MAX) && (j <= s.len)) { + return wuffs_base__make_slice_u8(s.ptr, ((size_t)j)); + } +- return wuffs_base__make_slice_u8(NULL, 0); ++ return wuffs_base__empty_slice_u8(); + } + + // wuffs_base__slice_u8__subslice_ij returns s[i:j]. +@@ -1720,7 +1923,7 @@ wuffs_base__slice_u8__subslice_ij(wuffs_base__slice_u8 s, + if ((i <= j) && (j <= SIZE_MAX) && (j <= s.len)) { + return wuffs_base__make_slice_u8(s.ptr + i, ((size_t)(j - i))); + } +- return wuffs_base__make_slice_u8(NULL, 0); ++ return wuffs_base__empty_slice_u8(); + } + + // wuffs_base__table_u8__subtable_ij returns t[ix:jx, iy:jy]. +@@ -1814,6 +2017,20 @@ WUFFS_BASE__MAYBE_STATIC int32_t // + wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data, + bool prefix_closed); + ++// ---------------- Quirk Values ++ ++// These constants are the value half of a key-value pair, where the key is ++// WUFFS_BASE__QUIRK_QUALITY. ++// ++// In the Wuffs API, set_quirk takes a u64 value. These macro definitions are ++// likewise unsigned values (uint64_t) but for this particular key, they are ++// best interpreted as signed values (int64_t). "Lower-than-default quality" ++// and "higher-than-default quality", as signed values, are -1 and +1. ++// ++// See doc/note/quirks.md for some more discussion about trade-offs. ++#define WUFFS_BASE__QUIRK_QUALITY__VALUE__LOWER_QUALITY UINT64_MAX ++#define WUFFS_BASE__QUIRK_QUALITY__VALUE__HIGHER_QUALITY ((uint64_t)1) ++ + // ---------------- Ranges and Rects + + // See https://github.com/google/wuffs/blob/main/doc/note/ranges-and-rects.md +@@ -3011,7 +3228,8 @@ wuffs_base__io_buffer__compact(wuffs_base__io_buffer* buf) { + // wuffs_base__io_buffer__compact_retaining moves any written but unread bytes + // closer to the start of the buffer. It retains H bytes of history (the most + // recently read bytes), where H is min(buf->meta.ri, history_retain_length). +-// A postcondition is that buf->meta.ri == H. ++// It is therefore a no-op if history_retain_length is UINT64_MAX. A ++// postcondition is that buf->meta.ri == H. + // + // wuffs_base__io_buffer__compact_retaining(0) is equivalent to + // wuffs_base__io_buffer__compact(). +@@ -3056,7 +3274,7 @@ wuffs_base__io_buffer__reader_length(const wuffs_base__io_buffer* buf) { + + static inline uint8_t* // + wuffs_base__io_buffer__reader_pointer(const wuffs_base__io_buffer* buf) { +- return buf ? (buf->data.ptr + buf->meta.ri) : NULL; ++ return (buf && buf->data.ptr) ? (buf->data.ptr + buf->meta.ri) : NULL; + } + + static inline uint64_t // +@@ -3066,7 +3284,8 @@ wuffs_base__io_buffer__reader_position(const wuffs_base__io_buffer* buf) { + + static inline wuffs_base__slice_u8 // + wuffs_base__io_buffer__reader_slice(const wuffs_base__io_buffer* buf) { +- return buf ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.ri, ++ return (buf && buf->data.ptr) ++ ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.ri, + buf->meta.wi - buf->meta.ri) + : wuffs_base__empty_slice_u8(); + } +@@ -3078,7 +3297,7 @@ wuffs_base__io_buffer__writer_length(const wuffs_base__io_buffer* buf) { + + static inline uint8_t* // + wuffs_base__io_buffer__writer_pointer(const wuffs_base__io_buffer* buf) { +- return buf ? (buf->data.ptr + buf->meta.wi) : NULL; ++ return (buf && buf->data.ptr) ? (buf->data.ptr + buf->meta.wi) : NULL; + } + + static inline uint64_t // +@@ -3088,7 +3307,8 @@ wuffs_base__io_buffer__writer_position(const wuffs_base__io_buffer* buf) { + + static inline wuffs_base__slice_u8 // + wuffs_base__io_buffer__writer_slice(const wuffs_base__io_buffer* buf) { +- return buf ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.wi, ++ return (buf && buf->data.ptr) ++ ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.wi, + buf->data.len - buf->meta.wi) + : wuffs_base__empty_slice_u8(); + } +@@ -3183,49 +3403,53 @@ wuffs_base__make_token(uint64_t repr) { + + // -------- + ++// clang-format off ++ ++// -------- ++ + #define WUFFS_BASE__TOKEN__LENGTH__MAX_INCL 0xFFFF + +-#define WUFFS_BASE__TOKEN__VALUE__SHIFT 17 +-#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 17 +-#define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT 42 +-#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 17 ++#define WUFFS_BASE__TOKEN__VALUE__SHIFT 17 ++#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 17 ++#define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT 42 ++#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 17 + #define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 38 +-#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 17 +-#define WUFFS_BASE__TOKEN__CONTINUED__SHIFT 16 +-#define WUFFS_BASE__TOKEN__LENGTH__SHIFT 0 ++#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 17 ++#define WUFFS_BASE__TOKEN__CONTINUED__SHIFT 16 ++#define WUFFS_BASE__TOKEN__LENGTH__SHIFT 0 + +-#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS 46 ++#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS 46 + + // -------- + +-#define WUFFS_BASE__TOKEN__VBC__FILLER 0 +-#define WUFFS_BASE__TOKEN__VBC__STRUCTURE 1 +-#define WUFFS_BASE__TOKEN__VBC__STRING 2 +-#define WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT 3 +-#define WUFFS_BASE__TOKEN__VBC__LITERAL 4 +-#define WUFFS_BASE__TOKEN__VBC__NUMBER 5 +-#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED 6 ++#define WUFFS_BASE__TOKEN__VBC__FILLER 0 ++#define WUFFS_BASE__TOKEN__VBC__STRUCTURE 1 ++#define WUFFS_BASE__TOKEN__VBC__STRING 2 ++#define WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT 3 ++#define WUFFS_BASE__TOKEN__VBC__LITERAL 4 ++#define WUFFS_BASE__TOKEN__VBC__NUMBER 5 ++#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED 6 + #define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED 7 + + // -------- + +-#define WUFFS_BASE__TOKEN__VBD__FILLER__PUNCTUATION 0x00001 ++#define WUFFS_BASE__TOKEN__VBD__FILLER__PUNCTUATION 0x00001 + #define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_BLOCK 0x00002 +-#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_LINE 0x00004 ++#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_LINE 0x00004 + + // COMMENT_ANY is a bit-wise or of COMMENT_BLOCK AND COMMENT_LINE. +-#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_ANY 0x00006 ++#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_ANY 0x00006 + + // -------- + +-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH 0x00001 +-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP 0x00002 ++#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH 0x00001 ++#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP 0x00002 + #define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE 0x00010 + #define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST 0x00020 + #define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT 0x00040 +-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE 0x01000 +-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST 0x02000 +-#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT 0x04000 ++#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE 0x01000 ++#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST 0x02000 ++#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT 0x04000 + + // -------- + +@@ -3245,11 +3469,11 @@ wuffs_base__make_token(uint64_t repr) { + // + // The lack of any particular bit is conservative: it is valid for all-ASCII + // strings, in a single- or multi-token chain, to have none of these bits set. +-#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_UTF_8 0x00001 +-#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8 0x00002 ++#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_UTF_8 0x00001 ++#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8 0x00002 + #define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_UTF_8 0x00004 +-#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_ASCII 0x00010 +-#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_ASCII 0x00020 ++#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_ASCII 0x00010 ++#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_ASCII 0x00020 + #define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_ASCII 0x00040 + + // CONVERT_D_DST_S_SRC means that multiples of S source bytes (possibly padded) +@@ -3264,22 +3488,22 @@ wuffs_base__make_token(uint64_t repr) { + // When src is the empty string, multiple conversion algorithms are applicable + // (so these bits are not necessarily mutually exclusive), all producing the + // same empty dst string. +-#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP 0x00100 +-#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY 0x00200 ++#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP 0x00100 ++#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY 0x00200 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_2_SRC_HEXADECIMAL 0x00400 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_4_SRC_BACKSLASH_X 0x00800 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_STD 0x01000 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_URL 0x02000 +-#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_4_DST_5_SRC_ASCII_85 0x04000 ++#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_4_DST_5_SRC_ASCII_85 0x04000 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_HEX 0x08000 + #define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_STD 0x10000 + + // -------- + + #define WUFFS_BASE__TOKEN__VBD__LITERAL__UNDEFINED 0x00001 +-#define WUFFS_BASE__TOKEN__VBD__LITERAL__NULL 0x00002 +-#define WUFFS_BASE__TOKEN__VBD__LITERAL__FALSE 0x00004 +-#define WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE 0x00008 ++#define WUFFS_BASE__TOKEN__VBD__LITERAL__NULL 0x00002 ++#define WUFFS_BASE__TOKEN__VBD__LITERAL__FALSE 0x00004 ++#define WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE 0x00008 + + // -------- + +@@ -3292,8 +3516,8 @@ wuffs_base__make_token(uint64_t repr) { + // For a source string of "+123" or "-0x9A", only the first two are valid. + // + // For a source string of "123.", only the first one is valid. +-#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT 0x00001 +-#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED 0x00002 ++#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT 0x00001 ++#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED 0x00002 + #define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_UNSIGNED 0x00004 + + #define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_INF 0x00010 +@@ -3305,11 +3529,15 @@ wuffs_base__make_token(uint64_t repr) { + // "300", which are big-endian, little-endian or text. For binary formats, the + // token length (after adjusting for FORMAT_IGNORE_ETC) discriminates + // e.g. u16 little-endian vs u32 little-endian. +-#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN 0x00100 ++#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN 0x00100 + #define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_LITTLE_ENDIAN 0x00200 +-#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT 0x00400 ++#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT 0x00400 ++ ++#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE 0x01000 ++ ++// -------- + +-#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE 0x01000 ++// clang-format on + + // -------- + +@@ -3421,6 +3649,22 @@ wuffs_base__token::length() const { + + // -------- + ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wcast-qual" ++#endif ++ ++static inline wuffs_base__token* // ++wuffs_base__strip_const_from_token_ptr(const wuffs_base__token* ptr) { ++ return (wuffs_base__token*)ptr; ++} ++ ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ ++// -------- ++ + typedef WUFFS_BASE__SLICE(wuffs_base__token) wuffs_base__slice_token; + + static inline wuffs_base__slice_token // +@@ -3574,7 +3818,8 @@ wuffs_base__token_buffer__compact(wuffs_base__token_buffer* buf) { + // wuffs_base__token_buffer__compact_retaining moves any written but unread + // tokens closer to the start of the buffer. It retains H tokens of history + // (the most recently read tokens), where H is min(buf->meta.ri, +-// history_retain_length). A postcondition is that buf->meta.ri == H. ++// history_retain_length). It is therefore a no-op if history_retain_length is ++// UINT64_MAX. A postcondition is that buf->meta.ri == H. + // + // wuffs_base__token_buffer__compact_retaining(0) is equivalent to + // wuffs_base__token_buffer__compact(). +@@ -3730,51 +3975,51 @@ wuffs_base__token_buffer::writer_token_position() const { + // + // You can pass the C stdlib's malloc as the malloc_func. + // +-// It returns an empty slice (containing a NULL ptr field) if (num_uxx * +-// sizeof(uintxx_t)) would overflow SIZE_MAX. ++// It returns an empty slice (containing a NULL ptr field) if num_uxx is zero ++// or if (num_uxx * sizeof(uintxx_t)) would overflow SIZE_MAX. + + static inline wuffs_base__slice_u8 // + wuffs_base__malloc_slice_u8(void* (*malloc_func)(size_t), uint64_t num_u8) { +- if (malloc_func && (num_u8 <= (SIZE_MAX / sizeof(uint8_t)))) { ++ if (malloc_func && num_u8 && (num_u8 <= (SIZE_MAX / sizeof(uint8_t)))) { + void* p = (*malloc_func)((size_t)(num_u8 * sizeof(uint8_t))); + if (p) { + return wuffs_base__make_slice_u8((uint8_t*)(p), (size_t)num_u8); + } + } +- return wuffs_base__make_slice_u8(NULL, 0); ++ return wuffs_base__empty_slice_u8(); + } + + static inline wuffs_base__slice_u16 // + wuffs_base__malloc_slice_u16(void* (*malloc_func)(size_t), uint64_t num_u16) { +- if (malloc_func && (num_u16 <= (SIZE_MAX / sizeof(uint16_t)))) { ++ if (malloc_func && num_u16 && (num_u16 <= (SIZE_MAX / sizeof(uint16_t)))) { + void* p = (*malloc_func)((size_t)(num_u16 * sizeof(uint16_t))); + if (p) { + return wuffs_base__make_slice_u16((uint16_t*)(p), (size_t)num_u16); + } + } +- return wuffs_base__make_slice_u16(NULL, 0); ++ return wuffs_base__empty_slice_u16(); + } + + static inline wuffs_base__slice_u32 // + wuffs_base__malloc_slice_u32(void* (*malloc_func)(size_t), uint64_t num_u32) { +- if (malloc_func && (num_u32 <= (SIZE_MAX / sizeof(uint32_t)))) { ++ if (malloc_func && num_u32 && (num_u32 <= (SIZE_MAX / sizeof(uint32_t)))) { + void* p = (*malloc_func)((size_t)(num_u32 * sizeof(uint32_t))); + if (p) { + return wuffs_base__make_slice_u32((uint32_t*)(p), (size_t)num_u32); + } + } +- return wuffs_base__make_slice_u32(NULL, 0); ++ return wuffs_base__empty_slice_u32(); + } + + static inline wuffs_base__slice_u64 // + wuffs_base__malloc_slice_u64(void* (*malloc_func)(size_t), uint64_t num_u64) { +- if (malloc_func && (num_u64 <= (SIZE_MAX / sizeof(uint64_t)))) { ++ if (malloc_func && num_u64 && (num_u64 <= (SIZE_MAX / sizeof(uint64_t)))) { + void* p = (*malloc_func)((size_t)(num_u64 * sizeof(uint64_t))); + if (p) { + return wuffs_base__make_slice_u64((uint64_t*)(p), (size_t)num_u64); + } + } +- return wuffs_base__make_slice_u64(NULL, 0); ++ return wuffs_base__empty_slice_u64(); + } + + // ---------------- Images +@@ -3838,6 +4083,26 @@ wuffs_base__color_u32_argb_premul__as__color_u8_gray( + return (uint8_t)(weighted_average >> 24); + } + ++static inline uint16_t // ++wuffs_base__color_u32_argb_premul__as__color_u16_alpha_gray_nonpremul( ++ wuffs_base__color_u32_argb_premul c) { ++ uint32_t a = 0xFF & (c >> 24); ++ if (a == 0) { ++ return 0; ++ } ++ uint32_t a16 = a * 0x101; ++ ++ uint32_t cr = 0xFF & (c >> 16); ++ cr = (cr * (0x101 * 0xFFFF)) / a16; ++ uint32_t cg = 0xFF & (c >> 8); ++ cg = (cg * (0x101 * 0xFFFF)) / a16; ++ uint32_t cb = 0xFF & (c >> 0); ++ cb = (cb * (0x101 * 0xFFFF)) / a16; ++ ++ uint32_t weighted_average = (19595 * cr) + (38470 * cg) + (7471 * cb) + 32768; ++ return (uint16_t)((a16 & 0xFF00) | (weighted_average >> 24)); ++} ++ + static inline uint16_t // + wuffs_base__color_u32_argb_premul__as__color_u16_gray( + wuffs_base__color_u32_argb_premul c) { +@@ -4114,49 +4379,53 @@ wuffs_base__make_pixel_format(uint32_t repr) { + // Common 8-bit-depth pixel formats. This list is not exhaustive; not all valid + // wuffs_base__pixel_format values are present. + +-#define WUFFS_BASE__PIXEL_FORMAT__INVALID 0x00000000 ++// clang-format off ++ ++#define WUFFS_BASE__PIXEL_FORMAT__INVALID 0x00000000 + +-#define WUFFS_BASE__PIXEL_FORMAT__A 0x02000008 ++#define WUFFS_BASE__PIXEL_FORMAT__A 0x02000008 + +-#define WUFFS_BASE__PIXEL_FORMAT__Y 0x20000008 +-#define WUFFS_BASE__PIXEL_FORMAT__Y_16LE 0x2000000B +-#define WUFFS_BASE__PIXEL_FORMAT__Y_16BE 0x2010000B +-#define WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL 0x21000008 +-#define WUFFS_BASE__PIXEL_FORMAT__YA_PREMUL 0x22000008 ++#define WUFFS_BASE__PIXEL_FORMAT__Y 0x20000008 ++#define WUFFS_BASE__PIXEL_FORMAT__Y_16LE 0x2000000B ++#define WUFFS_BASE__PIXEL_FORMAT__Y_16BE 0x2010000B ++#define WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL 0x21000088 ++#define WUFFS_BASE__PIXEL_FORMAT__YA_PREMUL 0x22000088 + +-#define WUFFS_BASE__PIXEL_FORMAT__YCBCR 0x40020888 +-#define WUFFS_BASE__PIXEL_FORMAT__YCBCRA_NONPREMUL 0x41038888 +-#define WUFFS_BASE__PIXEL_FORMAT__YCBCRK 0x50038888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCBCR 0x40020888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCBCRA_NONPREMUL 0x41038888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCBCRK 0x50038888 + +-#define WUFFS_BASE__PIXEL_FORMAT__YCOCG 0x60020888 +-#define WUFFS_BASE__PIXEL_FORMAT__YCOCGA_NONPREMUL 0x61038888 +-#define WUFFS_BASE__PIXEL_FORMAT__YCOCGK 0x70038888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCOCG 0x60020888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCOCGA_NONPREMUL 0x61038888 ++#define WUFFS_BASE__PIXEL_FORMAT__YCOCGK 0x70038888 + +-#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL 0x81040008 +-#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL 0x82040008 +-#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY 0x83040008 ++#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL 0x81040008 ++#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL 0x82040008 ++#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY 0x83040008 + +-#define WUFFS_BASE__PIXEL_FORMAT__BGR_565 0x80000565 +-#define WUFFS_BASE__PIXEL_FORMAT__BGR 0x80000888 +-#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL 0x81008888 +-#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE 0x8100BBBB +-#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL 0x82008888 +-#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE 0x8200BBBB +-#define WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY 0x83008888 +-#define WUFFS_BASE__PIXEL_FORMAT__BGRX 0x90008888 ++#define WUFFS_BASE__PIXEL_FORMAT__BGR_565 0x80000565 ++#define WUFFS_BASE__PIXEL_FORMAT__BGR 0x80000888 ++#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL 0x81008888 ++#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE 0x8100BBBB ++#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL 0x82008888 ++#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE 0x8200BBBB ++#define WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY 0x83008888 ++#define WUFFS_BASE__PIXEL_FORMAT__BGRX 0x90008888 + +-#define WUFFS_BASE__PIXEL_FORMAT__RGB 0xA0000888 +-#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL 0xA1008888 +-#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE 0xA100BBBB +-#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL 0xA2008888 +-#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE 0xA200BBBB +-#define WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY 0xA3008888 +-#define WUFFS_BASE__PIXEL_FORMAT__RGBX 0xB0008888 ++#define WUFFS_BASE__PIXEL_FORMAT__RGB 0xA0000888 ++#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL 0xA1008888 ++#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE 0xA100BBBB ++#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL 0xA2008888 ++#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE 0xA200BBBB ++#define WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY 0xA3008888 ++#define WUFFS_BASE__PIXEL_FORMAT__RGBX 0xB0008888 + +-#define WUFFS_BASE__PIXEL_FORMAT__CMY 0xC0020888 +-#define WUFFS_BASE__PIXEL_FORMAT__CMYK 0xD0038888 ++#define WUFFS_BASE__PIXEL_FORMAT__CMY 0xC0020888 ++#define WUFFS_BASE__PIXEL_FORMAT__CMYK 0xD0038888 + +-extern const uint32_t wuffs_base__pixel_format__bits_per_channel[16]; ++// clang-format on ++ ++extern const uint32_t wuffs_private_impl__pixel_format__bits_per_channel[16]; + + static inline bool // + wuffs_base__pixel_format__is_valid(const wuffs_base__pixel_format* f) { +@@ -4170,10 +4439,14 @@ wuffs_base__pixel_format__bits_per_pixel(const wuffs_base__pixel_format* f) { + if (((f->repr >> 16) & 0x03) != 0) { + return 0; + } +- return wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 0)] + +- wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 4)] + +- wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 8)] + +- wuffs_base__pixel_format__bits_per_channel[0x0F & (f->repr >> 12)]; ++ return wuffs_private_impl__pixel_format__bits_per_channel[0x0F & ++ (f->repr >> 0)] + ++ wuffs_private_impl__pixel_format__bits_per_channel[0x0F & ++ (f->repr >> 4)] + ++ wuffs_private_impl__pixel_format__bits_per_channel[0x0F & ++ (f->repr >> 8)] + ++ wuffs_private_impl__pixel_format__bits_per_channel[0x0F & ++ (f->repr >> 12)]; + } + + static inline bool // +@@ -4391,15 +4664,20 @@ wuffs_base__pixel_config__set(wuffs_base__pixel_config* c, + return; + } + if (pixfmt_repr) { +- uint64_t wh = ((uint64_t)width) * ((uint64_t)height); +- // TODO: handle things other than 1 byte per pixel. +- if (wh <= ((uint64_t)SIZE_MAX)) { ++ do { ++#if SIZE_MAX < 0xFFFFFFFFFFFFFFFFull ++ uint64_t wh = ((uint64_t)width) * ((uint64_t)height); ++ // TODO: handle things other than 1 byte per pixel. ++ if (wh > ((uint64_t)SIZE_MAX)) { ++ break; ++ } ++#endif + c->private_impl.pixfmt.repr = pixfmt_repr; + c->private_impl.pixsub.repr = pixsub_repr; + c->private_impl.width = width; + c->private_impl.height = height; + return; +- } ++ } while (0); + } + + c->private_impl.pixfmt.repr = 0; +@@ -5117,7 +5395,7 @@ wuffs_base__pixel_buffer__palette(wuffs_base__pixel_buffer* pb) { + tab->ptr, WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH); + } + } +- return wuffs_base__make_slice_u8(NULL, 0); ++ return wuffs_base__empty_slice_u8(); + } + + static inline wuffs_base__slice_u8 // +@@ -6202,6 +6480,113 @@ struct wuffs_base__hasher_u64__struct { + + // -------- + ++extern const char wuffs_base__hasher_bitvec256__vtable_name[]; ++ ++typedef struct wuffs_base__hasher_bitvec256__func_ptrs__struct { ++ wuffs_base__bitvec256 (*checksum_bitvec256)( ++ const void* self); ++ uint64_t (*get_quirk)( ++ const void* self, ++ uint32_t a_key); ++ wuffs_base__status (*set_quirk)( ++ void* self, ++ uint32_t a_key, ++ uint64_t a_value); ++ wuffs_base__empty_struct (*update)( ++ void* self, ++ wuffs_base__slice_u8 a_x); ++ wuffs_base__bitvec256 (*update_bitvec256)( ++ void* self, ++ wuffs_base__slice_u8 a_x); ++} wuffs_base__hasher_bitvec256__func_ptrs; ++ ++typedef struct wuffs_base__hasher_bitvec256__struct wuffs_base__hasher_bitvec256; ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_base__hasher_bitvec256__checksum_bitvec256( ++ const wuffs_base__hasher_bitvec256* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_bitvec256__get_quirk( ++ const wuffs_base__hasher_bitvec256* self, ++ uint32_t a_key); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__hasher_bitvec256__set_quirk( ++ wuffs_base__hasher_bitvec256* self, ++ uint32_t a_key, ++ uint64_t a_value); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_base__hasher_bitvec256__update( ++ wuffs_base__hasher_bitvec256* self, ++ wuffs_base__slice_u8 a_x); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_base__hasher_bitvec256__update_bitvec256( ++ wuffs_base__hasher_bitvec256* self, ++ wuffs_base__slice_u8 a_x); ++ ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_base__hasher_bitvec256__struct { ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable first_vtable; ++ } private_impl; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++#endif ++ ++ inline wuffs_base__bitvec256 ++ checksum_bitvec256() const { ++ return wuffs_base__hasher_bitvec256__checksum_bitvec256(this); ++ } ++ ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_base__hasher_bitvec256__get_quirk( ++ this, a_key); ++ } ++ ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_base__hasher_bitvec256__set_quirk( ++ this, a_key, a_value); ++ } ++ ++ inline wuffs_base__empty_struct ++ update( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_base__hasher_bitvec256__update( ++ this, a_x); ++ } ++ ++ inline wuffs_base__bitvec256 ++ update_bitvec256( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_base__hasher_bitvec256__update_bitvec256( ++ this, a_x); ++ } ++ ++#endif // __cplusplus ++}; // struct wuffs_base__hasher_bitvec256__struct ++ ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++// -------- ++ + extern const char wuffs_base__image_decoder__vtable_name[]; + + typedef struct wuffs_base__image_decoder__func_ptrs__struct { +@@ -6225,8 +6610,6 @@ typedef struct wuffs_base__image_decoder__func_ptrs__struct { + uint64_t (*get_quirk)( + const void* self, + uint32_t a_key); +- uint64_t (*history_retain_length)( +- const void* self); + uint32_t (*num_animation_loops)( + const void* self); + uint64_t (*num_decoded_frame_configs)( +@@ -6291,11 +6674,6 @@ wuffs_base__image_decoder__get_quirk( + const wuffs_base__image_decoder* self, + uint32_t a_key); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__image_decoder__history_retain_length( +- const wuffs_base__image_decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t + wuffs_base__image_decoder__num_animation_loops( +@@ -6398,11 +6776,6 @@ struct wuffs_base__image_decoder__struct { + this, a_key); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_base__image_decoder__history_retain_length(this); +- } +- + inline uint32_t + num_animation_loops() const { + return wuffs_base__image_decoder__num_animation_loops(this); +@@ -6466,11 +6839,11 @@ struct wuffs_base__image_decoder__struct { + extern const char wuffs_base__io_transformer__vtable_name[]; + + typedef struct wuffs_base__io_transformer__func_ptrs__struct { ++ wuffs_base__optional_u63 (*dst_history_retain_length)( ++ const void* self); + uint64_t (*get_quirk)( + const void* self, + uint32_t a_key); +- uint64_t (*history_retain_length)( +- const void* self); + wuffs_base__status (*set_quirk)( + void* self, + uint32_t a_key, +@@ -6486,17 +6859,17 @@ typedef struct wuffs_base__io_transformer__func_ptrs__struct { + + typedef struct wuffs_base__io_transformer__struct wuffs_base__io_transformer; + ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_base__io_transformer__dst_history_retain_length( ++ const wuffs_base__io_transformer* self); ++ + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t + wuffs_base__io_transformer__get_quirk( + const wuffs_base__io_transformer* self, + uint32_t a_key); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__io_transformer__history_retain_length( +- const wuffs_base__io_transformer* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status + wuffs_base__io_transformer__set_quirk( +@@ -6531,6 +6904,11 @@ struct wuffs_base__io_transformer__struct { + using unique_ptr = std::unique_ptr; + #endif + ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_base__io_transformer__dst_history_retain_length(this); ++ } ++ + inline uint64_t + get_quirk( + uint32_t a_key) const { +@@ -6538,11 +6916,6 @@ struct wuffs_base__io_transformer__struct { + this, a_key); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_base__io_transformer__history_retain_length(this); +- } +- + inline wuffs_base__status + set_quirk( + uint32_t a_key, +@@ -6583,8 +6956,6 @@ typedef struct wuffs_base__token_decoder__func_ptrs__struct { + uint64_t (*get_quirk)( + const void* self, + uint32_t a_key); +- uint64_t (*history_retain_length)( +- const void* self); + wuffs_base__status (*set_quirk)( + void* self, + uint32_t a_key, +@@ -6609,11 +6980,6 @@ wuffs_base__token_decoder__get_quirk( + const wuffs_base__token_decoder* self, + uint32_t a_key); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__token_decoder__history_retain_length( +- const wuffs_base__token_decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status + wuffs_base__token_decoder__set_quirk( +@@ -6656,11 +7022,6 @@ struct wuffs_base__token_decoder__struct { + this, a_key); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_base__token_decoder__history_retain_length(this); +- } +- + inline wuffs_base__status + set_quirk( + uint32_t a_key, +@@ -6918,9 +7279,7 @@ extern const char wuffs_bmp__error__unsupported_bmp_file[]; + + // ---------------- Public Consts + +-#define WUFFS_BMP__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 +- +-#define WUFFS_BMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_BMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + + // ---------------- Struct Declarations + +@@ -7053,11 +7412,6 @@ wuffs_bmp__decoder__tell_me_more( + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bmp__decoder__history_retain_length( +- const wuffs_bmp__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_bmp__decoder__workbuf_len( +@@ -7116,14 +7470,14 @@ struct wuffs_bmp__decoder__struct { + bool f_rle_padded; + wuffs_base__pixel_swizzler f_swizzler; + +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; +- uint32_t p_tell_me_more[1]; +- uint32_t p_read_palette[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_tell_me_more; ++ uint32_t p_read_palette; + } private_impl; + + struct { +@@ -7132,14 +7486,14 @@ struct wuffs_bmp__decoder__struct { + + struct { + uint64_t scratch; +- } s_do_decode_image_config[1]; ++ } s_do_decode_image_config; + struct { + uint64_t scratch; +- } s_do_decode_frame[1]; ++ } s_do_decode_frame; + struct { + uint32_t v_i; + uint64_t scratch; +- } s_read_palette[1]; ++ } s_read_palette; + } private_data; + + #ifdef __cplusplus +@@ -7283,11 +7637,6 @@ struct wuffs_bmp__decoder__struct { + return wuffs_bmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_bmp__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_bmp__decoder__workbuf_len(this); +@@ -7316,9 +7665,9 @@ extern const char wuffs_bzip2__error__unsupported_block_randomization[]; + + // ---------------- Public Consts + +-#define WUFFS_BZIP2__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_BZIP2__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_BZIP2__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_BZIP2__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + + // ---------------- Struct Declarations + +@@ -7386,8 +7735,8 @@ wuffs_bzip2__decoder__set_quirk( + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bzip2__decoder__history_retain_length( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_bzip2__decoder__dst_history_retain_length( + const wuffs_bzip2__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +@@ -7452,12 +7801,12 @@ struct wuffs_bzip2__decoder__struct { + uint32_t f_num_sections; + uint32_t f_code_lengths_bitmask; + +- uint32_t p_transform_io[1]; +- uint32_t p_do_transform_io[1]; +- uint32_t p_prepare_block[1]; +- uint32_t p_read_code_lengths[1]; +- uint32_t p_flush_slow[1]; +- uint32_t p_decode_huffman_slow[1]; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; ++ uint32_t p_prepare_block; ++ uint32_t p_read_code_lengths; ++ uint32_t p_flush_slow; ++ uint32_t p_decode_huffman_slow; + } private_impl; + + struct { +@@ -7474,15 +7823,15 @@ struct wuffs_bzip2__decoder__struct { + uint32_t v_i; + uint64_t v_tag; + uint32_t v_final_checksum_want; +- } s_do_transform_io[1]; ++ } s_do_transform_io; + struct { + uint32_t v_i; + uint32_t v_selector; +- } s_prepare_block[1]; ++ } s_prepare_block; + struct { + uint32_t v_i; + uint32_t v_code_length; +- } s_read_code_lengths[1]; ++ } s_read_code_lengths; + struct { + uint32_t v_flush_pointer; + uint32_t v_flush_repeat_count; +@@ -7491,10 +7840,10 @@ struct wuffs_bzip2__decoder__struct { + uint32_t v_block_size; + uint8_t v_curr; + uint64_t scratch; +- } s_flush_slow[1]; ++ } s_flush_slow; + struct { + uint32_t v_node_index; +- } s_decode_huffman_slow[1]; ++ } s_decode_huffman_slow; + } private_data; + + #ifdef __cplusplus +@@ -7572,9 +7921,9 @@ struct wuffs_bzip2__decoder__struct { + return wuffs_bzip2__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_bzip2__decoder__history_retain_length(this); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_bzip2__decoder__dst_history_retain_length(this); + } + + inline wuffs_base__range_ii_u64 +@@ -7606,25 +7955,23 @@ extern const char wuffs_cbor__error__unsupported_recursion_depth[]; + + // ---------------- Public Consts + +-#define WUFFS_CBOR__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_CBOR__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_CBOR__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_CBOR__DECODER_DEPTH_MAX_INCL 1024u + +-#define WUFFS_CBOR__DECODER_DEPTH_MAX_INCL 1024 ++#define WUFFS_CBOR__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 2u + +-#define WUFFS_CBOR__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 2 ++#define WUFFS_CBOR__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 9u + +-#define WUFFS_CBOR__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 9 ++#define WUFFS_CBOR__TOKEN_VALUE_MAJOR 787997u + +-#define WUFFS_CBOR__TOKEN_VALUE_MAJOR 787997 ++#define WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK 262143u + +-#define WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK 262143 ++#define WUFFS_CBOR__TOKEN_VALUE_MINOR__MINUS_1_MINUS_X 16777216u + +-#define WUFFS_CBOR__TOKEN_VALUE_MINOR__MINUS_1_MINUS_X 16777216 ++#define WUFFS_CBOR__TOKEN_VALUE_MINOR__SIMPLE_VALUE 8388608u + +-#define WUFFS_CBOR__TOKEN_VALUE_MINOR__SIMPLE_VALUE 8388608 +- +-#define WUFFS_CBOR__TOKEN_VALUE_MINOR__TAG 4194304 ++#define WUFFS_CBOR__TOKEN_VALUE_MINOR__TAG 4194304u + + // ---------------- Struct Declarations + +@@ -7691,11 +8038,6 @@ wuffs_cbor__decoder__set_quirk( + uint32_t a_key, + uint64_t a_value); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_cbor__decoder__history_retain_length( +- const wuffs_cbor__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_cbor__decoder__workbuf_len( +@@ -7738,7 +8080,7 @@ struct wuffs_cbor__decoder__struct { + + bool f_end_of_data; + +- uint32_t p_decode_tokens[1]; ++ uint32_t p_decode_tokens; + } private_impl; + + struct { +@@ -7750,7 +8092,7 @@ struct wuffs_cbor__decoder__struct { + uint32_t v_depth; + bool v_tagged; + uint8_t v_indefinite_string_major_type; +- } s_decode_tokens[1]; ++ } s_decode_tokens; + } private_data; + + #ifdef __cplusplus +@@ -7828,11 +8170,6 @@ struct wuffs_cbor__decoder__struct { + return wuffs_cbor__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_cbor__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_cbor__decoder__workbuf_len(this); +@@ -8074,6 +8411,227 @@ struct wuffs_crc32__ieee_hasher__struct { + + #endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) || defined(WUFFS_NONMONOLITHIC) + ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) || defined(WUFFS_NONMONOLITHIC) ++ ++// ---------------- Status Codes ++ ++// ---------------- Public Consts ++ ++// ---------------- Struct Declarations ++ ++typedef struct wuffs_crc64__ecma_hasher__struct wuffs_crc64__ecma_hasher; ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++// ---------------- Public Initializer Prototypes ++ ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_crc64__ecma_hasher__initialize( ++ wuffs_crc64__ecma_hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); ++ ++size_t ++sizeof__wuffs_crc64__ecma_hasher(void); ++ ++// ---------------- Allocs ++ ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. ++ ++wuffs_crc64__ecma_hasher* ++wuffs_crc64__ecma_hasher__alloc(void); ++ ++static inline wuffs_base__hasher_u64* ++wuffs_crc64__ecma_hasher__alloc_as__wuffs_base__hasher_u64(void) { ++ return (wuffs_base__hasher_u64*)(wuffs_crc64__ecma_hasher__alloc()); ++} ++ ++// ---------------- Upcasts ++ ++static inline wuffs_base__hasher_u64* ++wuffs_crc64__ecma_hasher__upcast_as__wuffs_base__hasher_u64( ++ wuffs_crc64__ecma_hasher* p) { ++ return (wuffs_base__hasher_u64*)p; ++} ++ ++// ---------------- Public Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_crc64__ecma_hasher__get_quirk( ++ const wuffs_crc64__ecma_hasher* self, ++ uint32_t a_key); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_crc64__ecma_hasher__set_quirk( ++ wuffs_crc64__ecma_hasher* self, ++ uint32_t a_key, ++ uint64_t a_value); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__update( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_crc64__ecma_hasher__update_u64( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_crc64__ecma_hasher__checksum_u64( ++ const wuffs_crc64__ecma_hasher* self); ++ ++#ifdef __cplusplus ++} // extern "C" ++#endif ++ ++// ---------------- Struct Definitions ++ ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C ++ ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_crc64__ecma_hasher__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. ++ ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__hasher_u64; ++ wuffs_base__vtable null_vtable; ++ ++ uint64_t f_state; ++ ++ wuffs_base__empty_struct (*choosy_up)( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); ++ } private_impl; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++ ++ // On failure, the alloc_etc functions return nullptr. They don't throw. ++ ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_crc64__ecma_hasher__alloc()); ++ } ++ ++ static inline wuffs_base__hasher_u64::unique_ptr ++ alloc_as__wuffs_base__hasher_u64() { ++ return wuffs_base__hasher_u64::unique_ptr( ++ wuffs_crc64__ecma_hasher__alloc_as__wuffs_base__hasher_u64()); ++ } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_crc64__ecma_hasher__struct() = delete; ++ wuffs_crc64__ecma_hasher__struct(const wuffs_crc64__ecma_hasher__struct&) = delete; ++ wuffs_crc64__ecma_hasher__struct& operator=( ++ const wuffs_crc64__ecma_hasher__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) ++ ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_crc64__ecma_hasher__initialize( ++ this, sizeof_star_self, wuffs_version, options); ++ } ++ ++ inline wuffs_base__hasher_u64* ++ upcast_as__wuffs_base__hasher_u64() { ++ return (wuffs_base__hasher_u64*)this; ++ } ++ ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_crc64__ecma_hasher__get_quirk(this, a_key); ++ } ++ ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_crc64__ecma_hasher__set_quirk(this, a_key, a_value); ++ } ++ ++ inline wuffs_base__empty_struct ++ update( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_crc64__ecma_hasher__update(this, a_x); ++ } ++ ++ inline uint64_t ++ update_u64( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_crc64__ecma_hasher__update_u64(this, a_x); ++ } ++ ++ inline uint64_t ++ checksum_u64() const { ++ return wuffs_crc64__ecma_hasher__checksum_u64(this); ++ } ++ ++#endif // __cplusplus ++}; // struct wuffs_crc64__ecma_hasher__struct ++ ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) || defined(WUFFS_NONMONOLITHIC) ++ + #if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes +@@ -8095,9 +8653,9 @@ extern const char wuffs_deflate__error__truncated_input[]; + + // ---------------- Public Consts + +-#define WUFFS_DEFLATE__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_DEFLATE__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_DEFLATE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1 ++#define WUFFS_DEFLATE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u + + // ---------------- Struct Declarations + +@@ -8171,8 +8729,8 @@ wuffs_deflate__decoder__set_quirk( + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_deflate__decoder__history_retain_length( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_deflate__decoder__dst_history_retain_length( + const wuffs_deflate__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +@@ -8222,16 +8780,16 @@ struct wuffs_deflate__decoder__struct { + uint32_t f_n_huffs_bits[2]; + bool f_end_of_block; + +- uint32_t p_transform_io[1]; +- uint32_t p_do_transform_io[1]; +- uint32_t p_decode_blocks[1]; +- uint32_t p_decode_uncompressed[1]; +- uint32_t p_init_dynamic_huffman[1]; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; ++ uint32_t p_decode_blocks; ++ uint32_t p_decode_uncompressed; ++ uint32_t p_init_dynamic_huffman; + wuffs_base__status (*choosy_decode_huffman_fast64)( + wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src); +- uint32_t p_decode_huffman_slow[1]; ++ uint32_t p_decode_huffman_slow; + } private_impl; + + struct { +@@ -8241,11 +8799,11 @@ struct wuffs_deflate__decoder__struct { + + struct { + uint32_t v_final; +- } s_decode_blocks[1]; ++ } s_decode_blocks; + struct { + uint32_t v_length; + uint64_t scratch; +- } s_decode_uncompressed[1]; ++ } s_decode_uncompressed; + struct { + uint32_t v_bits; + uint32_t v_n_bits; +@@ -8257,7 +8815,7 @@ struct wuffs_deflate__decoder__struct { + uint32_t v_n_extra_bits; + uint8_t v_rep_symbol; + uint32_t v_rep_count; +- } s_init_dynamic_huffman[1]; ++ } s_init_dynamic_huffman; + struct { + uint32_t v_bits; + uint32_t v_n_bits; +@@ -8269,7 +8827,7 @@ struct wuffs_deflate__decoder__struct { + uint32_t v_length; + uint32_t v_dist_minus_1; + uint64_t scratch; +- } s_decode_huffman_slow[1]; ++ } s_decode_huffman_slow; + } private_data; + + #ifdef __cplusplus +@@ -8353,9 +8911,9 @@ struct wuffs_deflate__decoder__struct { + return wuffs_deflate__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_deflate__decoder__history_retain_length(this); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_deflate__decoder__dst_history_retain_length(this); + } + + inline wuffs_base__range_ii_u64 +@@ -8393,23 +8951,21 @@ extern const char wuffs_gif__error__truncated_input[]; + + // ---------------- Public Consts + +-#define WUFFS_GIF__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_GIF__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_GIF__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_GIF__QUIRK_DELAY_NUM_DECODED_FRAMES 1041635328u + +-#define WUFFS_GIF__QUIRK_DELAY_NUM_DECODED_FRAMES 1041635328 ++#define WUFFS_GIF__QUIRK_FIRST_FRAME_LOCAL_PALETTE_MEANS_BLACK_BACKGROUND 1041635329u + +-#define WUFFS_GIF__QUIRK_FIRST_FRAME_LOCAL_PALETTE_MEANS_BLACK_BACKGROUND 1041635329 ++#define WUFFS_GIF__QUIRK_HONOR_BACKGROUND_COLOR 1041635330u + +-#define WUFFS_GIF__QUIRK_HONOR_BACKGROUND_COLOR 1041635330 ++#define WUFFS_GIF__QUIRK_IGNORE_TOO_MUCH_PIXEL_DATA 1041635331u + +-#define WUFFS_GIF__QUIRK_IGNORE_TOO_MUCH_PIXEL_DATA 1041635331 ++#define WUFFS_GIF__QUIRK_IMAGE_BOUNDS_ARE_STRICT 1041635332u + +-#define WUFFS_GIF__QUIRK_IMAGE_BOUNDS_ARE_STRICT 1041635332 ++#define WUFFS_GIF__QUIRK_REJECT_EMPTY_FRAME 1041635333u + +-#define WUFFS_GIF__QUIRK_REJECT_EMPTY_FRAME 1041635333 +- +-#define WUFFS_GIF__QUIRK_REJECT_EMPTY_PALETTE 1041635334 ++#define WUFFS_GIF__QUIRK_REJECT_EMPTY_PALETTE 1041635334u + + // ---------------- Struct Declarations + +@@ -8518,11 +9074,6 @@ WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 + wuffs_gif__decoder__frame_dirty_rect( + const wuffs_gif__decoder* self); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gif__decoder__history_retain_length( +- const wuffs_gif__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_gif__decoder__workbuf_len( +@@ -8627,25 +9178,25 @@ struct wuffs_gif__decoder__struct { + uint32_t f_lzw_read_from_return_value; + uint16_t f_lzw_prefixes[4096]; + +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_tell_me_more[1]; +- uint32_t p_do_tell_me_more[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_skip_frame[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; +- uint32_t p_decode_up_to_id_part1[1]; +- uint32_t p_decode_header[1]; +- uint32_t p_decode_lsd[1]; +- uint32_t p_decode_extension[1]; +- uint32_t p_skip_blocks[1]; +- uint32_t p_decode_ae[1]; +- uint32_t p_decode_gc[1]; +- uint32_t p_decode_id_part0[1]; +- uint32_t p_decode_id_part1[1]; +- uint32_t p_decode_id_part2[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_tell_me_more; ++ uint32_t p_do_tell_me_more; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_skip_frame; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_decode_up_to_id_part1; ++ uint32_t p_decode_header; ++ uint32_t p_decode_lsd; ++ uint32_t p_decode_extension; ++ uint32_t p_skip_blocks; ++ uint32_t p_decode_ae; ++ uint32_t p_decode_gc; ++ uint32_t p_decode_id_part0; ++ uint32_t p_decode_id_part1; ++ uint32_t p_decode_id_part2; + } private_impl; + + struct { +@@ -8658,24 +9209,23 @@ struct wuffs_gif__decoder__struct { + + struct { + uint32_t v_background_color; +- } s_do_decode_frame_config[1]; ++ } s_do_decode_frame_config; + struct { + uint64_t scratch; +- } s_skip_frame[1]; ++ } s_skip_frame; + struct { +- uint8_t v_c[6]; +- uint32_t v_i; +- } s_decode_header[1]; ++ uint64_t scratch; ++ } s_decode_header; + struct { + uint8_t v_flags; + uint8_t v_background_color_index; + uint32_t v_num_palette_entries; + uint32_t v_i; + uint64_t scratch; +- } s_decode_lsd[1]; ++ } s_decode_lsd; + struct { + uint64_t scratch; +- } s_skip_blocks[1]; ++ } s_skip_blocks; + struct { + uint8_t v_block_size; + bool v_is_animexts; +@@ -8683,24 +9233,24 @@ struct wuffs_gif__decoder__struct { + bool v_is_iccp; + bool v_is_xmp; + uint64_t scratch; +- } s_decode_ae[1]; ++ } s_decode_ae; + struct { + uint64_t scratch; +- } s_decode_gc[1]; ++ } s_decode_gc; + struct { + uint64_t scratch; +- } s_decode_id_part0[1]; ++ } s_decode_id_part0; + struct { + uint8_t v_which_palette; + uint32_t v_num_palette_entries; + uint32_t v_i; + uint64_t scratch; +- } s_decode_id_part1[1]; ++ } s_decode_id_part1; + struct { + uint64_t v_block_size; + bool v_need_block_size; + uint64_t scratch; +- } s_decode_id_part2[1]; ++ } s_decode_id_part2; + } private_data; + + #ifdef __cplusplus +@@ -8820,11 +9370,6 @@ struct wuffs_gif__decoder__struct { + return wuffs_gif__decoder__frame_dirty_rect(this); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_gif__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_gif__decoder__workbuf_len(this); +@@ -8873,9 +9418,9 @@ extern const char wuffs_gzip__error__truncated_input[]; + + // ---------------- Public Consts + +-#define WUFFS_GZIP__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_GZIP__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_GZIP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1 ++#define WUFFS_GZIP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u + + // ---------------- Struct Declarations + +@@ -8943,8 +9488,8 @@ wuffs_gzip__decoder__set_quirk( + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gzip__decoder__history_retain_length( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_gzip__decoder__dst_history_retain_length( + const wuffs_gzip__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +@@ -8989,8 +9534,8 @@ struct wuffs_gzip__decoder__struct { + + bool f_ignore_checksum; + +- uint32_t p_transform_io[1]; +- uint32_t p_do_transform_io[1]; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; + } private_impl; + + struct { +@@ -8999,11 +9544,11 @@ struct wuffs_gzip__decoder__struct { + + struct { + uint8_t v_flags; +- uint32_t v_checksum_got; +- uint32_t v_decoded_length_got; ++ uint32_t v_checksum_have; ++ uint32_t v_decoded_length_have; + uint32_t v_checksum_want; + uint64_t scratch; +- } s_do_transform_io[1]; ++ } s_do_transform_io; + } private_data; + + #ifdef __cplusplus +@@ -9081,9 +9626,9 @@ struct wuffs_gzip__decoder__struct { + return wuffs_gzip__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_gzip__decoder__history_retain_length(this); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_gzip__decoder__dst_history_retain_length(this); + } + + inline wuffs_base__range_ii_u64 +@@ -9117,8 +9662,10 @@ extern const char wuffs_jpeg__error__bad_sof_marker[]; + extern const char wuffs_jpeg__error__bad_sos_marker[]; + extern const char wuffs_jpeg__error__bad_header[]; + extern const char wuffs_jpeg__error__bad_marker[]; ++extern const char wuffs_jpeg__error__bad_scan_count[]; + extern const char wuffs_jpeg__error__missing_huffman_table[]; + extern const char wuffs_jpeg__error__missing_quantization_table[]; ++extern const char wuffs_jpeg__error__rejected_progressive_jpeg[]; + extern const char wuffs_jpeg__error__truncated_input[]; + extern const char wuffs_jpeg__error__unsupported_arithmetic_coding[]; + extern const char wuffs_jpeg__error__unsupported_color_model[]; +@@ -9134,9 +9681,9 @@ extern const char wuffs_jpeg__error__unsupported_scan_count[]; + + // ---------------- Public Consts + +-#define WUFFS_JPEG__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_JPEG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 51552191232u + +-#define WUFFS_JPEG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 51552191232 ++#define WUFFS_JPEG__QUIRK_REJECT_PROGRESSIVE_JPEGS 1220532224u + + // ---------------- Struct Declarations + +@@ -9269,11 +9816,6 @@ wuffs_jpeg__decoder__tell_me_more( + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_jpeg__decoder__history_retain_length( +- const wuffs_jpeg__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_jpeg__decoder__workbuf_len( +@@ -9368,6 +9910,13 @@ struct wuffs_jpeg__decoder__struct { + uint32_t f_bitstream_ri; + uint32_t f_bitstream_wi; + bool f_bitstream_is_closed; ++ bool f_expect_multiple_scans; ++ bool f_use_lower_quality; ++ bool f_reject_progressive_jpegs; ++ bool f_swizzle_immediately; ++ wuffs_base__status f_swizzle_immediately_status; ++ uint32_t f_swizzle_immediately_b_offsets[10]; ++ uint32_t f_swizzle_immediately_c_offsets[5]; + uint32_t f_bitstream_padding; + uint16_t f_quant_tables[4][64]; + uint16_t f_saved_quant_tables[4][64]; +@@ -9381,28 +9930,29 @@ struct wuffs_jpeg__decoder__struct { + wuffs_base__slice_u8 a_dst_buffer, + uint64_t a_dst_stride, + uint32_t a_q); +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_dqt[1]; +- uint32_t p_decode_dri[1]; +- uint32_t p_decode_appn[1]; +- uint32_t p_decode_sof[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; +- uint32_t p_decode_dht[1]; +- uint32_t p_decode_sos[1]; +- uint32_t p_prepare_scan[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_dqt; ++ uint32_t p_decode_dri; ++ uint32_t p_decode_appn; ++ uint32_t p_decode_sof; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_decode_dht; ++ uint32_t p_decode_sos; ++ uint32_t p_prepare_scan; + wuffs_base__empty_struct (*choosy_load_mcu_blocks_for_single_component)( + wuffs_jpeg__decoder* self, + uint32_t a_mx, + uint32_t a_my, + wuffs_base__slice_u8 a_workbuf, + uint32_t a_csel); +- uint32_t p_skip_past_the_next_restart_marker[1]; ++ uint32_t p_skip_past_the_next_restart_marker; + uint32_t (*choosy_decode_mcu)( + wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, + wuffs_base__slice_u8 a_workbuf, + uint32_t a_mx, + uint32_t a_my); +@@ -9411,6 +9961,7 @@ struct wuffs_jpeg__decoder__struct { + struct { + uint8_t f_bitstream_buffer[2048]; + uint16_t f_mcu_blocks[10][64]; ++ uint8_t f_swizzle_immediately_buffer[640]; + uint8_t f_swizzle_ycck_scratch_buffer_2k[2048]; + uint8_t f_dht_temp_counts[16]; + uint8_t f_dht_temp_bit_lengths[256]; +@@ -9420,38 +9971,38 @@ struct wuffs_jpeg__decoder__struct { + struct { + uint8_t v_marker; + uint64_t scratch; +- } s_do_decode_image_config[1]; ++ } s_do_decode_image_config; + struct { + uint8_t v_q; + uint32_t v_i; +- } s_decode_dqt[1]; ++ } s_decode_dqt; + struct { + uint64_t scratch; +- } s_decode_dri[1]; ++ } s_decode_dri; + struct { + uint64_t scratch; +- } s_decode_appn[1]; ++ } s_decode_appn; + struct { + uint32_t v_i; + uint64_t scratch; +- } s_decode_sof[1]; ++ } s_decode_sof; + struct { + uint8_t v_marker; + uint64_t scratch; +- } s_do_decode_frame[1]; ++ } s_do_decode_frame; + struct { + uint8_t v_tc4_th; + uint32_t v_total_count; + uint32_t v_i; +- } s_decode_dht[1]; ++ } s_decode_dht; + struct { + uint32_t v_my; + uint32_t v_mx; +- } s_decode_sos[1]; ++ } s_decode_sos; + struct { + uint32_t v_i; + uint64_t scratch; +- } s_prepare_scan[1]; ++ } s_prepare_scan; + } private_data; + + #ifdef __cplusplus +@@ -9595,11 +10146,6 @@ struct wuffs_jpeg__decoder__struct { + return wuffs_jpeg__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_jpeg__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_jpeg__decoder__workbuf_len(this); +@@ -9627,55 +10173,53 @@ extern const char wuffs_json__error__unsupported_recursion_depth[]; + + // ---------------- Public Consts + +-#define WUFFS_JSON__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 +- +-#define WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_JSON__DECODER_DEPTH_MAX_INCL 1024 ++#define WUFFS_JSON__DECODER_DEPTH_MAX_INCL 1024u + +-#define WUFFS_JSON__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 1 ++#define WUFFS_JSON__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 1u + +-#define WUFFS_JSON__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 100 ++#define WUFFS_JSON__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 100u + +-#define WUFFS_JSON__QUIRK_ALLOW_ASCII_CONTROL_CODES 1225364480 ++#define WUFFS_JSON__QUIRK_ALLOW_ASCII_CONTROL_CODES 1225364480u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_A 1225364481 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_A 1225364481u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_CAPITAL_U 1225364482 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_CAPITAL_U 1225364482u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_E 1225364483 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_E 1225364483u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_NEW_LINE 1225364484 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_NEW_LINE 1225364484u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_QUESTION_MARK 1225364485 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_QUESTION_MARK 1225364485u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_SINGLE_QUOTE 1225364486 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_SINGLE_QUOTE 1225364486u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_V 1225364487 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_V 1225364487u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_X_AS_CODE_POINTS 1225364489 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_X_AS_CODE_POINTS 1225364489u + +-#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_ZERO 1225364490 ++#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_ZERO 1225364490u + +-#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_BLOCK 1225364491 ++#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_BLOCK 1225364491u + +-#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_LINE 1225364492 ++#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_LINE 1225364492u + +-#define WUFFS_JSON__QUIRK_ALLOW_EXTRA_COMMA 1225364493 ++#define WUFFS_JSON__QUIRK_ALLOW_EXTRA_COMMA 1225364493u + +-#define WUFFS_JSON__QUIRK_ALLOW_INF_NAN_NUMBERS 1225364494 ++#define WUFFS_JSON__QUIRK_ALLOW_INF_NAN_NUMBERS 1225364494u + +-#define WUFFS_JSON__QUIRK_ALLOW_LEADING_ASCII_RECORD_SEPARATOR 1225364495 ++#define WUFFS_JSON__QUIRK_ALLOW_LEADING_ASCII_RECORD_SEPARATOR 1225364495u + +-#define WUFFS_JSON__QUIRK_ALLOW_LEADING_UNICODE_BYTE_ORDER_MARK 1225364496 ++#define WUFFS_JSON__QUIRK_ALLOW_LEADING_UNICODE_BYTE_ORDER_MARK 1225364496u + +-#define WUFFS_JSON__QUIRK_ALLOW_TRAILING_FILLER 1225364497 ++#define WUFFS_JSON__QUIRK_ALLOW_TRAILING_FILLER 1225364497u + +-#define WUFFS_JSON__QUIRK_EXPECT_TRAILING_NEW_LINE_OR_EOF 1225364498 ++#define WUFFS_JSON__QUIRK_EXPECT_TRAILING_NEW_LINE_OR_EOF 1225364498u + +-#define WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T 1225364499 ++#define WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T 1225364499u + +-#define WUFFS_JSON__QUIRK_REPLACE_INVALID_UNICODE 1225364500 ++#define WUFFS_JSON__QUIRK_REPLACE_INVALID_UNICODE 1225364500u + + // ---------------- Struct Declarations + +@@ -9742,11 +10286,6 @@ wuffs_json__decoder__set_quirk( + uint32_t a_key, + uint64_t a_value); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_json__decoder__history_retain_length( +- const wuffs_json__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_json__decoder__workbuf_len( +@@ -9794,11 +10333,11 @@ struct wuffs_json__decoder__struct { + uint8_t f_trailer_stop; + uint8_t f_comment_type; + +- uint32_t p_decode_tokens[1]; +- uint32_t p_decode_leading[1]; +- uint32_t p_decode_comment[1]; +- uint32_t p_decode_inf_nan[1]; +- uint32_t p_decode_trailer[1]; ++ uint32_t p_decode_tokens; ++ uint32_t p_decode_leading; ++ uint32_t p_decode_comment; ++ uint32_t p_decode_inf_nan; ++ uint32_t p_decode_trailer; + } private_impl; + + struct { +@@ -9808,7 +10347,7 @@ struct wuffs_json__decoder__struct { + uint32_t v_depth; + uint32_t v_expect; + uint32_t v_expect_after_value; +- } s_decode_tokens[1]; ++ } s_decode_tokens; + } private_data; + + #ifdef __cplusplus +@@ -9886,11 +10425,6 @@ struct wuffs_json__decoder__struct { + return wuffs_json__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_json__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_json__decoder__workbuf_len(this); +@@ -9911,24 +10445,33 @@ struct wuffs_json__decoder__struct { + + #endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +-extern const char wuffs_lzw__error__bad_code[]; +-extern const char wuffs_lzw__error__truncated_input[]; ++extern const char wuffs_lzma__error__bad_lzma2_header[]; ++extern const char wuffs_lzma__error__bad_bitstream_trailer[]; ++extern const char wuffs_lzma__error__bad_code[]; ++extern const char wuffs_lzma__error__bad_decoded_length[]; ++extern const char wuffs_lzma__error__bad_distance[]; ++extern const char wuffs_lzma__error__bad_header[]; ++extern const char wuffs_lzma__error__truncated_input[]; ++extern const char wuffs_lzma__error__unsupported_decoded_length[]; ++extern const char wuffs_lzma__error__unsupported_properties[]; + + // ---------------- Public Consts + +-#define WUFFS_LZW__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_LZMA__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_LZW__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_LZMA__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u + +-#define WUFFS_LZW__QUIRK_LITERAL_WIDTH_PLUS_ONE 1348378624 ++#define WUFFS_LZMA__QUIRK_ALLOW_NON_ZERO_INITIAL_BYTE 1348001792u ++ ++#define WUFFS_LZMA__QUIRK_FORMAT_EXTENSION 1348001793u + + // ---------------- Struct Declarations + +-typedef struct wuffs_lzw__decoder__struct wuffs_lzw__decoder; ++typedef struct wuffs_lzma__decoder__struct wuffs_lzma__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -9943,14 +10486,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_lzw__decoder__initialize( +- wuffs_lzw__decoder* self, ++wuffs_lzma__decoder__initialize( ++ wuffs_lzma__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_lzw__decoder(void); ++sizeof__wuffs_lzma__decoder(void); + + // ---------------- Allocs + +@@ -9960,19 +10503,19 @@ sizeof__wuffs_lzw__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_lzw__decoder* +-wuffs_lzw__decoder__alloc(void); ++wuffs_lzma__decoder* ++wuffs_lzma__decoder__alloc(void); + + static inline wuffs_base__io_transformer* +-wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer(void) { +- return (wuffs_base__io_transformer*)(wuffs_lzw__decoder__alloc()); ++wuffs_lzma__decoder__alloc_as__wuffs_base__io_transformer(void) { ++ return (wuffs_base__io_transformer*)(wuffs_lzma__decoder__alloc()); + } + + // ---------------- Upcasts + + static inline wuffs_base__io_transformer* +-wuffs_lzw__decoder__upcast_as__wuffs_base__io_transformer( +- wuffs_lzw__decoder* p) { ++wuffs_lzma__decoder__upcast_as__wuffs_base__io_transformer( ++ wuffs_lzma__decoder* p) { + return (wuffs_base__io_transformer*)p; + } + +@@ -9980,40 +10523,35 @@ wuffs_lzw__decoder__upcast_as__wuffs_base__io_transformer( + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_lzw__decoder__get_quirk( +- const wuffs_lzw__decoder* self, ++wuffs_lzma__decoder__get_quirk( ++ const wuffs_lzma__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_lzw__decoder__set_quirk( +- wuffs_lzw__decoder* self, ++wuffs_lzma__decoder__set_quirk( ++ wuffs_lzma__decoder* self, + uint32_t a_key, + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_lzw__decoder__history_retain_length( +- const wuffs_lzw__decoder* self); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzma__decoder__dst_history_retain_length( ++ const wuffs_lzma__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_lzw__decoder__workbuf_len( +- const wuffs_lzw__decoder* self); ++wuffs_lzma__decoder__workbuf_len( ++ const wuffs_lzma__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_lzw__decoder__transform_io( +- wuffs_lzw__decoder* self, ++wuffs_lzma__decoder__transform_io( ++ wuffs_lzma__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8 +-wuffs_lzw__decoder__flush( +- wuffs_lzw__decoder* self); +- + #ifdef __cplusplus + } // extern "C" + #endif +@@ -10027,7 +10565,7 @@ wuffs_lzw__decoder__flush( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_lzw__decoder__struct { ++struct wuffs_lzma__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -10041,45 +10579,113 @@ struct wuffs_lzw__decoder__struct { + wuffs_base__vtable vtable_for__wuffs_base__io_transformer; + wuffs_base__vtable null_vtable; + +- uint32_t f_pending_literal_width_plus_one; +- uint32_t f_literal_width; +- uint32_t f_clear_code; +- uint32_t f_end_code; +- uint32_t f_save_code; +- uint32_t f_prev_code; +- uint32_t f_width; +- uint32_t f_bits; +- uint32_t f_n_bits; +- uint32_t f_output_ri; +- uint32_t f_output_wi; +- uint32_t f_read_from_return_value; +- uint16_t f_prefixes[4096]; +- +- uint32_t p_transform_io[1]; +- uint32_t p_write_to[1]; ++ uint32_t f_lc; ++ uint32_t f_lp; ++ uint32_t f_pb; ++ uint32_t f_format_extension; ++ uint32_t f_dict_size; ++ uint32_t f_dict_workbuf_index; ++ uint32_t f_dict_seen; ++ uint64_t f_decoded_length; ++ uint64_t f_lzma2_encoded_length_have; ++ uint64_t f_lzma2_encoded_length_want; ++ bool f_lzma2_need_prob_reset; ++ bool f_lzma2_need_properties; ++ bool f_lzma2_need_dict_reset; ++ bool f_prev_lzma2_chunk_was_uncompressed; ++ bool f_allow_non_zero_initial_byte; ++ bool f_end_of_chunk; ++ uint8_t f_stashed_bytes[2]; ++ uint32_t f_stashed_bits; ++ uint32_t f_stashed_range; ++ uint32_t f_stashed_state; ++ uint32_t f_stashed_rep0; ++ uint32_t f_stashed_rep1; ++ uint32_t f_stashed_rep2; ++ uint32_t f_stashed_rep3; ++ uint64_t f_stashed_pos; ++ uint64_t f_stashed_pos_end; ++ ++ uint32_t p_decode_bitstream_slow; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; ++ uint32_t p_decode_bitstream; ++ uint32_t p_update_stashed_bytes; ++ uint32_t p_decode_optional_end_of_stream; + } private_impl; + + struct { +- uint8_t f_suffixes[4096][8]; +- uint16_t f_lm1s[4096]; +- uint8_t f_output[8199]; ++ uint16_t f_probs_ao00[192]; ++ uint16_t f_probs_ao20[12]; ++ uint16_t f_probs_ao40[12]; ++ uint16_t f_probs_ao41[192]; ++ uint16_t f_probs_ao60[12]; ++ uint16_t f_probs_ao63[12]; ++ uint16_t f_probs_match_len_low[16][8]; ++ uint16_t f_probs_match_len_mid[16][8]; ++ uint16_t f_probs_match_len_high[1][256]; ++ uint16_t f_probs_longrep_len_low[16][8]; ++ uint16_t f_probs_longrep_len_mid[16][8]; ++ uint16_t f_probs_longrep_len_high[1][256]; ++ uint16_t f_probs_slot[4][64]; ++ uint16_t f_probs_small_dist[128]; ++ uint16_t f_probs_large_dist[16]; ++ uint16_t f_probs_lit[16][768]; ++ ++ struct { ++ uint32_t v_bits; ++ uint32_t v_range; ++ uint32_t v_state; ++ uint32_t v_rep0; ++ uint32_t v_rep1; ++ uint32_t v_rep2; ++ uint32_t v_rep3; ++ uint32_t v_rep; ++ uint64_t v_pos; ++ uint64_t v_pos_end; ++ uint32_t v_lc; ++ uint64_t v_lp_mask; ++ uint64_t v_pb_mask; ++ uint32_t v_tree_node; ++ uint8_t v_prev_byte; ++ uint32_t v_match_byte; ++ uint32_t v_len_state; ++ uint32_t v_slot; ++ uint32_t v_len; ++ uint32_t v_lanl_offset; ++ uint32_t v_num_extra_bits; ++ uint32_t v_dist_extra_bits; ++ uint32_t v_i; ++ uint32_t v_index_lit; ++ uint32_t v_index_len; ++ uint32_t v_index_small_dist_base; ++ uint32_t v_index_small_dist_extra; ++ uint32_t v_index_large_dist; ++ uint32_t v_dist; ++ uint64_t scratch; ++ } s_decode_bitstream_slow; ++ struct { ++ uint8_t v_header_byte; ++ uint32_t v_length; ++ uint64_t scratch; ++ } s_do_transform_io; + } private_data; + + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_lzw__decoder__alloc()); ++ return unique_ptr(wuffs_lzma__decoder__alloc()); + } + + static inline wuffs_base__io_transformer::unique_ptr + alloc_as__wuffs_base__io_transformer() { + return wuffs_base__io_transformer::unique_ptr( +- wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer()); ++ wuffs_lzma__decoder__alloc_as__wuffs_base__io_transformer()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -10095,10 +10701,10 @@ struct wuffs_lzw__decoder__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_lzw__decoder__struct() = delete; +- wuffs_lzw__decoder__struct(const wuffs_lzw__decoder__struct&) = delete; +- wuffs_lzw__decoder__struct& operator=( +- const wuffs_lzw__decoder__struct&) = delete; ++ wuffs_lzma__decoder__struct() = delete; ++ wuffs_lzma__decoder__struct(const wuffs_lzma__decoder__struct&) = delete; ++ wuffs_lzma__decoder__struct& operator=( ++ const wuffs_lzma__decoder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -10118,7 +10724,7 @@ struct wuffs_lzw__decoder__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_lzw__decoder__initialize( ++ return wuffs_lzma__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +@@ -10130,24 +10736,24 @@ struct wuffs_lzw__decoder__struct { + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_lzw__decoder__get_quirk(this, a_key); ++ return wuffs_lzma__decoder__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_lzw__decoder__set_quirk(this, a_key, a_value); ++ return wuffs_lzma__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_lzw__decoder__history_retain_length(this); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_lzma__decoder__dst_history_retain_length(this); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { +- return wuffs_lzw__decoder__workbuf_len(this); ++ return wuffs_lzma__decoder__workbuf_len(this); + } + + inline wuffs_base__status +@@ -10155,38 +10761,34 @@ struct wuffs_lzw__decoder__struct { + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { +- return wuffs_lzw__decoder__transform_io(this, a_dst, a_src, a_workbuf); +- } +- +- inline wuffs_base__slice_u8 +- flush() { +- return wuffs_lzw__decoder__flush(this); ++ return wuffs_lzma__decoder__transform_io(this, a_dst, a_src, a_workbuf); + } + + #endif // __cplusplus +-}; // struct wuffs_lzw__decoder__struct ++}; // struct wuffs_lzma__decoder__struct + + #endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +-extern const char wuffs_netpbm__error__bad_header[]; +-extern const char wuffs_netpbm__error__truncated_input[]; +-extern const char wuffs_netpbm__error__unsupported_netpbm_file[]; ++extern const char wuffs_lzip__error__bad_checksum[]; ++extern const char wuffs_lzip__error__bad_footer[]; ++extern const char wuffs_lzip__error__bad_header[]; ++extern const char wuffs_lzip__error__truncated_input[]; + + // ---------------- Public Consts + +-#define WUFFS_NETPBM__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_LZIP__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#define WUFFS_NETPBM__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_LZIP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u + + // ---------------- Struct Declarations + +-typedef struct wuffs_netpbm__decoder__struct wuffs_netpbm__decoder; ++typedef struct wuffs_lzip__decoder__struct wuffs_lzip__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -10201,14 +10803,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_netpbm__decoder__initialize( +- wuffs_netpbm__decoder* self, ++wuffs_lzip__decoder__initialize( ++ wuffs_lzip__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_netpbm__decoder(void); ++sizeof__wuffs_lzip__decoder(void); + + // ---------------- Allocs + +@@ -10218,112 +10820,54 @@ sizeof__wuffs_netpbm__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_netpbm__decoder* +-wuffs_netpbm__decoder__alloc(void); ++wuffs_lzip__decoder* ++wuffs_lzip__decoder__alloc(void); + +-static inline wuffs_base__image_decoder* +-wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder(void) { +- return (wuffs_base__image_decoder*)(wuffs_netpbm__decoder__alloc()); ++static inline wuffs_base__io_transformer* ++wuffs_lzip__decoder__alloc_as__wuffs_base__io_transformer(void) { ++ return (wuffs_base__io_transformer*)(wuffs_lzip__decoder__alloc()); + } + + // ---------------- Upcasts + +-static inline wuffs_base__image_decoder* +-wuffs_netpbm__decoder__upcast_as__wuffs_base__image_decoder( +- wuffs_netpbm__decoder* p) { +- return (wuffs_base__image_decoder*)p; ++static inline wuffs_base__io_transformer* ++wuffs_lzip__decoder__upcast_as__wuffs_base__io_transformer( ++ wuffs_lzip__decoder* p) { ++ return (wuffs_base__io_transformer*)p; + } + + // ---------------- Public Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__get_quirk( +- const wuffs_netpbm__decoder* self, ++wuffs_lzip__decoder__get_quirk( ++ const wuffs_lzip__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__set_quirk( +- wuffs_netpbm__decoder* self, ++wuffs_lzip__decoder__set_quirk( ++ wuffs_lzip__decoder* self, + uint32_t a_key, + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_image_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_frame_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_frame( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_netpbm__decoder__frame_dirty_rect( +- const wuffs_netpbm__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_netpbm__decoder__num_animation_loops( +- const wuffs_netpbm__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__num_decoded_frame_configs( +- const wuffs_netpbm__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__num_decoded_frames( +- const wuffs_netpbm__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__restart_frame( +- wuffs_netpbm__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzip__decoder__dst_history_retain_length( ++ const wuffs_lzip__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_netpbm__decoder__set_report_metadata( +- wuffs_netpbm__decoder* self, +- uint32_t a_fourcc, +- bool a_report); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_lzip__decoder__workbuf_len( ++ const wuffs_lzip__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__tell_me_more( +- wuffs_netpbm__decoder* self, ++wuffs_lzip__decoder__transform_io( ++ wuffs_lzip__decoder* self, + wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__history_retain_length( +- const wuffs_netpbm__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_netpbm__decoder__workbuf_len( +- const wuffs_netpbm__decoder* self); ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); + + #ifdef __cplusplus + } // extern "C" +@@ -10338,7 +10882,7 @@ wuffs_netpbm__decoder__workbuf_len( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_netpbm__decoder__struct { ++struct wuffs_lzip__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -10349,42 +10893,41 @@ struct wuffs_netpbm__decoder__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; +- wuffs_base__vtable vtable_for__wuffs_base__image_decoder; ++ wuffs_base__vtable vtable_for__wuffs_base__io_transformer; + wuffs_base__vtable null_vtable; + +- uint32_t f_pixfmt; +- uint32_t f_width; +- uint32_t f_height; +- uint32_t f_max_value; +- uint8_t f_call_sequence; +- uint64_t f_frame_config_io_position; +- uint32_t f_dst_x; +- uint32_t f_dst_y; +- wuffs_base__pixel_swizzler f_swizzler; ++ bool f_ignore_checksum; ++ uint64_t f_dsize_have; ++ uint64_t f_ssize_have; + +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; + } private_impl; + ++ struct { ++ wuffs_crc32__ieee_hasher f_crc32; ++ wuffs_lzma__decoder f_lzma; ++ ++ struct { ++ uint64_t scratch; ++ } s_do_transform_io; ++ } private_data; ++ + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_netpbm__decoder__alloc()); ++ return unique_ptr(wuffs_lzip__decoder__alloc()); + } + +- static inline wuffs_base__image_decoder::unique_ptr +- alloc_as__wuffs_base__image_decoder() { +- return wuffs_base__image_decoder::unique_ptr( +- wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder()); ++ static inline wuffs_base__io_transformer::unique_ptr ++ alloc_as__wuffs_base__io_transformer() { ++ return wuffs_base__io_transformer::unique_ptr( ++ wuffs_lzip__decoder__alloc_as__wuffs_base__io_transformer()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -10400,10 +10943,10 @@ struct wuffs_netpbm__decoder__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_netpbm__decoder__struct() = delete; +- wuffs_netpbm__decoder__struct(const wuffs_netpbm__decoder__struct&) = delete; +- wuffs_netpbm__decoder__struct& operator=( +- const wuffs_netpbm__decoder__struct&) = delete; ++ wuffs_lzip__decoder__struct() = delete; ++ wuffs_lzip__decoder__struct(const wuffs_lzip__decoder__struct&) = delete; ++ wuffs_lzip__decoder__struct& operator=( ++ const wuffs_lzip__decoder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -10423,128 +10966,327 @@ struct wuffs_netpbm__decoder__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_netpbm__decoder__initialize( ++ return wuffs_lzip__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +- inline wuffs_base__image_decoder* +- upcast_as__wuffs_base__image_decoder() { +- return (wuffs_base__image_decoder*)this; ++ inline wuffs_base__io_transformer* ++ upcast_as__wuffs_base__io_transformer() { ++ return (wuffs_base__io_transformer*)this; + } + + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_netpbm__decoder__get_quirk(this, a_key); ++ return wuffs_lzip__decoder__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_netpbm__decoder__set_quirk(this, a_key, a_value); ++ return wuffs_lzip__decoder__set_quirk(this, a_key, a_value); + } + +- inline wuffs_base__status +- decode_image_config( +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- return wuffs_netpbm__decoder__decode_image_config(this, a_dst, a_src); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_lzip__decoder__dst_history_retain_length(this); + } + +- inline wuffs_base__status +- decode_frame_config( +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- return wuffs_netpbm__decoder__decode_frame_config(this, a_dst, a_src); ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_lzip__decoder__workbuf_len(this); + } + + inline wuffs_base__status +- decode_frame( +- wuffs_base__pixel_buffer* a_dst, ++ transform_io( ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- return wuffs_netpbm__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); +- } +- +- inline wuffs_base__rect_ie_u32 +- frame_dirty_rect() const { +- return wuffs_netpbm__decoder__frame_dirty_rect(this); ++ wuffs_base__slice_u8 a_workbuf) { ++ return wuffs_lzip__decoder__transform_io(this, a_dst, a_src, a_workbuf); + } + +- inline uint32_t +- num_animation_loops() const { +- return wuffs_netpbm__decoder__num_animation_loops(this); +- } ++#endif // __cplusplus ++}; // struct wuffs_lzip__decoder__struct + +- inline uint64_t +- num_decoded_frame_configs() const { +- return wuffs_netpbm__decoder__num_decoded_frame_configs(this); +- } ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- inline uint64_t +- num_decoded_frames() const { +- return wuffs_netpbm__decoder__num_decoded_frames(this); +- } ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) || defined(WUFFS_NONMONOLITHIC) + +- inline wuffs_base__status +- restart_frame( +- uint64_t a_index, +- uint64_t a_io_position) { +- return wuffs_netpbm__decoder__restart_frame(this, a_index, a_io_position); +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC) + +- inline wuffs_base__empty_struct +- set_report_metadata( +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_netpbm__decoder__set_report_metadata(this, a_fourcc, a_report); +- } ++// ---------------- Status Codes + +- inline wuffs_base__status +- tell_me_more( +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- return wuffs_netpbm__decoder__tell_me_more(this, a_dst, a_minfo, a_src); +- } ++extern const char wuffs_lzw__error__bad_code[]; ++extern const char wuffs_lzw__error__truncated_input[]; + +- inline uint64_t +- history_retain_length() const { +- return wuffs_netpbm__decoder__history_retain_length(this); +- } ++// ---------------- Public Consts + +- inline wuffs_base__range_ii_u64 +- workbuf_len() const { +- return wuffs_netpbm__decoder__workbuf_len(this); +- } ++#define WUFFS_LZW__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-#endif // __cplusplus +-}; // struct wuffs_netpbm__decoder__struct ++#define WUFFS_LZW__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++#define WUFFS_LZW__QUIRK_LITERAL_WIDTH_PLUS_ONE 1348378624u + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC) ++// ---------------- Struct Declarations + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC) ++typedef struct wuffs_lzw__decoder__struct wuffs_lzw__decoder; + +-// ---------------- Status Codes ++#ifdef __cplusplus ++extern "C" { ++#endif + +-extern const char wuffs_nie__error__bad_header[]; +-extern const char wuffs_nie__error__truncated_input[]; +-extern const char wuffs_nie__error__unsupported_nie_file[]; ++// ---------------- Public Initializer Prototypes + +-// ---------------- Public Consts ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_lzw__decoder__initialize( ++ wuffs_lzw__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); ++ ++size_t ++sizeof__wuffs_lzw__decoder(void); ++ ++// ---------------- Allocs ++ ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. ++ ++wuffs_lzw__decoder* ++wuffs_lzw__decoder__alloc(void); ++ ++static inline wuffs_base__io_transformer* ++wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer(void) { ++ return (wuffs_base__io_transformer*)(wuffs_lzw__decoder__alloc()); ++} ++ ++// ---------------- Upcasts ++ ++static inline wuffs_base__io_transformer* ++wuffs_lzw__decoder__upcast_as__wuffs_base__io_transformer( ++ wuffs_lzw__decoder* p) { ++ return (wuffs_base__io_transformer*)p; ++} ++ ++// ---------------- Public Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_lzw__decoder__get_quirk( ++ const wuffs_lzw__decoder* self, ++ uint32_t a_key); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzw__decoder__set_quirk( ++ wuffs_lzw__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzw__decoder__dst_history_retain_length( ++ const wuffs_lzw__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_lzw__decoder__workbuf_len( ++ const wuffs_lzw__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzw__decoder__transform_io( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8 ++wuffs_lzw__decoder__flush( ++ wuffs_lzw__decoder* self); ++ ++#ifdef __cplusplus ++} // extern "C" ++#endif ++ ++// ---------------- Struct Definitions ++ ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C ++ ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_lzw__decoder__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. ++ ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__io_transformer; ++ wuffs_base__vtable null_vtable; ++ ++ uint32_t f_pending_literal_width_plus_one; ++ uint32_t f_literal_width; ++ uint32_t f_clear_code; ++ uint32_t f_end_code; ++ uint32_t f_save_code; ++ uint32_t f_prev_code; ++ uint32_t f_width; ++ uint32_t f_bits; ++ uint32_t f_n_bits; ++ uint32_t f_output_ri; ++ uint32_t f_output_wi; ++ uint32_t f_read_from_return_value; ++ uint16_t f_prefixes[4096]; ++ ++ uint32_t p_transform_io; ++ uint32_t p_write_to; ++ } private_impl; ++ ++ struct { ++ uint8_t f_suffixes[4096][8]; ++ uint16_t f_lm1s[4096]; ++ uint8_t f_output[8199]; ++ } private_data; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++ ++ // On failure, the alloc_etc functions return nullptr. They don't throw. ++ ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_lzw__decoder__alloc()); ++ } ++ ++ static inline wuffs_base__io_transformer::unique_ptr ++ alloc_as__wuffs_base__io_transformer() { ++ return wuffs_base__io_transformer::unique_ptr( ++ wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer()); ++ } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_lzw__decoder__struct() = delete; ++ wuffs_lzw__decoder__struct(const wuffs_lzw__decoder__struct&) = delete; ++ wuffs_lzw__decoder__struct& operator=( ++ const wuffs_lzw__decoder__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) ++ ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_lzw__decoder__initialize( ++ this, sizeof_star_self, wuffs_version, options); ++ } ++ ++ inline wuffs_base__io_transformer* ++ upcast_as__wuffs_base__io_transformer() { ++ return (wuffs_base__io_transformer*)this; ++ } ++ ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_lzw__decoder__get_quirk(this, a_key); ++ } ++ ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_lzw__decoder__set_quirk(this, a_key, a_value); ++ } ++ ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_lzw__decoder__dst_history_retain_length(this); ++ } ++ ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_lzw__decoder__workbuf_len(this); ++ } ++ ++ inline wuffs_base__status ++ transform_io( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ return wuffs_lzw__decoder__transform_io(this, a_dst, a_src, a_workbuf); ++ } ++ ++ inline wuffs_base__slice_u8 ++ flush() { ++ return wuffs_lzw__decoder__flush(this); ++ } ++ ++#endif // __cplusplus ++}; // struct wuffs_lzw__decoder__struct ++ ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC) ++ ++// ---------------- Status Codes ++ ++extern const char wuffs_netpbm__error__bad_header[]; ++extern const char wuffs_netpbm__error__truncated_input[]; ++extern const char wuffs_netpbm__error__unsupported_netpbm_file[]; + +-#define WUFFS_NIE__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++// ---------------- Public Consts + +-#define WUFFS_NIE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_NETPBM__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + + // ---------------- Struct Declarations + +-typedef struct wuffs_nie__decoder__struct wuffs_nie__decoder; ++typedef struct wuffs_netpbm__decoder__struct wuffs_netpbm__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -10559,14 +11301,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_nie__decoder__initialize( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__initialize( ++ wuffs_netpbm__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_nie__decoder(void); ++sizeof__wuffs_netpbm__decoder(void); + + // ---------------- Allocs + +@@ -10576,19 +11318,19 @@ sizeof__wuffs_nie__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_nie__decoder* +-wuffs_nie__decoder__alloc(void); ++wuffs_netpbm__decoder* ++wuffs_netpbm__decoder__alloc(void); + + static inline wuffs_base__image_decoder* +-wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder(void) { +- return (wuffs_base__image_decoder*)(wuffs_nie__decoder__alloc()); ++wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_netpbm__decoder__alloc()); + } + + // ---------------- Upcasts + + static inline wuffs_base__image_decoder* +-wuffs_nie__decoder__upcast_as__wuffs_base__image_decoder( +- wuffs_nie__decoder* p) { ++wuffs_netpbm__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_netpbm__decoder* p) { + return (wuffs_base__image_decoder*)p; + } + +@@ -10596,35 +11338,35 @@ wuffs_nie__decoder__upcast_as__wuffs_base__image_decoder( + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__get_quirk( +- const wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__get_quirk( ++ const wuffs_netpbm__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__set_quirk( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__set_quirk( ++ wuffs_netpbm__decoder* self, + uint32_t a_key, + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_image_config( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__decode_image_config( ++ wuffs_netpbm__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_frame_config( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__decode_frame_config( ++ wuffs_netpbm__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_frame( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__decode_frame( ++ wuffs_netpbm__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, +@@ -10633,55 +11375,50 @@ wuffs_nie__decoder__decode_frame( + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_nie__decoder__frame_dirty_rect( +- const wuffs_nie__decoder* self); ++wuffs_netpbm__decoder__frame_dirty_rect( ++ const wuffs_netpbm__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_nie__decoder__num_animation_loops( +- const wuffs_nie__decoder* self); ++wuffs_netpbm__decoder__num_animation_loops( ++ const wuffs_netpbm__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__num_decoded_frame_configs( +- const wuffs_nie__decoder* self); ++wuffs_netpbm__decoder__num_decoded_frame_configs( ++ const wuffs_netpbm__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__num_decoded_frames( +- const wuffs_nie__decoder* self); ++wuffs_netpbm__decoder__num_decoded_frames( ++ const wuffs_netpbm__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__restart_frame( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__restart_frame( ++ wuffs_netpbm__decoder* self, + uint64_t a_index, + uint64_t a_io_position); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_nie__decoder__set_report_metadata( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__set_report_metadata( ++ wuffs_netpbm__decoder* self, + uint32_t a_fourcc, + bool a_report); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__tell_me_more( +- wuffs_nie__decoder* self, ++wuffs_netpbm__decoder__tell_me_more( ++ wuffs_netpbm__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__history_retain_length( +- const wuffs_nie__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_nie__decoder__workbuf_len( +- const wuffs_nie__decoder* self); ++wuffs_netpbm__decoder__workbuf_len( ++ const wuffs_netpbm__decoder* self); + + #ifdef __cplusplus + } // extern "C" +@@ -10696,7 +11433,7 @@ wuffs_nie__decoder__workbuf_len( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_nie__decoder__struct { ++struct wuffs_netpbm__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -10713,40 +11450,36 @@ struct wuffs_nie__decoder__struct { + uint32_t f_pixfmt; + uint32_t f_width; + uint32_t f_height; ++ uint32_t f_max_value; + uint8_t f_call_sequence; ++ uint64_t f_frame_config_io_position; + uint32_t f_dst_x; + uint32_t f_dst_y; + wuffs_base__pixel_swizzler f_swizzler; + +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; + } private_impl; + +- struct { +- struct { +- uint64_t scratch; +- } s_do_decode_image_config[1]; +- } private_data; +- + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_nie__decoder__alloc()); ++ return unique_ptr(wuffs_netpbm__decoder__alloc()); + } + + static inline wuffs_base__image_decoder::unique_ptr + alloc_as__wuffs_base__image_decoder() { + return wuffs_base__image_decoder::unique_ptr( +- wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder()); ++ wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -10762,10 +11495,10 @@ struct wuffs_nie__decoder__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_nie__decoder__struct() = delete; +- wuffs_nie__decoder__struct(const wuffs_nie__decoder__struct&) = delete; +- wuffs_nie__decoder__struct& operator=( +- const wuffs_nie__decoder__struct&) = delete; ++ wuffs_netpbm__decoder__struct() = delete; ++ wuffs_netpbm__decoder__struct(const wuffs_netpbm__decoder__struct&) = delete; ++ wuffs_netpbm__decoder__struct& operator=( ++ const wuffs_netpbm__decoder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -10785,7 +11518,7 @@ struct wuffs_nie__decoder__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_nie__decoder__initialize( ++ return wuffs_netpbm__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +@@ -10797,28 +11530,28 @@ struct wuffs_nie__decoder__struct { + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_nie__decoder__get_quirk(this, a_key); ++ return wuffs_netpbm__decoder__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_nie__decoder__set_quirk(this, a_key, a_value); ++ return wuffs_netpbm__decoder__set_quirk(this, a_key, a_value); + } + + inline wuffs_base__status + decode_image_config( + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { +- return wuffs_nie__decoder__decode_image_config(this, a_dst, a_src); ++ return wuffs_netpbm__decoder__decode_image_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame_config( + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { +- return wuffs_nie__decoder__decode_frame_config(this, a_dst, a_src); ++ return wuffs_netpbm__decoder__decode_frame_config(this, a_dst, a_src); + } + + inline wuffs_base__status +@@ -10828,41 +11561,41 @@ struct wuffs_nie__decoder__struct { + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { +- return wuffs_nie__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ return wuffs_netpbm__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); + } + + inline wuffs_base__rect_ie_u32 + frame_dirty_rect() const { +- return wuffs_nie__decoder__frame_dirty_rect(this); ++ return wuffs_netpbm__decoder__frame_dirty_rect(this); + } + + inline uint32_t + num_animation_loops() const { +- return wuffs_nie__decoder__num_animation_loops(this); ++ return wuffs_netpbm__decoder__num_animation_loops(this); + } + + inline uint64_t + num_decoded_frame_configs() const { +- return wuffs_nie__decoder__num_decoded_frame_configs(this); ++ return wuffs_netpbm__decoder__num_decoded_frame_configs(this); + } + + inline uint64_t + num_decoded_frames() const { +- return wuffs_nie__decoder__num_decoded_frames(this); ++ return wuffs_netpbm__decoder__num_decoded_frames(this); + } + + inline wuffs_base__status + restart_frame( + uint64_t a_index, + uint64_t a_io_position) { +- return wuffs_nie__decoder__restart_frame(this, a_index, a_io_position); ++ return wuffs_netpbm__decoder__restart_frame(this, a_index, a_io_position); + } + + inline wuffs_base__empty_struct + set_report_metadata( + uint32_t a_fourcc, + bool a_report) { +- return wuffs_nie__decoder__set_report_metadata(this, a_fourcc, a_report); ++ return wuffs_netpbm__decoder__set_report_metadata(this, a_fourcc, a_report); + } + + inline wuffs_base__status +@@ -10870,49 +11603,36 @@ struct wuffs_nie__decoder__struct { + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { +- return wuffs_nie__decoder__tell_me_more(this, a_dst, a_minfo, a_src); +- } +- +- inline uint64_t +- history_retain_length() const { +- return wuffs_nie__decoder__history_retain_length(this); ++ return wuffs_netpbm__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { +- return wuffs_nie__decoder__workbuf_len(this); ++ return wuffs_netpbm__decoder__workbuf_len(this); + } + + #endif // __cplusplus +-}; // struct wuffs_nie__decoder__struct ++}; // struct wuffs_netpbm__decoder__struct + + #endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +-extern const char wuffs_zlib__note__dictionary_required[]; +-extern const char wuffs_zlib__error__bad_checksum[]; +-extern const char wuffs_zlib__error__bad_compression_method[]; +-extern const char wuffs_zlib__error__bad_compression_window_size[]; +-extern const char wuffs_zlib__error__bad_parity_check[]; +-extern const char wuffs_zlib__error__incorrect_dictionary[]; +-extern const char wuffs_zlib__error__truncated_input[]; ++extern const char wuffs_nie__error__bad_header[]; ++extern const char wuffs_nie__error__truncated_input[]; ++extern const char wuffs_nie__error__unsupported_nie_file[]; + + // ---------------- Public Consts + +-#define WUFFS_ZLIB__QUIRK_JUST_RAW_DEFLATE 2113790976 +- +-#define WUFFS_ZLIB__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 +- +-#define WUFFS_ZLIB__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1 ++#define WUFFS_NIE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + + // ---------------- Struct Declarations + +-typedef struct wuffs_zlib__decoder__struct wuffs_zlib__decoder; ++typedef struct wuffs_nie__decoder__struct wuffs_nie__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -10927,14 +11647,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_zlib__decoder__initialize( +- wuffs_zlib__decoder* self, ++wuffs_nie__decoder__initialize( ++ wuffs_nie__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_zlib__decoder(void); ++sizeof__wuffs_nie__decoder(void); + + // ---------------- Allocs + +@@ -10944,65 +11664,107 @@ sizeof__wuffs_zlib__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_zlib__decoder* +-wuffs_zlib__decoder__alloc(void); ++wuffs_nie__decoder* ++wuffs_nie__decoder__alloc(void); + +-static inline wuffs_base__io_transformer* +-wuffs_zlib__decoder__alloc_as__wuffs_base__io_transformer(void) { +- return (wuffs_base__io_transformer*)(wuffs_zlib__decoder__alloc()); ++static inline wuffs_base__image_decoder* ++wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_nie__decoder__alloc()); + } + + // ---------------- Upcasts + +-static inline wuffs_base__io_transformer* +-wuffs_zlib__decoder__upcast_as__wuffs_base__io_transformer( +- wuffs_zlib__decoder* p) { +- return (wuffs_base__io_transformer*)p; ++static inline wuffs_base__image_decoder* ++wuffs_nie__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_nie__decoder* p) { ++ return (wuffs_base__image_decoder*)p; + } + + // ---------------- Public Function Prototypes + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_zlib__decoder__dictionary_id( +- const wuffs_zlib__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_zlib__decoder__add_dictionary( +- wuffs_zlib__decoder* self, +- wuffs_base__slice_u8 a_dict); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_zlib__decoder__get_quirk( +- const wuffs_zlib__decoder* self, ++wuffs_nie__decoder__get_quirk( ++ const wuffs_nie__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_zlib__decoder__set_quirk( +- wuffs_zlib__decoder* self, ++wuffs_nie__decoder__set_quirk( ++ wuffs_nie__decoder* self, + uint32_t a_key, + uint64_t a_value); + ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_image_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_frame_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_frame( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_nie__decoder__frame_dirty_rect( ++ const wuffs_nie__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_nie__decoder__num_animation_loops( ++ const wuffs_nie__decoder* self); ++ + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_zlib__decoder__history_retain_length( +- const wuffs_zlib__decoder* self); ++wuffs_nie__decoder__num_decoded_frame_configs( ++ const wuffs_nie__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_zlib__decoder__workbuf_len( +- const wuffs_zlib__decoder* self); ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_nie__decoder__num_decoded_frames( ++ const wuffs_nie__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_zlib__decoder__transform_io( +- wuffs_zlib__decoder* self, ++wuffs_nie__decoder__restart_frame( ++ wuffs_nie__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_nie__decoder__set_report_metadata( ++ wuffs_nie__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__tell_me_more( ++ wuffs_nie__decoder* self, + wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_nie__decoder__workbuf_len( ++ const wuffs_nie__decoder* self); + + #ifdef __cplusplus + } // extern "C" +@@ -11017,7 +11779,7 @@ wuffs_zlib__decoder__transform_io( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_zlib__decoder__struct { ++struct wuffs_nie__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -11028,20 +11790,336 @@ struct wuffs_zlib__decoder__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; +- wuffs_base__vtable vtable_for__wuffs_base__io_transformer; ++ wuffs_base__vtable vtable_for__wuffs_base__image_decoder; + wuffs_base__vtable null_vtable; + +- bool f_bad_call_sequence; +- bool f_header_complete; ++ uint32_t f_pixfmt; ++ uint32_t f_width; ++ uint32_t f_height; ++ uint8_t f_call_sequence; ++ uint32_t f_dst_x; ++ uint32_t f_dst_y; ++ wuffs_base__pixel_swizzler f_swizzler; ++ ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ } private_impl; ++ ++ struct { ++ struct { ++ uint64_t scratch; ++ } s_do_decode_image_config; ++ } private_data; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++ ++ // On failure, the alloc_etc functions return nullptr. They don't throw. ++ ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_nie__decoder__alloc()); ++ } ++ ++ static inline wuffs_base__image_decoder::unique_ptr ++ alloc_as__wuffs_base__image_decoder() { ++ return wuffs_base__image_decoder::unique_ptr( ++ wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder()); ++ } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_nie__decoder__struct() = delete; ++ wuffs_nie__decoder__struct(const wuffs_nie__decoder__struct&) = delete; ++ wuffs_nie__decoder__struct& operator=( ++ const wuffs_nie__decoder__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) ++ ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_nie__decoder__initialize( ++ this, sizeof_star_self, wuffs_version, options); ++ } ++ ++ inline wuffs_base__image_decoder* ++ upcast_as__wuffs_base__image_decoder() { ++ return (wuffs_base__image_decoder*)this; ++ } ++ ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_nie__decoder__get_quirk(this, a_key); ++ } ++ ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_nie__decoder__set_quirk(this, a_key, a_value); ++ } ++ ++ inline wuffs_base__status ++ decode_image_config( ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_nie__decoder__decode_image_config(this, a_dst, a_src); ++ } ++ ++ inline wuffs_base__status ++ decode_frame_config( ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_nie__decoder__decode_frame_config(this, a_dst, a_src); ++ } ++ ++ inline wuffs_base__status ++ decode_frame( ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ return wuffs_nie__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ } ++ ++ inline wuffs_base__rect_ie_u32 ++ frame_dirty_rect() const { ++ return wuffs_nie__decoder__frame_dirty_rect(this); ++ } ++ ++ inline uint32_t ++ num_animation_loops() const { ++ return wuffs_nie__decoder__num_animation_loops(this); ++ } ++ ++ inline uint64_t ++ num_decoded_frame_configs() const { ++ return wuffs_nie__decoder__num_decoded_frame_configs(this); ++ } ++ ++ inline uint64_t ++ num_decoded_frames() const { ++ return wuffs_nie__decoder__num_decoded_frames(this); ++ } ++ ++ inline wuffs_base__status ++ restart_frame( ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ return wuffs_nie__decoder__restart_frame(this, a_index, a_io_position); ++ } ++ ++ inline wuffs_base__empty_struct ++ set_report_metadata( ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_nie__decoder__set_report_metadata(this, a_fourcc, a_report); ++ } ++ ++ inline wuffs_base__status ++ tell_me_more( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_nie__decoder__tell_me_more(this, a_dst, a_minfo, a_src); ++ } ++ ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_nie__decoder__workbuf_len(this); ++ } ++ ++#endif // __cplusplus ++}; // struct wuffs_nie__decoder__struct ++ ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) || defined(WUFFS_NONMONOLITHIC) ++ ++// ---------------- Status Codes ++ ++extern const char wuffs_zlib__note__dictionary_required[]; ++extern const char wuffs_zlib__error__bad_checksum[]; ++extern const char wuffs_zlib__error__bad_compression_method[]; ++extern const char wuffs_zlib__error__bad_compression_window_size[]; ++extern const char wuffs_zlib__error__bad_parity_check[]; ++extern const char wuffs_zlib__error__incorrect_dictionary[]; ++extern const char wuffs_zlib__error__truncated_input[]; ++ ++// ---------------- Public Consts ++ ++#define WUFFS_ZLIB__QUIRK_JUST_RAW_DEFLATE 2113790976u ++ ++#define WUFFS_ZLIB__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u ++ ++#define WUFFS_ZLIB__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u ++ ++// ---------------- Struct Declarations ++ ++typedef struct wuffs_zlib__decoder__struct wuffs_zlib__decoder; ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++// ---------------- Public Initializer Prototypes ++ ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_zlib__decoder__initialize( ++ wuffs_zlib__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); ++ ++size_t ++sizeof__wuffs_zlib__decoder(void); ++ ++// ---------------- Allocs ++ ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. ++ ++wuffs_zlib__decoder* ++wuffs_zlib__decoder__alloc(void); ++ ++static inline wuffs_base__io_transformer* ++wuffs_zlib__decoder__alloc_as__wuffs_base__io_transformer(void) { ++ return (wuffs_base__io_transformer*)(wuffs_zlib__decoder__alloc()); ++} ++ ++// ---------------- Upcasts ++ ++static inline wuffs_base__io_transformer* ++wuffs_zlib__decoder__upcast_as__wuffs_base__io_transformer( ++ wuffs_zlib__decoder* p) { ++ return (wuffs_base__io_transformer*)p; ++} ++ ++// ---------------- Public Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_zlib__decoder__dictionary_id( ++ const wuffs_zlib__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_zlib__decoder__add_dictionary( ++ wuffs_zlib__decoder* self, ++ wuffs_base__slice_u8 a_dict); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_zlib__decoder__get_quirk( ++ const wuffs_zlib__decoder* self, ++ uint32_t a_key); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_zlib__decoder__set_quirk( ++ wuffs_zlib__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_zlib__decoder__dst_history_retain_length( ++ const wuffs_zlib__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_zlib__decoder__workbuf_len( ++ const wuffs_zlib__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_zlib__decoder__transform_io( ++ wuffs_zlib__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++#ifdef __cplusplus ++} // extern "C" ++#endif ++ ++// ---------------- Struct Definitions ++ ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C ++ ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_zlib__decoder__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. ++ ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__io_transformer; ++ wuffs_base__vtable null_vtable; ++ ++ bool f_bad_call_sequence; ++ bool f_header_complete; + bool f_got_dictionary; + bool f_want_dictionary; + bool f_quirks[1]; + bool f_ignore_checksum; +- uint32_t f_dict_id_got; ++ uint32_t f_dict_id_have; + uint32_t f_dict_id_want; + +- uint32_t p_transform_io[1]; +- uint32_t p_do_transform_io[1]; ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; + } private_impl; + + struct { +@@ -11050,9 +12128,9 @@ struct wuffs_zlib__decoder__struct { + wuffs_deflate__decoder f_flate; + + struct { +- uint32_t v_checksum_got; ++ uint32_t v_checksum_have; + uint64_t scratch; +- } s_do_transform_io[1]; ++ } s_do_transform_io; + } private_data; + + #ifdef __cplusplus +@@ -11141,9 +12219,9 @@ struct wuffs_zlib__decoder__struct { + return wuffs_zlib__decoder__set_quirk(this, a_key, a_value); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_zlib__decoder__history_retain_length(this); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_zlib__decoder__dst_history_retain_length(this); + } + + inline wuffs_base__range_ii_u64 +@@ -11184,11 +12262,9 @@ extern const char wuffs_png__error__unsupported_png_file[]; + + // ---------------- Public Consts + +-#define WUFFS_PNG__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 ++#define WUFFS_PNG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 2251799562027015u + +-#define WUFFS_PNG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 2251799562027015 +- +-#define WUFFS_PNG__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 8 ++#define WUFFS_PNG__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 8u + + // ---------------- Struct Declarations + +@@ -11321,11 +12397,6 @@ wuffs_png__decoder__tell_me_more( + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_png__decoder__history_retain_length( +- const wuffs_png__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 + wuffs_png__decoder__workbuf_len( +@@ -11438,26 +12509,26 @@ struct wuffs_png__decoder__struct { + wuffs_png__decoder* self, + wuffs_base__slice_u8 a_curr, + wuffs_base__slice_u8 a_prev); +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_ihdr[1]; +- uint32_t p_decode_other_chunk[1]; +- uint32_t p_decode_actl[1]; +- uint32_t p_decode_chrm[1]; +- uint32_t p_decode_fctl[1]; +- uint32_t p_decode_gama[1]; +- uint32_t p_decode_iccp[1]; +- uint32_t p_decode_plte[1]; +- uint32_t p_decode_srgb[1]; +- uint32_t p_decode_trns[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_skip_frame[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; +- uint32_t p_decode_pass[1]; +- uint32_t p_tell_me_more[1]; +- uint32_t p_do_tell_me_more[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_ihdr; ++ uint32_t p_decode_other_chunk; ++ uint32_t p_decode_actl; ++ uint32_t p_decode_chrm; ++ uint32_t p_decode_fctl; ++ uint32_t p_decode_gama; ++ uint32_t p_decode_iccp; ++ uint32_t p_decode_plte; ++ uint32_t p_decode_srgb; ++ uint32_t p_decode_trns; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_skip_frame; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_decode_pass; ++ uint32_t p_tell_me_more; ++ uint32_t p_do_tell_me_more; + wuffs_base__status (*choosy_filter_and_swizzle)( + wuffs_png__decoder* self, + wuffs_base__pixel_buffer* a_dst, +@@ -11473,54 +12544,54 @@ struct wuffs_png__decoder__struct { + struct { + uint32_t v_checksum_have; + uint64_t scratch; +- } s_do_decode_image_config[1]; ++ } s_do_decode_image_config; + struct { + uint64_t scratch; +- } s_decode_ihdr[1]; ++ } s_decode_ihdr; + struct { + uint64_t scratch; +- } s_decode_other_chunk[1]; ++ } s_decode_other_chunk; + struct { + uint64_t scratch; +- } s_decode_actl[1]; ++ } s_decode_actl; + struct { + uint64_t scratch; +- } s_decode_chrm[1]; ++ } s_decode_chrm; + struct { + uint32_t v_x0; + uint32_t v_x1; + uint32_t v_y1; + uint64_t scratch; +- } s_decode_fctl[1]; ++ } s_decode_fctl; + struct { + uint64_t scratch; +- } s_decode_gama[1]; ++ } s_decode_gama; + struct { + uint32_t v_num_entries; + uint32_t v_i; + uint64_t scratch; +- } s_decode_plte[1]; ++ } s_decode_plte; + struct { + uint32_t v_i; + uint32_t v_n; + uint64_t scratch; +- } s_decode_trns[1]; ++ } s_decode_trns; + struct { + uint64_t scratch; +- } s_do_decode_frame_config[1]; ++ } s_do_decode_frame_config; + struct { + uint64_t scratch; +- } s_skip_frame[1]; ++ } s_skip_frame; + struct { + uint64_t scratch; +- } s_do_decode_frame[1]; ++ } s_do_decode_frame; + struct { + uint64_t scratch; +- } s_decode_pass[1]; ++ } s_decode_pass; + struct { + wuffs_base__status v_zlib_status; + uint64_t scratch; +- } s_do_tell_me_more[1]; ++ } s_do_tell_me_more; + } private_data; + + #ifdef __cplusplus +@@ -11664,11 +12735,6 @@ struct wuffs_png__decoder__struct { + return wuffs_png__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_png__decoder__history_retain_length(this); +- } +- + inline wuffs_base__range_ii_u64 + workbuf_len() const { + return wuffs_png__decoder__workbuf_len(this); +@@ -11681,24 +12747,21 @@ struct wuffs_png__decoder__struct { + + #endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +-extern const char wuffs_tga__error__bad_header[]; +-extern const char wuffs_tga__error__bad_run_length_encoding[]; +-extern const char wuffs_tga__error__truncated_input[]; +-extern const char wuffs_tga__error__unsupported_tga_file[]; ++extern const char wuffs_qoi__error__bad_footer[]; ++extern const char wuffs_qoi__error__bad_header[]; ++extern const char wuffs_qoi__error__truncated_input[]; + + // ---------------- Public Consts + +-#define WUFFS_TGA__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 +- +-#define WUFFS_TGA__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 ++#define WUFFS_QOI__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + + // ---------------- Struct Declarations + +-typedef struct wuffs_tga__decoder__struct wuffs_tga__decoder; ++typedef struct wuffs_qoi__decoder__struct wuffs_qoi__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -11713,14 +12776,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_tga__decoder__initialize( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__initialize( ++ wuffs_qoi__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_tga__decoder(void); ++sizeof__wuffs_qoi__decoder(void); + + // ---------------- Allocs + +@@ -11730,19 +12793,19 @@ sizeof__wuffs_tga__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_tga__decoder* +-wuffs_tga__decoder__alloc(void); ++wuffs_qoi__decoder* ++wuffs_qoi__decoder__alloc(void); + + static inline wuffs_base__image_decoder* +-wuffs_tga__decoder__alloc_as__wuffs_base__image_decoder(void) { +- return (wuffs_base__image_decoder*)(wuffs_tga__decoder__alloc()); ++wuffs_qoi__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_qoi__decoder__alloc()); + } + + // ---------------- Upcasts + + static inline wuffs_base__image_decoder* +-wuffs_tga__decoder__upcast_as__wuffs_base__image_decoder( +- wuffs_tga__decoder* p) { ++wuffs_qoi__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_qoi__decoder* p) { + return (wuffs_base__image_decoder*)p; + } + +@@ -11750,35 +12813,35 @@ wuffs_tga__decoder__upcast_as__wuffs_base__image_decoder( + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__get_quirk( +- const wuffs_tga__decoder* self, ++wuffs_qoi__decoder__get_quirk( ++ const wuffs_qoi__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__set_quirk( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__set_quirk( ++ wuffs_qoi__decoder* self, + uint32_t a_key, + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_image_config( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__decode_image_config( ++ wuffs_qoi__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_frame_config( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__decode_frame_config( ++ wuffs_qoi__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_frame( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__decode_frame( ++ wuffs_qoi__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, +@@ -11787,55 +12850,50 @@ wuffs_tga__decoder__decode_frame( + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_tga__decoder__frame_dirty_rect( +- const wuffs_tga__decoder* self); ++wuffs_qoi__decoder__frame_dirty_rect( ++ const wuffs_qoi__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_tga__decoder__num_animation_loops( +- const wuffs_tga__decoder* self); ++wuffs_qoi__decoder__num_animation_loops( ++ const wuffs_qoi__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__num_decoded_frame_configs( +- const wuffs_tga__decoder* self); ++wuffs_qoi__decoder__num_decoded_frame_configs( ++ const wuffs_qoi__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__num_decoded_frames( +- const wuffs_tga__decoder* self); ++wuffs_qoi__decoder__num_decoded_frames( ++ const wuffs_qoi__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__restart_frame( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__restart_frame( ++ wuffs_qoi__decoder* self, + uint64_t a_index, + uint64_t a_io_position); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_tga__decoder__set_report_metadata( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__set_report_metadata( ++ wuffs_qoi__decoder* self, + uint32_t a_fourcc, + bool a_report); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__tell_me_more( +- wuffs_tga__decoder* self, ++wuffs_qoi__decoder__tell_me_more( ++ wuffs_qoi__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__history_retain_length( +- const wuffs_tga__decoder* self); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_tga__decoder__workbuf_len( +- const wuffs_tga__decoder* self); ++wuffs_qoi__decoder__workbuf_len( ++ const wuffs_qoi__decoder* self); + + #ifdef __cplusplus + } // extern "C" +@@ -11850,7 +12908,7 @@ wuffs_tga__decoder__workbuf_len( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_tga__decoder__struct { ++struct wuffs_qoi__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -11864,69 +12922,58 @@ struct wuffs_tga__decoder__struct { + wuffs_base__vtable vtable_for__wuffs_base__image_decoder; + wuffs_base__vtable null_vtable; + ++ uint32_t f_pixfmt; + uint32_t f_width; + uint32_t f_height; ++ uint64_t f_remaining_pixels_times_4; + uint8_t f_call_sequence; +- uint8_t f_header_id_length; +- uint8_t f_header_color_map_type; +- uint8_t f_header_image_type; +- uint16_t f_header_color_map_first_entry_index; +- uint16_t f_header_color_map_length; +- uint8_t f_header_color_map_entry_size; +- uint8_t f_header_pixel_depth; +- uint8_t f_header_image_descriptor; +- bool f_opaque; +- uint32_t f_scratch_bytes_per_pixel; +- uint32_t f_src_bytes_per_pixel; +- uint32_t f_src_pixfmt; +- uint64_t f_frame_config_io_position; ++ uint32_t f_buffer_index; ++ uint32_t f_dst_x; ++ uint32_t f_dst_y; + wuffs_base__pixel_swizzler f_swizzler; + +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_from_src_to_buffer; + } private_impl; + + struct { +- uint8_t f_dst_palette[1024]; +- uint8_t f_src_palette[1024]; +- uint8_t f_scratch[4]; ++ uint8_t f_pixel[4]; ++ uint8_t f_cache[256]; ++ uint8_t f_buffer[8196]; + + struct { +- uint32_t v_i; + uint64_t scratch; +- } s_do_decode_image_config[1]; ++ } s_do_decode_image_config; + struct { +- uint64_t v_dst_bytes_per_pixel; +- uint32_t v_dst_x; +- uint32_t v_dst_y; +- uint64_t v_mark; +- uint32_t v_num_pixels32; +- uint32_t v_lit_length; +- uint32_t v_run_length; +- uint64_t v_num_dst_bytes; + uint64_t scratch; +- } s_do_decode_frame[1]; ++ } s_do_decode_frame; ++ struct { ++ uint8_t v_dg; ++ uint32_t v_bi; ++ uint32_t v_bk; ++ } s_from_src_to_buffer; + } private_data; + + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_tga__decoder__alloc()); ++ return unique_ptr(wuffs_qoi__decoder__alloc()); + } + + static inline wuffs_base__image_decoder::unique_ptr + alloc_as__wuffs_base__image_decoder() { + return wuffs_base__image_decoder::unique_ptr( +- wuffs_tga__decoder__alloc_as__wuffs_base__image_decoder()); ++ wuffs_qoi__decoder__alloc_as__wuffs_base__image_decoder()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -11942,10 +12989,10 @@ struct wuffs_tga__decoder__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_tga__decoder__struct() = delete; +- wuffs_tga__decoder__struct(const wuffs_tga__decoder__struct&) = delete; +- wuffs_tga__decoder__struct& operator=( +- const wuffs_tga__decoder__struct&) = delete; ++ wuffs_qoi__decoder__struct() = delete; ++ wuffs_qoi__decoder__struct(const wuffs_qoi__decoder__struct&) = delete; ++ wuffs_qoi__decoder__struct& operator=( ++ const wuffs_qoi__decoder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -11965,7 +13012,7 @@ struct wuffs_tga__decoder__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_tga__decoder__initialize( ++ return wuffs_qoi__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +@@ -11977,28 +13024,28 @@ struct wuffs_tga__decoder__struct { + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_tga__decoder__get_quirk(this, a_key); ++ return wuffs_qoi__decoder__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_tga__decoder__set_quirk(this, a_key, a_value); ++ return wuffs_qoi__decoder__set_quirk(this, a_key, a_value); + } + + inline wuffs_base__status + decode_image_config( + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { +- return wuffs_tga__decoder__decode_image_config(this, a_dst, a_src); ++ return wuffs_qoi__decoder__decode_image_config(this, a_dst, a_src); + } + + inline wuffs_base__status + decode_frame_config( + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { +- return wuffs_tga__decoder__decode_frame_config(this, a_dst, a_src); ++ return wuffs_qoi__decoder__decode_frame_config(this, a_dst, a_src); + } + + inline wuffs_base__status +@@ -12008,41 +13055,41 @@ struct wuffs_tga__decoder__struct { + wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, + wuffs_base__decode_frame_options* a_opts) { +- return wuffs_tga__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ return wuffs_qoi__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); + } + + inline wuffs_base__rect_ie_u32 + frame_dirty_rect() const { +- return wuffs_tga__decoder__frame_dirty_rect(this); ++ return wuffs_qoi__decoder__frame_dirty_rect(this); + } + + inline uint32_t + num_animation_loops() const { +- return wuffs_tga__decoder__num_animation_loops(this); ++ return wuffs_qoi__decoder__num_animation_loops(this); + } + + inline uint64_t + num_decoded_frame_configs() const { +- return wuffs_tga__decoder__num_decoded_frame_configs(this); ++ return wuffs_qoi__decoder__num_decoded_frame_configs(this); + } + + inline uint64_t + num_decoded_frames() const { +- return wuffs_tga__decoder__num_decoded_frames(this); ++ return wuffs_qoi__decoder__num_decoded_frames(this); + } + + inline wuffs_base__status + restart_frame( + uint64_t a_index, + uint64_t a_io_position) { +- return wuffs_tga__decoder__restart_frame(this, a_index, a_io_position); ++ return wuffs_qoi__decoder__restart_frame(this, a_index, a_io_position); + } + + inline wuffs_base__empty_struct + set_report_metadata( + uint32_t a_fourcc, + bool a_report) { +- return wuffs_tga__decoder__set_report_metadata(this, a_fourcc, a_report); ++ return wuffs_qoi__decoder__set_report_metadata(this, a_fourcc, a_report); + } + + inline wuffs_base__status +@@ -12050,42 +13097,30 @@ struct wuffs_tga__decoder__struct { + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { +- return wuffs_tga__decoder__tell_me_more(this, a_dst, a_minfo, a_src); +- } +- +- inline uint64_t +- history_retain_length() const { +- return wuffs_tga__decoder__history_retain_length(this); ++ return wuffs_qoi__decoder__tell_me_more(this, a_dst, a_minfo, a_src); + } + + inline wuffs_base__range_ii_u64 + workbuf_len() const { +- return wuffs_tga__decoder__workbuf_len(this); ++ return wuffs_qoi__decoder__workbuf_len(this); + } + + #endif // __cplusplus +-}; // struct wuffs_tga__decoder__struct ++}; // struct wuffs_qoi__decoder__struct + + #endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) || defined(WUFFS_NONMONOLITHIC) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +-extern const char wuffs_wbmp__error__bad_header[]; +-extern const char wuffs_wbmp__error__truncated_input[]; +- + // ---------------- Public Consts + +-#define WUFFS_WBMP__DECODER_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0 +- +-#define WUFFS_WBMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0 +- + // ---------------- Struct Declarations + +-typedef struct wuffs_wbmp__decoder__struct wuffs_wbmp__decoder; ++typedef struct wuffs_sha256__hasher__struct wuffs_sha256__hasher; + + #ifdef __cplusplus + extern "C" { +@@ -12100,14 +13135,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_wbmp__decoder__initialize( +- wuffs_wbmp__decoder* self, ++wuffs_sha256__hasher__initialize( ++ wuffs_sha256__hasher* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_wbmp__decoder(void); ++sizeof__wuffs_sha256__hasher(void); + + // ---------------- Allocs + +@@ -12117,112 +13152,53 @@ sizeof__wuffs_wbmp__decoder(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_wbmp__decoder* +-wuffs_wbmp__decoder__alloc(void); ++wuffs_sha256__hasher* ++wuffs_sha256__hasher__alloc(void); + +-static inline wuffs_base__image_decoder* +-wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder(void) { +- return (wuffs_base__image_decoder*)(wuffs_wbmp__decoder__alloc()); ++static inline wuffs_base__hasher_bitvec256* ++wuffs_sha256__hasher__alloc_as__wuffs_base__hasher_bitvec256(void) { ++ return (wuffs_base__hasher_bitvec256*)(wuffs_sha256__hasher__alloc()); + } + + // ---------------- Upcasts + +-static inline wuffs_base__image_decoder* +-wuffs_wbmp__decoder__upcast_as__wuffs_base__image_decoder( +- wuffs_wbmp__decoder* p) { +- return (wuffs_base__image_decoder*)p; ++static inline wuffs_base__hasher_bitvec256* ++wuffs_sha256__hasher__upcast_as__wuffs_base__hasher_bitvec256( ++ wuffs_sha256__hasher* p) { ++ return (wuffs_base__hasher_bitvec256*)p; + } + + // ---------------- Public Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__get_quirk( +- const wuffs_wbmp__decoder* self, ++wuffs_sha256__hasher__get_quirk( ++ const wuffs_sha256__hasher* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__set_quirk( +- wuffs_wbmp__decoder* self, ++wuffs_sha256__hasher__set_quirk( ++ wuffs_sha256__hasher* self, + uint32_t a_key, + uint64_t a_value); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_image_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_frame_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_frame( +- wuffs_wbmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_wbmp__decoder__frame_dirty_rect( +- const wuffs_wbmp__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_wbmp__decoder__num_animation_loops( +- const wuffs_wbmp__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__num_decoded_frame_configs( +- const wuffs_wbmp__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__num_decoded_frames( +- const wuffs_wbmp__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__restart_frame( +- wuffs_wbmp__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position); +- + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_wbmp__decoder__set_report_metadata( +- wuffs_wbmp__decoder* self, +- uint32_t a_fourcc, +- bool a_report); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__tell_me_more( +- wuffs_wbmp__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src); ++wuffs_sha256__hasher__update( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__history_retain_length( +- const wuffs_wbmp__decoder* self); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_sha256__hasher__update_bitvec256( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_wbmp__decoder__workbuf_len( +- const wuffs_wbmp__decoder* self); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_sha256__hasher__checksum_bitvec256( ++ const wuffs_sha256__hasher* self); + + #ifdef __cplusplus + } // extern "C" +@@ -12237,7 +13213,7 @@ wuffs_wbmp__decoder__workbuf_len( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_wbmp__decoder__struct { ++struct wuffs_sha256__hasher__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -12248,52 +13224,41 @@ struct wuffs_wbmp__decoder__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; +- wuffs_base__vtable vtable_for__wuffs_base__image_decoder; ++ wuffs_base__vtable vtable_for__wuffs_base__hasher_bitvec256; + wuffs_base__vtable null_vtable; + +- uint32_t f_width; +- uint32_t f_height; +- uint8_t f_call_sequence; +- uint64_t f_frame_config_io_position; +- wuffs_base__pixel_swizzler f_swizzler; +- +- uint32_t p_decode_image_config[1]; +- uint32_t p_do_decode_image_config[1]; +- uint32_t p_decode_frame_config[1]; +- uint32_t p_do_decode_frame_config[1]; +- uint32_t p_decode_frame[1]; +- uint32_t p_do_decode_frame[1]; ++ uint64_t f_length_modulo_u64; ++ bool f_length_overflows_u64; ++ uint8_t f_padding0; ++ uint8_t f_padding1; ++ uint8_t f_padding2; ++ uint32_t f_buf_len; ++ uint8_t f_buf_data[64]; ++ uint32_t f_h0; ++ uint32_t f_h1; ++ uint32_t f_h2; ++ uint32_t f_h3; ++ uint32_t f_h4; ++ uint32_t f_h5; ++ uint32_t f_h6; ++ uint32_t f_h7; + } private_impl; + +- struct { +- struct { +- uint32_t v_i; +- uint32_t v_p; +- } s_do_decode_image_config[1]; +- struct { +- uint64_t v_dst_bytes_per_pixel; +- uint32_t v_dst_x; +- uint32_t v_dst_y; +- uint8_t v_src[1]; +- uint8_t v_c; +- } s_do_decode_frame[1]; +- } private_data; +- + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_wbmp__decoder__alloc()); ++ return unique_ptr(wuffs_sha256__hasher__alloc()); + } + +- static inline wuffs_base__image_decoder::unique_ptr +- alloc_as__wuffs_base__image_decoder() { +- return wuffs_base__image_decoder::unique_ptr( +- wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder()); ++ static inline wuffs_base__hasher_bitvec256::unique_ptr ++ alloc_as__wuffs_base__hasher_bitvec256() { ++ return wuffs_base__hasher_bitvec256::unique_ptr( ++ wuffs_sha256__hasher__alloc_as__wuffs_base__hasher_bitvec256()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -12309,10 +13274,10 @@ struct wuffs_wbmp__decoder__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_wbmp__decoder__struct() = delete; +- wuffs_wbmp__decoder__struct(const wuffs_wbmp__decoder__struct&) = delete; +- wuffs_wbmp__decoder__struct& operator=( +- const wuffs_wbmp__decoder__struct&) = delete; ++ wuffs_sha256__hasher__struct() = delete; ++ wuffs_sha256__hasher__struct(const wuffs_sha256__hasher__struct&) = delete; ++ wuffs_sha256__hasher__struct& operator=( ++ const wuffs_sha256__hasher__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -12332,120 +13297,68 @@ struct wuffs_wbmp__decoder__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_wbmp__decoder__initialize( ++ return wuffs_sha256__hasher__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +- inline wuffs_base__image_decoder* +- upcast_as__wuffs_base__image_decoder() { +- return (wuffs_base__image_decoder*)this; ++ inline wuffs_base__hasher_bitvec256* ++ upcast_as__wuffs_base__hasher_bitvec256() { ++ return (wuffs_base__hasher_bitvec256*)this; + } + + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_wbmp__decoder__get_quirk(this, a_key); ++ return wuffs_sha256__hasher__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_wbmp__decoder__set_quirk(this, a_key, a_value); +- } +- +- inline wuffs_base__status +- decode_image_config( +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- return wuffs_wbmp__decoder__decode_image_config(this, a_dst, a_src); +- } +- +- inline wuffs_base__status +- decode_frame_config( +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- return wuffs_wbmp__decoder__decode_frame_config(this, a_dst, a_src); +- } +- +- inline wuffs_base__status +- decode_frame( +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- return wuffs_wbmp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); +- } +- +- inline wuffs_base__rect_ie_u32 +- frame_dirty_rect() const { +- return wuffs_wbmp__decoder__frame_dirty_rect(this); +- } +- +- inline uint32_t +- num_animation_loops() const { +- return wuffs_wbmp__decoder__num_animation_loops(this); +- } +- +- inline uint64_t +- num_decoded_frame_configs() const { +- return wuffs_wbmp__decoder__num_decoded_frame_configs(this); +- } +- +- inline uint64_t +- num_decoded_frames() const { +- return wuffs_wbmp__decoder__num_decoded_frames(this); +- } +- +- inline wuffs_base__status +- restart_frame( +- uint64_t a_index, +- uint64_t a_io_position) { +- return wuffs_wbmp__decoder__restart_frame(this, a_index, a_io_position); ++ return wuffs_sha256__hasher__set_quirk(this, a_key, a_value); + } + + inline wuffs_base__empty_struct +- set_report_metadata( +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_wbmp__decoder__set_report_metadata(this, a_fourcc, a_report); +- } +- +- inline wuffs_base__status +- tell_me_more( +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- return wuffs_wbmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src); ++ update( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_sha256__hasher__update(this, a_x); + } + +- inline uint64_t +- history_retain_length() const { +- return wuffs_wbmp__decoder__history_retain_length(this); ++ inline wuffs_base__bitvec256 ++ update_bitvec256( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_sha256__hasher__update_bitvec256(this, a_x); + } + +- inline wuffs_base__range_ii_u64 +- workbuf_len() const { +- return wuffs_wbmp__decoder__workbuf_len(this); ++ inline wuffs_base__bitvec256 ++ checksum_bitvec256() const { ++ return wuffs_sha256__hasher__checksum_bitvec256(this); + } + + #endif // __cplusplus +-}; // struct wuffs_wbmp__decoder__struct ++}; // struct wuffs_sha256__hasher__struct + + #endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + ++extern const char wuffs_tga__error__bad_header[]; ++extern const char wuffs_tga__error__bad_run_length_encoding[]; ++extern const char wuffs_tga__error__truncated_input[]; ++extern const char wuffs_tga__error__unsupported_tga_file[]; ++ + // ---------------- Public Consts + ++#define WUFFS_TGA__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u ++ + // ---------------- Struct Declarations + +-typedef struct wuffs_xxhash32__hasher__struct wuffs_xxhash32__hasher; ++typedef struct wuffs_tga__decoder__struct wuffs_tga__decoder; + + #ifdef __cplusplus + extern "C" { +@@ -12460,14 +13373,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_xxhash32__hasher__initialize( +- wuffs_xxhash32__hasher* self, ++wuffs_tga__decoder__initialize( ++ wuffs_tga__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_xxhash32__hasher(void); ++sizeof__wuffs_tga__decoder(void); + + // ---------------- Allocs + +@@ -12477,53 +13390,107 @@ sizeof__wuffs_xxhash32__hasher(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_xxhash32__hasher* +-wuffs_xxhash32__hasher__alloc(void); ++wuffs_tga__decoder* ++wuffs_tga__decoder__alloc(void); + +-static inline wuffs_base__hasher_u32* +-wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32(void) { +- return (wuffs_base__hasher_u32*)(wuffs_xxhash32__hasher__alloc()); ++static inline wuffs_base__image_decoder* ++wuffs_tga__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_tga__decoder__alloc()); + } + + // ---------------- Upcasts + +-static inline wuffs_base__hasher_u32* +-wuffs_xxhash32__hasher__upcast_as__wuffs_base__hasher_u32( +- wuffs_xxhash32__hasher* p) { +- return (wuffs_base__hasher_u32*)p; ++static inline wuffs_base__image_decoder* ++wuffs_tga__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_tga__decoder* p) { ++ return (wuffs_base__image_decoder*)p; + } + + // ---------------- Public Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash32__hasher__get_quirk( +- const wuffs_xxhash32__hasher* self, ++wuffs_tga__decoder__get_quirk( ++ const wuffs_tga__decoder* self, + uint32_t a_key); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_xxhash32__hasher__set_quirk( +- wuffs_xxhash32__hasher* self, ++wuffs_tga__decoder__set_quirk( ++ wuffs_tga__decoder* self, + uint32_t a_key, + uint64_t a_value); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_xxhash32__hasher__update( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_image_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_xxhash32__hasher__update_u32( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_frame_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_frame( ++ wuffs_tga__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_tga__decoder__frame_dirty_rect( ++ const wuffs_tga__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_xxhash32__hasher__checksum_u32( +- const wuffs_xxhash32__hasher* self); ++wuffs_tga__decoder__num_animation_loops( ++ const wuffs_tga__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_tga__decoder__num_decoded_frame_configs( ++ const wuffs_tga__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_tga__decoder__num_decoded_frames( ++ const wuffs_tga__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__restart_frame( ++ wuffs_tga__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_tga__decoder__set_report_metadata( ++ wuffs_tga__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__tell_me_more( ++ wuffs_tga__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_tga__decoder__workbuf_len( ++ const wuffs_tga__decoder* self); + + #ifdef __cplusplus + } // extern "C" +@@ -12538,7 +13505,7 @@ wuffs_xxhash32__hasher__checksum_u32( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_xxhash32__hasher__struct { ++struct wuffs_tga__decoder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -12549,36 +13516,72 @@ struct wuffs_xxhash32__hasher__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; +- wuffs_base__vtable vtable_for__wuffs_base__hasher_u32; ++ wuffs_base__vtable vtable_for__wuffs_base__image_decoder; + wuffs_base__vtable null_vtable; + +- uint32_t f_length_modulo_u32; +- bool f_length_overflows_u32; +- uint8_t f_padding0; +- uint8_t f_padding1; +- uint8_t f_buf_len; +- uint8_t f_buf_data[16]; +- uint32_t f_v0; +- uint32_t f_v1; +- uint32_t f_v2; +- uint32_t f_v3; ++ uint32_t f_width; ++ uint32_t f_height; ++ uint8_t f_call_sequence; ++ uint8_t f_header_id_length; ++ uint8_t f_header_color_map_type; ++ uint8_t f_header_image_type; ++ uint16_t f_header_color_map_first_entry_index; ++ uint16_t f_header_color_map_length; ++ uint8_t f_header_color_map_entry_size; ++ uint8_t f_header_pixel_depth; ++ uint8_t f_header_image_descriptor; ++ bool f_opaque; ++ uint32_t f_scratch_bytes_per_pixel; ++ uint32_t f_src_bytes_per_pixel; ++ uint32_t f_src_pixfmt; ++ uint64_t f_frame_config_io_position; ++ wuffs_base__pixel_swizzler f_swizzler; ++ ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; + } private_impl; + ++ struct { ++ uint8_t f_dst_palette[1024]; ++ uint8_t f_src_palette[1024]; ++ uint8_t f_scratch[4]; ++ ++ struct { ++ uint32_t v_i; ++ uint64_t scratch; ++ } s_do_decode_image_config; ++ struct { ++ uint64_t v_dst_bytes_per_pixel; ++ uint32_t v_dst_x; ++ uint32_t v_dst_y; ++ uint64_t v_mark; ++ uint32_t v_num_pixels32; ++ uint32_t v_lit_length; ++ uint32_t v_run_length; ++ uint64_t v_num_dst_bytes; ++ uint64_t scratch; ++ } s_do_decode_frame; ++ } private_data; ++ + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_xxhash32__hasher__alloc()); ++ return unique_ptr(wuffs_tga__decoder__alloc()); + } + +- static inline wuffs_base__hasher_u32::unique_ptr +- alloc_as__wuffs_base__hasher_u32() { +- return wuffs_base__hasher_u32::unique_ptr( +- wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32()); ++ static inline wuffs_base__image_decoder::unique_ptr ++ alloc_as__wuffs_base__image_decoder() { ++ return wuffs_base__image_decoder::unique_ptr( ++ wuffs_tga__decoder__alloc_as__wuffs_base__image_decoder()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -12594,10 +13597,10 @@ struct wuffs_xxhash32__hasher__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_xxhash32__hasher__struct() = delete; +- wuffs_xxhash32__hasher__struct(const wuffs_xxhash32__hasher__struct&) = delete; +- wuffs_xxhash32__hasher__struct& operator=( +- const wuffs_xxhash32__hasher__struct&) = delete; ++ wuffs_tga__decoder__struct() = delete; ++ wuffs_tga__decoder__struct(const wuffs_tga__decoder__struct&) = delete; ++ wuffs_tga__decoder__struct& operator=( ++ const wuffs_tga__decoder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -12617,53 +13620,107 @@ struct wuffs_xxhash32__hasher__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_xxhash32__hasher__initialize( ++ return wuffs_tga__decoder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +- inline wuffs_base__hasher_u32* +- upcast_as__wuffs_base__hasher_u32() { +- return (wuffs_base__hasher_u32*)this; ++ inline wuffs_base__image_decoder* ++ upcast_as__wuffs_base__image_decoder() { ++ return (wuffs_base__image_decoder*)this; + } + + inline uint64_t + get_quirk( + uint32_t a_key) const { +- return wuffs_xxhash32__hasher__get_quirk(this, a_key); ++ return wuffs_tga__decoder__get_quirk(this, a_key); + } + + inline wuffs_base__status + set_quirk( + uint32_t a_key, + uint64_t a_value) { +- return wuffs_xxhash32__hasher__set_quirk(this, a_key, a_value); ++ return wuffs_tga__decoder__set_quirk(this, a_key, a_value); + } + +- inline wuffs_base__empty_struct +- update( +- wuffs_base__slice_u8 a_x) { +- return wuffs_xxhash32__hasher__update(this, a_x); ++ inline wuffs_base__status ++ decode_image_config( ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_tga__decoder__decode_image_config(this, a_dst, a_src); + } + +- inline uint32_t +- update_u32( +- wuffs_base__slice_u8 a_x) { +- return wuffs_xxhash32__hasher__update_u32(this, a_x); ++ inline wuffs_base__status ++ decode_frame_config( ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_tga__decoder__decode_frame_config(this, a_dst, a_src); ++ } ++ ++ inline wuffs_base__status ++ decode_frame( ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ return wuffs_tga__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ } ++ ++ inline wuffs_base__rect_ie_u32 ++ frame_dirty_rect() const { ++ return wuffs_tga__decoder__frame_dirty_rect(this); + } + + inline uint32_t +- checksum_u32() const { +- return wuffs_xxhash32__hasher__checksum_u32(this); ++ num_animation_loops() const { ++ return wuffs_tga__decoder__num_animation_loops(this); ++ } ++ ++ inline uint64_t ++ num_decoded_frame_configs() const { ++ return wuffs_tga__decoder__num_decoded_frame_configs(this); ++ } ++ ++ inline uint64_t ++ num_decoded_frames() const { ++ return wuffs_tga__decoder__num_decoded_frames(this); ++ } ++ ++ inline wuffs_base__status ++ restart_frame( ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ return wuffs_tga__decoder__restart_frame(this, a_index, a_io_position); ++ } ++ ++ inline wuffs_base__empty_struct ++ set_report_metadata( ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_tga__decoder__set_report_metadata(this, a_fourcc, a_report); ++ } ++ ++ inline wuffs_base__status ++ tell_me_more( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_tga__decoder__tell_me_more(this, a_dst, a_minfo, a_src); ++ } ++ ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_tga__decoder__workbuf_len(this); + } + + #endif // __cplusplus +-}; // struct wuffs_xxhash32__hasher__struct ++}; // struct wuffs_tga__decoder__struct + + #endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) || defined(WUFFS_NONMONOLITHIC) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) || defined(WUFFS_NONMONOLITHIC) + + // ---------------- Status Codes + +@@ -12671,7 +13728,7 @@ struct wuffs_xxhash32__hasher__struct { + + // ---------------- Struct Declarations + +-typedef struct wuffs_xxhash64__hasher__struct wuffs_xxhash64__hasher; ++typedef struct wuffs_vp8__placeholder__struct wuffs_vp8__placeholder; + + #ifdef __cplusplus + extern "C" { +@@ -12686,14 +13743,14 @@ extern "C" { + // Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_xxhash64__hasher__initialize( +- wuffs_xxhash64__hasher* self, ++wuffs_vp8__placeholder__initialize( ++ wuffs_vp8__placeholder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options); + + size_t +-sizeof__wuffs_xxhash64__hasher(void); ++sizeof__wuffs_vp8__placeholder(void); + + // ---------------- Allocs + +@@ -12703,54 +13760,13 @@ sizeof__wuffs_xxhash64__hasher(void); + // calling free on the returned pointer. That pointer is effectively a C++ + // std::unique_ptr. + +-wuffs_xxhash64__hasher* +-wuffs_xxhash64__hasher__alloc(void); +- +-static inline wuffs_base__hasher_u64* +-wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64(void) { +- return (wuffs_base__hasher_u64*)(wuffs_xxhash64__hasher__alloc()); +-} ++wuffs_vp8__placeholder* ++wuffs_vp8__placeholder__alloc(void); + + // ---------------- Upcasts + +-static inline wuffs_base__hasher_u64* +-wuffs_xxhash64__hasher__upcast_as__wuffs_base__hasher_u64( +- wuffs_xxhash64__hasher* p) { +- return (wuffs_base__hasher_u64*)p; +-} +- + // ---------------- Public Function Prototypes + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__get_quirk( +- const wuffs_xxhash64__hasher* self, +- uint32_t a_key); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_xxhash64__hasher__set_quirk( +- wuffs_xxhash64__hasher* self, +- uint32_t a_key, +- uint64_t a_value); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_xxhash64__hasher__update( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__update_u64( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x); +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__checksum_u64( +- const wuffs_xxhash64__hasher* self); +- + #ifdef __cplusplus + } // extern "C" + #endif +@@ -12764,7 +13780,7 @@ wuffs_xxhash64__hasher__checksum_u64( + + #if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-struct wuffs_xxhash64__hasher__struct { ++struct wuffs_vp8__placeholder__struct { + // Do not access the private_impl's or private_data's fields directly. There + // is no API/ABI compatibility or safety guarantee if you do so. Instead, use + // the wuffs_foo__bar__baz functions. +@@ -12775,37 +13791,20 @@ struct wuffs_xxhash64__hasher__struct { + struct { + uint32_t magic; + uint32_t active_coroutine; +- wuffs_base__vtable vtable_for__wuffs_base__hasher_u64; + wuffs_base__vtable null_vtable; + +- uint64_t f_length_modulo_u64; +- bool f_length_overflows_u64; +- uint8_t f_padding0; +- uint8_t f_padding1; +- uint8_t f_padding2; +- uint32_t f_buf_len; +- uint8_t f_buf_data[32]; +- uint64_t f_v0; +- uint64_t f_v1; +- uint64_t f_v2; +- uint64_t f_v3; ++ uint32_t f_placeholder; + } private_impl; + + #ifdef __cplusplus + #if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) +- using unique_ptr = std::unique_ptr; ++ using unique_ptr = std::unique_ptr; + + // On failure, the alloc_etc functions return nullptr. They don't throw. + + static inline unique_ptr + alloc() { +- return unique_ptr(wuffs_xxhash64__hasher__alloc()); +- } +- +- static inline wuffs_base__hasher_u64::unique_ptr +- alloc_as__wuffs_base__hasher_u64() { +- return wuffs_base__hasher_u64::unique_ptr( +- wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64()); ++ return unique_ptr(wuffs_vp8__placeholder__alloc()); + } + #endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -12821,10 +13820,10 @@ struct wuffs_xxhash64__hasher__struct { + // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in + // order to provide convenience methods. These forward on "this", so that you + // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". +- wuffs_xxhash64__hasher__struct() = delete; +- wuffs_xxhash64__hasher__struct(const wuffs_xxhash64__hasher__struct&) = delete; +- wuffs_xxhash64__hasher__struct& operator=( +- const wuffs_xxhash64__hasher__struct&) = delete; ++ wuffs_vp8__placeholder__struct() = delete; ++ wuffs_vp8__placeholder__struct(const wuffs_vp8__placeholder__struct&) = delete; ++ wuffs_vp8__placeholder__struct& operator=( ++ const wuffs_vp8__placeholder__struct&) = delete; + #endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + + #if !defined(WUFFS_IMPLEMENTATION) +@@ -12844,9372 +13843,9377 @@ struct wuffs_xxhash64__hasher__struct { + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options) { +- return wuffs_xxhash64__hasher__initialize( ++ return wuffs_vp8__placeholder__initialize( + this, sizeof_star_self, wuffs_version, options); + } + +- inline wuffs_base__hasher_u64* +- upcast_as__wuffs_base__hasher_u64() { +- return (wuffs_base__hasher_u64*)this; +- } ++#endif // __cplusplus ++}; // struct wuffs_vp8__placeholder__struct + +- inline uint64_t +- get_quirk( +- uint32_t a_key) const { +- return wuffs_xxhash64__hasher__get_quirk(this, a_key); +- } ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- inline wuffs_base__status +- set_quirk( +- uint32_t a_key, +- uint64_t a_value) { +- return wuffs_xxhash64__hasher__set_quirk(this, a_key, a_value); +- } ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) || defined(WUFFS_NONMONOLITHIC) + +- inline wuffs_base__empty_struct +- update( +- wuffs_base__slice_u8 a_x) { +- return wuffs_xxhash64__hasher__update(this, a_x); +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC) + +- inline uint64_t +- update_u64( +- wuffs_base__slice_u8 a_x) { +- return wuffs_xxhash64__hasher__update_u64(this, a_x); +- } ++// ---------------- Status Codes + +- inline uint64_t +- checksum_u64() const { +- return wuffs_xxhash64__hasher__checksum_u64(this); +- } ++extern const char wuffs_wbmp__error__bad_header[]; ++extern const char wuffs_wbmp__error__truncated_input[]; + +-#endif // __cplusplus +-}; // struct wuffs_xxhash64__hasher__struct ++// ---------------- Public Consts + +-#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++#define WUFFS_WBMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC) ++// ---------------- Struct Declarations + +-#if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++typedef struct wuffs_wbmp__decoder__struct wuffs_wbmp__decoder; + +-// ---------------- Auxiliary - Base ++#ifdef __cplusplus ++extern "C" { ++#endif + +-// Auxiliary code is discussed at +-// https://github.com/google/wuffs/blob/main/doc/note/auxiliary-code.md ++// ---------------- Public Initializer Prototypes + +-#include ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +-#include ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_wbmp__decoder__initialize( ++ wuffs_wbmp__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); + +-namespace wuffs_aux { ++size_t ++sizeof__wuffs_wbmp__decoder(void); + +-using IOBuffer = wuffs_base__io_buffer; ++// ---------------- Allocs + +-// MemOwner represents ownership of some memory. Dynamically allocated memory +-// (e.g. from malloc or new) is typically paired with free or delete, invoked +-// when the std::unique_ptr is destroyed. Statically allocated memory might use +-// MemOwner(nullptr, &free), even if that statically allocated memory is not +-// nullptr, since calling free(nullptr) is a no-op. +-using MemOwner = std::unique_ptr; ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. + +-namespace sync_io { ++wuffs_wbmp__decoder* ++wuffs_wbmp__decoder__alloc(void); + +-// -------- ++static inline wuffs_base__image_decoder* ++wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_wbmp__decoder__alloc()); ++} + +-// DynIOBuffer is an IOBuffer that is backed by a dynamically sized byte array. +-// It owns that backing array and will free it in its destructor. +-// +-// The array size can be explicitly extended (by calling the grow method) but, +-// unlike a C++ std::vector, there is no implicit extension (e.g. by calling +-// std::vector::insert) and its maximum size is capped by the max_incl +-// constructor argument. +-// +-// It contains an IOBuffer-typed field whose reader side provides access to +-// previously written bytes and whose writer side provides access to the +-// allocated but not-yet-written-to slack space. For Go programmers, this slack +-// space is roughly analogous to the s[len(s):cap(s)] space of a slice s. +-class DynIOBuffer { +- public: +- enum GrowResult { +- OK = 0, +- FailedMaxInclExceeded = 1, +- FailedOutOfMemory = 2, +- }; ++// ---------------- Upcasts + +- // m_buf holds the dynamically sized byte array and its read/write indexes: +- // - m_buf.meta.wi is roughly analogous to a Go slice's length. +- // - m_buf.data.len is roughly analogous to a Go slice's capacity. It is +- // also equal to the m_buf.data.ptr malloc/realloc size. +- // +- // Users should not modify the m_buf.data.ptr or m_buf.data.len fields (as +- // they are conceptually private to this class), but they can modify the +- // bytes referenced by that pointer-length pair (e.g. compactions). +- IOBuffer m_buf; ++static inline wuffs_base__image_decoder* ++wuffs_wbmp__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_wbmp__decoder* p) { ++ return (wuffs_base__image_decoder*)p; ++} + +- // m_max_incl is an inclusive upper bound on the backing array size. +- const uint64_t m_max_incl; ++// ---------------- Public Function Prototypes + +- // Constructor and destructor. +- explicit DynIOBuffer(uint64_t max_incl); +- ~DynIOBuffer(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_wbmp__decoder__get_quirk( ++ const wuffs_wbmp__decoder* self, ++ uint32_t a_key); + +- // Drop frees the byte array and resets m_buf. The DynIOBuffer can still be +- // used after a drop call. It just restarts from zero. +- void drop(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__set_quirk( ++ wuffs_wbmp__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value); + +- // grow ensures that the byte array size is at least min_incl and at most +- // max_incl. It returns FailedMaxInclExceeded if that would require +- // allocating more than max_incl bytes, including the case where (min_incl > +- // max_incl). It returns FailedOutOfMemory if memory allocation failed. +- GrowResult grow(uint64_t min_incl); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__decode_image_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- private: +- // Delete the copy and assign constructors. +- DynIOBuffer(const DynIOBuffer&) = delete; +- DynIOBuffer& operator=(const DynIOBuffer&) = delete; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__decode_frame_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- static uint64_t round_up(uint64_t min_incl, uint64_t max_incl); +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__decode_frame( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); + +-// -------- ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_wbmp__decoder__frame_dirty_rect( ++ const wuffs_wbmp__decoder* self); + +-class Input { +- public: +- virtual ~Input(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_wbmp__decoder__num_animation_loops( ++ const wuffs_wbmp__decoder* self); + +- virtual IOBuffer* BringsItsOwnIOBuffer(); +- virtual std::string CopyIn(IOBuffer* dst, uint64_t history_retain_length) = 0; +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_wbmp__decoder__num_decoded_frame_configs( ++ const wuffs_wbmp__decoder* self); + +-// -------- ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_wbmp__decoder__num_decoded_frames( ++ const wuffs_wbmp__decoder* self); + +-// FileInput is an Input that reads from a file source. +-// +-// It does not take responsibility for closing the file when done. +-class FileInput : public Input { +- public: +- FileInput(FILE* f); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__restart_frame( ++ wuffs_wbmp__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position); + +- virtual std::string CopyIn(IOBuffer* dst, uint64_t history_retain_length); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_wbmp__decoder__set_report_metadata( ++ wuffs_wbmp__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report); + +- private: +- FILE* m_f; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__tell_me_more( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); + +- // Delete the copy and assign constructors. +- FileInput(const FileInput&) = delete; +- FileInput& operator=(const FileInput&) = delete; +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_wbmp__decoder__workbuf_len( ++ const wuffs_wbmp__decoder* self); + +-// -------- ++#ifdef __cplusplus ++} // extern "C" ++#endif + +-// MemoryInput is an Input that reads from an in-memory source. ++// ---------------- Struct Definitions ++ ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. + // +-// It does not take responsibility for freeing the memory when done. +-class MemoryInput : public Input { +- public: +- MemoryInput(const char* ptr, size_t len); +- MemoryInput(const uint8_t* ptr, size_t len); ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +- virtual IOBuffer* BringsItsOwnIOBuffer(); +- virtual std::string CopyIn(IOBuffer* dst, uint64_t history_retain_length); ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- private: +- IOBuffer m_io; ++struct wuffs_wbmp__decoder__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + +- // Delete the copy and assign constructors. +- MemoryInput(const MemoryInput&) = delete; +- MemoryInput& operator=(const MemoryInput&) = delete; +-}; ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__image_decoder; ++ wuffs_base__vtable null_vtable; + +-// -------- ++ uint32_t f_width; ++ uint32_t f_height; ++ uint8_t f_call_sequence; ++ uint64_t f_frame_config_io_position; ++ wuffs_base__pixel_swizzler f_swizzler; + +-} // namespace sync_io ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ } private_impl; + +-} // namespace wuffs_aux ++ struct { ++ struct { ++ uint32_t v_i; ++ uint32_t v_p; ++ } s_do_decode_image_config; ++ struct { ++ uint64_t v_dst_bytes_per_pixel; ++ uint32_t v_dst_x; ++ uint32_t v_dst_y; ++ uint8_t v_src[1]; ++ uint8_t v_c8; ++ } s_do_decode_frame; ++ } private_data; + +-// ---------------- Auxiliary - CBOR ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; + +-namespace wuffs_aux { ++ // On failure, the alloc_etc functions return nullptr. They don't throw. + +-struct DecodeCborResult { +- DecodeCborResult(std::string&& error_message0, uint64_t cursor_position0); ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_wbmp__decoder__alloc()); ++ } + +- std::string error_message; +- uint64_t cursor_position; +-}; ++ static inline wuffs_base__image_decoder::unique_ptr ++ alloc_as__wuffs_base__image_decoder() { ++ return wuffs_base__image_decoder::unique_ptr( ++ wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder()); ++ } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +-class DecodeCborCallbacks { +- public: +- virtual ~DecodeCborCallbacks(); ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_wbmp__decoder__struct() = delete; ++ wuffs_wbmp__decoder__struct(const wuffs_wbmp__decoder__struct&) = delete; ++ wuffs_wbmp__decoder__struct& operator=( ++ const wuffs_wbmp__decoder__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +- // AppendXxx are called for leaf nodes: literals, numbers, strings, etc. ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) + +- virtual std::string AppendNull() = 0; +- virtual std::string AppendUndefined() = 0; +- virtual std::string AppendBool(bool val) = 0; +- virtual std::string AppendF64(double val) = 0; +- virtual std::string AppendI64(int64_t val) = 0; +- virtual std::string AppendU64(uint64_t val) = 0; +- virtual std::string AppendByteString(std::string&& val) = 0; +- virtual std::string AppendTextString(std::string&& val) = 0; +- virtual std::string AppendMinus1MinusX(uint64_t val) = 0; +- virtual std::string AppendCborSimpleValue(uint8_t val) = 0; +- virtual std::string AppendCborTag(uint64_t val) = 0; ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_wbmp__decoder__initialize( ++ this, sizeof_star_self, wuffs_version, options); ++ } + +- // Push and Pop are called for container nodes: CBOR arrays (lists) and CBOR +- // maps (dictionaries). +- // +- // The flags bits combine exactly one of: +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT +- // and exactly one of: +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT ++ inline wuffs_base__image_decoder* ++ upcast_as__wuffs_base__image_decoder() { ++ return (wuffs_base__image_decoder*)this; ++ } + +- virtual std::string Push(uint32_t flags) = 0; +- virtual std::string Pop(uint32_t flags) = 0; ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_wbmp__decoder__get_quirk(this, a_key); ++ } + +- // Done is always the last Callback method called by DecodeCbor, whether or +- // not parsing the input as CBOR encountered an error. Even when successful, +- // trailing data may remain in input and buffer. +- // +- // Do not keep a reference to buffer or buffer.data.ptr after Done returns, +- // as DecodeCbor may then de-allocate the backing array. +- // +- // The default Done implementation is a no-op. +- virtual void // +- Done(DecodeCborResult& result, sync_io::Input& input, IOBuffer& buffer); +-}; ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_wbmp__decoder__set_quirk(this, a_key, a_value); ++ } + +-// The FooArgBar types add structure to Foo's optional arguments. They wrap +-// inner representations for several reasons: +-// - It provides a home for the DefaultValue static method, for Foo callers +-// that want to override some but not all optional arguments. +-// - It provides the "Bar" name at Foo call sites, which can help self- +-// document Foo calls with many arguemnts. +-// - It provides some type safety against accidentally transposing or omitting +-// adjacent fundamentally-numeric-typed optional arguments. ++ inline wuffs_base__status ++ decode_image_config( ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_wbmp__decoder__decode_image_config(this, a_dst, a_src); ++ } + +-// DecodeCborArgQuirks wraps an optional argument to DecodeCbor. +-struct DecodeCborArgQuirks { +- explicit DecodeCborArgQuirks(wuffs_base__slice_u32 repr0); +- explicit DecodeCborArgQuirks(uint32_t* ptr, size_t len); ++ inline wuffs_base__status ++ decode_frame_config( ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_wbmp__decoder__decode_frame_config(this, a_dst, a_src); ++ } + +- // DefaultValue returns an empty slice. +- static DecodeCborArgQuirks DefaultValue(); ++ inline wuffs_base__status ++ decode_frame( ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ return wuffs_wbmp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ } + +- wuffs_base__slice_u32 repr; +-}; ++ inline wuffs_base__rect_ie_u32 ++ frame_dirty_rect() const { ++ return wuffs_wbmp__decoder__frame_dirty_rect(this); ++ } + +-// DecodeCbor calls callbacks based on the CBOR-formatted data in input. +-// +-// On success, the returned error_message is empty and cursor_position counts +-// the number of bytes consumed. On failure, error_message is non-empty and +-// cursor_position is the location of the error. That error may be a content +-// error (invalid CBOR) or an input error (e.g. network failure). +-DecodeCborResult // +-DecodeCbor(DecodeCborCallbacks& callbacks, +- sync_io::Input& input, +- DecodeCborArgQuirks quirks = DecodeCborArgQuirks::DefaultValue()); ++ inline uint32_t ++ num_animation_loops() const { ++ return wuffs_wbmp__decoder__num_animation_loops(this); ++ } + +-} // namespace wuffs_aux ++ inline uint64_t ++ num_decoded_frame_configs() const { ++ return wuffs_wbmp__decoder__num_decoded_frame_configs(this); ++ } + +-// ---------------- Auxiliary - Image ++ inline uint64_t ++ num_decoded_frames() const { ++ return wuffs_wbmp__decoder__num_decoded_frames(this); ++ } + +-namespace wuffs_aux { ++ inline wuffs_base__status ++ restart_frame( ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ return wuffs_wbmp__decoder__restart_frame(this, a_index, a_io_position); ++ } + +-struct DecodeImageResult { +- DecodeImageResult(MemOwner&& pixbuf_mem_owner0, +- wuffs_base__pixel_buffer pixbuf0, +- std::string&& error_message0); +- DecodeImageResult(std::string&& error_message0); ++ inline wuffs_base__empty_struct ++ set_report_metadata( ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_wbmp__decoder__set_report_metadata(this, a_fourcc, a_report); ++ } + +- MemOwner pixbuf_mem_owner; +- wuffs_base__pixel_buffer pixbuf; +- std::string error_message; +-}; ++ inline wuffs_base__status ++ tell_me_more( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_wbmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src); ++ } + +-// DecodeImageCallbacks are the callbacks given to DecodeImage. They are always +-// called in this order: +-// 1. SelectDecoder +-// 2. HandleMetadata +-// 3. SelectPixfmt +-// 4. AllocPixbuf +-// 5. AllocWorkbuf +-// 6. Done +-// +-// It may return early - the third callback might not be invoked if the second +-// one fails - but the final callback (Done) is always invoked. +-class DecodeImageCallbacks { +- public: +- // AllocPixbufResult holds a memory allocation (the result of malloc or new, +- // a statically allocated pointer, etc), or an error message. The memory is +- // de-allocated when mem_owner goes out of scope and is destroyed. +- struct AllocPixbufResult { +- AllocPixbufResult(MemOwner&& mem_owner0, wuffs_base__pixel_buffer pixbuf0); +- AllocPixbufResult(std::string&& error_message0); ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_wbmp__decoder__workbuf_len(this); ++ } + +- MemOwner mem_owner; +- wuffs_base__pixel_buffer pixbuf; +- std::string error_message; +- }; ++#endif // __cplusplus ++}; // struct wuffs_wbmp__decoder__struct + +- // AllocWorkbufResult holds a memory allocation (the result of malloc or new, +- // a statically allocated pointer, etc), or an error message. The memory is +- // de-allocated when mem_owner goes out of scope and is destroyed. +- struct AllocWorkbufResult { +- AllocWorkbufResult(MemOwner&& mem_owner0, wuffs_base__slice_u8 workbuf0); +- AllocWorkbufResult(std::string&& error_message0); ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- MemOwner mem_owner; +- wuffs_base__slice_u8 workbuf; +- std::string error_message; +- }; ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC) + +- virtual ~DecodeImageCallbacks(); ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) || defined(WUFFS_NONMONOLITHIC) + +- // SelectDecoder returns the image decoder for the input data's file format. +- // Returning a nullptr means failure (DecodeImage_UnsupportedImageFormat). +- // +- // Common formats will have a FourCC value in the range [1 ..= 0x7FFF_FFFF], +- // such as WUFFS_BASE__FOURCC__JPEG. A zero FourCC value means that Wuffs' +- // standard library did not recognize the image format but if SelectDecoder +- // was overridden, it may examine the input data's starting bytes and still +- // provide its own image decoder, e.g. for an exotic image file format that's +- // not in Wuffs' standard library. The prefix_etc fields have the same +- // meaning as wuffs_base__magic_number_guess_fourcc arguments. SelectDecoder +- // implementations should not modify prefix_data's contents. +- // +- // SelectDecoder might be called more than once, since some image file +- // formats can wrap others. For example, a nominal BMP file can actually +- // contain a JPEG or a PNG. +- // +- // The default SelectDecoder accepts the FOURCC codes listed below. For +- // modular builds (i.e. when #define'ing WUFFS_CONFIG__MODULES), acceptance +- // of the ETC file format is optional (for each value of ETC) and depends on +- // the corresponding module to be enabled at compile time (i.e. #define'ing +- // WUFFS_CONFIG__MODULE__ETC). +- // - WUFFS_BASE__FOURCC__BMP +- // - WUFFS_BASE__FOURCC__GIF +- // - WUFFS_BASE__FOURCC__JPEG +- // - WUFFS_BASE__FOURCC__NIE +- // - WUFFS_BASE__FOURCC__NPBM +- // - WUFFS_BASE__FOURCC__PNG +- // - WUFFS_BASE__FOURCC__TGA +- // - WUFFS_BASE__FOURCC__WBMP +- virtual wuffs_base__image_decoder::unique_ptr // +- SelectDecoder(uint32_t fourcc, +- wuffs_base__slice_u8 prefix_data, +- bool prefix_closed); +- +- // HandleMetadata acknowledges image metadata. minfo.flavor will be one of: +- // - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH +- // - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED +- // If it is ETC__METADATA_RAW_ETC then raw contains the metadata bytes. Those +- // bytes should not be retained beyond the the HandleMetadata call. +- // +- // minfo.metadata__fourcc() will typically match one of the +- // DecodeImageArgFlags bits. For example, if (REPORT_METADATA_CHRM | +- // REPORT_METADATA_GAMA) was passed to DecodeImage then the metadata FourCC +- // will be either WUFFS_BASE__FOURCC__CHRM or WUFFS_BASE__FOURCC__GAMA. +- // +- // It returns an error message, or an empty string on success. +- virtual std::string // +- HandleMetadata(const wuffs_base__more_information& minfo, +- wuffs_base__slice_u8 raw); +- +- // SelectPixfmt returns the destination pixel format for AllocPixbuf. It +- // should return wuffs_base__make_pixel_format(etc) called with one of: +- // - WUFFS_BASE__PIXEL_FORMAT__BGR_565 +- // - WUFFS_BASE__PIXEL_FORMAT__BGR +- // - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL +- // - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE +- // - WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL +- // - WUFFS_BASE__PIXEL_FORMAT__RGB +- // - WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL +- // - WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL +- // or return image_config.pixcfg.pixel_format(). The latter means to use the +- // image file's natural pixel format. For example, GIF images' natural pixel +- // format is an indexed one. +- // +- // Returning otherwise means failure (DecodeImage_UnsupportedPixelFormat). +- // +- // The default SelectPixfmt implementation returns +- // wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL) which +- // is 4 bytes per pixel (8 bits per channel × 4 channels). +- virtual wuffs_base__pixel_format // +- SelectPixfmt(const wuffs_base__image_config& image_config); ++// ---------------- Status Codes + +- // AllocPixbuf allocates the pixel buffer. +- // +- // allow_uninitialized_memory will be true if a valid background_color was +- // passed to DecodeImage, since the pixel buffer's contents will be +- // overwritten with that color after AllocPixbuf returns. +- // +- // The default AllocPixbuf implementation allocates either uninitialized or +- // zeroed memory. Zeroed memory typically corresponds to filling with opaque +- // black or transparent black, depending on the pixel format. +- virtual AllocPixbufResult // +- AllocPixbuf(const wuffs_base__image_config& image_config, +- bool allow_uninitialized_memory); ++extern const char wuffs_webp__error__bad_huffman_code_over_subscribed[]; ++extern const char wuffs_webp__error__bad_huffman_code_under_subscribed[]; ++extern const char wuffs_webp__error__bad_huffman_code[]; ++extern const char wuffs_webp__error__bad_back_reference[]; ++extern const char wuffs_webp__error__bad_color_cache[]; ++extern const char wuffs_webp__error__bad_header[]; ++extern const char wuffs_webp__error__bad_transform[]; ++extern const char wuffs_webp__error__short_chunk[]; ++extern const char wuffs_webp__error__truncated_input[]; ++extern const char wuffs_webp__error__unsupported_number_of_huffman_groups[]; ++extern const char wuffs_webp__error__unsupported_transform_after_color_indexing_transform[]; ++extern const char wuffs_webp__error__unsupported_webp_file[]; + +- // AllocWorkbuf allocates the work buffer. The allocated buffer's length +- // should be at least len_range.min_incl, but larger allocations (up to +- // len_range.max_incl) may have better performance (by using more memory). +- // +- // The default AllocWorkbuf implementation allocates len_range.max_incl bytes +- // of either uninitialized or zeroed memory. +- virtual AllocWorkbufResult // +- AllocWorkbuf(wuffs_base__range_ii_u64 len_range, +- bool allow_uninitialized_memory); ++// ---------------- Public Consts + +- // Done is always the last Callback method called by DecodeImage, whether or +- // not parsing the input encountered an error. Even when successful, trailing +- // data may remain in input and buffer. +- // +- // The image_decoder is the one returned by SelectDecoder (if SelectDecoder +- // was successful), or a no-op unique_ptr otherwise. Like any unique_ptr, +- // ownership moves to the Done implementation. +- // +- // Do not keep a reference to buffer or buffer.data.ptr after Done returns, +- // as DecodeImage may then de-allocate the backing array. +- // +- // The default Done implementation is a no-op, other than running the +- // image_decoder unique_ptr destructor. +- virtual void // +- Done(DecodeImageResult& result, +- sync_io::Input& input, +- IOBuffer& buffer, +- wuffs_base__image_decoder::unique_ptr image_decoder); +-}; ++#define WUFFS_WEBP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u + +-extern const char DecodeImage_BufferIsTooShort[]; +-extern const char DecodeImage_MaxInclDimensionExceeded[]; +-extern const char DecodeImage_MaxInclMetadataLengthExceeded[]; +-extern const char DecodeImage_OutOfMemory[]; +-extern const char DecodeImage_UnexpectedEndOfFile[]; +-extern const char DecodeImage_UnsupportedImageFormat[]; +-extern const char DecodeImage_UnsupportedMetadata[]; +-extern const char DecodeImage_UnsupportedPixelBlend[]; +-extern const char DecodeImage_UnsupportedPixelConfiguration[]; +-extern const char DecodeImage_UnsupportedPixelFormat[]; ++// ---------------- Struct Declarations + +-// The FooArgBar types add structure to Foo's optional arguments. They wrap +-// inner representations for several reasons: +-// - It provides a home for the DefaultValue static method, for Foo callers +-// that want to override some but not all optional arguments. +-// - It provides the "Bar" name at Foo call sites, which can help self- +-// document Foo calls with many arguemnts. +-// - It provides some type safety against accidentally transposing or omitting +-// adjacent fundamentally-numeric-typed optional arguments. ++typedef struct wuffs_webp__decoder__struct wuffs_webp__decoder; + +-// DecodeImageArgQuirks wraps an optional argument to DecodeImage. +-struct DecodeImageArgQuirks { +- explicit DecodeImageArgQuirks(wuffs_base__slice_u32 repr0); +- explicit DecodeImageArgQuirks(uint32_t* ptr, size_t len); ++#ifdef __cplusplus ++extern "C" { ++#endif + +- // DefaultValue returns an empty slice. +- static DecodeImageArgQuirks DefaultValue(); ++// ---------------- Public Initializer Prototypes + +- wuffs_base__slice_u32 repr; +-}; ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +-// DecodeImageArgFlags wraps an optional argument to DecodeImage. +-struct DecodeImageArgFlags { +- explicit DecodeImageArgFlags(uint64_t repr0); ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_webp__decoder__initialize( ++ wuffs_webp__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); + +- // DefaultValue returns 0. +- static DecodeImageArgFlags DefaultValue(); ++size_t ++sizeof__wuffs_webp__decoder(void); + +- // TODO: support all of the REPORT_METADATA_ETC flags, not just CHRM, EXIF, +- // GAMA, ICCP, KVP, SRGB and XMP. ++// ---------------- Allocs + +- // Background Color. +- static constexpr uint64_t REPORT_METADATA_BGCL = 0x0001; +- // Primary Chromaticities and White Point. +- static constexpr uint64_t REPORT_METADATA_CHRM = 0x0002; +- // Exchangeable Image File Format. +- static constexpr uint64_t REPORT_METADATA_EXIF = 0x0004; +- // Gamma Correction. +- static constexpr uint64_t REPORT_METADATA_GAMA = 0x0008; +- // International Color Consortium Profile. +- static constexpr uint64_t REPORT_METADATA_ICCP = 0x0010; +- // Key-Value Pair. +- // +- // For PNG files, this includes iTXt, tEXt and zTXt chunks. In the +- // HandleMetadata callback, the raw argument contains UTF-8 strings. +- static constexpr uint64_t REPORT_METADATA_KVP = 0x0020; +- // Modification Time. +- static constexpr uint64_t REPORT_METADATA_MTIM = 0x0040; +- // Offset (2-Dimensional). +- static constexpr uint64_t REPORT_METADATA_OFS2 = 0x0080; +- // Physical Dimensions. +- static constexpr uint64_t REPORT_METADATA_PHYD = 0x0100; +- // Standard Red Green Blue (Rendering Intent). +- static constexpr uint64_t REPORT_METADATA_SRGB = 0x0200; +- // Extensible Metadata Platform. +- static constexpr uint64_t REPORT_METADATA_XMP = 0x0400; ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. + +- uint64_t repr; +-}; ++wuffs_webp__decoder* ++wuffs_webp__decoder__alloc(void); + +-// DecodeImageArgPixelBlend wraps an optional argument to DecodeImage. +-struct DecodeImageArgPixelBlend { +- explicit DecodeImageArgPixelBlend(wuffs_base__pixel_blend repr0); ++static inline wuffs_base__image_decoder* ++wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder(void) { ++ return (wuffs_base__image_decoder*)(wuffs_webp__decoder__alloc()); ++} + +- // DefaultValue returns WUFFS_BASE__PIXEL_BLEND__SRC. +- static DecodeImageArgPixelBlend DefaultValue(); ++// ---------------- Upcasts + +- wuffs_base__pixel_blend repr; +-}; ++static inline wuffs_base__image_decoder* ++wuffs_webp__decoder__upcast_as__wuffs_base__image_decoder( ++ wuffs_webp__decoder* p) { ++ return (wuffs_base__image_decoder*)p; ++} + +-// DecodeImageArgBackgroundColor wraps an optional argument to DecodeImage. +-struct DecodeImageArgBackgroundColor { +- explicit DecodeImageArgBackgroundColor( +- wuffs_base__color_u32_argb_premul repr0); ++// ---------------- Public Function Prototypes + +- // DefaultValue returns 1, an invalid wuffs_base__color_u32_argb_premul. +- static DecodeImageArgBackgroundColor DefaultValue(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_webp__decoder__get_quirk( ++ const wuffs_webp__decoder* self, ++ uint32_t a_key); + +- wuffs_base__color_u32_argb_premul repr; +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__set_quirk( ++ wuffs_webp__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value); + +-// DecodeImageArgMaxInclDimension wraps an optional argument to DecodeImage. +-struct DecodeImageArgMaxInclDimension { +- explicit DecodeImageArgMaxInclDimension(uint32_t repr0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__decode_image_config( ++ wuffs_webp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- // DefaultValue returns 1048575 = 0x000F_FFFF, more than 1 million pixels. +- static DecodeImageArgMaxInclDimension DefaultValue(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__decode_frame_config( ++ wuffs_webp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- uint32_t repr; +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__decode_frame( ++ wuffs_webp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); + +-// DecodeImageArgMaxInclMetadataLength wraps an optional argument to +-// DecodeImage. +-struct DecodeImageArgMaxInclMetadataLength { +- explicit DecodeImageArgMaxInclMetadataLength(uint64_t repr0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_webp__decoder__frame_dirty_rect( ++ const wuffs_webp__decoder* self); + +- // DefaultValue returns 16777215 = 0x00FF_FFFF, one less than 16 MiB. +- static DecodeImageArgMaxInclMetadataLength DefaultValue(); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_webp__decoder__num_animation_loops( ++ const wuffs_webp__decoder* self); + +- uint64_t repr; +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_webp__decoder__num_decoded_frame_configs( ++ const wuffs_webp__decoder* self); + +-// DecodeImage decodes the image data in input. A variety of image file formats +-// can be decoded, depending on what callbacks.SelectDecoder returns. +-// +-// For animated formats, only the first frame is returned, since the API is +-// simpler for synchronous I/O and having DecodeImage only return when +-// completely done, but rendering animation often involves handling other +-// events in between animation frames. To decode multiple frames of animated +-// images, or for asynchronous I/O (e.g. when decoding an image streamed over +-// the network), use Wuffs' lower level C API instead of its higher level, +-// simplified C++ API (the wuffs_aux API). +-// +-// The DecodeImageResult's fields depend on whether decoding succeeded: +-// - On total success, the error_message is empty and pixbuf.pixcfg.is_valid() +-// is true. +-// - On partial success (e.g. the input file was truncated but we are still +-// able to decode some of the pixels), error_message is non-empty but +-// pixbuf.pixcfg.is_valid() is still true. It is up to the caller whether to +-// accept or reject partial success. +-// - On failure, the error_message is non_empty and pixbuf.pixcfg.is_valid() +-// is false. +-// +-// The callbacks allocate the pixel buffer memory and work buffer memory. On +-// success, pixel buffer memory ownership is passed to the DecodeImage caller +-// as the returned pixbuf_mem_owner. Regardless of success or failure, the work +-// buffer memory is deleted. +-// +-// The pixel_blend (one of the constants listed below) determines how to +-// composite the decoded image over the pixel buffer's original pixels (as +-// returned by callbacks.AllocPixbuf): +-// - WUFFS_BASE__PIXEL_BLEND__SRC +-// - WUFFS_BASE__PIXEL_BLEND__SRC_OVER +-// +-// The background_color is used to fill the pixel buffer after +-// callbacks.AllocPixbuf returns, if it is valid in the +-// wuffs_base__color_u32_argb_premul__is_valid sense. The default value, +-// 0x0000_0001, is not valid since its Blue channel value (0x01) is greater +-// than its Alpha channel value (0x00). A valid background_color will typically +-// be overwritten when pixel_blend is WUFFS_BASE__PIXEL_BLEND__SRC, but might +-// still be visible on partial (not total) success or when pixel_blend is +-// WUFFS_BASE__PIXEL_BLEND__SRC_OVER and the decoded image is not fully opaque. +-// +-// Decoding fails (with DecodeImage_MaxInclDimensionExceeded) if the image's +-// width or height is greater than max_incl_dimension or if any opted-in (via +-// flags bits) metadata is longer than max_incl_metadata_length. +-DecodeImageResult // +-DecodeImage(DecodeImageCallbacks& callbacks, +- sync_io::Input& input, +- DecodeImageArgQuirks quirks = DecodeImageArgQuirks::DefaultValue(), +- DecodeImageArgFlags flags = DecodeImageArgFlags::DefaultValue(), +- DecodeImageArgPixelBlend pixel_blend = +- DecodeImageArgPixelBlend::DefaultValue(), +- DecodeImageArgBackgroundColor background_color = +- DecodeImageArgBackgroundColor::DefaultValue(), +- DecodeImageArgMaxInclDimension max_incl_dimension = +- DecodeImageArgMaxInclDimension::DefaultValue(), +- DecodeImageArgMaxInclMetadataLength max_incl_metadata_length = +- DecodeImageArgMaxInclMetadataLength::DefaultValue()); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_webp__decoder__num_decoded_frames( ++ const wuffs_webp__decoder* self); + +-} // namespace wuffs_aux ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__restart_frame( ++ wuffs_webp__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position); + +-// ---------------- Auxiliary - JSON ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_webp__decoder__set_report_metadata( ++ wuffs_webp__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report); + +-namespace wuffs_aux { ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_webp__decoder__tell_me_more( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); + +-struct DecodeJsonResult { +- DecodeJsonResult(std::string&& error_message0, uint64_t cursor_position0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_webp__decoder__workbuf_len( ++ const wuffs_webp__decoder* self); + +- std::string error_message; +- uint64_t cursor_position; +-}; ++#ifdef __cplusplus ++} // extern "C" ++#endif + +-class DecodeJsonCallbacks { +- public: +- virtual ~DecodeJsonCallbacks(); ++// ---------------- Struct Definitions + +- // AppendXxx are called for leaf nodes: literals, numbers and strings. For +- // strings, the Callbacks implementation is responsible for tracking map keys +- // versus other values. ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +- virtual std::string AppendNull() = 0; +- virtual std::string AppendBool(bool val) = 0; +- virtual std::string AppendF64(double val) = 0; +- virtual std::string AppendI64(int64_t val) = 0; +- virtual std::string AppendTextString(std::string&& val) = 0; ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- // Push and Pop are called for container nodes: JSON arrays (lists) and JSON +- // objects (dictionaries). ++struct wuffs_webp__decoder__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. + // +- // The flags bits combine exactly one of: +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT +- // and exactly one of: +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST +- // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + +- virtual std::string Push(uint32_t flags) = 0; +- virtual std::string Pop(uint32_t flags) = 0; ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__image_decoder; ++ wuffs_base__vtable null_vtable; + +- // Done is always the last Callback method called by DecodeJson, whether or +- // not parsing the input as JSON encountered an error. Even when successful, +- // trailing data may remain in input and buffer. See "Unintuitive JSON +- // Parsing" (https://nullprogram.com/blog/2019/12/28/) which discusses JSON +- // parsing and when it stops. +- // +- // Do not keep a reference to buffer or buffer.data.ptr after Done returns, +- // as DecodeJson may then de-allocate the backing array. +- // +- // The default Done implementation is a no-op. +- virtual void // +- Done(DecodeJsonResult& result, sync_io::Input& input, IOBuffer& buffer); +-}; ++ uint32_t f_pixfmt; ++ uint32_t f_width; ++ uint32_t f_height; ++ uint8_t f_call_sequence; ++ uint8_t f_code_length_code_lengths[19]; ++ bool f_sub_chunk_has_padding; ++ uint64_t f_frame_config_io_position; ++ uint32_t f_riff_chunk_length; ++ uint32_t f_sub_chunk_length; ++ uint32_t f_bits; ++ uint32_t f_n_bits; ++ bool f_seen_transform[4]; ++ uint8_t f_transform_type[4]; ++ uint8_t f_transform_tile_size_log2[4]; ++ uint32_t f_n_transforms; ++ uint32_t f_color_cache_bits; ++ uint32_t f_overall_color_cache_bits; ++ uint32_t f_overall_tile_size_log2; ++ uint32_t f_overall_n_huffman_groups; ++ uint32_t f_ht_n_symbols; ++ uint32_t f_ht_code_lengths_remaining; ++ uint32_t f_color_indexing_palette_size; ++ uint32_t f_color_indexing_width; ++ uint32_t f_workbuf_offset_for_transform[4]; ++ uint32_t f_workbuf_offset_for_color_indexing; ++ wuffs_base__pixel_swizzler f_swizzler; + +-extern const char DecodeJson_BadJsonPointer[]; +-extern const char DecodeJson_NoMatch[]; ++ uint32_t p_decode_huffman_groups; ++ uint32_t p_decode_huffman_tree; ++ uint32_t p_decode_huffman_tree_simple; ++ uint32_t p_decode_code_length_code_lengths; ++ uint32_t p_build_code_lengths; ++ uint32_t p_decode_pixels_slow; ++ uint32_t p_decode_image_config; ++ uint32_t p_do_decode_image_config; ++ uint32_t p_do_decode_image_config_limited; ++ uint32_t p_do_decode_image_config_limited_vp8l; ++ uint32_t p_decode_frame_config; ++ uint32_t p_do_decode_frame_config; ++ uint32_t p_decode_frame; ++ uint32_t p_do_decode_frame; ++ uint32_t p_decode_transform; ++ uint32_t p_decode_color_cache_parameters; ++ uint32_t p_decode_hg_table; ++ uint32_t p_decode_pixels; ++ } private_impl; + +-// The FooArgBar types add structure to Foo's optional arguments. They wrap +-// inner representations for several reasons: +-// - It provides a home for the DefaultValue static method, for Foo callers +-// that want to override some but not all optional arguments. +-// - It provides the "Bar" name at Foo call sites, which can help self- +-// document Foo calls with many arguemnts. +-// - It provides some type safety against accidentally transposing or omitting +-// adjacent fundamentally-numeric-typed optional arguments. ++ struct { ++ uint8_t f_palette[1024]; ++ uint32_t f_color_cache[2048]; ++ uint16_t f_codes[2328]; ++ uint16_t f_code_lengths[2328]; ++ uint16_t f_code_lengths_huffman_nodes[37]; ++ uint16_t f_huffman_nodes[256][6267]; + +-// DecodeJsonArgQuirks wraps an optional argument to DecodeJson. +-struct DecodeJsonArgQuirks { +- explicit DecodeJsonArgQuirks(wuffs_base__slice_u32 repr0); +- explicit DecodeJsonArgQuirks(uint32_t* ptr, size_t len); ++ struct { ++ uint32_t v_hg; ++ uint32_t v_ht; ++ } s_decode_huffman_groups; ++ struct { ++ uint32_t v_use_second_symbol; ++ uint32_t v_first_symbol_n_bits; ++ uint32_t v_symbol0; ++ uint32_t v_base_offset; ++ } s_decode_huffman_tree_simple; ++ struct { ++ uint32_t v_n_codes; ++ uint32_t v_i; ++ } s_decode_code_length_code_lengths; ++ struct { ++ uint32_t v_length_n_bits; ++ uint16_t v_prev_code_length; ++ uint32_t v_s; ++ uint32_t v_s_max; ++ uint16_t v_node; ++ uint16_t v_repeat_value; ++ uint32_t v_repeat_n_bits; ++ } s_build_code_lengths; ++ struct { ++ uint64_t v_p; ++ uint64_t v_p_max; ++ uint32_t v_tile_size_log2; ++ uint32_t v_width_in_tiles; ++ uint32_t v_x; ++ uint32_t v_y; ++ uint32_t v_hg; ++ uint16_t v_node; ++ uint32_t v_color; ++ uint32_t v_back_ref_len_n_bits; ++ uint32_t v_back_ref_len_minus_1; ++ uint32_t v_back_ref_dist_n_bits; ++ uint32_t v_back_ref_dist_premap_minus_1; ++ uint64_t v_color_cache_p; ++ } s_decode_pixels_slow; ++ struct { ++ uint64_t scratch; ++ } s_do_decode_image_config; ++ struct { ++ uint64_t scratch; ++ } s_do_decode_image_config_limited; ++ struct { ++ uint64_t scratch; ++ } s_do_decode_image_config_limited_vp8l; ++ struct { ++ uint32_t v_width; ++ } s_do_decode_frame; ++ struct { ++ uint32_t v_transform_type; ++ uint32_t v_tile_size_log2; ++ } s_decode_transform; ++ struct { ++ uint32_t v_tile_size_log2; ++ } s_decode_hg_table; ++ } private_data; + +- // DefaultValue returns an empty slice. +- static DecodeJsonArgQuirks DefaultValue(); ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; + +- wuffs_base__slice_u32 repr; +-}; ++ // On failure, the alloc_etc functions return nullptr. They don't throw. + +-// DecodeJsonArgJsonPointer wraps an optional argument to DecodeJson. +-struct DecodeJsonArgJsonPointer { +- explicit DecodeJsonArgJsonPointer(std::string repr0); ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_webp__decoder__alloc()); ++ } + +- // DefaultValue returns an empty string. +- static DecodeJsonArgJsonPointer DefaultValue(); ++ static inline wuffs_base__image_decoder::unique_ptr ++ alloc_as__wuffs_base__image_decoder() { ++ return wuffs_base__image_decoder::unique_ptr( ++ wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder()); ++ } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +- std::string repr; +-}; ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_webp__decoder__struct() = delete; ++ wuffs_webp__decoder__struct(const wuffs_webp__decoder__struct&) = delete; ++ wuffs_webp__decoder__struct& operator=( ++ const wuffs_webp__decoder__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +-// DecodeJson calls callbacks based on the JSON-formatted data in input. +-// +-// On success, the returned error_message is empty and cursor_position counts +-// the number of bytes consumed. On failure, error_message is non-empty and +-// cursor_position is the location of the error. That error may be a content +-// error (invalid JSON) or an input error (e.g. network failure). +-// +-// json_pointer is a query in the JSON Pointer (RFC 6901) syntax. The callbacks +-// run for the input's sub-node that matches the query. DecodeJson_NoMatch is +-// returned if no matching sub-node was found. The empty query matches the +-// input's root node, consistent with JSON Pointer semantics. +-// +-// The JSON Pointer implementation is greedy: duplicate keys are not rejected +-// but only the first match for each '/'-separated fragment is followed. +-DecodeJsonResult // +-DecodeJson(DecodeJsonCallbacks& callbacks, +- sync_io::Input& input, +- DecodeJsonArgQuirks quirks = DecodeJsonArgQuirks::DefaultValue(), +- DecodeJsonArgJsonPointer json_pointer = +- DecodeJsonArgJsonPointer::DefaultValue()); ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) + +-} // namespace wuffs_aux ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_webp__decoder__initialize( ++ this, sizeof_star_self, wuffs_version, options); ++ } + +-#endif // defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ inline wuffs_base__image_decoder* ++ upcast_as__wuffs_base__image_decoder() { ++ return (wuffs_base__image_decoder*)this; ++ } + +-// ‼ WUFFS C HEADER ENDS HERE. +-#ifdef WUFFS_IMPLEMENTATION ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_webp__decoder__get_quirk(this, a_key); ++ } + +-#ifdef __cplusplus +-extern "C" { +-#endif ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_webp__decoder__set_quirk(this, a_key, a_value); ++ } + +-// ---------------- Fundamentals ++ inline wuffs_base__status ++ decode_image_config( ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_webp__decoder__decode_image_config(this, a_dst, a_src); ++ } + +-// WUFFS_BASE__MAGIC is a magic number to check that initializers are called. +-// It's not foolproof, given C doesn't automatically zero memory before use, +-// but it should catch 99.99% of cases. +-// +-// Its (non-zero) value is arbitrary, based on md5sum("wuffs"). +-#define WUFFS_BASE__MAGIC ((uint32_t)0x3CCB6C71) ++ inline wuffs_base__status ++ decode_frame_config( ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_webp__decoder__decode_frame_config(this, a_dst, a_src); ++ } + +-// WUFFS_BASE__DISABLED is a magic number to indicate that a non-recoverable +-// error was previously encountered. +-// +-// Its (non-zero) value is arbitrary, based on md5sum("disabled"). +-#define WUFFS_BASE__DISABLED ((uint32_t)0x075AE3D2) ++ inline wuffs_base__status ++ decode_frame( ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ return wuffs_webp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ } + +-// Use switch cases for coroutine suspension points, similar to the technique +-// in https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html +-// +-// The implicit fallthrough is intentional. +-// +-// We use trivial macros instead of an explicit assignment and case statement +-// so that clang-format doesn't get confused by the unusual "case"s. +-#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0 case 0:; +-#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT(n) \ +- coro_susp_point = n; \ +- case n:; ++ inline wuffs_base__rect_ie_u32 ++ frame_dirty_rect() const { ++ return wuffs_webp__decoder__frame_dirty_rect(this); ++ } + +-#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \ +- if (!status.repr) { \ +- goto ok; \ +- } else if (*status.repr != '$') { \ +- goto exit; \ +- } \ +- coro_susp_point = n; \ +- goto suspend; \ +- case n:; ++ inline uint32_t ++ num_animation_loops() const { ++ return wuffs_webp__decoder__num_animation_loops(this); ++ } + +-// The "defined(__clang__)" isn't redundant. While vanilla clang defines +-// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. +-#if defined(__GNUC__) || defined(__clang__) +-#define WUFFS_BASE__LIKELY(expr) (__builtin_expect(!!(expr), 1)) +-#define WUFFS_BASE__UNLIKELY(expr) (__builtin_expect(!!(expr), 0)) +-#else +-#define WUFFS_BASE__LIKELY(expr) (expr) +-#define WUFFS_BASE__UNLIKELY(expr) (expr) +-#endif ++ inline uint64_t ++ num_decoded_frame_configs() const { ++ return wuffs_webp__decoder__num_decoded_frame_configs(this); ++ } + +-// -------- ++ inline uint64_t ++ num_decoded_frames() const { ++ return wuffs_webp__decoder__num_decoded_frames(this); ++ } + +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wcast-qual" +-#endif +-static inline uint8_t* // +-wuffs_base__strip_const_from_u8_ptr(const uint8_t* ptr) { +- return (uint8_t*)ptr; +-} +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++ inline wuffs_base__status ++ restart_frame( ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ return wuffs_webp__decoder__restart_frame(this, a_index, a_io_position); ++ } + +-// -------- ++ inline wuffs_base__empty_struct ++ set_report_metadata( ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_webp__decoder__set_report_metadata(this, a_fourcc, a_report); ++ } + +-static inline wuffs_base__empty_struct // +-wuffs_base__ignore_status(wuffs_base__status z) { +- return wuffs_base__make_empty_struct(); +-} ++ inline wuffs_base__status ++ tell_me_more( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ return wuffs_webp__decoder__tell_me_more(this, a_dst, a_minfo, a_src); ++ } + +-static inline wuffs_base__status // +-wuffs_base__status__ensure_not_a_suspension(wuffs_base__status z) { +- if (z.repr && (*z.repr == '$')) { +- z.repr = wuffs_base__error__cannot_return_a_suspension; ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_webp__decoder__workbuf_len(this); + } +- return z; +-} + +-// -------- ++#endif // __cplusplus ++}; // struct wuffs_webp__decoder__struct + +-// wuffs_base__iterate_total_advance returns the exclusive pointer-offset at +-// which iteration should stop. The overall slice has length total_len, each +-// iteration's sub-slice has length iter_len and are placed iter_advance apart. +-// +-// The iter_advance may not be larger than iter_len. The iter_advance may be +-// smaller than iter_len, in which case the sub-slices will overlap. +-// +-// The return value r satisfies ((0 <= r) && (r <= total_len)). +-// +-// For example, if total_len = 15, iter_len = 5 and iter_advance = 3, there are +-// four iterations at offsets 0, 3, 6 and 9. This function returns 12. +-// +-// 0123456789012345 +-// [....] +-// [....] +-// [....] +-// [....] +-// $ +-// 0123456789012345 +-// +-// For example, if total_len = 15, iter_len = 5 and iter_advance = 5, there are +-// three iterations at offsets 0, 5 and 10. This function returns 15. ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) || defined(WUFFS_NONMONOLITHIC) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC) ++ ++// ---------------- Status Codes ++ ++// ---------------- Public Consts ++ ++// ---------------- Struct Declarations ++ ++typedef struct wuffs_xxhash32__hasher__struct wuffs_xxhash32__hasher; ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++// ---------------- Public Initializer Prototypes ++ ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". + // +-// 0123456789012345 +-// [....] +-// [....] +-// [....] +-// $ +-// 0123456789012345 +-static inline size_t // +-wuffs_base__iterate_total_advance(size_t total_len, +- size_t iter_len, +- size_t iter_advance) { +- if (total_len >= iter_len) { +- size_t n = total_len - iter_len; +- return ((n / iter_advance) * iter_advance) + iter_advance; +- } +- return 0; +-} ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +-// ---------------- Numeric Types ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_xxhash32__hasher__initialize( ++ wuffs_xxhash32__hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); + +-extern const uint8_t wuffs_base__low_bits_mask__u8[8]; +-extern const uint16_t wuffs_base__low_bits_mask__u16[16]; +-extern const uint32_t wuffs_base__low_bits_mask__u32[32]; +-extern const uint64_t wuffs_base__low_bits_mask__u64[64]; ++size_t ++sizeof__wuffs_xxhash32__hasher(void); + +-#define WUFFS_BASE__LOW_BITS_MASK__U8(n) (wuffs_base__low_bits_mask__u8[n]) +-#define WUFFS_BASE__LOW_BITS_MASK__U16(n) (wuffs_base__low_bits_mask__u16[n]) +-#define WUFFS_BASE__LOW_BITS_MASK__U32(n) (wuffs_base__low_bits_mask__u32[n]) +-#define WUFFS_BASE__LOW_BITS_MASK__U64(n) (wuffs_base__low_bits_mask__u64[n]) ++// ---------------- Allocs + +-// -------- ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. + +-static inline void // +-wuffs_base__u8__sat_add_indirect(uint8_t* x, uint8_t y) { +- *x = wuffs_base__u8__sat_add(*x, y); +-} ++wuffs_xxhash32__hasher* ++wuffs_xxhash32__hasher__alloc(void); + +-static inline void // +-wuffs_base__u8__sat_sub_indirect(uint8_t* x, uint8_t y) { +- *x = wuffs_base__u8__sat_sub(*x, y); ++static inline wuffs_base__hasher_u32* ++wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32(void) { ++ return (wuffs_base__hasher_u32*)(wuffs_xxhash32__hasher__alloc()); + } + +-static inline void // +-wuffs_base__u16__sat_add_indirect(uint16_t* x, uint16_t y) { +- *x = wuffs_base__u16__sat_add(*x, y); +-} ++// ---------------- Upcasts + +-static inline void // +-wuffs_base__u16__sat_sub_indirect(uint16_t* x, uint16_t y) { +- *x = wuffs_base__u16__sat_sub(*x, y); ++static inline wuffs_base__hasher_u32* ++wuffs_xxhash32__hasher__upcast_as__wuffs_base__hasher_u32( ++ wuffs_xxhash32__hasher* p) { ++ return (wuffs_base__hasher_u32*)p; + } + +-static inline void // +-wuffs_base__u32__sat_add_indirect(uint32_t* x, uint32_t y) { +- *x = wuffs_base__u32__sat_add(*x, y); +-} ++// ---------------- Public Function Prototypes + +-static inline void // +-wuffs_base__u32__sat_sub_indirect(uint32_t* x, uint32_t y) { +- *x = wuffs_base__u32__sat_sub(*x, y); +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xxhash32__hasher__get_quirk( ++ const wuffs_xxhash32__hasher* self, ++ uint32_t a_key); + +-static inline void // +-wuffs_base__u64__sat_add_indirect(uint64_t* x, uint64_t y) { +- *x = wuffs_base__u64__sat_add(*x, y); +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_xxhash32__hasher__set_quirk( ++ wuffs_xxhash32__hasher* self, ++ uint32_t a_key, ++ uint64_t a_value); + +-static inline void // +-wuffs_base__u64__sat_sub_indirect(uint64_t* x, uint64_t y) { +- *x = wuffs_base__u64__sat_sub(*x, y); +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_xxhash32__hasher__update( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x); + +-// ---------------- Numeric Types (Utility) ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_xxhash32__hasher__update_u32( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x); + +-#define wuffs_base__utility__sign_extend_convert_u16_u32(a) \ +- ((uint32_t)(int32_t)(int16_t)(a)) ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_xxhash32__hasher__checksum_u32( ++ const wuffs_xxhash32__hasher* self); + +-#define wuffs_base__utility__sign_extend_rshift_u32(a, n) \ +- ((uint32_t)(((int32_t)(a)) >> (n))) ++#ifdef __cplusplus ++} // extern "C" ++#endif + +-#define wuffs_base__utility__sign_extend_rshift_u64(a, n) \ +- ((uint64_t)(((int64_t)(a)) >> (n))) ++// ---------------- Struct Definitions + +-// ---------------- Slices and Tables ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +-// wuffs_base__slice_u8__prefix returns up to the first up_to bytes of s. +-static inline wuffs_base__slice_u8 // +-wuffs_base__slice_u8__prefix(wuffs_base__slice_u8 s, uint64_t up_to) { +- if (((uint64_t)(s.len)) > up_to) { +- s.len = ((size_t)up_to); ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_xxhash32__hasher__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. ++ ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__hasher_u32; ++ wuffs_base__vtable null_vtable; ++ ++ uint32_t f_length_modulo_u32; ++ bool f_length_overflows_u32; ++ uint8_t f_padding0; ++ uint8_t f_padding1; ++ uint8_t f_buf_len; ++ uint8_t f_buf_data[16]; ++ uint32_t f_v0; ++ uint32_t f_v1; ++ uint32_t f_v2; ++ uint32_t f_v3; ++ } private_impl; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++ ++ // On failure, the alloc_etc functions return nullptr. They don't throw. ++ ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_xxhash32__hasher__alloc()); + } +- return s; +-} + +-// wuffs_base__slice_u8__suffix returns up to the last up_to bytes of s. +-static inline wuffs_base__slice_u8 // +-wuffs_base__slice_u8__suffix(wuffs_base__slice_u8 s, uint64_t up_to) { +- if (((uint64_t)(s.len)) > up_to) { +- s.ptr += ((uint64_t)(s.len)) - up_to; +- s.len = ((size_t)up_to); ++ static inline wuffs_base__hasher_u32::unique_ptr ++ alloc_as__wuffs_base__hasher_u32() { ++ return wuffs_base__hasher_u32::unique_ptr( ++ wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32()); + } +- return s; +-} ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +-// wuffs_base__slice_u8__copy_from_slice calls memmove(dst.ptr, src.ptr, len) +-// where len is the minimum of dst.len and src.len. +-// +-// Passing a wuffs_base__slice_u8 with all fields NULL or zero (a valid, empty +-// slice) is valid and results in a no-op. +-static inline uint64_t // +-wuffs_base__slice_u8__copy_from_slice(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src) { +- size_t len = dst.len < src.len ? dst.len : src.len; +- if (len > 0) { +- memmove(dst.ptr, src.ptr, len); ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_xxhash32__hasher__struct() = delete; ++ wuffs_xxhash32__hasher__struct(const wuffs_xxhash32__hasher__struct&) = delete; ++ wuffs_xxhash32__hasher__struct& operator=( ++ const wuffs_xxhash32__hasher__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) ++ ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_xxhash32__hasher__initialize( ++ this, sizeof_star_self, wuffs_version, options); + } +- return len; +-} + +-static inline wuffs_base__empty_struct // +-wuffs_base__bulk_load_host_endian(void* ptr, +- size_t len, +- wuffs_base__slice_u8 src) { +- if (len && (len <= src.len)) { +- memmove(ptr, src.ptr, len); ++ inline wuffs_base__hasher_u32* ++ upcast_as__wuffs_base__hasher_u32() { ++ return (wuffs_base__hasher_u32*)this; + } +- return wuffs_base__make_empty_struct(); +-} + +-static inline wuffs_base__empty_struct // +-wuffs_base__bulk_memset(void* ptr, size_t len, uint8_t byte_value) { +- if (len) { +- memset(ptr, byte_value, len); ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_xxhash32__hasher__get_quirk(this, a_key); + } +- return wuffs_base__make_empty_struct(); +-} + +-static inline wuffs_base__empty_struct // +-wuffs_base__bulk_save_host_endian(void* ptr, +- size_t len, +- wuffs_base__slice_u8 dst) { +- if (len && (len <= dst.len)) { +- memmove(dst.ptr, ptr, len); ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_xxhash32__hasher__set_quirk(this, a_key, a_value); + } +- return wuffs_base__make_empty_struct(); +-} + +-// -------- ++ inline wuffs_base__empty_struct ++ update( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_xxhash32__hasher__update(this, a_x); ++ } + +-static inline wuffs_base__slice_u8 // +-wuffs_base__table_u8__row_u32(wuffs_base__table_u8 t, uint32_t y) { +- if (y < t.height) { +- return wuffs_base__make_slice_u8(t.ptr + (t.stride * y), t.width); ++ inline uint32_t ++ update_u32( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_xxhash32__hasher__update_u32(this, a_x); + } +- return wuffs_base__make_slice_u8(NULL, 0); +-} + +-// ---------------- Slices and Tables (Utility) ++ inline uint32_t ++ checksum_u32() const { ++ return wuffs_xxhash32__hasher__checksum_u32(this); ++ } + +-#define wuffs_base__utility__empty_slice_u8 wuffs_base__empty_slice_u8 ++#endif // __cplusplus ++}; // struct wuffs_xxhash32__hasher__struct + +-// ---------------- Ranges and Rects ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-static inline uint32_t // +-wuffs_base__range_ii_u32__get_min_incl(const wuffs_base__range_ii_u32* r) { +- return r->min_incl; +-} ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC) + +-static inline uint32_t // +-wuffs_base__range_ii_u32__get_max_incl(const wuffs_base__range_ii_u32* r) { +- return r->max_incl; +-} ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC) + +-static inline uint32_t // +-wuffs_base__range_ie_u32__get_min_incl(const wuffs_base__range_ie_u32* r) { +- return r->min_incl; +-} ++// ---------------- Status Codes + +-static inline uint32_t // +-wuffs_base__range_ie_u32__get_max_excl(const wuffs_base__range_ie_u32* r) { +- return r->max_excl; +-} ++// ---------------- Public Consts + +-static inline uint64_t // +-wuffs_base__range_ii_u64__get_min_incl(const wuffs_base__range_ii_u64* r) { +- return r->min_incl; +-} ++// ---------------- Struct Declarations + +-static inline uint64_t // +-wuffs_base__range_ii_u64__get_max_incl(const wuffs_base__range_ii_u64* r) { +- return r->max_incl; +-} ++typedef struct wuffs_xxhash64__hasher__struct wuffs_xxhash64__hasher; + +-static inline uint64_t // +-wuffs_base__range_ie_u64__get_min_incl(const wuffs_base__range_ie_u64* r) { +- return r->min_incl; +-} ++#ifdef __cplusplus ++extern "C" { ++#endif + +-static inline uint64_t // +-wuffs_base__range_ie_u64__get_max_excl(const wuffs_base__range_ie_u64* r) { +- return r->max_excl; +-} ++// ---------------- Public Initializer Prototypes + +-// ---------------- Ranges and Rects (Utility) ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +-#define wuffs_base__utility__empty_range_ii_u32 wuffs_base__empty_range_ii_u32 +-#define wuffs_base__utility__empty_range_ie_u32 wuffs_base__empty_range_ie_u32 +-#define wuffs_base__utility__empty_range_ii_u64 wuffs_base__empty_range_ii_u64 +-#define wuffs_base__utility__empty_range_ie_u64 wuffs_base__empty_range_ie_u64 +-#define wuffs_base__utility__empty_rect_ii_u32 wuffs_base__empty_rect_ii_u32 +-#define wuffs_base__utility__empty_rect_ie_u32 wuffs_base__empty_rect_ie_u32 +-#define wuffs_base__utility__make_range_ii_u32 wuffs_base__make_range_ii_u32 +-#define wuffs_base__utility__make_range_ie_u32 wuffs_base__make_range_ie_u32 +-#define wuffs_base__utility__make_range_ii_u64 wuffs_base__make_range_ii_u64 +-#define wuffs_base__utility__make_range_ie_u64 wuffs_base__make_range_ie_u64 +-#define wuffs_base__utility__make_rect_ii_u32 wuffs_base__make_rect_ii_u32 +-#define wuffs_base__utility__make_rect_ie_u32 wuffs_base__make_rect_ie_u32 ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_xxhash64__hasher__initialize( ++ wuffs_xxhash64__hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); + +-// ---------------- I/O ++size_t ++sizeof__wuffs_xxhash64__hasher(void); + +-static inline uint64_t // +-wuffs_base__io__count_since(uint64_t mark, uint64_t index) { +- if (index >= mark) { +- return index - mark; +- } +- return 0; +-} ++// ---------------- Allocs + +-// TODO: drop the "const" in "const uint8_t* ptr". Some though required about +-// the base.io_reader.since method returning a mutable "slice base.u8". +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wcast-qual" +-#endif +-static inline wuffs_base__slice_u8 // +-wuffs_base__io__since(uint64_t mark, uint64_t index, const uint8_t* ptr) { +- if (index >= mark) { +- return wuffs_base__make_slice_u8(((uint8_t*)ptr) + mark, +- ((size_t)(index - mark))); +- } +- return wuffs_base__make_slice_u8(NULL, 0); +-} +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. + +-// -------- ++wuffs_xxhash64__hasher* ++wuffs_xxhash64__hasher__alloc(void); + +-static inline void // +-wuffs_base__io_reader__limit(const uint8_t** ptr_io2_r, +- const uint8_t* iop_r, +- uint64_t limit) { +- if (((uint64_t)(*ptr_io2_r - iop_r)) > limit) { +- *ptr_io2_r = iop_r + limit; +- } ++static inline wuffs_base__hasher_u64* ++wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64(void) { ++ return (wuffs_base__hasher_u64*)(wuffs_xxhash64__hasher__alloc()); + } + +-static inline uint32_t // +-wuffs_base__io_reader__limited_copy_u32_to_slice(const uint8_t** ptr_iop_r, +- const uint8_t* io2_r, +- uint32_t length, +- wuffs_base__slice_u8 dst) { +- const uint8_t* iop_r = *ptr_iop_r; +- size_t n = dst.len; +- if (n > length) { +- n = length; +- } +- if (n > ((size_t)(io2_r - iop_r))) { +- n = (size_t)(io2_r - iop_r); +- } +- if (n > 0) { +- memmove(dst.ptr, iop_r, n); +- *ptr_iop_r += n; +- } +- return (uint32_t)(n); ++// ---------------- Upcasts ++ ++static inline wuffs_base__hasher_u64* ++wuffs_xxhash64__hasher__upcast_as__wuffs_base__hasher_u64( ++ wuffs_xxhash64__hasher* p) { ++ return (wuffs_base__hasher_u64*)p; + } + +-// wuffs_base__io_reader__match7 returns whether the io_reader's upcoming bytes +-// start with the given prefix (up to 7 bytes long). It is peek-like, not +-// read-like, in that there are no side-effects. +-// +-// The low 3 bits of a hold the prefix length, n. +-// +-// The high 56 bits of a hold the prefix itself, in little-endian order. The +-// first prefix byte is in bits 8..=15, the second prefix byte is in bits +-// 16..=23, etc. The high (8 * (7 - n)) bits are ignored. +-// +-// There are three possible return values: +-// - 0 means success. +-// - 1 means inconclusive, equivalent to "$short read". +-// - 2 means failure. +-static inline uint32_t // +-wuffs_base__io_reader__match7(const uint8_t* iop_r, +- const uint8_t* io2_r, +- wuffs_base__io_buffer* r, +- uint64_t a) { +- uint32_t n = a & 7; +- a >>= 8; +- if ((io2_r - iop_r) >= 8) { +- uint64_t x = wuffs_base__peek_u64le__no_bounds_check(iop_r); +- uint32_t shift = 8 * (8 - n); +- return ((a << shift) == (x << shift)) ? 0 : 2; +- } +- for (; n > 0; n--) { +- if (iop_r >= io2_r) { +- return (r && r->meta.closed) ? 2 : 1; +- } else if (*iop_r != ((uint8_t)(a))) { +- return 2; +- } +- iop_r++; +- a >>= 8; +- } +- return 0; +-} ++// ---------------- Public Function Prototypes + +-static inline wuffs_base__io_buffer* // +-wuffs_base__io_reader__set(wuffs_base__io_buffer* b, +- const uint8_t** ptr_iop_r, +- const uint8_t** ptr_io0_r, +- const uint8_t** ptr_io1_r, +- const uint8_t** ptr_io2_r, +- wuffs_base__slice_u8 data, +- uint64_t history_position) { +- b->data = data; +- b->meta.wi = data.len; +- b->meta.ri = 0; +- b->meta.pos = history_position; +- b->meta.closed = false; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xxhash64__hasher__get_quirk( ++ const wuffs_xxhash64__hasher* self, ++ uint32_t a_key); + +- *ptr_iop_r = data.ptr; +- *ptr_io0_r = data.ptr; +- *ptr_io1_r = data.ptr; +- *ptr_io2_r = data.ptr + data.len; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_xxhash64__hasher__set_quirk( ++ wuffs_xxhash64__hasher* self, ++ uint32_t a_key, ++ uint64_t a_value); + +- return b; +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_xxhash64__hasher__update( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x); + +-// -------- ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xxhash64__hasher__update_u64( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x); + +-static inline uint64_t // +-wuffs_base__io_writer__copy_from_slice(uint8_t** ptr_iop_w, +- uint8_t* io2_w, +- wuffs_base__slice_u8 src) { +- uint8_t* iop_w = *ptr_iop_w; +- size_t n = src.len; +- if (n > ((size_t)(io2_w - iop_w))) { +- n = (size_t)(io2_w - iop_w); +- } +- if (n > 0) { +- memmove(iop_w, src.ptr, n); +- *ptr_iop_w += n; +- } +- return (uint64_t)(n); +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xxhash64__hasher__checksum_u64( ++ const wuffs_xxhash64__hasher* self); + +-static inline void // +-wuffs_base__io_writer__limit(uint8_t** ptr_io2_w, +- uint8_t* iop_w, +- uint64_t limit) { +- if (((uint64_t)(*ptr_io2_w - iop_w)) > limit) { +- *ptr_io2_w = iop_w + limit; +- } +-} ++#ifdef __cplusplus ++} // extern "C" ++#endif + +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_history(uint8_t** ptr_iop_w, +- uint8_t* io0_w, +- uint8_t* io2_w, +- uint32_t length, +- uint32_t distance) { +- if (!distance) { +- return 0; +- } +- uint8_t* p = *ptr_iop_w; +- if ((size_t)(p - io0_w) < (size_t)(distance)) { +- return 0; +- } +- uint8_t* q = p - distance; +- size_t n = (size_t)(io2_w - p); +- if ((size_t)(length) > n) { +- length = (uint32_t)(n); +- } else { +- n = (size_t)(length); +- } +- // TODO: unrolling by 3 seems best for the std/deflate benchmarks, but that +- // is mostly because 3 is the minimum length for the deflate format. This +- // function implementation shouldn't overfit to that one format. Perhaps the +- // limited_copy_u32_from_history Wuffs method should also take an unroll hint +- // argument, and the cgen can look if that argument is the constant +- // expression '3'. +- // +- // See also wuffs_base__io_writer__limited_copy_u32_from_history_fast below. +- for (; n >= 3; n -= 3) { +- *p++ = *q++; +- *p++ = *q++; +- *p++ = *q++; +- } +- for (; n; n--) { +- *p++ = *q++; +- } +- *ptr_iop_w = p; +- return length; +-} ++// ---------------- Struct Definitions + +-// wuffs_base__io_writer__limited_copy_u32_from_history_fast is like the +-// wuffs_base__io_writer__limited_copy_u32_from_history function above, but has +-// stronger pre-conditions. ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. + // +-// The caller needs to prove that: +-// - length <= (io2_w - *ptr_iop_w) +-// - distance >= 1 +-// - distance <= (*ptr_iop_w - io0_w) +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_history_fast(uint8_t** ptr_iop_w, +- uint8_t* io0_w, +- uint8_t* io2_w, +- uint32_t length, +- uint32_t distance) { +- uint8_t* p = *ptr_iop_w; +- uint8_t* q = p - distance; +- uint32_t n = length; +- for (; n >= 3; n -= 3) { +- *p++ = *q++; +- *p++ = *q++; +- *p++ = *q++; +- } +- for (; n; n--) { +- *p++ = *q++; ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C ++ ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) ++ ++struct wuffs_xxhash64__hasher__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. ++ ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__hasher_u64; ++ wuffs_base__vtable null_vtable; ++ ++ uint64_t f_length_modulo_u64; ++ bool f_length_overflows_u64; ++ uint8_t f_padding0; ++ uint8_t f_padding1; ++ uint8_t f_padding2; ++ uint32_t f_buf_len; ++ uint8_t f_buf_data[32]; ++ uint64_t f_v0; ++ uint64_t f_v1; ++ uint64_t f_v2; ++ uint64_t f_v3; ++ } private_impl; ++ ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; ++ ++ // On failure, the alloc_etc functions return nullptr. They don't throw. ++ ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_xxhash64__hasher__alloc()); + } +- *ptr_iop_w = p; +- return length; +-} + +-// wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast +-// copies the previous byte (the one immediately before *ptr_iop_w), copying 8 +-// byte chunks at a time. Each chunk contains 8 repetitions of the same byte. +-// +-// In terms of number of bytes copied, length is rounded up to a multiple of 8. +-// As a special case, a zero length rounds up to 8 (even though 0 is already a +-// multiple of 8), since there is always at least one 8 byte chunk copied. +-// +-// In terms of advancing *ptr_iop_w, length is not rounded up. +-// +-// The caller needs to prove that: +-// - (length + 8) <= (io2_w - *ptr_iop_w) +-// - distance == 1 +-// - distance <= (*ptr_iop_w - io0_w) +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( +- uint8_t** ptr_iop_w, +- uint8_t* io0_w, +- uint8_t* io2_w, +- uint32_t length, +- uint32_t distance) { +- uint8_t* p = *ptr_iop_w; +- uint64_t x = p[-1]; +- x |= x << 8; +- x |= x << 16; +- x |= x << 32; +- uint32_t n = length; +- while (1) { +- wuffs_base__poke_u64le__no_bounds_check(p, x); +- if (n <= 8) { +- p += n; +- break; +- } +- p += 8; +- n -= 8; ++ static inline wuffs_base__hasher_u64::unique_ptr ++ alloc_as__wuffs_base__hasher_u64() { ++ return wuffs_base__hasher_u64::unique_ptr( ++ wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64()); + } +- *ptr_iop_w = p; +- return length; +-} ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +-// wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast is +-// like the wuffs_base__io_writer__limited_copy_u32_from_history_fast function +-// above, but copies 8 byte chunks at a time. +-// +-// In terms of number of bytes copied, length is rounded up to a multiple of 8. +-// As a special case, a zero length rounds up to 8 (even though 0 is already a +-// multiple of 8), since there is always at least one 8 byte chunk copied. +-// +-// In terms of advancing *ptr_iop_w, length is not rounded up. +-// +-// The caller needs to prove that: +-// - (length + 8) <= (io2_w - *ptr_iop_w) +-// - distance >= 8 +-// - distance <= (*ptr_iop_w - io0_w) +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( +- uint8_t** ptr_iop_w, +- uint8_t* io0_w, +- uint8_t* io2_w, +- uint32_t length, +- uint32_t distance) { +- uint8_t* p = *ptr_iop_w; +- uint8_t* q = p - distance; +- uint32_t n = length; +- while (1) { +- memcpy(p, q, 8); +- if (n <= 8) { +- p += n; +- break; +- } +- p += 8; +- q += 8; +- n -= 8; ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_xxhash64__hasher__struct() = delete; ++ wuffs_xxhash64__hasher__struct(const wuffs_xxhash64__hasher__struct&) = delete; ++ wuffs_xxhash64__hasher__struct& operator=( ++ const wuffs_xxhash64__hasher__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) ++ ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_xxhash64__hasher__initialize( ++ this, sizeof_star_self, wuffs_version, options); + } +- *ptr_iop_w = p; +- return length; +-} + +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_reader(uint8_t** ptr_iop_w, +- uint8_t* io2_w, +- uint32_t length, +- const uint8_t** ptr_iop_r, +- const uint8_t* io2_r) { +- uint8_t* iop_w = *ptr_iop_w; +- size_t n = length; +- if (n > ((size_t)(io2_w - iop_w))) { +- n = (size_t)(io2_w - iop_w); ++ inline wuffs_base__hasher_u64* ++ upcast_as__wuffs_base__hasher_u64() { ++ return (wuffs_base__hasher_u64*)this; + } +- const uint8_t* iop_r = *ptr_iop_r; +- if (n > ((size_t)(io2_r - iop_r))) { +- n = (size_t)(io2_r - iop_r); ++ ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_xxhash64__hasher__get_quirk(this, a_key); + } +- if (n > 0) { +- memmove(iop_w, iop_r, n); +- *ptr_iop_w += n; +- *ptr_iop_r += n; ++ ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_xxhash64__hasher__set_quirk(this, a_key, a_value); + } +- return (uint32_t)(n); +-} + +-static inline uint32_t // +-wuffs_base__io_writer__limited_copy_u32_from_slice(uint8_t** ptr_iop_w, +- uint8_t* io2_w, +- uint32_t length, +- wuffs_base__slice_u8 src) { +- uint8_t* iop_w = *ptr_iop_w; +- size_t n = src.len; +- if (n > length) { +- n = length; ++ inline wuffs_base__empty_struct ++ update( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_xxhash64__hasher__update(this, a_x); + } +- if (n > ((size_t)(io2_w - iop_w))) { +- n = (size_t)(io2_w - iop_w); ++ ++ inline uint64_t ++ update_u64( ++ wuffs_base__slice_u8 a_x) { ++ return wuffs_xxhash64__hasher__update_u64(this, a_x); + } +- if (n > 0) { +- memmove(iop_w, src.ptr, n); +- *ptr_iop_w += n; ++ ++ inline uint64_t ++ checksum_u64() const { ++ return wuffs_xxhash64__hasher__checksum_u64(this); + } +- return (uint32_t)(n); +-} + +-static inline wuffs_base__io_buffer* // +-wuffs_base__io_writer__set(wuffs_base__io_buffer* b, +- uint8_t** ptr_iop_w, +- uint8_t** ptr_io0_w, +- uint8_t** ptr_io1_w, +- uint8_t** ptr_io2_w, +- wuffs_base__slice_u8 data, +- uint64_t history_position) { +- b->data = data; +- b->meta.wi = 0; +- b->meta.ri = 0; +- b->meta.pos = history_position; +- b->meta.closed = false; ++#endif // __cplusplus ++}; // struct wuffs_xxhash64__hasher__struct + +- *ptr_iop_w = data.ptr; +- *ptr_io0_w = data.ptr; +- *ptr_io1_w = data.ptr; +- *ptr_io2_w = data.ptr + data.len; ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- return b; +-} ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC) + +-// ---------------- I/O (Utility) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) || defined(WUFFS_NONMONOLITHIC) + +-#define wuffs_base__utility__empty_io_reader wuffs_base__empty_io_reader +-#define wuffs_base__utility__empty_io_writer wuffs_base__empty_io_writer ++// ---------------- Status Codes + +-// ---------------- Tokens ++extern const char wuffs_xz__error__bad_bcj_offset[]; ++extern const char wuffs_xz__error__bad_block_header[]; ++extern const char wuffs_xz__error__bad_checksum[]; ++extern const char wuffs_xz__error__bad_filter[]; ++extern const char wuffs_xz__error__bad_footer[]; ++extern const char wuffs_xz__error__bad_header[]; ++extern const char wuffs_xz__error__bad_header_concatenated_stream[]; ++extern const char wuffs_xz__error__bad_index[]; ++extern const char wuffs_xz__error__bad_padding[]; ++extern const char wuffs_xz__error__truncated_input[]; ++extern const char wuffs_xz__error__unsupported_checksum_algorithm[]; ++extern const char wuffs_xz__error__unsupported_filter[]; ++extern const char wuffs_xz__error__unsupported_filter_combination[]; + +-// ---------------- Tokens (Utility) ++// ---------------- Public Consts + +-// ---------------- Memory Allocation ++#define WUFFS_XZ__QUIRK_DECODE_STANDALONE_CONCATENATED_STREAMS 2021322752u + +-// ---------------- Images ++#define WUFFS_XZ__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( +- const wuffs_base__pixel_swizzler* p, +- uint32_t up_to_num_pixels, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- const uint8_t** ptr_iop_r, +- const uint8_t* io2_r); ++#define WUFFS_XZ__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- const uint8_t** ptr_iop_r, +- const uint8_t* io2_r); ++// ---------------- Struct Declarations + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- uint64_t num_pixels); ++typedef struct wuffs_xz__decoder__struct wuffs_xz__decoder; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +-wuffs_base__pixel_swizzler__swizzle_ycck( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_buffer* dst, +- wuffs_base__slice_u8 dst_palette, +- uint32_t width, +- uint32_t height, +- wuffs_base__slice_u8 src0, +- wuffs_base__slice_u8 src1, +- wuffs_base__slice_u8 src2, +- wuffs_base__slice_u8 src3, +- uint32_t width0, +- uint32_t width1, +- uint32_t width2, +- uint32_t width3, +- uint32_t height0, +- uint32_t height1, +- uint32_t height2, +- uint32_t height3, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t stride3, +- uint8_t h0, +- uint8_t h1, +- uint8_t h2, +- uint8_t h3, +- uint8_t v0, +- uint8_t v1, +- uint8_t v2, +- uint8_t v3, +- bool is_rgb_or_cmyk, +- bool triangle_filter_for_2to1, +- wuffs_base__slice_u8 scratch_buffer_2k); ++#ifdef __cplusplus ++extern "C" { ++#endif + +-// ---------------- Images (Utility) ++// ---------------- Public Initializer Prototypes + +-#define wuffs_base__utility__make_pixel_format wuffs_base__make_pixel_format ++// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self, ++// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)". ++// ++// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version. ++// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options. + +-// ---------------- String Conversions ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_xz__decoder__initialize( ++ wuffs_xz__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options); + +-// ---------------- Unicode and UTF-8 ++size_t ++sizeof__wuffs_xz__decoder(void); + +-// ---------------- ++// ---------------- Allocs + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__CORE) ++// These functions allocate and initialize Wuffs structs. They return NULL if ++// memory allocation fails. If they return non-NULL, there is no need to call ++// wuffs_foo__bar__initialize, but the caller is responsible for eventually ++// calling free on the returned pointer. That pointer is effectively a C++ ++// std::unique_ptr. + +-const uint8_t wuffs_base__low_bits_mask__u8[8] = { +- 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, +-}; ++wuffs_xz__decoder* ++wuffs_xz__decoder__alloc(void); + +-const uint16_t wuffs_base__low_bits_mask__u16[16] = { +- 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, +- 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, +-}; ++static inline wuffs_base__io_transformer* ++wuffs_xz__decoder__alloc_as__wuffs_base__io_transformer(void) { ++ return (wuffs_base__io_transformer*)(wuffs_xz__decoder__alloc()); ++} + +-const uint32_t wuffs_base__low_bits_mask__u32[32] = { +- 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, +- 0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF, +- 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 0x0001FFFF, +- 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, +- 0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF, +- 0x3FFFFFFF, 0x7FFFFFFF, +-}; ++// ---------------- Upcasts + +-const uint64_t wuffs_base__low_bits_mask__u64[64] = { +- 0x0000000000000000, 0x0000000000000001, 0x0000000000000003, +- 0x0000000000000007, 0x000000000000000F, 0x000000000000001F, +- 0x000000000000003F, 0x000000000000007F, 0x00000000000000FF, +- 0x00000000000001FF, 0x00000000000003FF, 0x00000000000007FF, +- 0x0000000000000FFF, 0x0000000000001FFF, 0x0000000000003FFF, +- 0x0000000000007FFF, 0x000000000000FFFF, 0x000000000001FFFF, +- 0x000000000003FFFF, 0x000000000007FFFF, 0x00000000000FFFFF, +- 0x00000000001FFFFF, 0x00000000003FFFFF, 0x00000000007FFFFF, +- 0x0000000000FFFFFF, 0x0000000001FFFFFF, 0x0000000003FFFFFF, +- 0x0000000007FFFFFF, 0x000000000FFFFFFF, 0x000000001FFFFFFF, +- 0x000000003FFFFFFF, 0x000000007FFFFFFF, 0x00000000FFFFFFFF, +- 0x00000001FFFFFFFF, 0x00000003FFFFFFFF, 0x00000007FFFFFFFF, +- 0x0000000FFFFFFFFF, 0x0000001FFFFFFFFF, 0x0000003FFFFFFFFF, +- 0x0000007FFFFFFFFF, 0x000000FFFFFFFFFF, 0x000001FFFFFFFFFF, +- 0x000003FFFFFFFFFF, 0x000007FFFFFFFFFF, 0x00000FFFFFFFFFFF, +- 0x00001FFFFFFFFFFF, 0x00003FFFFFFFFFFF, 0x00007FFFFFFFFFFF, +- 0x0000FFFFFFFFFFFF, 0x0001FFFFFFFFFFFF, 0x0003FFFFFFFFFFFF, +- 0x0007FFFFFFFFFFFF, 0x000FFFFFFFFFFFFF, 0x001FFFFFFFFFFFFF, +- 0x003FFFFFFFFFFFFF, 0x007FFFFFFFFFFFFF, 0x00FFFFFFFFFFFFFF, +- 0x01FFFFFFFFFFFFFF, 0x03FFFFFFFFFFFFFF, 0x07FFFFFFFFFFFFFF, +- 0x0FFFFFFFFFFFFFFF, 0x1FFFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFFF, +- 0x7FFFFFFFFFFFFFFF, +-}; ++static inline wuffs_base__io_transformer* ++wuffs_xz__decoder__upcast_as__wuffs_base__io_transformer( ++ wuffs_xz__decoder* p) { ++ return (wuffs_base__io_transformer*)p; ++} + +-const uint32_t wuffs_base__pixel_format__bits_per_channel[16] = { +- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +- 0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, +-}; ++// ---------------- Public Function Prototypes + +-const char wuffs_base__note__i_o_redirect[] = "@base: I/O redirect"; +-const char wuffs_base__note__end_of_data[] = "@base: end of data"; +-const char wuffs_base__note__metadata_reported[] = "@base: metadata reported"; +-const char wuffs_base__suspension__even_more_information[] = "$base: even more information"; +-const char wuffs_base__suspension__mispositioned_read[] = "$base: mispositioned read"; +-const char wuffs_base__suspension__mispositioned_write[] = "$base: mispositioned write"; +-const char wuffs_base__suspension__short_read[] = "$base: short read"; +-const char wuffs_base__suspension__short_write[] = "$base: short write"; +-const char wuffs_base__error__bad_i_o_position[] = "#base: bad I/O position"; +-const char wuffs_base__error__bad_argument_length_too_short[] = "#base: bad argument (length too short)"; +-const char wuffs_base__error__bad_argument[] = "#base: bad argument"; +-const char wuffs_base__error__bad_call_sequence[] = "#base: bad call sequence"; +-const char wuffs_base__error__bad_data[] = "#base: bad data"; +-const char wuffs_base__error__bad_receiver[] = "#base: bad receiver"; +-const char wuffs_base__error__bad_restart[] = "#base: bad restart"; +-const char wuffs_base__error__bad_sizeof_receiver[] = "#base: bad sizeof receiver"; +-const char wuffs_base__error__bad_vtable[] = "#base: bad vtable"; +-const char wuffs_base__error__bad_workbuf_length[] = "#base: bad workbuf length"; +-const char wuffs_base__error__bad_wuffs_version[] = "#base: bad wuffs version"; +-const char wuffs_base__error__cannot_return_a_suspension[] = "#base: cannot return a suspension"; +-const char wuffs_base__error__disabled_by_previous_error[] = "#base: disabled by previous error"; +-const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[] = "#base: initialize falsely claimed already zeroed"; +-const char wuffs_base__error__initialize_not_called[] = "#base: initialize not called"; +-const char wuffs_base__error__interleaved_coroutine_calls[] = "#base: interleaved coroutine calls"; +-const char wuffs_base__error__no_more_information[] = "#base: no more information"; +-const char wuffs_base__error__not_enough_data[] = "#base: not enough data"; +-const char wuffs_base__error__out_of_bounds[] = "#base: out of bounds"; +-const char wuffs_base__error__unsupported_image_dimension[] = "#base: unsupported image dimension"; +-const char wuffs_base__error__unsupported_method[] = "#base: unsupported method"; +-const char wuffs_base__error__unsupported_option[] = "#base: unsupported option"; +-const char wuffs_base__error__unsupported_pixel_swizzler_option[] = "#base: unsupported pixel swizzler option"; +-const char wuffs_base__error__too_much_data[] = "#base: too much data"; +- +-const char wuffs_base__hasher_u32__vtable_name[] = "{vtable}wuffs_base__hasher_u32"; +-const char wuffs_base__hasher_u64__vtable_name[] = "{vtable}wuffs_base__hasher_u64"; +-const char wuffs_base__image_decoder__vtable_name[] = "{vtable}wuffs_base__image_decoder"; +-const char wuffs_base__io_transformer__vtable_name[] = "{vtable}wuffs_base__io_transformer"; +-const char wuffs_base__token_decoder__vtable_name[] = "{vtable}wuffs_base__token_decoder"; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xz__decoder__get_quirk( ++ const wuffs_xz__decoder* self, ++ uint32_t a_key); + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__CORE) ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_xz__decoder__set_quirk( ++ wuffs_xz__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value); + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES) ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_xz__decoder__dst_history_retain_length( ++ const wuffs_xz__decoder* self); + +-// ---------------- Interface Definitions. ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_xz__decoder__workbuf_len( ++ const wuffs_xz__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_base__hasher_u32__checksum_u32( +- const wuffs_base__hasher_u32* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_xz__decoder__transform_io( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { +- const wuffs_base__hasher_u32__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->checksum_u32)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#ifdef __cplusplus ++} // extern "C" ++#endif + +- return 0; +-} ++// ---------------- Struct Definitions + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__hasher_u32__get_quirk( +- const wuffs_base__hasher_u32* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++// These structs' fields, and the sizeof them, are private implementation ++// details that aren't guaranteed to be stable across Wuffs versions. ++// ++// See https://en.wikipedia.org/wiki/Opaque_pointer#C + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { +- const wuffs_base__hasher_u32__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->get_quirk)(self, a_key); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +- return 0; +-} ++struct wuffs_xz__decoder__struct { ++ // Do not access the private_impl's or private_data's fields directly. There ++ // is no API/ABI compatibility or safety guarantee if you do so. Instead, use ++ // the wuffs_foo__bar__baz functions. ++ // ++ // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct ++ // can be stack allocated when WUFFS_IMPLEMENTATION is defined. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__hasher_u32__set_quirk( +- wuffs_base__hasher_u32* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++ struct { ++ uint32_t magic; ++ uint32_t active_coroutine; ++ wuffs_base__vtable vtable_for__wuffs_base__io_transformer; ++ wuffs_base__vtable null_vtable; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { +- const wuffs_base__hasher_u32__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_quirk)(self, a_key, a_value); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ uint32_t f_filters[3]; ++ uint32_t f_num_non_final_filters; ++ uint8_t f_checksummer; ++ bool f_ignore_checksum; ++ bool f_standalone_format; ++ bool f_lzma_needs_reset; ++ bool f_block_has_compressed_size; ++ bool f_block_has_uncompressed_size; ++ uint8_t f_bcj_undo_index; ++ uint32_t f_bcj_pos; ++ uint32_t f_bcj_x86_prev_mask; ++ uint64_t f_block_compressed_size; ++ uint64_t f_block_uncompressed_size; ++ uint64_t f_compressed_size_for_index; ++ uint32_t f_verification_have_hashed_sizes[2]; ++ uint32_t f_verification_want_hashed_sizes[2]; ++ uint64_t f_verification_have_total_sizes[2]; ++ uint64_t f_verification_want_total_sizes[2]; ++ uint64_t f_num_actual_blocks; ++ uint64_t f_num_index_blocks; ++ uint64_t f_index_block_compressed_size; ++ uint64_t f_index_block_uncompressed_size; ++ uint64_t f_backwards_size; ++ bool f_started_verify_index; ++ uint16_t f_flags; ++ ++ uint8_t (*choosy_apply_non_final_filters)( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ uint32_t p_transform_io; ++ uint32_t p_do_transform_io; ++ uint32_t p_decode_block_header_with_padding; ++ uint32_t p_decode_block_header_sans_padding; ++ uint32_t p_verify_index; ++ uint32_t p_verify_footer; ++ } private_impl; + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ struct { ++ uint8_t f_filter_data[3][256]; ++ wuffs_crc32__ieee_hasher f_crc32; ++ wuffs_crc64__ecma_hasher f_crc64; ++ wuffs_sha256__hasher f_sha256; ++ wuffs_lzma__decoder f_lzma; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_base__hasher_u32__update( +- wuffs_base__hasher_u32* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); +- } ++ struct { ++ uint32_t v_checksum32_have; ++ uint32_t v_checksum32_want; ++ wuffs_base__bitvec256 v_checksum256_have; ++ uint64_t v_compressed_size; ++ uint64_t v_uncompressed_size; ++ uint64_t scratch; ++ } s_do_transform_io; ++ struct { ++ uint64_t v_padded_size_have; ++ uint64_t v_padded_size_want; ++ } s_decode_block_header_with_padding; ++ struct { ++ uint8_t v_flags; ++ uint8_t v_filter_id; ++ uint32_t v_shift; ++ uint32_t v_f; ++ uint64_t scratch; ++ } s_decode_block_header_sans_padding; ++ struct { ++ uint32_t v_shift; ++ } s_verify_index; ++ struct { ++ uint64_t scratch; ++ } s_verify_footer; ++ } private_data; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { +- const wuffs_base__hasher_u32__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->update)(self, a_x); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#ifdef __cplusplus ++#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR) ++ using unique_ptr = std::unique_ptr; + +- return wuffs_base__make_empty_struct(); +-} ++ // On failure, the alloc_etc functions return nullptr. They don't throw. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_base__hasher_u32__update_u32( +- wuffs_base__hasher_u32* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return 0; +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; ++ static inline unique_ptr ++ alloc() { ++ return unique_ptr(wuffs_xz__decoder__alloc()); + } + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { +- const wuffs_base__hasher_u32__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->update_u32)(self, a_x); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; ++ static inline wuffs_base__io_transformer::unique_ptr ++ alloc_as__wuffs_base__io_transformer() { ++ return wuffs_base__io_transformer::unique_ptr( ++ wuffs_xz__decoder__alloc_as__wuffs_base__io_transformer()); + } ++#endif // defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +- return 0; +-} ++#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) ++ // Disallow constructing or copying an object via standard C++ mechanisms, ++ // e.g. the "new" operator, as this struct is intentionally opaque. Its total ++ // size and field layout is not part of the public, stable, memory-safe API. ++ // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and ++ // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as ++ // their first argument) rather than tweaking bar.private_impl.qux fields. ++ // ++ // In C, we can just leave wuffs_foo__bar as an incomplete type (unless ++ // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in ++ // order to provide convenience methods. These forward on "this", so that you ++ // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)". ++ wuffs_xz__decoder__struct() = delete; ++ wuffs_xz__decoder__struct(const wuffs_xz__decoder__struct&) = delete; ++ wuffs_xz__decoder__struct& operator=( ++ const wuffs_xz__decoder__struct&) = delete; ++#endif // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION) + +-// -------- ++#if !defined(WUFFS_IMPLEMENTATION) ++ // As above, the size of the struct is not part of the public API, and unless ++ // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap ++ // allocated, not stack allocated. Its size is not intended to be known at ++ // compile time, but it is unfortunately divulged as a side effect of ++ // defining C++ convenience methods. Use "sizeof__T()", calling the function, ++ // instead of "sizeof T", invoking the operator. To make the two values ++ // different, so that passing the latter will be rejected by the initialize ++ // function, we add an arbitrary amount of dead weight. ++ uint8_t dead_weight[123000000]; // 123 MB. ++#endif // !defined(WUFFS_IMPLEMENTATION) + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__hasher_u64__checksum_u64( +- const wuffs_base__hasher_u64* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++ initialize( ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options) { ++ return wuffs_xz__decoder__initialize( ++ this, sizeof_star_self, wuffs_version, options); + } + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { +- const wuffs_base__hasher_u64__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->checksum_u64)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; ++ inline wuffs_base__io_transformer* ++ upcast_as__wuffs_base__io_transformer() { ++ return (wuffs_base__io_transformer*)this; + } + +- return 0; +-} +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__hasher_u64__get_quirk( +- const wuffs_base__hasher_u64* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ inline uint64_t ++ get_quirk( ++ uint32_t a_key) const { ++ return wuffs_xz__decoder__get_quirk(this, a_key); + } + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { +- const wuffs_base__hasher_u64__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->get_quirk)(self, a_key); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; ++ inline wuffs_base__status ++ set_quirk( ++ uint32_t a_key, ++ uint64_t a_value) { ++ return wuffs_xz__decoder__set_quirk(this, a_key, a_value); + } + +- return 0; +-} +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__hasher_u64__set_quirk( +- wuffs_base__hasher_u64* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ inline wuffs_base__optional_u63 ++ dst_history_retain_length() const { ++ return wuffs_xz__decoder__dst_history_retain_length(this); + } + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { +- const wuffs_base__hasher_u64__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_quirk)(self, a_key, a_value); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; ++ inline wuffs_base__range_ii_u64 ++ workbuf_len() const { ++ return wuffs_xz__decoder__workbuf_len(this); + } + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_base__hasher_u64__update( +- wuffs_base__hasher_u64* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ inline wuffs_base__status ++ transform_io( ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ return wuffs_xz__decoder__transform_io(this, a_dst, a_src, a_workbuf); + } + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { +- const wuffs_base__hasher_u64__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->update)(self, a_x); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#endif // __cplusplus ++}; // struct wuffs_xz__decoder__struct + +- return wuffs_base__make_empty_struct(); +-} ++#endif // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION) + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__hasher_u64__update_u64( +- wuffs_base__hasher_u64* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return 0; +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; +- } ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) || defined(WUFFS_NONMONOLITHIC) + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { +- const wuffs_base__hasher_u64__func_ptrs* func_ptrs = +- (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->update_u64)(self, a_x); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +- return 0; +-} ++// ---------------- Auxiliary - Base + +-// -------- ++// Auxiliary code is discussed at ++// https://github.com/google/wuffs/blob/main/doc/note/auxiliary-code.md + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__decode_frame( +- wuffs_base__image_decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++#include + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->decode_frame)(self, a_dst, a_src, a_blend, a_workbuf, a_opts); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++#include ++#include + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++namespace wuffs_aux { + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__decode_frame_config( +- wuffs_base__image_decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++using IOBuffer = wuffs_base__io_buffer; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->decode_frame_config)(self, a_dst, a_src); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++// MemOwner represents ownership of some memory. Dynamically allocated memory ++// (e.g. from malloc or new) is typically paired with free or delete, invoked ++// when the std::unique_ptr is destroyed. Statically allocated memory might use ++// MemOwner(nullptr, &free), even if that statically allocated memory is not ++// nullptr, since calling free(nullptr) is a no-op. ++using MemOwner = std::unique_ptr; + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++using QuirkKeyValuePair = std::pair; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__decode_image_config( +- wuffs_base__image_decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++namespace sync_io { + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->decode_image_config)(self, a_dst, a_src); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++// -------- + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++// DynIOBuffer is an IOBuffer that is backed by a dynamically sized byte array. ++// It owns that backing array and will free it in its destructor. ++// ++// The array size can be explicitly extended (by calling the grow method) but, ++// unlike a C++ std::vector, there is no implicit extension (e.g. by calling ++// std::vector::insert) and its maximum size is capped by the max_incl ++// constructor argument. ++// ++// It contains an IOBuffer-typed field whose reader side provides access to ++// previously written bytes and whose writer side provides access to the ++// allocated but not-yet-written-to slack space. For Go programmers, this slack ++// space is roughly analogous to the s[len(s):cap(s)] space of a slice s. ++class DynIOBuffer { ++ public: ++ enum GrowResult { ++ OK = 0, ++ FailedMaxInclExceeded = 1, ++ FailedOutOfMemory = 2, ++ }; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_base__image_decoder__frame_dirty_rect( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } ++ // m_buf holds the dynamically sized byte array and its read/write indexes: ++ // - m_buf.meta.wi is roughly analogous to a Go slice's length. ++ // - m_buf.data.len is roughly analogous to a Go slice's capacity. It is ++ // also equal to the m_buf.data.ptr malloc/realloc size. ++ // ++ // Users should not modify the m_buf.data.ptr or m_buf.data.len fields (as ++ // they are conceptually private to this class), but they can modify the ++ // bytes referenced by that pointer-length pair (e.g. compactions). ++ IOBuffer m_buf; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->frame_dirty_rect)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // m_max_incl is an inclusive upper bound on the backing array size. ++ const uint64_t m_max_incl; + +- return wuffs_base__utility__empty_rect_ie_u32(); +-} ++ // Constructor and destructor. ++ explicit DynIOBuffer(uint64_t max_incl); ++ ~DynIOBuffer(); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__image_decoder__get_quirk( +- const wuffs_base__image_decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ // Drop frees the byte array and resets m_buf. The DynIOBuffer can still be ++ // used after a drop call. It just restarts from zero. ++ void drop(); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->get_quirk)(self, a_key); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // grow ensures that the byte array size is at least min_incl and at most ++ // max_incl. It returns FailedMaxInclExceeded if that would require ++ // allocating more than max_incl bytes, including the case where (min_incl > ++ // max_incl). It returns FailedOutOfMemory if memory allocation failed. ++ GrowResult grow(uint64_t min_incl); + +- return 0; +-} ++ private: ++ // Delete the copy and assign constructors. ++ DynIOBuffer(const DynIOBuffer&) = delete; ++ DynIOBuffer& operator=(const DynIOBuffer&) = delete; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__image_decoder__history_retain_length( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ static uint64_t round_up(uint64_t min_incl, uint64_t max_incl); ++}; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->history_retain_length)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++// -------- + +- return 0; +-} ++class Input { ++ public: ++ virtual ~Input(); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_base__image_decoder__num_animation_loops( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ virtual IOBuffer* BringsItsOwnIOBuffer(); ++ virtual std::string CopyIn(IOBuffer* dst) = 0; ++}; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->num_animation_loops)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++// -------- + +- return 0; +-} ++// FileInput is an Input that reads from a file source. ++// ++// It does not take responsibility for closing the file when done. ++class FileInput : public Input { ++ public: ++ FileInput(FILE* f); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__image_decoder__num_decoded_frame_configs( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ virtual std::string CopyIn(IOBuffer* dst); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->num_decoded_frame_configs)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ private: ++ FILE* m_f; + +- return 0; +-} ++ // Delete the copy and assign constructors. ++ FileInput(const FileInput&) = delete; ++ FileInput& operator=(const FileInput&) = delete; ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__image_decoder__num_decoded_frames( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++// -------- + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->num_decoded_frames)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++// MemoryInput is an Input that reads from an in-memory source. ++// ++// It does not take responsibility for freeing the memory when done. ++class MemoryInput : public Input { ++ public: ++ MemoryInput(const char* ptr, size_t len); ++ MemoryInput(const uint8_t* ptr, size_t len); + +- return 0; +-} ++ virtual IOBuffer* BringsItsOwnIOBuffer(); ++ virtual std::string CopyIn(IOBuffer* dst); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__restart_frame( +- wuffs_base__image_decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++ private: ++ IOBuffer m_io; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->restart_frame)(self, a_index, a_io_position); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // Delete the copy and assign constructors. ++ MemoryInput(const MemoryInput&) = delete; ++ MemoryInput& operator=(const MemoryInput&) = delete; ++}; + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++// -------- + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__set_quirk( +- wuffs_base__image_decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++} // namespace sync_io + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_quirk)(self, a_key, a_value); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++} // namespace wuffs_aux + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++// ---------------- Auxiliary - CBOR + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_base__image_decoder__set_report_metadata( +- wuffs_base__image_decoder* self, +- uint32_t a_fourcc, +- bool a_report) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); +- } ++namespace wuffs_aux { + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_report_metadata)(self, a_fourcc, a_report); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++struct DecodeCborResult { ++ DecodeCborResult(std::string&& error_message0, uint64_t cursor_position0); + +- return wuffs_base__make_empty_struct(); +-} ++ std::string error_message; ++ uint64_t cursor_position; ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__image_decoder__tell_me_more( +- wuffs_base__image_decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++class DecodeCborCallbacks { ++ public: ++ virtual ~DecodeCborCallbacks(); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->tell_me_more)(self, a_dst, a_minfo, a_src); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // AppendXxx are called for leaf nodes: literals, numbers, strings, etc. + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ virtual std::string AppendNull() = 0; ++ virtual std::string AppendUndefined() = 0; ++ virtual std::string AppendBool(bool val) = 0; ++ virtual std::string AppendF64(double val) = 0; ++ virtual std::string AppendI64(int64_t val) = 0; ++ virtual std::string AppendU64(uint64_t val) = 0; ++ virtual std::string AppendByteString(std::string&& val) = 0; ++ virtual std::string AppendTextString(std::string&& val) = 0; ++ virtual std::string AppendMinus1MinusX(uint64_t val) = 0; ++ virtual std::string AppendCborSimpleValue(uint8_t val) = 0; ++ virtual std::string AppendCborTag(uint64_t val) = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_base__image_decoder__workbuf_len( +- const wuffs_base__image_decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } ++ // Push and Pop are called for container nodes: CBOR arrays (lists) and CBOR ++ // maps (dictionaries). ++ // ++ // The flags bits combine exactly one of: ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT ++ // and exactly one of: ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { +- const wuffs_base__image_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->workbuf_len)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ virtual std::string Push(uint32_t flags) = 0; ++ virtual std::string Pop(uint32_t flags) = 0; + +- return wuffs_base__utility__empty_range_ii_u64(); +-} ++ // Done is always the last Callback method called by DecodeCbor, whether or ++ // not parsing the input as CBOR encountered an error. Even when successful, ++ // trailing data may remain in input and buffer. ++ // ++ // Do not keep a reference to buffer or buffer.data.ptr after Done returns, ++ // as DecodeCbor may then de-allocate the backing array. ++ // ++ // The default Done implementation is a no-op. ++ virtual void // ++ Done(DecodeCborResult& result, sync_io::Input& input, IOBuffer& buffer); ++}; + +-// -------- ++// The FooArgBar types add structure to Foo's optional arguments. They wrap ++// inner representations for several reasons: ++// - It provides a home for the DefaultValue static method, for Foo callers ++// that want to override some but not all optional arguments. ++// - It provides the "Bar" name at Foo call sites, which can help self- ++// document Foo calls with many arguemnts. ++// - It provides some type safety against accidentally transposing or omitting ++// adjacent fundamentally-numeric-typed optional arguments. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__io_transformer__get_quirk( +- const wuffs_base__io_transformer* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++// DecodeCborArgQuirks wraps an optional argument to DecodeCbor. ++struct DecodeCborArgQuirks { ++ explicit DecodeCborArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { +- const wuffs_base__io_transformer__func_ptrs* func_ptrs = +- (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->get_quirk)(self, a_key); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // DefaultValue returns an empty slice. ++ static DecodeCborArgQuirks DefaultValue(); + +- return 0; +-} ++ const QuirkKeyValuePair* ptr; ++ const size_t len; ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__io_transformer__history_retain_length( +- const wuffs_base__io_transformer* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++// DecodeCbor calls callbacks based on the CBOR-formatted data in input. ++// ++// On success, the returned error_message is empty and cursor_position counts ++// the number of bytes consumed. On failure, error_message is non-empty and ++// cursor_position is the location of the error. That error may be a content ++// error (invalid CBOR) or an input error (e.g. network failure). ++DecodeCborResult // ++DecodeCbor(DecodeCborCallbacks& callbacks, ++ sync_io::Input& input, ++ DecodeCborArgQuirks quirks = DecodeCborArgQuirks::DefaultValue()); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { +- const wuffs_base__io_transformer__func_ptrs* func_ptrs = +- (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->history_retain_length)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++} // namespace wuffs_aux + +- return 0; +-} ++// ---------------- Auxiliary - Image + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__io_transformer__set_quirk( +- wuffs_base__io_transformer* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++namespace wuffs_aux { + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { +- const wuffs_base__io_transformer__func_ptrs* func_ptrs = +- (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_quirk)(self, a_key, a_value); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++struct DecodeImageResult { ++ DecodeImageResult(MemOwner&& pixbuf_mem_owner0, ++ wuffs_base__pixel_buffer pixbuf0, ++ std::string&& error_message0); ++ DecodeImageResult(std::string&& error_message0); + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ MemOwner pixbuf_mem_owner; ++ wuffs_base__pixel_buffer pixbuf; ++ std::string error_message; ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__io_transformer__transform_io( +- wuffs_base__io_transformer* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++// DecodeImageCallbacks are the callbacks given to DecodeImage. They are always ++// called in this order: ++// 1. SelectDecoder ++// 2. HandleMetadata ++// 3. SelectPixfmt ++// 4. AllocPixbuf ++// 5. AllocWorkbuf ++// 6. Done ++// ++// It may return early - the third callback might not be invoked if the second ++// one fails - but the final callback (Done) is always invoked. ++class DecodeImageCallbacks { ++ public: ++ // AllocPixbufResult holds a memory allocation (the result of malloc or new, ++ // a statically allocated pointer, etc), or an error message. The memory is ++ // de-allocated when mem_owner goes out of scope and is destroyed. ++ struct AllocPixbufResult { ++ AllocPixbufResult(MemOwner&& mem_owner0, wuffs_base__pixel_buffer pixbuf0); ++ AllocPixbufResult(std::string&& error_message0); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { +- const wuffs_base__io_transformer__func_ptrs* func_ptrs = +- (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->transform_io)(self, a_dst, a_src, a_workbuf); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ MemOwner mem_owner; ++ wuffs_base__pixel_buffer pixbuf; ++ std::string error_message; ++ }; + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ // AllocWorkbufResult holds a memory allocation (the result of malloc or new, ++ // a statically allocated pointer, etc), or an error message. The memory is ++ // de-allocated when mem_owner goes out of scope and is destroyed. ++ struct AllocWorkbufResult { ++ AllocWorkbufResult(MemOwner&& mem_owner0, wuffs_base__slice_u8 workbuf0); ++ AllocWorkbufResult(std::string&& error_message0); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_base__io_transformer__workbuf_len( +- const wuffs_base__io_transformer* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } ++ MemOwner mem_owner; ++ wuffs_base__slice_u8 workbuf; ++ std::string error_message; ++ }; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { +- const wuffs_base__io_transformer__func_ptrs* func_ptrs = +- (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->workbuf_len)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ virtual ~DecodeImageCallbacks(); + +- return wuffs_base__utility__empty_range_ii_u64(); +-} ++ // SelectDecoder returns the image decoder for the input data's file format. ++ // Returning a nullptr means failure (DecodeImage_UnsupportedImageFormat). ++ // ++ // Common formats will have a FourCC value in the range [1 ..= 0x7FFF_FFFF], ++ // such as WUFFS_BASE__FOURCC__JPEG. A zero FourCC value means that Wuffs' ++ // standard library did not recognize the image format but if SelectDecoder ++ // was overridden, it may examine the input data's starting bytes and still ++ // provide its own image decoder, e.g. for an exotic image file format that's ++ // not in Wuffs' standard library. The prefix_etc fields have the same ++ // meaning as wuffs_base__magic_number_guess_fourcc arguments. SelectDecoder ++ // implementations should not modify prefix_data's contents. ++ // ++ // SelectDecoder might be called more than once, since some image file ++ // formats can wrap others. For example, a nominal BMP file can actually ++ // contain a JPEG or a PNG. ++ // ++ // The default SelectDecoder accepts the FOURCC codes listed below. For ++ // modular builds (i.e. when #define'ing WUFFS_CONFIG__MODULES), acceptance ++ // of the ETC file format is optional (for each value of ETC) and depends on ++ // the corresponding module to be enabled at compile time (i.e. #define'ing ++ // WUFFS_CONFIG__MODULE__ETC). ++ // - WUFFS_BASE__FOURCC__BMP ++ // - WUFFS_BASE__FOURCC__GIF ++ // - WUFFS_BASE__FOURCC__JPEG ++ // - WUFFS_BASE__FOURCC__NIE ++ // - WUFFS_BASE__FOURCC__NPBM ++ // - WUFFS_BASE__FOURCC__PNG ++ // - WUFFS_BASE__FOURCC__QOI ++ // - WUFFS_BASE__FOURCC__TGA ++ // - WUFFS_BASE__FOURCC__WBMP ++ // - WUFFS_BASE__FOURCC__WEBP ++ virtual wuffs_base__image_decoder::unique_ptr // ++ SelectDecoder(uint32_t fourcc, ++ wuffs_base__slice_u8 prefix_data, ++ bool prefix_closed); + +-// -------- ++ // HandleMetadata acknowledges image metadata. minfo.flavor will be one of: ++ // - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH ++ // - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED ++ // If it is ETC__METADATA_RAW_ETC then raw contains the metadata bytes. Those ++ // bytes should not be retained beyond the the HandleMetadata call. ++ // ++ // minfo.metadata__fourcc() will typically match one of the ++ // DecodeImageArgFlags bits. For example, if (REPORT_METADATA_CHRM | ++ // REPORT_METADATA_GAMA) was passed to DecodeImage then the metadata FourCC ++ // will be either WUFFS_BASE__FOURCC__CHRM or WUFFS_BASE__FOURCC__GAMA. ++ // ++ // It returns an error message, or an empty string on success. ++ virtual std::string // ++ HandleMetadata(const wuffs_base__more_information& minfo, ++ wuffs_base__slice_u8 raw); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__token_decoder__decode_tokens( +- wuffs_base__token_decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++ // SelectPixfmt returns the destination pixel format for AllocPixbuf. It ++ // should return wuffs_base__make_pixel_format(etc) called with one of: ++ // - WUFFS_BASE__PIXEL_FORMAT__BGR_565 ++ // - WUFFS_BASE__PIXEL_FORMAT__BGR ++ // - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL ++ // - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE ++ // - WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL ++ // - WUFFS_BASE__PIXEL_FORMAT__RGB ++ // - WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL ++ // - WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL ++ // or return image_config.pixcfg.pixel_format(). The latter means to use the ++ // image file's natural pixel format. For example, GIF images' natural pixel ++ // format is an indexed one. ++ // ++ // Returning otherwise means failure (DecodeImage_UnsupportedPixelFormat). ++ // ++ // The default SelectPixfmt implementation returns ++ // wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL) which ++ // is 4 bytes per pixel (8 bits per channel × 4 channels). ++ virtual wuffs_base__pixel_format // ++ SelectPixfmt(const wuffs_base__image_config& image_config); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { +- const wuffs_base__token_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->decode_tokens)(self, a_dst, a_src, a_workbuf); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // AllocPixbuf allocates the pixel buffer. ++ // ++ // allow_uninitialized_memory will be true if a valid background_color was ++ // passed to DecodeImage, since the pixel buffer's contents will be ++ // overwritten with that color after AllocPixbuf returns. ++ // ++ // The default AllocPixbuf implementation allocates either uninitialized or ++ // zeroed memory. Zeroed memory typically corresponds to filling with opaque ++ // black or transparent black, depending on the pixel format. ++ virtual AllocPixbufResult // ++ AllocPixbuf(const wuffs_base__image_config& image_config, ++ bool allow_uninitialized_memory); + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ // AllocWorkbuf allocates the work buffer. The allocated buffer's length ++ // should be at least len_range.min_incl, but larger allocations (up to ++ // len_range.max_incl) may have better performance (by using more memory). ++ // ++ // The default AllocWorkbuf implementation allocates len_range.max_incl bytes ++ // of either uninitialized or zeroed memory. ++ virtual AllocWorkbufResult // ++ AllocWorkbuf(wuffs_base__range_ii_u64 len_range, ++ bool allow_uninitialized_memory); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__token_decoder__get_quirk( +- const wuffs_base__token_decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ // Done is always the last Callback method called by DecodeImage, whether or ++ // not parsing the input encountered an error. Even when successful, trailing ++ // data may remain in input and buffer. ++ // ++ // The image_decoder is the one returned by SelectDecoder (if SelectDecoder ++ // was successful), or a no-op unique_ptr otherwise. Like any unique_ptr, ++ // ownership moves to the Done implementation. ++ // ++ // Do not keep a reference to buffer or buffer.data.ptr after Done returns, ++ // as DecodeImage may then de-allocate the backing array. ++ // ++ // The default Done implementation is a no-op, other than running the ++ // image_decoder unique_ptr destructor. ++ virtual void // ++ Done(DecodeImageResult& result, ++ sync_io::Input& input, ++ IOBuffer& buffer, ++ wuffs_base__image_decoder::unique_ptr image_decoder); ++}; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { +- const wuffs_base__token_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->get_quirk)(self, a_key); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++extern const char DecodeImage_BufferIsTooShort[]; ++extern const char DecodeImage_MaxInclDimensionExceeded[]; ++extern const char DecodeImage_MaxInclMetadataLengthExceeded[]; ++extern const char DecodeImage_OutOfMemory[]; ++extern const char DecodeImage_UnexpectedEndOfFile[]; ++extern const char DecodeImage_UnsupportedImageFormat[]; ++extern const char DecodeImage_UnsupportedMetadata[]; ++extern const char DecodeImage_UnsupportedPixelBlend[]; ++extern const char DecodeImage_UnsupportedPixelConfiguration[]; ++extern const char DecodeImage_UnsupportedPixelFormat[]; + +- return 0; +-} ++// The FooArgBar types add structure to Foo's optional arguments. They wrap ++// inner representations for several reasons: ++// - It provides a home for the DefaultValue static method, for Foo callers ++// that want to override some but not all optional arguments. ++// - It provides the "Bar" name at Foo call sites, which can help self- ++// document Foo calls with many arguemnts. ++// - It provides some type safety against accidentally transposing or omitting ++// adjacent fundamentally-numeric-typed optional arguments. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_base__token_decoder__history_retain_length( +- const wuffs_base__token_decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++// DecodeImageArgQuirks wraps an optional argument to DecodeImage. ++struct DecodeImageArgQuirks { ++ explicit DecodeImageArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { +- const wuffs_base__token_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->history_retain_length)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // DefaultValue returns an empty slice. ++ static DecodeImageArgQuirks DefaultValue(); + +- return 0; +-} ++ const QuirkKeyValuePair* ptr; ++ const size_t len; ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_base__token_decoder__set_quirk( +- wuffs_base__token_decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++// DecodeImageArgFlags wraps an optional argument to DecodeImage. ++struct DecodeImageArgFlags { ++ explicit DecodeImageArgFlags(uint64_t repr0); + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { +- const wuffs_base__token_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->set_quirk)(self, a_key, a_value); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ // DefaultValue returns 0. ++ static DecodeImageArgFlags DefaultValue(); + +- return wuffs_base__make_status(wuffs_base__error__bad_vtable); +-} ++ // TODO: support all of the REPORT_METADATA_ETC flags, not just CHRM, EXIF, ++ // GAMA, ICCP, KVP, SRGB and XMP. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_base__token_decoder__workbuf_len( +- const wuffs_base__token_decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } ++ // Background Color. ++ static constexpr uint64_t REPORT_METADATA_BGCL = 0x0001; ++ // Primary Chromaticities and White Point. ++ static constexpr uint64_t REPORT_METADATA_CHRM = 0x0002; ++ // Exchangeable Image File Format. ++ static constexpr uint64_t REPORT_METADATA_EXIF = 0x0004; ++ // Gamma Correction. ++ static constexpr uint64_t REPORT_METADATA_GAMA = 0x0008; ++ // International Color Consortium Profile. ++ static constexpr uint64_t REPORT_METADATA_ICCP = 0x0010; ++ // Key-Value Pair. ++ // ++ // For PNG files, this includes iTXt, tEXt and zTXt chunks. In the ++ // HandleMetadata callback, the raw argument contains UTF-8 strings. ++ static constexpr uint64_t REPORT_METADATA_KVP = 0x0020; ++ // Modification Time. ++ static constexpr uint64_t REPORT_METADATA_MTIM = 0x0040; ++ // Offset (2-Dimensional). ++ static constexpr uint64_t REPORT_METADATA_OFS2 = 0x0080; ++ // Physical Dimensions. ++ static constexpr uint64_t REPORT_METADATA_PHYD = 0x0100; ++ // Standard Red Green Blue (Rendering Intent). ++ static constexpr uint64_t REPORT_METADATA_SRGB = 0x0200; ++ // Extensible Metadata Platform. ++ static constexpr uint64_t REPORT_METADATA_XMP = 0x0400; + +- const wuffs_base__vtable* v = &self->private_impl.first_vtable; +- int i; +- for (i = 0; i < 63; i++) { +- if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { +- const wuffs_base__token_decoder__func_ptrs* func_ptrs = +- (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); +- return (*func_ptrs->workbuf_len)(self); +- } else if (v->vtable_name == NULL) { +- break; +- } +- v++; +- } ++ uint64_t repr; ++}; + +- return wuffs_base__utility__empty_range_ii_u64(); +-} ++// DecodeImageArgPixelBlend wraps an optional argument to DecodeImage. ++struct DecodeImageArgPixelBlend { ++ explicit DecodeImageArgPixelBlend(wuffs_base__pixel_blend repr0); + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES) ++ // DefaultValue returns WUFFS_BASE__PIXEL_BLEND__SRC. ++ static DecodeImageArgPixelBlend DefaultValue(); + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV) ++ wuffs_base__pixel_blend repr; ++}; + +-// ---------------- IEEE 754 Floating Point ++// DecodeImageArgBackgroundColor wraps an optional argument to DecodeImage. ++struct DecodeImageArgBackgroundColor { ++ explicit DecodeImageArgBackgroundColor( ++ wuffs_base__color_u32_argb_premul repr0); + +-// The etc__hpd_left_shift and etc__powers_of_5 tables were printed by +-// script/print-hpd-left-shift.go. That script has an optional -comments flag, +-// whose output is not copied here, which prints further detail. +-// +-// These tables are used in +-// wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits. ++ // DefaultValue returns 1, an invalid wuffs_base__color_u32_argb_premul. ++ static DecodeImageArgBackgroundColor DefaultValue(); ++ ++ wuffs_base__color_u32_argb_premul repr; ++}; ++ ++// DecodeImageArgMaxInclDimension wraps an optional argument to DecodeImage. ++struct DecodeImageArgMaxInclDimension { ++ explicit DecodeImageArgMaxInclDimension(uint32_t repr0); ++ ++ // DefaultValue returns 1048575 = 0x000F_FFFF, more than 1 million pixels. ++ static DecodeImageArgMaxInclDimension DefaultValue(); ++ ++ uint32_t repr; ++}; ++ ++// DecodeImageArgMaxInclMetadataLength wraps an optional argument to ++// DecodeImage. ++struct DecodeImageArgMaxInclMetadataLength { ++ explicit DecodeImageArgMaxInclMetadataLength(uint64_t repr0); ++ ++ // DefaultValue returns 16777215 = 0x00FF_FFFF, one less than 16 MiB. ++ static DecodeImageArgMaxInclMetadataLength DefaultValue(); ++ ++ uint64_t repr; ++}; + +-// wuffs_base__private_implementation__hpd_left_shift[i] encodes the number of +-// new digits created after multiplying a positive integer by (1 << i): the +-// additional length in the decimal representation. For example, shifting "234" +-// by 3 (equivalent to multiplying by 8) will produce "1872". Going from a +-// 3-length string to a 4-length string means that 1 new digit was added (and +-// existing digits may have changed). ++// DecodeImage decodes the image data in input. A variety of image file formats ++// can be decoded, depending on what callbacks.SelectDecoder returns. + // +-// Shifting by i can add either N or N-1 new digits, depending on whether the +-// original positive integer compares >= or < to the i'th power of 5 (as 10 +-// equals 2 * 5). Comparison is lexicographic, not numerical. ++// For animated formats, only the first frame is returned, since the API is ++// simpler for synchronous I/O and having DecodeImage only return when ++// completely done, but rendering animation often involves handling other ++// events in between animation frames. To decode multiple frames of animated ++// images, or for asynchronous I/O (e.g. when decoding an image streamed over ++// the network), use Wuffs' lower level C API instead of its higher level, ++// simplified C++ API (the wuffs_aux API). + // +-// For example, shifting by 4 (i.e. multiplying by 16) can add 1 or 2 new +-// digits, depending on a lexicographic comparison to (5 ** 4), i.e. "625": +-// - ("1" << 4) is "16", which adds 1 new digit. +-// - ("5678" << 4) is "90848", which adds 1 new digit. +-// - ("624" << 4) is "9984", which adds 1 new digit. +-// - ("62498" << 4) is "999968", which adds 1 new digit. +-// - ("625" << 4) is "10000", which adds 2 new digits. +-// - ("625001" << 4) is "10000016", which adds 2 new digits. +-// - ("7008" << 4) is "112128", which adds 2 new digits. +-// - ("99" << 4) is "1584", which adds 2 new digits. ++// The DecodeImageResult's fields depend on whether decoding succeeded: ++// - On total success, the error_message is empty and pixbuf.pixcfg.is_valid() ++// is true. ++// - On partial success (e.g. the input file was truncated but we are still ++// able to decode some of the pixels), error_message is non-empty but ++// pixbuf.pixcfg.is_valid() is still true. It is up to the caller whether to ++// accept or reject partial success. ++// - On failure, the error_message is non_empty and pixbuf.pixcfg.is_valid() ++// is false. + // +-// Thus, when i is 4, N is 2 and (5 ** i) is "625". This etc__hpd_left_shift +-// array encodes this as: +-// - etc__hpd_left_shift[4] is 0x1006 = (2 << 11) | 0x0006. +-// - etc__hpd_left_shift[5] is 0x1009 = (? << 11) | 0x0009. +-// where the ? isn't relevant for i == 4. ++// The callbacks allocate the pixel buffer memory and work buffer memory. On ++// success, pixel buffer memory ownership is passed to the DecodeImage caller ++// as the returned pixbuf_mem_owner. Regardless of success or failure, the work ++// buffer memory is deleted. + // +-// The high 5 bits of etc__hpd_left_shift[i] is N, the higher of the two +-// possible number of new digits. The low 11 bits are an offset into the +-// etc__powers_of_5 array (of length 0x051C, so offsets fit in 11 bits). When i +-// is 4, its offset and the next one is 6 and 9, and etc__powers_of_5[6 .. 9] +-// is the string "\x06\x02\x05", so the relevant power of 5 is "625". ++// The pixel_blend (one of the constants listed below) determines how to ++// composite the decoded image over the pixel buffer's original pixels (as ++// returned by callbacks.AllocPixbuf): ++// - WUFFS_BASE__PIXEL_BLEND__SRC ++// - WUFFS_BASE__PIXEL_BLEND__SRC_OVER + // +-// Thanks to Ken Thompson for the original idea. +-static const uint16_t wuffs_base__private_implementation__hpd_left_shift[65] = { +- 0x0000, 0x0800, 0x0801, 0x0803, 0x1006, 0x1009, 0x100D, 0x1812, 0x1817, +- 0x181D, 0x2024, 0x202B, 0x2033, 0x203C, 0x2846, 0x2850, 0x285B, 0x3067, +- 0x3073, 0x3080, 0x388E, 0x389C, 0x38AB, 0x38BB, 0x40CC, 0x40DD, 0x40EF, +- 0x4902, 0x4915, 0x4929, 0x513E, 0x5153, 0x5169, 0x5180, 0x5998, 0x59B0, +- 0x59C9, 0x61E3, 0x61FD, 0x6218, 0x6A34, 0x6A50, 0x6A6D, 0x6A8B, 0x72AA, +- 0x72C9, 0x72E9, 0x7B0A, 0x7B2B, 0x7B4D, 0x8370, 0x8393, 0x83B7, 0x83DC, +- 0x8C02, 0x8C28, 0x8C4F, 0x9477, 0x949F, 0x94C8, 0x9CF2, 0x051C, 0x051C, +- 0x051C, 0x051C, +-}; +- +-// wuffs_base__private_implementation__powers_of_5 contains the powers of 5, +-// concatenated together: "5", "25", "125", "625", "3125", etc. +-static const uint8_t wuffs_base__private_implementation__powers_of_5[0x051C] = { +- 5, 2, 5, 1, 2, 5, 6, 2, 5, 3, 1, 2, 5, 1, 5, 6, 2, 5, 7, 8, 1, 2, 5, 3, 9, +- 0, 6, 2, 5, 1, 9, 5, 3, 1, 2, 5, 9, 7, 6, 5, 6, 2, 5, 4, 8, 8, 2, 8, 1, 2, +- 5, 2, 4, 4, 1, 4, 0, 6, 2, 5, 1, 2, 2, 0, 7, 0, 3, 1, 2, 5, 6, 1, 0, 3, 5, +- 1, 5, 6, 2, 5, 3, 0, 5, 1, 7, 5, 7, 8, 1, 2, 5, 1, 5, 2, 5, 8, 7, 8, 9, 0, +- 6, 2, 5, 7, 6, 2, 9, 3, 9, 4, 5, 3, 1, 2, 5, 3, 8, 1, 4, 6, 9, 7, 2, 6, 5, +- 6, 2, 5, 1, 9, 0, 7, 3, 4, 8, 6, 3, 2, 8, 1, 2, 5, 9, 5, 3, 6, 7, 4, 3, 1, +- 6, 4, 0, 6, 2, 5, 4, 7, 6, 8, 3, 7, 1, 5, 8, 2, 0, 3, 1, 2, 5, 2, 3, 8, 4, +- 1, 8, 5, 7, 9, 1, 0, 1, 5, 6, 2, 5, 1, 1, 9, 2, 0, 9, 2, 8, 9, 5, 5, 0, 7, +- 8, 1, 2, 5, 5, 9, 6, 0, 4, 6, 4, 4, 7, 7, 5, 3, 9, 0, 6, 2, 5, 2, 9, 8, 0, +- 2, 3, 2, 2, 3, 8, 7, 6, 9, 5, 3, 1, 2, 5, 1, 4, 9, 0, 1, 1, 6, 1, 1, 9, 3, +- 8, 4, 7, 6, 5, 6, 2, 5, 7, 4, 5, 0, 5, 8, 0, 5, 9, 6, 9, 2, 3, 8, 2, 8, 1, +- 2, 5, 3, 7, 2, 5, 2, 9, 0, 2, 9, 8, 4, 6, 1, 9, 1, 4, 0, 6, 2, 5, 1, 8, 6, +- 2, 6, 4, 5, 1, 4, 9, 2, 3, 0, 9, 5, 7, 0, 3, 1, 2, 5, 9, 3, 1, 3, 2, 2, 5, +- 7, 4, 6, 1, 5, 4, 7, 8, 5, 1, 5, 6, 2, 5, 4, 6, 5, 6, 6, 1, 2, 8, 7, 3, 0, +- 7, 7, 3, 9, 2, 5, 7, 8, 1, 2, 5, 2, 3, 2, 8, 3, 0, 6, 4, 3, 6, 5, 3, 8, 6, +- 9, 6, 2, 8, 9, 0, 6, 2, 5, 1, 1, 6, 4, 1, 5, 3, 2, 1, 8, 2, 6, 9, 3, 4, 8, +- 1, 4, 4, 5, 3, 1, 2, 5, 5, 8, 2, 0, 7, 6, 6, 0, 9, 1, 3, 4, 6, 7, 4, 0, 7, +- 2, 2, 6, 5, 6, 2, 5, 2, 9, 1, 0, 3, 8, 3, 0, 4, 5, 6, 7, 3, 3, 7, 0, 3, 6, +- 1, 3, 2, 8, 1, 2, 5, 1, 4, 5, 5, 1, 9, 1, 5, 2, 2, 8, 3, 6, 6, 8, 5, 1, 8, +- 0, 6, 6, 4, 0, 6, 2, 5, 7, 2, 7, 5, 9, 5, 7, 6, 1, 4, 1, 8, 3, 4, 2, 5, 9, +- 0, 3, 3, 2, 0, 3, 1, 2, 5, 3, 6, 3, 7, 9, 7, 8, 8, 0, 7, 0, 9, 1, 7, 1, 2, +- 9, 5, 1, 6, 6, 0, 1, 5, 6, 2, 5, 1, 8, 1, 8, 9, 8, 9, 4, 0, 3, 5, 4, 5, 8, +- 5, 6, 4, 7, 5, 8, 3, 0, 0, 7, 8, 1, 2, 5, 9, 0, 9, 4, 9, 4, 7, 0, 1, 7, 7, +- 2, 9, 2, 8, 2, 3, 7, 9, 1, 5, 0, 3, 9, 0, 6, 2, 5, 4, 5, 4, 7, 4, 7, 3, 5, +- 0, 8, 8, 6, 4, 6, 4, 1, 1, 8, 9, 5, 7, 5, 1, 9, 5, 3, 1, 2, 5, 2, 2, 7, 3, +- 7, 3, 6, 7, 5, 4, 4, 3, 2, 3, 2, 0, 5, 9, 4, 7, 8, 7, 5, 9, 7, 6, 5, 6, 2, +- 5, 1, 1, 3, 6, 8, 6, 8, 3, 7, 7, 2, 1, 6, 1, 6, 0, 2, 9, 7, 3, 9, 3, 7, 9, +- 8, 8, 2, 8, 1, 2, 5, 5, 6, 8, 4, 3, 4, 1, 8, 8, 6, 0, 8, 0, 8, 0, 1, 4, 8, +- 6, 9, 6, 8, 9, 9, 4, 1, 4, 0, 6, 2, 5, 2, 8, 4, 2, 1, 7, 0, 9, 4, 3, 0, 4, +- 0, 4, 0, 0, 7, 4, 3, 4, 8, 4, 4, 9, 7, 0, 7, 0, 3, 1, 2, 5, 1, 4, 2, 1, 0, +- 8, 5, 4, 7, 1, 5, 2, 0, 2, 0, 0, 3, 7, 1, 7, 4, 2, 2, 4, 8, 5, 3, 5, 1, 5, +- 6, 2, 5, 7, 1, 0, 5, 4, 2, 7, 3, 5, 7, 6, 0, 1, 0, 0, 1, 8, 5, 8, 7, 1, 1, +- 2, 4, 2, 6, 7, 5, 7, 8, 1, 2, 5, 3, 5, 5, 2, 7, 1, 3, 6, 7, 8, 8, 0, 0, 5, +- 0, 0, 9, 2, 9, 3, 5, 5, 6, 2, 1, 3, 3, 7, 8, 9, 0, 6, 2, 5, 1, 7, 7, 6, 3, +- 5, 6, 8, 3, 9, 4, 0, 0, 2, 5, 0, 4, 6, 4, 6, 7, 7, 8, 1, 0, 6, 6, 8, 9, 4, +- 5, 3, 1, 2, 5, 8, 8, 8, 1, 7, 8, 4, 1, 9, 7, 0, 0, 1, 2, 5, 2, 3, 2, 3, 3, +- 8, 9, 0, 5, 3, 3, 4, 4, 7, 2, 6, 5, 6, 2, 5, 4, 4, 4, 0, 8, 9, 2, 0, 9, 8, +- 5, 0, 0, 6, 2, 6, 1, 6, 1, 6, 9, 4, 5, 2, 6, 6, 7, 2, 3, 6, 3, 2, 8, 1, 2, +- 5, 2, 2, 2, 0, 4, 4, 6, 0, 4, 9, 2, 5, 0, 3, 1, 3, 0, 8, 0, 8, 4, 7, 2, 6, +- 3, 3, 3, 6, 1, 8, 1, 6, 4, 0, 6, 2, 5, 1, 1, 1, 0, 2, 2, 3, 0, 2, 4, 6, 2, +- 5, 1, 5, 6, 5, 4, 0, 4, 2, 3, 6, 3, 1, 6, 6, 8, 0, 9, 0, 8, 2, 0, 3, 1, 2, +- 5, 5, 5, 5, 1, 1, 1, 5, 1, 2, 3, 1, 2, 5, 7, 8, 2, 7, 0, 2, 1, 1, 8, 1, 5, +- 8, 3, 4, 0, 4, 5, 4, 1, 0, 1, 5, 6, 2, 5, 2, 7, 7, 5, 5, 5, 7, 5, 6, 1, 5, +- 6, 2, 8, 9, 1, 3, 5, 1, 0, 5, 9, 0, 7, 9, 1, 7, 0, 2, 2, 7, 0, 5, 0, 7, 8, +- 1, 2, 5, 1, 3, 8, 7, 7, 7, 8, 7, 8, 0, 7, 8, 1, 4, 4, 5, 6, 7, 5, 5, 2, 9, +- 5, 3, 9, 5, 8, 5, 1, 1, 3, 5, 2, 5, 3, 9, 0, 6, 2, 5, 6, 9, 3, 8, 8, 9, 3, +- 9, 0, 3, 9, 0, 7, 2, 2, 8, 3, 7, 7, 6, 4, 7, 6, 9, 7, 9, 2, 5, 5, 6, 7, 6, +- 2, 6, 9, 5, 3, 1, 2, 5, 3, 4, 6, 9, 4, 4, 6, 9, 5, 1, 9, 5, 3, 6, 1, 4, 1, +- 8, 8, 8, 2, 3, 8, 4, 8, 9, 6, 2, 7, 8, 3, 8, 1, 3, 4, 7, 6, 5, 6, 2, 5, 1, +- 7, 3, 4, 7, 2, 3, 4, 7, 5, 9, 7, 6, 8, 0, 7, 0, 9, 4, 4, 1, 1, 9, 2, 4, 4, +- 8, 1, 3, 9, 1, 9, 0, 6, 7, 3, 8, 2, 8, 1, 2, 5, 8, 6, 7, 3, 6, 1, 7, 3, 7, +- 9, 8, 8, 4, 0, 3, 5, 4, 7, 2, 0, 5, 9, 6, 2, 2, 4, 0, 6, 9, 5, 9, 5, 3, 3, +- 6, 9, 1, 4, 0, 6, 2, 5, +-}; ++// The background_color is used to fill the pixel buffer after ++// callbacks.AllocPixbuf returns, if it is valid in the ++// wuffs_base__color_u32_argb_premul__is_valid sense. The default value, ++// 0x0000_0001, is not valid since its Blue channel value (0x01) is greater ++// than its Alpha channel value (0x00). A valid background_color will typically ++// be overwritten when pixel_blend is WUFFS_BASE__PIXEL_BLEND__SRC, but might ++// still be visible on partial (not total) success or when pixel_blend is ++// WUFFS_BASE__PIXEL_BLEND__SRC_OVER and the decoded image is not fully opaque. ++// ++// Decoding fails (with DecodeImage_MaxInclDimensionExceeded) if the image's ++// width or height is greater than max_incl_dimension or if any opted-in (via ++// flags bits) metadata is longer than max_incl_metadata_length. ++DecodeImageResult // ++DecodeImage(DecodeImageCallbacks& callbacks, ++ sync_io::Input& input, ++ DecodeImageArgQuirks quirks = DecodeImageArgQuirks::DefaultValue(), ++ DecodeImageArgFlags flags = DecodeImageArgFlags::DefaultValue(), ++ DecodeImageArgPixelBlend pixel_blend = ++ DecodeImageArgPixelBlend::DefaultValue(), ++ DecodeImageArgBackgroundColor background_color = ++ DecodeImageArgBackgroundColor::DefaultValue(), ++ DecodeImageArgMaxInclDimension max_incl_dimension = ++ DecodeImageArgMaxInclDimension::DefaultValue(), ++ DecodeImageArgMaxInclMetadataLength max_incl_metadata_length = ++ DecodeImageArgMaxInclMetadataLength::DefaultValue()); + +-// -------- ++} // namespace wuffs_aux + +-// wuffs_base__private_implementation__powers_of_10 contains truncated +-// approximations to the powers of 10, ranging from 1e-307 to 1e+288 inclusive, +-// as 596 pairs of uint64_t values (a 128-bit mantissa). +-// +-// There's also an implicit third column (implied by a linear formula involving +-// the base-10 exponent) that is the base-2 exponent, biased by a magic +-// constant. That constant (1214 or 0x04BE) equals 1023 + 191. 1023 is the bias +-// for IEEE 754 double-precision floating point. 191 is ((3 * 64) - 1) and +-// wuffs_base__private_implementation__parse_number_f64_eisel_lemire works with +-// multiples-of-64-bit mantissas. +-// +-// For example, the third row holds the approximation to 1e-305: +-// 0xE0B62E29_29ABA83C_331ACDAB_FE94DE87 * (2 ** (0x0049 - 0x04BE)) +-// +-// Similarly, 1e+4 is approximated by: +-// 0x9C400000_00000000_00000000_00000000 * (2 ** (0x044C - 0x04BE)) +-// +-// Similarly, 1e+68 is approximated by: +-// 0xED63A231_D4C4FB27_4CA7AAA8_63EE4BDD * (2 ** (0x0520 - 0x04BE)) +-// +-// This table was generated by by script/print-mpb-powers-of-10.go +-static const uint64_t wuffs_base__private_implementation__powers_of_10[596][2] = +- { +- {0xA5D3B6D479F8E056, 0x8FD0C16206306BAB}, // 1e-307 +- {0x8F48A4899877186C, 0xB3C4F1BA87BC8696}, // 1e-306 +- {0x331ACDABFE94DE87, 0xE0B62E2929ABA83C}, // 1e-305 +- {0x9FF0C08B7F1D0B14, 0x8C71DCD9BA0B4925}, // 1e-304 +- {0x07ECF0AE5EE44DD9, 0xAF8E5410288E1B6F}, // 1e-303 +- {0xC9E82CD9F69D6150, 0xDB71E91432B1A24A}, // 1e-302 +- {0xBE311C083A225CD2, 0x892731AC9FAF056E}, // 1e-301 +- {0x6DBD630A48AAF406, 0xAB70FE17C79AC6CA}, // 1e-300 +- {0x092CBBCCDAD5B108, 0xD64D3D9DB981787D}, // 1e-299 +- {0x25BBF56008C58EA5, 0x85F0468293F0EB4E}, // 1e-298 +- {0xAF2AF2B80AF6F24E, 0xA76C582338ED2621}, // 1e-297 +- {0x1AF5AF660DB4AEE1, 0xD1476E2C07286FAA}, // 1e-296 +- {0x50D98D9FC890ED4D, 0x82CCA4DB847945CA}, // 1e-295 +- {0xE50FF107BAB528A0, 0xA37FCE126597973C}, // 1e-294 +- {0x1E53ED49A96272C8, 0xCC5FC196FEFD7D0C}, // 1e-293 +- {0x25E8E89C13BB0F7A, 0xFF77B1FCBEBCDC4F}, // 1e-292 +- {0x77B191618C54E9AC, 0x9FAACF3DF73609B1}, // 1e-291 +- {0xD59DF5B9EF6A2417, 0xC795830D75038C1D}, // 1e-290 +- {0x4B0573286B44AD1D, 0xF97AE3D0D2446F25}, // 1e-289 +- {0x4EE367F9430AEC32, 0x9BECCE62836AC577}, // 1e-288 +- {0x229C41F793CDA73F, 0xC2E801FB244576D5}, // 1e-287 +- {0x6B43527578C1110F, 0xF3A20279ED56D48A}, // 1e-286 +- {0x830A13896B78AAA9, 0x9845418C345644D6}, // 1e-285 +- {0x23CC986BC656D553, 0xBE5691EF416BD60C}, // 1e-284 +- {0x2CBFBE86B7EC8AA8, 0xEDEC366B11C6CB8F}, // 1e-283 +- {0x7BF7D71432F3D6A9, 0x94B3A202EB1C3F39}, // 1e-282 +- {0xDAF5CCD93FB0CC53, 0xB9E08A83A5E34F07}, // 1e-281 +- {0xD1B3400F8F9CFF68, 0xE858AD248F5C22C9}, // 1e-280 +- {0x23100809B9C21FA1, 0x91376C36D99995BE}, // 1e-279 +- {0xABD40A0C2832A78A, 0xB58547448FFFFB2D}, // 1e-278 +- {0x16C90C8F323F516C, 0xE2E69915B3FFF9F9}, // 1e-277 +- {0xAE3DA7D97F6792E3, 0x8DD01FAD907FFC3B}, // 1e-276 +- {0x99CD11CFDF41779C, 0xB1442798F49FFB4A}, // 1e-275 +- {0x40405643D711D583, 0xDD95317F31C7FA1D}, // 1e-274 +- {0x482835EA666B2572, 0x8A7D3EEF7F1CFC52}, // 1e-273 +- {0xDA3243650005EECF, 0xAD1C8EAB5EE43B66}, // 1e-272 +- {0x90BED43E40076A82, 0xD863B256369D4A40}, // 1e-271 +- {0x5A7744A6E804A291, 0x873E4F75E2224E68}, // 1e-270 +- {0x711515D0A205CB36, 0xA90DE3535AAAE202}, // 1e-269 +- {0x0D5A5B44CA873E03, 0xD3515C2831559A83}, // 1e-268 +- {0xE858790AFE9486C2, 0x8412D9991ED58091}, // 1e-267 +- {0x626E974DBE39A872, 0xA5178FFF668AE0B6}, // 1e-266 +- {0xFB0A3D212DC8128F, 0xCE5D73FF402D98E3}, // 1e-265 +- {0x7CE66634BC9D0B99, 0x80FA687F881C7F8E}, // 1e-264 +- {0x1C1FFFC1EBC44E80, 0xA139029F6A239F72}, // 1e-263 +- {0xA327FFB266B56220, 0xC987434744AC874E}, // 1e-262 +- {0x4BF1FF9F0062BAA8, 0xFBE9141915D7A922}, // 1e-261 +- {0x6F773FC3603DB4A9, 0x9D71AC8FADA6C9B5}, // 1e-260 +- {0xCB550FB4384D21D3, 0xC4CE17B399107C22}, // 1e-259 +- {0x7E2A53A146606A48, 0xF6019DA07F549B2B}, // 1e-258 +- {0x2EDA7444CBFC426D, 0x99C102844F94E0FB}, // 1e-257 +- {0xFA911155FEFB5308, 0xC0314325637A1939}, // 1e-256 +- {0x793555AB7EBA27CA, 0xF03D93EEBC589F88}, // 1e-255 +- {0x4BC1558B2F3458DE, 0x96267C7535B763B5}, // 1e-254 +- {0x9EB1AAEDFB016F16, 0xBBB01B9283253CA2}, // 1e-253 +- {0x465E15A979C1CADC, 0xEA9C227723EE8BCB}, // 1e-252 +- {0x0BFACD89EC191EC9, 0x92A1958A7675175F}, // 1e-251 +- {0xCEF980EC671F667B, 0xB749FAED14125D36}, // 1e-250 +- {0x82B7E12780E7401A, 0xE51C79A85916F484}, // 1e-249 +- {0xD1B2ECB8B0908810, 0x8F31CC0937AE58D2}, // 1e-248 +- {0x861FA7E6DCB4AA15, 0xB2FE3F0B8599EF07}, // 1e-247 +- {0x67A791E093E1D49A, 0xDFBDCECE67006AC9}, // 1e-246 +- {0xE0C8BB2C5C6D24E0, 0x8BD6A141006042BD}, // 1e-245 +- {0x58FAE9F773886E18, 0xAECC49914078536D}, // 1e-244 +- {0xAF39A475506A899E, 0xDA7F5BF590966848}, // 1e-243 +- {0x6D8406C952429603, 0x888F99797A5E012D}, // 1e-242 +- {0xC8E5087BA6D33B83, 0xAAB37FD7D8F58178}, // 1e-241 +- {0xFB1E4A9A90880A64, 0xD5605FCDCF32E1D6}, // 1e-240 +- {0x5CF2EEA09A55067F, 0x855C3BE0A17FCD26}, // 1e-239 +- {0xF42FAA48C0EA481E, 0xA6B34AD8C9DFC06F}, // 1e-238 +- {0xF13B94DAF124DA26, 0xD0601D8EFC57B08B}, // 1e-237 +- {0x76C53D08D6B70858, 0x823C12795DB6CE57}, // 1e-236 +- {0x54768C4B0C64CA6E, 0xA2CB1717B52481ED}, // 1e-235 +- {0xA9942F5DCF7DFD09, 0xCB7DDCDDA26DA268}, // 1e-234 +- {0xD3F93B35435D7C4C, 0xFE5D54150B090B02}, // 1e-233 +- {0xC47BC5014A1A6DAF, 0x9EFA548D26E5A6E1}, // 1e-232 +- {0x359AB6419CA1091B, 0xC6B8E9B0709F109A}, // 1e-231 +- {0xC30163D203C94B62, 0xF867241C8CC6D4C0}, // 1e-230 +- {0x79E0DE63425DCF1D, 0x9B407691D7FC44F8}, // 1e-229 +- {0x985915FC12F542E4, 0xC21094364DFB5636}, // 1e-228 +- {0x3E6F5B7B17B2939D, 0xF294B943E17A2BC4}, // 1e-227 +- {0xA705992CEECF9C42, 0x979CF3CA6CEC5B5A}, // 1e-226 +- {0x50C6FF782A838353, 0xBD8430BD08277231}, // 1e-225 +- {0xA4F8BF5635246428, 0xECE53CEC4A314EBD}, // 1e-224 +- {0x871B7795E136BE99, 0x940F4613AE5ED136}, // 1e-223 +- {0x28E2557B59846E3F, 0xB913179899F68584}, // 1e-222 +- {0x331AEADA2FE589CF, 0xE757DD7EC07426E5}, // 1e-221 +- {0x3FF0D2C85DEF7621, 0x9096EA6F3848984F}, // 1e-220 +- {0x0FED077A756B53A9, 0xB4BCA50B065ABE63}, // 1e-219 +- {0xD3E8495912C62894, 0xE1EBCE4DC7F16DFB}, // 1e-218 +- {0x64712DD7ABBBD95C, 0x8D3360F09CF6E4BD}, // 1e-217 +- {0xBD8D794D96AACFB3, 0xB080392CC4349DEC}, // 1e-216 +- {0xECF0D7A0FC5583A0, 0xDCA04777F541C567}, // 1e-215 +- {0xF41686C49DB57244, 0x89E42CAAF9491B60}, // 1e-214 +- {0x311C2875C522CED5, 0xAC5D37D5B79B6239}, // 1e-213 +- {0x7D633293366B828B, 0xD77485CB25823AC7}, // 1e-212 +- {0xAE5DFF9C02033197, 0x86A8D39EF77164BC}, // 1e-211 +- {0xD9F57F830283FDFC, 0xA8530886B54DBDEB}, // 1e-210 +- {0xD072DF63C324FD7B, 0xD267CAA862A12D66}, // 1e-209 +- {0x4247CB9E59F71E6D, 0x8380DEA93DA4BC60}, // 1e-208 +- {0x52D9BE85F074E608, 0xA46116538D0DEB78}, // 1e-207 +- {0x67902E276C921F8B, 0xCD795BE870516656}, // 1e-206 +- {0x00BA1CD8A3DB53B6, 0x806BD9714632DFF6}, // 1e-205 +- {0x80E8A40ECCD228A4, 0xA086CFCD97BF97F3}, // 1e-204 +- {0x6122CD128006B2CD, 0xC8A883C0FDAF7DF0}, // 1e-203 +- {0x796B805720085F81, 0xFAD2A4B13D1B5D6C}, // 1e-202 +- {0xCBE3303674053BB0, 0x9CC3A6EEC6311A63}, // 1e-201 +- {0xBEDBFC4411068A9C, 0xC3F490AA77BD60FC}, // 1e-200 +- {0xEE92FB5515482D44, 0xF4F1B4D515ACB93B}, // 1e-199 +- {0x751BDD152D4D1C4A, 0x991711052D8BF3C5}, // 1e-198 +- {0xD262D45A78A0635D, 0xBF5CD54678EEF0B6}, // 1e-197 +- {0x86FB897116C87C34, 0xEF340A98172AACE4}, // 1e-196 +- {0xD45D35E6AE3D4DA0, 0x9580869F0E7AAC0E}, // 1e-195 +- {0x8974836059CCA109, 0xBAE0A846D2195712}, // 1e-194 +- {0x2BD1A438703FC94B, 0xE998D258869FACD7}, // 1e-193 +- {0x7B6306A34627DDCF, 0x91FF83775423CC06}, // 1e-192 +- {0x1A3BC84C17B1D542, 0xB67F6455292CBF08}, // 1e-191 +- {0x20CABA5F1D9E4A93, 0xE41F3D6A7377EECA}, // 1e-190 +- {0x547EB47B7282EE9C, 0x8E938662882AF53E}, // 1e-189 +- {0xE99E619A4F23AA43, 0xB23867FB2A35B28D}, // 1e-188 +- {0x6405FA00E2EC94D4, 0xDEC681F9F4C31F31}, // 1e-187 +- {0xDE83BC408DD3DD04, 0x8B3C113C38F9F37E}, // 1e-186 +- {0x9624AB50B148D445, 0xAE0B158B4738705E}, // 1e-185 +- {0x3BADD624DD9B0957, 0xD98DDAEE19068C76}, // 1e-184 +- {0xE54CA5D70A80E5D6, 0x87F8A8D4CFA417C9}, // 1e-183 +- {0x5E9FCF4CCD211F4C, 0xA9F6D30A038D1DBC}, // 1e-182 +- {0x7647C3200069671F, 0xD47487CC8470652B}, // 1e-181 +- {0x29ECD9F40041E073, 0x84C8D4DFD2C63F3B}, // 1e-180 +- {0xF468107100525890, 0xA5FB0A17C777CF09}, // 1e-179 +- {0x7182148D4066EEB4, 0xCF79CC9DB955C2CC}, // 1e-178 +- {0xC6F14CD848405530, 0x81AC1FE293D599BF}, // 1e-177 +- {0xB8ADA00E5A506A7C, 0xA21727DB38CB002F}, // 1e-176 +- {0xA6D90811F0E4851C, 0xCA9CF1D206FDC03B}, // 1e-175 +- {0x908F4A166D1DA663, 0xFD442E4688BD304A}, // 1e-174 +- {0x9A598E4E043287FE, 0x9E4A9CEC15763E2E}, // 1e-173 +- {0x40EFF1E1853F29FD, 0xC5DD44271AD3CDBA}, // 1e-172 +- {0xD12BEE59E68EF47C, 0xF7549530E188C128}, // 1e-171 +- {0x82BB74F8301958CE, 0x9A94DD3E8CF578B9}, // 1e-170 +- {0xE36A52363C1FAF01, 0xC13A148E3032D6E7}, // 1e-169 +- {0xDC44E6C3CB279AC1, 0xF18899B1BC3F8CA1}, // 1e-168 +- {0x29AB103A5EF8C0B9, 0x96F5600F15A7B7E5}, // 1e-167 +- {0x7415D448F6B6F0E7, 0xBCB2B812DB11A5DE}, // 1e-166 +- {0x111B495B3464AD21, 0xEBDF661791D60F56}, // 1e-165 +- {0xCAB10DD900BEEC34, 0x936B9FCEBB25C995}, // 1e-164 +- {0x3D5D514F40EEA742, 0xB84687C269EF3BFB}, // 1e-163 +- {0x0CB4A5A3112A5112, 0xE65829B3046B0AFA}, // 1e-162 +- {0x47F0E785EABA72AB, 0x8FF71A0FE2C2E6DC}, // 1e-161 +- {0x59ED216765690F56, 0xB3F4E093DB73A093}, // 1e-160 +- {0x306869C13EC3532C, 0xE0F218B8D25088B8}, // 1e-159 +- {0x1E414218C73A13FB, 0x8C974F7383725573}, // 1e-158 +- {0xE5D1929EF90898FA, 0xAFBD2350644EEACF}, // 1e-157 +- {0xDF45F746B74ABF39, 0xDBAC6C247D62A583}, // 1e-156 +- {0x6B8BBA8C328EB783, 0x894BC396CE5DA772}, // 1e-155 +- {0x066EA92F3F326564, 0xAB9EB47C81F5114F}, // 1e-154 +- {0xC80A537B0EFEFEBD, 0xD686619BA27255A2}, // 1e-153 +- {0xBD06742CE95F5F36, 0x8613FD0145877585}, // 1e-152 +- {0x2C48113823B73704, 0xA798FC4196E952E7}, // 1e-151 +- {0xF75A15862CA504C5, 0xD17F3B51FCA3A7A0}, // 1e-150 +- {0x9A984D73DBE722FB, 0x82EF85133DE648C4}, // 1e-149 +- {0xC13E60D0D2E0EBBA, 0xA3AB66580D5FDAF5}, // 1e-148 +- {0x318DF905079926A8, 0xCC963FEE10B7D1B3}, // 1e-147 +- {0xFDF17746497F7052, 0xFFBBCFE994E5C61F}, // 1e-146 +- {0xFEB6EA8BEDEFA633, 0x9FD561F1FD0F9BD3}, // 1e-145 +- {0xFE64A52EE96B8FC0, 0xC7CABA6E7C5382C8}, // 1e-144 +- {0x3DFDCE7AA3C673B0, 0xF9BD690A1B68637B}, // 1e-143 +- {0x06BEA10CA65C084E, 0x9C1661A651213E2D}, // 1e-142 +- {0x486E494FCFF30A62, 0xC31BFA0FE5698DB8}, // 1e-141 +- {0x5A89DBA3C3EFCCFA, 0xF3E2F893DEC3F126}, // 1e-140 +- {0xF89629465A75E01C, 0x986DDB5C6B3A76B7}, // 1e-139 +- {0xF6BBB397F1135823, 0xBE89523386091465}, // 1e-138 +- {0x746AA07DED582E2C, 0xEE2BA6C0678B597F}, // 1e-137 +- {0xA8C2A44EB4571CDC, 0x94DB483840B717EF}, // 1e-136 +- {0x92F34D62616CE413, 0xBA121A4650E4DDEB}, // 1e-135 +- {0x77B020BAF9C81D17, 0xE896A0D7E51E1566}, // 1e-134 +- {0x0ACE1474DC1D122E, 0x915E2486EF32CD60}, // 1e-133 +- {0x0D819992132456BA, 0xB5B5ADA8AAFF80B8}, // 1e-132 +- {0x10E1FFF697ED6C69, 0xE3231912D5BF60E6}, // 1e-131 +- {0xCA8D3FFA1EF463C1, 0x8DF5EFABC5979C8F}, // 1e-130 +- {0xBD308FF8A6B17CB2, 0xB1736B96B6FD83B3}, // 1e-129 +- {0xAC7CB3F6D05DDBDE, 0xDDD0467C64BCE4A0}, // 1e-128 +- {0x6BCDF07A423AA96B, 0x8AA22C0DBEF60EE4}, // 1e-127 +- {0x86C16C98D2C953C6, 0xAD4AB7112EB3929D}, // 1e-126 +- {0xE871C7BF077BA8B7, 0xD89D64D57A607744}, // 1e-125 +- {0x11471CD764AD4972, 0x87625F056C7C4A8B}, // 1e-124 +- {0xD598E40D3DD89BCF, 0xA93AF6C6C79B5D2D}, // 1e-123 +- {0x4AFF1D108D4EC2C3, 0xD389B47879823479}, // 1e-122 +- {0xCEDF722A585139BA, 0x843610CB4BF160CB}, // 1e-121 +- {0xC2974EB4EE658828, 0xA54394FE1EEDB8FE}, // 1e-120 +- {0x733D226229FEEA32, 0xCE947A3DA6A9273E}, // 1e-119 +- {0x0806357D5A3F525F, 0x811CCC668829B887}, // 1e-118 +- {0xCA07C2DCB0CF26F7, 0xA163FF802A3426A8}, // 1e-117 +- {0xFC89B393DD02F0B5, 0xC9BCFF6034C13052}, // 1e-116 +- {0xBBAC2078D443ACE2, 0xFC2C3F3841F17C67}, // 1e-115 +- {0xD54B944B84AA4C0D, 0x9D9BA7832936EDC0}, // 1e-114 +- {0x0A9E795E65D4DF11, 0xC5029163F384A931}, // 1e-113 +- {0x4D4617B5FF4A16D5, 0xF64335BCF065D37D}, // 1e-112 +- {0x504BCED1BF8E4E45, 0x99EA0196163FA42E}, // 1e-111 +- {0xE45EC2862F71E1D6, 0xC06481FB9BCF8D39}, // 1e-110 +- {0x5D767327BB4E5A4C, 0xF07DA27A82C37088}, // 1e-109 +- {0x3A6A07F8D510F86F, 0x964E858C91BA2655}, // 1e-108 +- {0x890489F70A55368B, 0xBBE226EFB628AFEA}, // 1e-107 +- {0x2B45AC74CCEA842E, 0xEADAB0ABA3B2DBE5}, // 1e-106 +- {0x3B0B8BC90012929D, 0x92C8AE6B464FC96F}, // 1e-105 +- {0x09CE6EBB40173744, 0xB77ADA0617E3BBCB}, // 1e-104 +- {0xCC420A6A101D0515, 0xE55990879DDCAABD}, // 1e-103 +- {0x9FA946824A12232D, 0x8F57FA54C2A9EAB6}, // 1e-102 +- {0x47939822DC96ABF9, 0xB32DF8E9F3546564}, // 1e-101 +- {0x59787E2B93BC56F7, 0xDFF9772470297EBD}, // 1e-100 +- {0x57EB4EDB3C55B65A, 0x8BFBEA76C619EF36}, // 1e-99 +- {0xEDE622920B6B23F1, 0xAEFAE51477A06B03}, // 1e-98 +- {0xE95FAB368E45ECED, 0xDAB99E59958885C4}, // 1e-97 +- {0x11DBCB0218EBB414, 0x88B402F7FD75539B}, // 1e-96 +- {0xD652BDC29F26A119, 0xAAE103B5FCD2A881}, // 1e-95 +- {0x4BE76D3346F0495F, 0xD59944A37C0752A2}, // 1e-94 +- {0x6F70A4400C562DDB, 0x857FCAE62D8493A5}, // 1e-93 +- {0xCB4CCD500F6BB952, 0xA6DFBD9FB8E5B88E}, // 1e-92 +- {0x7E2000A41346A7A7, 0xD097AD07A71F26B2}, // 1e-91 +- {0x8ED400668C0C28C8, 0x825ECC24C873782F}, // 1e-90 +- {0x728900802F0F32FA, 0xA2F67F2DFA90563B}, // 1e-89 +- {0x4F2B40A03AD2FFB9, 0xCBB41EF979346BCA}, // 1e-88 +- {0xE2F610C84987BFA8, 0xFEA126B7D78186BC}, // 1e-87 +- {0x0DD9CA7D2DF4D7C9, 0x9F24B832E6B0F436}, // 1e-86 +- {0x91503D1C79720DBB, 0xC6EDE63FA05D3143}, // 1e-85 +- {0x75A44C6397CE912A, 0xF8A95FCF88747D94}, // 1e-84 +- {0xC986AFBE3EE11ABA, 0x9B69DBE1B548CE7C}, // 1e-83 +- {0xFBE85BADCE996168, 0xC24452DA229B021B}, // 1e-82 +- {0xFAE27299423FB9C3, 0xF2D56790AB41C2A2}, // 1e-81 +- {0xDCCD879FC967D41A, 0x97C560BA6B0919A5}, // 1e-80 +- {0x5400E987BBC1C920, 0xBDB6B8E905CB600F}, // 1e-79 +- {0x290123E9AAB23B68, 0xED246723473E3813}, // 1e-78 +- {0xF9A0B6720AAF6521, 0x9436C0760C86E30B}, // 1e-77 +- {0xF808E40E8D5B3E69, 0xB94470938FA89BCE}, // 1e-76 +- {0xB60B1D1230B20E04, 0xE7958CB87392C2C2}, // 1e-75 +- {0xB1C6F22B5E6F48C2, 0x90BD77F3483BB9B9}, // 1e-74 +- {0x1E38AEB6360B1AF3, 0xB4ECD5F01A4AA828}, // 1e-73 +- {0x25C6DA63C38DE1B0, 0xE2280B6C20DD5232}, // 1e-72 +- {0x579C487E5A38AD0E, 0x8D590723948A535F}, // 1e-71 +- {0x2D835A9DF0C6D851, 0xB0AF48EC79ACE837}, // 1e-70 +- {0xF8E431456CF88E65, 0xDCDB1B2798182244}, // 1e-69 +- {0x1B8E9ECB641B58FF, 0x8A08F0F8BF0F156B}, // 1e-68 +- {0xE272467E3D222F3F, 0xAC8B2D36EED2DAC5}, // 1e-67 +- {0x5B0ED81DCC6ABB0F, 0xD7ADF884AA879177}, // 1e-66 +- {0x98E947129FC2B4E9, 0x86CCBB52EA94BAEA}, // 1e-65 +- {0x3F2398D747B36224, 0xA87FEA27A539E9A5}, // 1e-64 +- {0x8EEC7F0D19A03AAD, 0xD29FE4B18E88640E}, // 1e-63 +- {0x1953CF68300424AC, 0x83A3EEEEF9153E89}, // 1e-62 +- {0x5FA8C3423C052DD7, 0xA48CEAAAB75A8E2B}, // 1e-61 +- {0x3792F412CB06794D, 0xCDB02555653131B6}, // 1e-60 +- {0xE2BBD88BBEE40BD0, 0x808E17555F3EBF11}, // 1e-59 +- {0x5B6ACEAEAE9D0EC4, 0xA0B19D2AB70E6ED6}, // 1e-58 +- {0xF245825A5A445275, 0xC8DE047564D20A8B}, // 1e-57 +- {0xEED6E2F0F0D56712, 0xFB158592BE068D2E}, // 1e-56 +- {0x55464DD69685606B, 0x9CED737BB6C4183D}, // 1e-55 +- {0xAA97E14C3C26B886, 0xC428D05AA4751E4C}, // 1e-54 +- {0xD53DD99F4B3066A8, 0xF53304714D9265DF}, // 1e-53 +- {0xE546A8038EFE4029, 0x993FE2C6D07B7FAB}, // 1e-52 +- {0xDE98520472BDD033, 0xBF8FDB78849A5F96}, // 1e-51 +- {0x963E66858F6D4440, 0xEF73D256A5C0F77C}, // 1e-50 +- {0xDDE7001379A44AA8, 0x95A8637627989AAD}, // 1e-49 +- {0x5560C018580D5D52, 0xBB127C53B17EC159}, // 1e-48 +- {0xAAB8F01E6E10B4A6, 0xE9D71B689DDE71AF}, // 1e-47 +- {0xCAB3961304CA70E8, 0x9226712162AB070D}, // 1e-46 +- {0x3D607B97C5FD0D22, 0xB6B00D69BB55C8D1}, // 1e-45 +- {0x8CB89A7DB77C506A, 0xE45C10C42A2B3B05}, // 1e-44 +- {0x77F3608E92ADB242, 0x8EB98A7A9A5B04E3}, // 1e-43 +- {0x55F038B237591ED3, 0xB267ED1940F1C61C}, // 1e-42 +- {0x6B6C46DEC52F6688, 0xDF01E85F912E37A3}, // 1e-41 +- {0x2323AC4B3B3DA015, 0x8B61313BBABCE2C6}, // 1e-40 +- {0xABEC975E0A0D081A, 0xAE397D8AA96C1B77}, // 1e-39 +- {0x96E7BD358C904A21, 0xD9C7DCED53C72255}, // 1e-38 +- {0x7E50D64177DA2E54, 0x881CEA14545C7575}, // 1e-37 +- {0xDDE50BD1D5D0B9E9, 0xAA242499697392D2}, // 1e-36 +- {0x955E4EC64B44E864, 0xD4AD2DBFC3D07787}, // 1e-35 +- {0xBD5AF13BEF0B113E, 0x84EC3C97DA624AB4}, // 1e-34 +- {0xECB1AD8AEACDD58E, 0xA6274BBDD0FADD61}, // 1e-33 +- {0x67DE18EDA5814AF2, 0xCFB11EAD453994BA}, // 1e-32 +- {0x80EACF948770CED7, 0x81CEB32C4B43FCF4}, // 1e-31 +- {0xA1258379A94D028D, 0xA2425FF75E14FC31}, // 1e-30 +- {0x096EE45813A04330, 0xCAD2F7F5359A3B3E}, // 1e-29 +- {0x8BCA9D6E188853FC, 0xFD87B5F28300CA0D}, // 1e-28 +- {0x775EA264CF55347D, 0x9E74D1B791E07E48}, // 1e-27 +- {0x95364AFE032A819D, 0xC612062576589DDA}, // 1e-26 +- {0x3A83DDBD83F52204, 0xF79687AED3EEC551}, // 1e-25 +- {0xC4926A9672793542, 0x9ABE14CD44753B52}, // 1e-24 +- {0x75B7053C0F178293, 0xC16D9A0095928A27}, // 1e-23 +- {0x5324C68B12DD6338, 0xF1C90080BAF72CB1}, // 1e-22 +- {0xD3F6FC16EBCA5E03, 0x971DA05074DA7BEE}, // 1e-21 +- {0x88F4BB1CA6BCF584, 0xBCE5086492111AEA}, // 1e-20 +- {0x2B31E9E3D06C32E5, 0xEC1E4A7DB69561A5}, // 1e-19 +- {0x3AFF322E62439FCF, 0x9392EE8E921D5D07}, // 1e-18 +- {0x09BEFEB9FAD487C2, 0xB877AA3236A4B449}, // 1e-17 +- {0x4C2EBE687989A9B3, 0xE69594BEC44DE15B}, // 1e-16 +- {0x0F9D37014BF60A10, 0x901D7CF73AB0ACD9}, // 1e-15 +- {0x538484C19EF38C94, 0xB424DC35095CD80F}, // 1e-14 +- {0x2865A5F206B06FB9, 0xE12E13424BB40E13}, // 1e-13 +- {0xF93F87B7442E45D3, 0x8CBCCC096F5088CB}, // 1e-12 +- {0xF78F69A51539D748, 0xAFEBFF0BCB24AAFE}, // 1e-11 +- {0xB573440E5A884D1B, 0xDBE6FECEBDEDD5BE}, // 1e-10 +- {0x31680A88F8953030, 0x89705F4136B4A597}, // 1e-9 +- {0xFDC20D2B36BA7C3D, 0xABCC77118461CEFC}, // 1e-8 +- {0x3D32907604691B4C, 0xD6BF94D5E57A42BC}, // 1e-7 +- {0xA63F9A49C2C1B10F, 0x8637BD05AF6C69B5}, // 1e-6 +- {0x0FCF80DC33721D53, 0xA7C5AC471B478423}, // 1e-5 +- {0xD3C36113404EA4A8, 0xD1B71758E219652B}, // 1e-4 +- {0x645A1CAC083126E9, 0x83126E978D4FDF3B}, // 1e-3 +- {0x3D70A3D70A3D70A3, 0xA3D70A3D70A3D70A}, // 1e-2 +- {0xCCCCCCCCCCCCCCCC, 0xCCCCCCCCCCCCCCCC}, // 1e-1 +- {0x0000000000000000, 0x8000000000000000}, // 1e0 +- {0x0000000000000000, 0xA000000000000000}, // 1e1 +- {0x0000000000000000, 0xC800000000000000}, // 1e2 +- {0x0000000000000000, 0xFA00000000000000}, // 1e3 +- {0x0000000000000000, 0x9C40000000000000}, // 1e4 +- {0x0000000000000000, 0xC350000000000000}, // 1e5 +- {0x0000000000000000, 0xF424000000000000}, // 1e6 +- {0x0000000000000000, 0x9896800000000000}, // 1e7 +- {0x0000000000000000, 0xBEBC200000000000}, // 1e8 +- {0x0000000000000000, 0xEE6B280000000000}, // 1e9 +- {0x0000000000000000, 0x9502F90000000000}, // 1e10 +- {0x0000000000000000, 0xBA43B74000000000}, // 1e11 +- {0x0000000000000000, 0xE8D4A51000000000}, // 1e12 +- {0x0000000000000000, 0x9184E72A00000000}, // 1e13 +- {0x0000000000000000, 0xB5E620F480000000}, // 1e14 +- {0x0000000000000000, 0xE35FA931A0000000}, // 1e15 +- {0x0000000000000000, 0x8E1BC9BF04000000}, // 1e16 +- {0x0000000000000000, 0xB1A2BC2EC5000000}, // 1e17 +- {0x0000000000000000, 0xDE0B6B3A76400000}, // 1e18 +- {0x0000000000000000, 0x8AC7230489E80000}, // 1e19 +- {0x0000000000000000, 0xAD78EBC5AC620000}, // 1e20 +- {0x0000000000000000, 0xD8D726B7177A8000}, // 1e21 +- {0x0000000000000000, 0x878678326EAC9000}, // 1e22 +- {0x0000000000000000, 0xA968163F0A57B400}, // 1e23 +- {0x0000000000000000, 0xD3C21BCECCEDA100}, // 1e24 +- {0x0000000000000000, 0x84595161401484A0}, // 1e25 +- {0x0000000000000000, 0xA56FA5B99019A5C8}, // 1e26 +- {0x0000000000000000, 0xCECB8F27F4200F3A}, // 1e27 +- {0x4000000000000000, 0x813F3978F8940984}, // 1e28 +- {0x5000000000000000, 0xA18F07D736B90BE5}, // 1e29 +- {0xA400000000000000, 0xC9F2C9CD04674EDE}, // 1e30 +- {0x4D00000000000000, 0xFC6F7C4045812296}, // 1e31 +- {0xF020000000000000, 0x9DC5ADA82B70B59D}, // 1e32 +- {0x6C28000000000000, 0xC5371912364CE305}, // 1e33 +- {0xC732000000000000, 0xF684DF56C3E01BC6}, // 1e34 +- {0x3C7F400000000000, 0x9A130B963A6C115C}, // 1e35 +- {0x4B9F100000000000, 0xC097CE7BC90715B3}, // 1e36 +- {0x1E86D40000000000, 0xF0BDC21ABB48DB20}, // 1e37 +- {0x1314448000000000, 0x96769950B50D88F4}, // 1e38 +- {0x17D955A000000000, 0xBC143FA4E250EB31}, // 1e39 +- {0x5DCFAB0800000000, 0xEB194F8E1AE525FD}, // 1e40 +- {0x5AA1CAE500000000, 0x92EFD1B8D0CF37BE}, // 1e41 +- {0xF14A3D9E40000000, 0xB7ABC627050305AD}, // 1e42 +- {0x6D9CCD05D0000000, 0xE596B7B0C643C719}, // 1e43 +- {0xE4820023A2000000, 0x8F7E32CE7BEA5C6F}, // 1e44 +- {0xDDA2802C8A800000, 0xB35DBF821AE4F38B}, // 1e45 +- {0xD50B2037AD200000, 0xE0352F62A19E306E}, // 1e46 +- {0x4526F422CC340000, 0x8C213D9DA502DE45}, // 1e47 +- {0x9670B12B7F410000, 0xAF298D050E4395D6}, // 1e48 +- {0x3C0CDD765F114000, 0xDAF3F04651D47B4C}, // 1e49 +- {0xA5880A69FB6AC800, 0x88D8762BF324CD0F}, // 1e50 +- {0x8EEA0D047A457A00, 0xAB0E93B6EFEE0053}, // 1e51 +- {0x72A4904598D6D880, 0xD5D238A4ABE98068}, // 1e52 +- {0x47A6DA2B7F864750, 0x85A36366EB71F041}, // 1e53 +- {0x999090B65F67D924, 0xA70C3C40A64E6C51}, // 1e54 +- {0xFFF4B4E3F741CF6D, 0xD0CF4B50CFE20765}, // 1e55 +- {0xBFF8F10E7A8921A4, 0x82818F1281ED449F}, // 1e56 +- {0xAFF72D52192B6A0D, 0xA321F2D7226895C7}, // 1e57 +- {0x9BF4F8A69F764490, 0xCBEA6F8CEB02BB39}, // 1e58 +- {0x02F236D04753D5B4, 0xFEE50B7025C36A08}, // 1e59 +- {0x01D762422C946590, 0x9F4F2726179A2245}, // 1e60 +- {0x424D3AD2B7B97EF5, 0xC722F0EF9D80AAD6}, // 1e61 +- {0xD2E0898765A7DEB2, 0xF8EBAD2B84E0D58B}, // 1e62 +- {0x63CC55F49F88EB2F, 0x9B934C3B330C8577}, // 1e63 +- {0x3CBF6B71C76B25FB, 0xC2781F49FFCFA6D5}, // 1e64 +- {0x8BEF464E3945EF7A, 0xF316271C7FC3908A}, // 1e65 +- {0x97758BF0E3CBB5AC, 0x97EDD871CFDA3A56}, // 1e66 +- {0x3D52EEED1CBEA317, 0xBDE94E8E43D0C8EC}, // 1e67 +- {0x4CA7AAA863EE4BDD, 0xED63A231D4C4FB27}, // 1e68 +- {0x8FE8CAA93E74EF6A, 0x945E455F24FB1CF8}, // 1e69 +- {0xB3E2FD538E122B44, 0xB975D6B6EE39E436}, // 1e70 +- {0x60DBBCA87196B616, 0xE7D34C64A9C85D44}, // 1e71 +- {0xBC8955E946FE31CD, 0x90E40FBEEA1D3A4A}, // 1e72 +- {0x6BABAB6398BDBE41, 0xB51D13AEA4A488DD}, // 1e73 +- {0xC696963C7EED2DD1, 0xE264589A4DCDAB14}, // 1e74 +- {0xFC1E1DE5CF543CA2, 0x8D7EB76070A08AEC}, // 1e75 +- {0x3B25A55F43294BCB, 0xB0DE65388CC8ADA8}, // 1e76 +- {0x49EF0EB713F39EBE, 0xDD15FE86AFFAD912}, // 1e77 +- {0x6E3569326C784337, 0x8A2DBF142DFCC7AB}, // 1e78 +- {0x49C2C37F07965404, 0xACB92ED9397BF996}, // 1e79 +- {0xDC33745EC97BE906, 0xD7E77A8F87DAF7FB}, // 1e80 +- {0x69A028BB3DED71A3, 0x86F0AC99B4E8DAFD}, // 1e81 +- {0xC40832EA0D68CE0C, 0xA8ACD7C0222311BC}, // 1e82 +- {0xF50A3FA490C30190, 0xD2D80DB02AABD62B}, // 1e83 +- {0x792667C6DA79E0FA, 0x83C7088E1AAB65DB}, // 1e84 +- {0x577001B891185938, 0xA4B8CAB1A1563F52}, // 1e85 +- {0xED4C0226B55E6F86, 0xCDE6FD5E09ABCF26}, // 1e86 +- {0x544F8158315B05B4, 0x80B05E5AC60B6178}, // 1e87 +- {0x696361AE3DB1C721, 0xA0DC75F1778E39D6}, // 1e88 +- {0x03BC3A19CD1E38E9, 0xC913936DD571C84C}, // 1e89 +- {0x04AB48A04065C723, 0xFB5878494ACE3A5F}, // 1e90 +- {0x62EB0D64283F9C76, 0x9D174B2DCEC0E47B}, // 1e91 +- {0x3BA5D0BD324F8394, 0xC45D1DF942711D9A}, // 1e92 +- {0xCA8F44EC7EE36479, 0xF5746577930D6500}, // 1e93 +- {0x7E998B13CF4E1ECB, 0x9968BF6ABBE85F20}, // 1e94 +- {0x9E3FEDD8C321A67E, 0xBFC2EF456AE276E8}, // 1e95 +- {0xC5CFE94EF3EA101E, 0xEFB3AB16C59B14A2}, // 1e96 +- {0xBBA1F1D158724A12, 0x95D04AEE3B80ECE5}, // 1e97 +- {0x2A8A6E45AE8EDC97, 0xBB445DA9CA61281F}, // 1e98 +- {0xF52D09D71A3293BD, 0xEA1575143CF97226}, // 1e99 +- {0x593C2626705F9C56, 0x924D692CA61BE758}, // 1e100 +- {0x6F8B2FB00C77836C, 0xB6E0C377CFA2E12E}, // 1e101 +- {0x0B6DFB9C0F956447, 0xE498F455C38B997A}, // 1e102 +- {0x4724BD4189BD5EAC, 0x8EDF98B59A373FEC}, // 1e103 +- {0x58EDEC91EC2CB657, 0xB2977EE300C50FE7}, // 1e104 +- {0x2F2967B66737E3ED, 0xDF3D5E9BC0F653E1}, // 1e105 +- {0xBD79E0D20082EE74, 0x8B865B215899F46C}, // 1e106 +- {0xECD8590680A3AA11, 0xAE67F1E9AEC07187}, // 1e107 +- {0xE80E6F4820CC9495, 0xDA01EE641A708DE9}, // 1e108 +- {0x3109058D147FDCDD, 0x884134FE908658B2}, // 1e109 +- {0xBD4B46F0599FD415, 0xAA51823E34A7EEDE}, // 1e110 +- {0x6C9E18AC7007C91A, 0xD4E5E2CDC1D1EA96}, // 1e111 +- {0x03E2CF6BC604DDB0, 0x850FADC09923329E}, // 1e112 +- {0x84DB8346B786151C, 0xA6539930BF6BFF45}, // 1e113 +- {0xE612641865679A63, 0xCFE87F7CEF46FF16}, // 1e114 +- {0x4FCB7E8F3F60C07E, 0x81F14FAE158C5F6E}, // 1e115 +- {0xE3BE5E330F38F09D, 0xA26DA3999AEF7749}, // 1e116 +- {0x5CADF5BFD3072CC5, 0xCB090C8001AB551C}, // 1e117 +- {0x73D9732FC7C8F7F6, 0xFDCB4FA002162A63}, // 1e118 +- {0x2867E7FDDCDD9AFA, 0x9E9F11C4014DDA7E}, // 1e119 +- {0xB281E1FD541501B8, 0xC646D63501A1511D}, // 1e120 +- {0x1F225A7CA91A4226, 0xF7D88BC24209A565}, // 1e121 +- {0x3375788DE9B06958, 0x9AE757596946075F}, // 1e122 +- {0x0052D6B1641C83AE, 0xC1A12D2FC3978937}, // 1e123 +- {0xC0678C5DBD23A49A, 0xF209787BB47D6B84}, // 1e124 +- {0xF840B7BA963646E0, 0x9745EB4D50CE6332}, // 1e125 +- {0xB650E5A93BC3D898, 0xBD176620A501FBFF}, // 1e126 +- {0xA3E51F138AB4CEBE, 0xEC5D3FA8CE427AFF}, // 1e127 +- {0xC66F336C36B10137, 0x93BA47C980E98CDF}, // 1e128 +- {0xB80B0047445D4184, 0xB8A8D9BBE123F017}, // 1e129 +- {0xA60DC059157491E5, 0xE6D3102AD96CEC1D}, // 1e130 +- {0x87C89837AD68DB2F, 0x9043EA1AC7E41392}, // 1e131 +- {0x29BABE4598C311FB, 0xB454E4A179DD1877}, // 1e132 +- {0xF4296DD6FEF3D67A, 0xE16A1DC9D8545E94}, // 1e133 +- {0x1899E4A65F58660C, 0x8CE2529E2734BB1D}, // 1e134 +- {0x5EC05DCFF72E7F8F, 0xB01AE745B101E9E4}, // 1e135 +- {0x76707543F4FA1F73, 0xDC21A1171D42645D}, // 1e136 +- {0x6A06494A791C53A8, 0x899504AE72497EBA}, // 1e137 +- {0x0487DB9D17636892, 0xABFA45DA0EDBDE69}, // 1e138 +- {0x45A9D2845D3C42B6, 0xD6F8D7509292D603}, // 1e139 +- {0x0B8A2392BA45A9B2, 0x865B86925B9BC5C2}, // 1e140 +- {0x8E6CAC7768D7141E, 0xA7F26836F282B732}, // 1e141 +- {0x3207D795430CD926, 0xD1EF0244AF2364FF}, // 1e142 +- {0x7F44E6BD49E807B8, 0x8335616AED761F1F}, // 1e143 +- {0x5F16206C9C6209A6, 0xA402B9C5A8D3A6E7}, // 1e144 +- {0x36DBA887C37A8C0F, 0xCD036837130890A1}, // 1e145 +- {0xC2494954DA2C9789, 0x802221226BE55A64}, // 1e146 +- {0xF2DB9BAA10B7BD6C, 0xA02AA96B06DEB0FD}, // 1e147 +- {0x6F92829494E5ACC7, 0xC83553C5C8965D3D}, // 1e148 +- {0xCB772339BA1F17F9, 0xFA42A8B73ABBF48C}, // 1e149 +- {0xFF2A760414536EFB, 0x9C69A97284B578D7}, // 1e150 +- {0xFEF5138519684ABA, 0xC38413CF25E2D70D}, // 1e151 +- {0x7EB258665FC25D69, 0xF46518C2EF5B8CD1}, // 1e152 +- {0xEF2F773FFBD97A61, 0x98BF2F79D5993802}, // 1e153 +- {0xAAFB550FFACFD8FA, 0xBEEEFB584AFF8603}, // 1e154 +- {0x95BA2A53F983CF38, 0xEEAABA2E5DBF6784}, // 1e155 +- {0xDD945A747BF26183, 0x952AB45CFA97A0B2}, // 1e156 +- {0x94F971119AEEF9E4, 0xBA756174393D88DF}, // 1e157 +- {0x7A37CD5601AAB85D, 0xE912B9D1478CEB17}, // 1e158 +- {0xAC62E055C10AB33A, 0x91ABB422CCB812EE}, // 1e159 +- {0x577B986B314D6009, 0xB616A12B7FE617AA}, // 1e160 +- {0xED5A7E85FDA0B80B, 0xE39C49765FDF9D94}, // 1e161 +- {0x14588F13BE847307, 0x8E41ADE9FBEBC27D}, // 1e162 +- {0x596EB2D8AE258FC8, 0xB1D219647AE6B31C}, // 1e163 +- {0x6FCA5F8ED9AEF3BB, 0xDE469FBD99A05FE3}, // 1e164 +- {0x25DE7BB9480D5854, 0x8AEC23D680043BEE}, // 1e165 +- {0xAF561AA79A10AE6A, 0xADA72CCC20054AE9}, // 1e166 +- {0x1B2BA1518094DA04, 0xD910F7FF28069DA4}, // 1e167 +- {0x90FB44D2F05D0842, 0x87AA9AFF79042286}, // 1e168 +- {0x353A1607AC744A53, 0xA99541BF57452B28}, // 1e169 +- {0x42889B8997915CE8, 0xD3FA922F2D1675F2}, // 1e170 +- {0x69956135FEBADA11, 0x847C9B5D7C2E09B7}, // 1e171 +- {0x43FAB9837E699095, 0xA59BC234DB398C25}, // 1e172 +- {0x94F967E45E03F4BB, 0xCF02B2C21207EF2E}, // 1e173 +- {0x1D1BE0EEBAC278F5, 0x8161AFB94B44F57D}, // 1e174 +- {0x6462D92A69731732, 0xA1BA1BA79E1632DC}, // 1e175 +- {0x7D7B8F7503CFDCFE, 0xCA28A291859BBF93}, // 1e176 +- {0x5CDA735244C3D43E, 0xFCB2CB35E702AF78}, // 1e177 +- {0x3A0888136AFA64A7, 0x9DEFBF01B061ADAB}, // 1e178 +- {0x088AAA1845B8FDD0, 0xC56BAEC21C7A1916}, // 1e179 +- {0x8AAD549E57273D45, 0xF6C69A72A3989F5B}, // 1e180 +- {0x36AC54E2F678864B, 0x9A3C2087A63F6399}, // 1e181 +- {0x84576A1BB416A7DD, 0xC0CB28A98FCF3C7F}, // 1e182 +- {0x656D44A2A11C51D5, 0xF0FDF2D3F3C30B9F}, // 1e183 +- {0x9F644AE5A4B1B325, 0x969EB7C47859E743}, // 1e184 +- {0x873D5D9F0DDE1FEE, 0xBC4665B596706114}, // 1e185 +- {0xA90CB506D155A7EA, 0xEB57FF22FC0C7959}, // 1e186 +- {0x09A7F12442D588F2, 0x9316FF75DD87CBD8}, // 1e187 +- {0x0C11ED6D538AEB2F, 0xB7DCBF5354E9BECE}, // 1e188 +- {0x8F1668C8A86DA5FA, 0xE5D3EF282A242E81}, // 1e189 +- {0xF96E017D694487BC, 0x8FA475791A569D10}, // 1e190 +- {0x37C981DCC395A9AC, 0xB38D92D760EC4455}, // 1e191 +- {0x85BBE253F47B1417, 0xE070F78D3927556A}, // 1e192 +- {0x93956D7478CCEC8E, 0x8C469AB843B89562}, // 1e193 +- {0x387AC8D1970027B2, 0xAF58416654A6BABB}, // 1e194 +- {0x06997B05FCC0319E, 0xDB2E51BFE9D0696A}, // 1e195 +- {0x441FECE3BDF81F03, 0x88FCF317F22241E2}, // 1e196 +- {0xD527E81CAD7626C3, 0xAB3C2FDDEEAAD25A}, // 1e197 +- {0x8A71E223D8D3B074, 0xD60B3BD56A5586F1}, // 1e198 +- {0xF6872D5667844E49, 0x85C7056562757456}, // 1e199 +- {0xB428F8AC016561DB, 0xA738C6BEBB12D16C}, // 1e200 +- {0xE13336D701BEBA52, 0xD106F86E69D785C7}, // 1e201 +- {0xECC0024661173473, 0x82A45B450226B39C}, // 1e202 +- {0x27F002D7F95D0190, 0xA34D721642B06084}, // 1e203 +- {0x31EC038DF7B441F4, 0xCC20CE9BD35C78A5}, // 1e204 +- {0x7E67047175A15271, 0xFF290242C83396CE}, // 1e205 +- {0x0F0062C6E984D386, 0x9F79A169BD203E41}, // 1e206 +- {0x52C07B78A3E60868, 0xC75809C42C684DD1}, // 1e207 +- {0xA7709A56CCDF8A82, 0xF92E0C3537826145}, // 1e208 +- {0x88A66076400BB691, 0x9BBCC7A142B17CCB}, // 1e209 +- {0x6ACFF893D00EA435, 0xC2ABF989935DDBFE}, // 1e210 +- {0x0583F6B8C4124D43, 0xF356F7EBF83552FE}, // 1e211 +- {0xC3727A337A8B704A, 0x98165AF37B2153DE}, // 1e212 +- {0x744F18C0592E4C5C, 0xBE1BF1B059E9A8D6}, // 1e213 +- {0x1162DEF06F79DF73, 0xEDA2EE1C7064130C}, // 1e214 +- {0x8ADDCB5645AC2BA8, 0x9485D4D1C63E8BE7}, // 1e215 +- {0x6D953E2BD7173692, 0xB9A74A0637CE2EE1}, // 1e216 +- {0xC8FA8DB6CCDD0437, 0xE8111C87C5C1BA99}, // 1e217 +- {0x1D9C9892400A22A2, 0x910AB1D4DB9914A0}, // 1e218 +- {0x2503BEB6D00CAB4B, 0xB54D5E4A127F59C8}, // 1e219 +- {0x2E44AE64840FD61D, 0xE2A0B5DC971F303A}, // 1e220 +- {0x5CEAECFED289E5D2, 0x8DA471A9DE737E24}, // 1e221 +- {0x7425A83E872C5F47, 0xB10D8E1456105DAD}, // 1e222 +- {0xD12F124E28F77719, 0xDD50F1996B947518}, // 1e223 +- {0x82BD6B70D99AAA6F, 0x8A5296FFE33CC92F}, // 1e224 +- {0x636CC64D1001550B, 0xACE73CBFDC0BFB7B}, // 1e225 +- {0x3C47F7E05401AA4E, 0xD8210BEFD30EFA5A}, // 1e226 +- {0x65ACFAEC34810A71, 0x8714A775E3E95C78}, // 1e227 +- {0x7F1839A741A14D0D, 0xA8D9D1535CE3B396}, // 1e228 +- {0x1EDE48111209A050, 0xD31045A8341CA07C}, // 1e229 +- {0x934AED0AAB460432, 0x83EA2B892091E44D}, // 1e230 +- {0xF81DA84D5617853F, 0xA4E4B66B68B65D60}, // 1e231 +- {0x36251260AB9D668E, 0xCE1DE40642E3F4B9}, // 1e232 +- {0xC1D72B7C6B426019, 0x80D2AE83E9CE78F3}, // 1e233 +- {0xB24CF65B8612F81F, 0xA1075A24E4421730}, // 1e234 +- {0xDEE033F26797B627, 0xC94930AE1D529CFC}, // 1e235 +- {0x169840EF017DA3B1, 0xFB9B7CD9A4A7443C}, // 1e236 +- {0x8E1F289560EE864E, 0x9D412E0806E88AA5}, // 1e237 +- {0xF1A6F2BAB92A27E2, 0xC491798A08A2AD4E}, // 1e238 +- {0xAE10AF696774B1DB, 0xF5B5D7EC8ACB58A2}, // 1e239 +- {0xACCA6DA1E0A8EF29, 0x9991A6F3D6BF1765}, // 1e240 +- {0x17FD090A58D32AF3, 0xBFF610B0CC6EDD3F}, // 1e241 +- {0xDDFC4B4CEF07F5B0, 0xEFF394DCFF8A948E}, // 1e242 +- {0x4ABDAF101564F98E, 0x95F83D0A1FB69CD9}, // 1e243 +- {0x9D6D1AD41ABE37F1, 0xBB764C4CA7A4440F}, // 1e244 +- {0x84C86189216DC5ED, 0xEA53DF5FD18D5513}, // 1e245 +- {0x32FD3CF5B4E49BB4, 0x92746B9BE2F8552C}, // 1e246 +- {0x3FBC8C33221DC2A1, 0xB7118682DBB66A77}, // 1e247 +- {0x0FABAF3FEAA5334A, 0xE4D5E82392A40515}, // 1e248 +- {0x29CB4D87F2A7400E, 0x8F05B1163BA6832D}, // 1e249 +- {0x743E20E9EF511012, 0xB2C71D5BCA9023F8}, // 1e250 +- {0x914DA9246B255416, 0xDF78E4B2BD342CF6}, // 1e251 +- {0x1AD089B6C2F7548E, 0x8BAB8EEFB6409C1A}, // 1e252 +- {0xA184AC2473B529B1, 0xAE9672ABA3D0C320}, // 1e253 +- {0xC9E5D72D90A2741E, 0xDA3C0F568CC4F3E8}, // 1e254 +- {0x7E2FA67C7A658892, 0x8865899617FB1871}, // 1e255 +- {0xDDBB901B98FEEAB7, 0xAA7EEBFB9DF9DE8D}, // 1e256 +- {0x552A74227F3EA565, 0xD51EA6FA85785631}, // 1e257 +- {0xD53A88958F87275F, 0x8533285C936B35DE}, // 1e258 +- {0x8A892ABAF368F137, 0xA67FF273B8460356}, // 1e259 +- {0x2D2B7569B0432D85, 0xD01FEF10A657842C}, // 1e260 +- {0x9C3B29620E29FC73, 0x8213F56A67F6B29B}, // 1e261 +- {0x8349F3BA91B47B8F, 0xA298F2C501F45F42}, // 1e262 +- {0x241C70A936219A73, 0xCB3F2F7642717713}, // 1e263 +- {0xED238CD383AA0110, 0xFE0EFB53D30DD4D7}, // 1e264 +- {0xF4363804324A40AA, 0x9EC95D1463E8A506}, // 1e265 +- {0xB143C6053EDCD0D5, 0xC67BB4597CE2CE48}, // 1e266 +- {0xDD94B7868E94050A, 0xF81AA16FDC1B81DA}, // 1e267 +- {0xCA7CF2B4191C8326, 0x9B10A4E5E9913128}, // 1e268 +- {0xFD1C2F611F63A3F0, 0xC1D4CE1F63F57D72}, // 1e269 +- {0xBC633B39673C8CEC, 0xF24A01A73CF2DCCF}, // 1e270 +- {0xD5BE0503E085D813, 0x976E41088617CA01}, // 1e271 +- {0x4B2D8644D8A74E18, 0xBD49D14AA79DBC82}, // 1e272 +- {0xDDF8E7D60ED1219E, 0xEC9C459D51852BA2}, // 1e273 +- {0xCABB90E5C942B503, 0x93E1AB8252F33B45}, // 1e274 +- {0x3D6A751F3B936243, 0xB8DA1662E7B00A17}, // 1e275 +- {0x0CC512670A783AD4, 0xE7109BFBA19C0C9D}, // 1e276 +- {0x27FB2B80668B24C5, 0x906A617D450187E2}, // 1e277 +- {0xB1F9F660802DEDF6, 0xB484F9DC9641E9DA}, // 1e278 +- {0x5E7873F8A0396973, 0xE1A63853BBD26451}, // 1e279 +- {0xDB0B487B6423E1E8, 0x8D07E33455637EB2}, // 1e280 +- {0x91CE1A9A3D2CDA62, 0xB049DC016ABC5E5F}, // 1e281 +- {0x7641A140CC7810FB, 0xDC5C5301C56B75F7}, // 1e282 +- {0xA9E904C87FCB0A9D, 0x89B9B3E11B6329BA}, // 1e283 +- {0x546345FA9FBDCD44, 0xAC2820D9623BF429}, // 1e284 +- {0xA97C177947AD4095, 0xD732290FBACAF133}, // 1e285 +- {0x49ED8EABCCCC485D, 0x867F59A9D4BED6C0}, // 1e286 +- {0x5C68F256BFFF5A74, 0xA81F301449EE8C70}, // 1e287 +- {0x73832EEC6FFF3111, 0xD226FC195C6A2F8C}, // 1e288 +-}; ++// ---------------- Auxiliary - JSON + +-// wuffs_base__private_implementation__f64_powers_of_10 holds powers of 10 that +-// can be exactly represented by a float64 (what C calls a double). +-static const double wuffs_base__private_implementation__f64_powers_of_10[23] = { +- 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, +- 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, ++namespace wuffs_aux { ++ ++struct DecodeJsonResult { ++ DecodeJsonResult(std::string&& error_message0, uint64_t cursor_position0); ++ ++ std::string error_message; ++ uint64_t cursor_position; + }; + +-// ---------------- IEEE 754 Floating Point ++class DecodeJsonCallbacks { ++ public: ++ virtual ~DecodeJsonCallbacks(); + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u16 // +-wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(double f) { +- uint64_t u = 0; +- if (sizeof(uint64_t) == sizeof(double)) { +- memcpy(&u, &f, sizeof(uint64_t)); +- } +- uint16_t neg = ((uint16_t)((u >> 63) << 15)); +- u &= 0x7FFFFFFFFFFFFFFF; +- uint64_t exp = u >> 52; +- uint64_t man = u & 0x000FFFFFFFFFFFFF; ++ // AppendXxx are called for leaf nodes: literals, numbers and strings. For ++ // strings, the Callbacks implementation is responsible for tracking map keys ++ // versus other values. + +- if (exp == 0x7FF) { +- if (man == 0) { // Infinity. +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg | 0x7C00; +- ret.lossy = false; +- return ret; +- } +- // NaN. Shift the 52 mantissa bits to 10 mantissa bits, keeping the most +- // significant mantissa bit (quiet vs signaling NaNs). Also set the low 9 +- // bits of ret.value so that the 10-bit mantissa is non-zero. +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg | 0x7DFF | ((uint16_t)(man >> 42)); +- ret.lossy = false; +- return ret; ++ virtual std::string AppendNull() = 0; ++ virtual std::string AppendBool(bool val) = 0; ++ virtual std::string AppendF64(double val) = 0; ++ virtual std::string AppendI64(int64_t val) = 0; ++ virtual std::string AppendTextString(std::string&& val) = 0; + +- } else if (exp > 0x40E) { // Truncate to the largest finite f16. +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg | 0x7BFF; +- ret.lossy = true; +- return ret; ++ // Push and Pop are called for container nodes: JSON arrays (lists) and JSON ++ // objects (dictionaries). ++ // ++ // The flags bits combine exactly one of: ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT ++ // and exactly one of: ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST ++ // - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT + +- } else if (exp <= 0x3E6) { // Truncate to zero. +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg; +- ret.lossy = (u != 0); +- return ret; ++ virtual std::string Push(uint32_t flags) = 0; ++ virtual std::string Pop(uint32_t flags) = 0; + +- } else if (exp <= 0x3F0) { // Normal f64, subnormal f16. +- // Convert from a 53-bit mantissa (after realizing the implicit bit) to a +- // 10-bit mantissa and then adjust for the exponent. +- man |= 0x0010000000000000; +- uint32_t shift = ((uint32_t)(1051 - exp)); // 1051 = 0x3F0 + 53 - 10. +- uint64_t shifted_man = man >> shift; +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg | ((uint16_t)shifted_man); +- ret.lossy = (shifted_man << shift) != man; +- return ret; +- } ++ // Done is always the last Callback method called by DecodeJson, whether or ++ // not parsing the input as JSON encountered an error. Even when successful, ++ // trailing data may remain in input and buffer. See "Unintuitive JSON ++ // Parsing" (https://nullprogram.com/blog/2019/12/28/) which discusses JSON ++ // parsing and when it stops. ++ // ++ // Do not keep a reference to buffer or buffer.data.ptr after Done returns, ++ // as DecodeJson may then de-allocate the backing array. ++ // ++ // The default Done implementation is a no-op. ++ virtual void // ++ Done(DecodeJsonResult& result, sync_io::Input& input, IOBuffer& buffer); ++}; + +- // Normal f64, normal f16. ++extern const char DecodeJson_BadJsonPointer[]; ++extern const char DecodeJson_NoMatch[]; + +- // Re-bias from 1023 to 15 and shift above f16's 10 mantissa bits. +- exp = (exp - 1008) << 10; // 1008 = 1023 - 15 = 0x3FF - 0xF. ++// The FooArgBar types add structure to Foo's optional arguments. They wrap ++// inner representations for several reasons: ++// - It provides a home for the DefaultValue static method, for Foo callers ++// that want to override some but not all optional arguments. ++// - It provides the "Bar" name at Foo call sites, which can help self- ++// document Foo calls with many arguemnts. ++// - It provides some type safety against accidentally transposing or omitting ++// adjacent fundamentally-numeric-typed optional arguments. + +- // Convert from a 52-bit mantissa (excluding the implicit bit) to a 10-bit +- // mantissa (again excluding the implicit bit). We lose some information if +- // any of the bottom 42 bits are non-zero. +- wuffs_base__lossy_value_u16 ret; +- ret.value = neg | ((uint16_t)exp) | ((uint16_t)(man >> 42)); +- ret.lossy = (man << 22) != 0; +- return ret; +-} ++// DecodeJsonArgQuirks wraps an optional argument to DecodeJson. ++struct DecodeJsonArgQuirks { ++ explicit DecodeJsonArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0); + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u32 // +-wuffs_base__ieee_754_bit_representation__from_f64_to_u32_truncate(double f) { +- uint64_t u = 0; +- if (sizeof(uint64_t) == sizeof(double)) { +- memcpy(&u, &f, sizeof(uint64_t)); +- } +- uint32_t neg = ((uint32_t)(u >> 63)) << 31; +- u &= 0x7FFFFFFFFFFFFFFF; +- uint64_t exp = u >> 52; +- uint64_t man = u & 0x000FFFFFFFFFFFFF; ++ // DefaultValue returns an empty slice. ++ static DecodeJsonArgQuirks DefaultValue(); + +- if (exp == 0x7FF) { +- if (man == 0) { // Infinity. +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg | 0x7F800000; +- ret.lossy = false; +- return ret; +- } +- // NaN. Shift the 52 mantissa bits to 23 mantissa bits, keeping the most +- // significant mantissa bit (quiet vs signaling NaNs). Also set the low 22 +- // bits of ret.value so that the 23-bit mantissa is non-zero. +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg | 0x7FBFFFFF | ((uint32_t)(man >> 29)); +- ret.lossy = false; +- return ret; ++ const QuirkKeyValuePair* ptr; ++ const size_t len; ++}; + +- } else if (exp > 0x47E) { // Truncate to the largest finite f32. +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg | 0x7F7FFFFF; +- ret.lossy = true; +- return ret; ++// DecodeJsonArgJsonPointer wraps an optional argument to DecodeJson. ++struct DecodeJsonArgJsonPointer { ++ explicit DecodeJsonArgJsonPointer(std::string repr0); + +- } else if (exp <= 0x369) { // Truncate to zero. +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg; +- ret.lossy = (u != 0); +- return ret; ++ // DefaultValue returns an empty string. ++ static DecodeJsonArgJsonPointer DefaultValue(); + +- } else if (exp <= 0x380) { // Normal f64, subnormal f32. +- // Convert from a 53-bit mantissa (after realizing the implicit bit) to a +- // 23-bit mantissa and then adjust for the exponent. +- man |= 0x0010000000000000; +- uint32_t shift = ((uint32_t)(926 - exp)); // 926 = 0x380 + 53 - 23. +- uint64_t shifted_man = man >> shift; +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg | ((uint32_t)shifted_man); +- ret.lossy = (shifted_man << shift) != man; +- return ret; +- } ++ std::string repr; ++}; + +- // Normal f64, normal f32. ++// DecodeJson calls callbacks based on the JSON-formatted data in input. ++// ++// On success, the returned error_message is empty and cursor_position counts ++// the number of bytes consumed. On failure, error_message is non-empty and ++// cursor_position is the location of the error. That error may be a content ++// error (invalid JSON) or an input error (e.g. network failure). ++// ++// json_pointer is a query in the JSON Pointer (RFC 6901) syntax. The callbacks ++// run for the input's sub-node that matches the query. DecodeJson_NoMatch is ++// returned if no matching sub-node was found. The empty query matches the ++// input's root node, consistent with JSON Pointer semantics. ++// ++// The JSON Pointer implementation is greedy: duplicate keys are not rejected ++// but only the first match for each '/'-separated fragment is followed. ++DecodeJsonResult // ++DecodeJson(DecodeJsonCallbacks& callbacks, ++ sync_io::Input& input, ++ DecodeJsonArgQuirks quirks = DecodeJsonArgQuirks::DefaultValue(), ++ DecodeJsonArgJsonPointer json_pointer = ++ DecodeJsonArgJsonPointer::DefaultValue()); + +- // Re-bias from 1023 to 127 and shift above f32's 23 mantissa bits. +- exp = (exp - 896) << 23; // 896 = 1023 - 127 = 0x3FF - 0x7F. ++} // namespace wuffs_aux + +- // Convert from a 52-bit mantissa (excluding the implicit bit) to a 23-bit +- // mantissa (again excluding the implicit bit). We lose some information if +- // any of the bottom 29 bits are non-zero. +- wuffs_base__lossy_value_u32 ret; +- ret.value = neg | ((uint32_t)exp) | ((uint32_t)(man >> 29)); +- ret.lossy = (man << 35) != 0; +- return ret; +-} ++#endif // defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +-// -------- ++// ‼ WUFFS C HEADER ENDS HERE. ++#ifdef WUFFS_IMPLEMENTATION + +-#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE 2047 +-#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION 800 ++#ifdef __cplusplus ++extern "C" { ++#endif + +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL is the largest N +-// such that ((10 << N) < (1 << 64)). +-#define WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL 60 ++// ---------------- Fundamentals + +-// wuffs_base__private_implementation__high_prec_dec (abbreviated as HPD) is a +-// fixed precision floating point decimal number, augmented with ±infinity +-// values, but it cannot represent NaN (Not a Number). ++// WUFFS_BASE__MAGIC is a magic number to check that initializers are called. ++// It's not foolproof, given C doesn't automatically zero memory before use, ++// but it should catch 99.99% of cases. + // +-// "High precision" means that the mantissa holds 800 decimal digits. 800 is +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION. ++// Its (non-zero) value is arbitrary, based on md5sum("wuffs"). ++#define WUFFS_BASE__MAGIC ((uint32_t)0x3CCB6C71) ++ ++// WUFFS_BASE__DISABLED is a magic number to indicate that a non-recoverable ++// error was previously encountered. + // +-// An HPD isn't for general purpose arithmetic, only for conversions to and +-// from IEEE 754 double-precision floating point, where the largest and +-// smallest positive, finite values are approximately 1.8e+308 and 4.9e-324. +-// HPD exponents above +2047 mean infinity, below -2047 mean zero. The ±2047 +-// bounds are further away from zero than ±(324 + 800), where 800 and 2047 is +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION and +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE. ++// Its (non-zero) value is arbitrary, based on md5sum("disabled"). ++#define WUFFS_BASE__DISABLED ((uint32_t)0x075AE3D2) ++ ++// Use switch cases for coroutine suspension points, similar to the technique ++// in https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html + // +-// digits[.. num_digits] are the number's digits in big-endian order. The +-// uint8_t values are in the range [0 ..= 9], not ['0' ..= '9'], where e.g. '7' +-// is the ASCII value 0x37. ++// The implicit fallthrough is intentional. + // +-// decimal_point is the index (within digits) of the decimal point. It may be +-// negative or be larger than num_digits, in which case the explicit digits are +-// padded with implicit zeroes. ++// We use trivial macros instead of an explicit assignment and case statement ++// so that clang-format doesn't get confused by the unusual "case"s. ++#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0 case 0:; ++#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT(n) \ ++ coro_susp_point = n; \ ++ case n:; ++ ++#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \ ++ if (!status.repr) { \ ++ goto ok; \ ++ } else if (*status.repr != '$') { \ ++ goto exit; \ ++ } \ ++ coro_susp_point = n; \ ++ goto suspend; \ ++ case n:; ++ ++// The "defined(__clang__)" isn't redundant. While vanilla clang defines ++// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not. ++#if defined(__GNUC__) || defined(__clang__) ++#define WUFFS_BASE__LIKELY(expr) (__builtin_expect(!!(expr), 1)) ++#define WUFFS_BASE__UNLIKELY(expr) (__builtin_expect(!!(expr), 0)) ++#else ++#define WUFFS_BASE__LIKELY(expr) (expr) ++#define WUFFS_BASE__UNLIKELY(expr) (expr) ++#endif ++ ++// -------- ++ ++static inline wuffs_base__empty_struct // ++wuffs_private_impl__ignore_status(wuffs_base__status z) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++static inline wuffs_base__status // ++wuffs_private_impl__status__ensure_not_a_suspension(wuffs_base__status z) { ++ if (z.repr && (*z.repr == '$')) { ++ z.repr = wuffs_base__error__cannot_return_a_suspension; ++ } ++ return z; ++} ++ ++// -------- ++ ++// wuffs_private_impl__iterate_total_advance returns the exclusive ++// pointer-offset at which iteration should stop. The overall slice has length ++// total_len, each iteration's sub-slice has length iter_len and are placed ++// iter_advance apart. + // +-// For example, if num_digits is 3 and digits is "\x07\x08\x09": +-// - A decimal_point of -2 means ".00789" +-// - A decimal_point of -1 means ".0789" +-// - A decimal_point of +0 means ".789" +-// - A decimal_point of +1 means "7.89" +-// - A decimal_point of +2 means "78.9" +-// - A decimal_point of +3 means "789." +-// - A decimal_point of +4 means "7890." +-// - A decimal_point of +5 means "78900." ++// The iter_advance may not be larger than iter_len. The iter_advance may be ++// smaller than iter_len, in which case the sub-slices will overlap. + // +-// As above, a decimal_point higher than +2047 means that the overall value is +-// infinity, lower than -2047 means zero. ++// The return value r satisfies ((0 <= r) && (r <= total_len)). + // +-// negative is a sign bit. An HPD can distinguish positive and negative zero. ++// For example, if total_len = 15, iter_len = 5 and iter_advance = 3, there are ++// four iterations at offsets 0, 3, 6 and 9. This function returns 12. + // +-// truncated is whether there are more than +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION digits, and at +-// least one of those extra digits are non-zero. The existence of long-tail +-// digits can affect rounding. ++// 0123456789012345 ++// [....] ++// [....] ++// [....] ++// [....] ++// $ ++// 0123456789012345 + // +-// The "all fields are zero" value is valid, and represents the number +0. +-typedef struct wuffs_base__private_implementation__high_prec_dec__struct { +- uint32_t num_digits; +- int32_t decimal_point; +- bool negative; +- bool truncated; +- uint8_t digits[WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION]; +-} wuffs_base__private_implementation__high_prec_dec; +- +-// wuffs_base__private_implementation__high_prec_dec__trim trims trailing +-// zeroes from the h->digits[.. h->num_digits] slice. They have no benefit, +-// since we explicitly track h->decimal_point. ++// For example, if total_len = 15, iter_len = 5 and iter_advance = 5, there are ++// three iterations at offsets 0, 5 and 10. This function returns 15. + // +-// Preconditions: +-// - h is non-NULL. +-static inline void // +-wuffs_base__private_implementation__high_prec_dec__trim( +- wuffs_base__private_implementation__high_prec_dec* h) { +- while ((h->num_digits > 0) && (h->digits[h->num_digits - 1] == 0)) { +- h->num_digits--; ++// 0123456789012345 ++// [....] ++// [....] ++// [....] ++// $ ++// 0123456789012345 ++static inline size_t // ++wuffs_private_impl__iterate_total_advance(size_t total_len, ++ size_t iter_len, ++ size_t iter_advance) { ++ if (total_len >= iter_len) { ++ size_t n = total_len - iter_len; ++ return ((n / iter_advance) * iter_advance) + iter_advance; + } ++ return 0; + } + +-// wuffs_base__private_implementation__high_prec_dec__assign sets h to +-// represent the number x. +-// +-// Preconditions: +-// - h is non-NULL. +-static void // +-wuffs_base__private_implementation__high_prec_dec__assign( +- wuffs_base__private_implementation__high_prec_dec* h, +- uint64_t x, +- bool negative) { +- uint32_t n = 0; ++// ---------------- Numeric Types + +- // Set h->digits. +- if (x > 0) { +- // Calculate the digits, working right-to-left. After we determine n (how +- // many digits there are), copy from buf to h->digits. +- // +- // UINT64_MAX, 18446744073709551615, is 20 digits long. It can be faster to +- // copy a constant number of bytes than a variable number (20 instead of +- // n). Make buf large enough (and start writing to it from the middle) so +- // that can we always copy 20 bytes: the slice buf[(20-n) .. (40-n)]. +- uint8_t buf[40] = {0}; +- uint8_t* ptr = &buf[20]; +- do { +- uint64_t remaining = x / 10; +- x -= remaining * 10; +- ptr--; +- *ptr = (uint8_t)x; +- n++; +- x = remaining; +- } while (x > 0); +- memcpy(h->digits, ptr, 20); +- } ++extern const uint8_t wuffs_private_impl__low_bits_mask__u8[8]; ++extern const uint16_t wuffs_private_impl__low_bits_mask__u16[16]; ++extern const uint32_t wuffs_private_impl__low_bits_mask__u32[32]; ++extern const uint64_t wuffs_private_impl__low_bits_mask__u64[64]; + +- // Set h's other fields. +- h->num_digits = n; +- h->decimal_point = (int32_t)n; +- h->negative = negative; +- h->truncated = false; +- wuffs_base__private_implementation__high_prec_dec__trim(h); ++#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U8(n) \ ++ (wuffs_private_impl__low_bits_mask__u8[n]) ++#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U16(n) \ ++ (wuffs_private_impl__low_bits_mask__u16[n]) ++#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(n) \ ++ (wuffs_private_impl__low_bits_mask__u32[n]) ++#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(n) \ ++ (wuffs_private_impl__low_bits_mask__u64[n]) ++ ++// -------- ++ ++static inline void // ++wuffs_private_impl__u8__sat_add_indirect(uint8_t* x, uint8_t y) { ++ *x = wuffs_base__u8__sat_add(*x, y); + } + +-static wuffs_base__status // +-wuffs_base__private_implementation__high_prec_dec__parse( +- wuffs_base__private_implementation__high_prec_dec* h, +- wuffs_base__slice_u8 s, +- uint32_t options) { +- if (!h) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- h->num_digits = 0; +- h->decimal_point = 0; +- h->negative = false; +- h->truncated = false; ++static inline void // ++wuffs_private_impl__u8__sat_sub_indirect(uint8_t* x, uint8_t y) { ++ *x = wuffs_base__u8__sat_sub(*x, y); ++} + +- uint8_t* p = s.ptr; +- uint8_t* q = s.ptr + s.len; ++static inline void // ++wuffs_private_impl__u16__sat_add_indirect(uint16_t* x, uint16_t y) { ++ *x = wuffs_base__u16__sat_add(*x, y); ++} + +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (;; p++) { +- if (p >= q) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } else if (*p != '_') { +- break; +- } +- } +- } ++static inline void // ++wuffs_private_impl__u16__sat_sub_indirect(uint16_t* x, uint16_t y) { ++ *x = wuffs_base__u16__sat_sub(*x, y); ++} + +- // Parse sign. +- do { +- if (*p == '+') { +- p++; +- } else if (*p == '-') { +- h->negative = true; +- p++; +- } else { +- break; +- } +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (;; p++) { +- if (p >= q) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } else if (*p != '_') { +- break; +- } +- } +- } +- } while (0); ++static inline void // ++wuffs_private_impl__u32__sat_add_indirect(uint32_t* x, uint32_t y) { ++ *x = wuffs_base__u32__sat_add(*x, y); ++} + +- // Parse digits, up to (and including) a '.', 'E' or 'e'. Examples for each +- // limb in this if-else chain: +- // - "0.789" +- // - "1002.789" +- // - ".789" +- // - Other (invalid input). +- uint32_t nd = 0; +- int32_t dp = 0; +- bool no_digits_before_separator = false; +- if (('0' == *p) && +- !(options & +- WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES)) { +- p++; +- for (;; p++) { +- if (p >= q) { +- goto after_all; +- } else if (*p == +- ((options & +- WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.')) { +- p++; +- goto after_sep; +- } else if ((*p == 'E') || (*p == 'e')) { +- p++; +- goto after_exp; +- } else if ((*p != '_') || +- !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- } ++static inline void // ++wuffs_private_impl__u32__sat_sub_indirect(uint32_t* x, uint32_t y) { ++ *x = wuffs_base__u32__sat_sub(*x, y); ++} + +- } else if (('0' <= *p) && (*p <= '9')) { +- if (*p == '0') { +- for (; (p < q) && (*p == '0'); p++) { +- } +- } else { +- h->digits[nd++] = (uint8_t)(*p - '0'); +- dp = (int32_t)nd; +- p++; +- } ++static inline void // ++wuffs_private_impl__u64__sat_add_indirect(uint64_t* x, uint64_t y) { ++ *x = wuffs_base__u64__sat_add(*x, y); ++} + +- for (;; p++) { +- if (p >= q) { +- goto after_all; +- } else if (('0' <= *p) && (*p <= '9')) { +- if (nd < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[nd++] = (uint8_t)(*p - '0'); +- dp = (int32_t)nd; +- } else if ('0' != *p) { +- // Long-tail non-zeroes set the truncated bit. +- h->truncated = true; +- } +- } else if (*p == +- ((options & +- WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.')) { +- p++; +- goto after_sep; +- } else if ((*p == 'E') || (*p == 'e')) { +- p++; +- goto after_exp; +- } else if ((*p != '_') || +- !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- } ++static inline void // ++wuffs_private_impl__u64__sat_sub_indirect(uint64_t* x, uint64_t y) { ++ *x = wuffs_base__u64__sat_sub(*x, y); ++} + +- } else if (*p == ((options & +- WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.')) { +- p++; +- no_digits_before_separator = true; ++// ---------------- Numeric Types (Utility) + +- } else { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } ++#define wuffs_base__utility__sign_extend_convert_u8_u32(a) \ ++ ((uint32_t)(int32_t)(int8_t)(a)) + +-after_sep: +- for (;; p++) { +- if (p >= q) { +- goto after_all; +- } else if ('0' == *p) { +- if (nd == 0) { +- // Track leading zeroes implicitly. +- dp--; +- } else if (nd < +- WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[nd++] = (uint8_t)(*p - '0'); +- } +- } else if (('0' < *p) && (*p <= '9')) { +- if (nd < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[nd++] = (uint8_t)(*p - '0'); +- } else { +- // Long-tail non-zeroes set the truncated bit. +- h->truncated = true; +- } +- } else if ((*p == 'E') || (*p == 'e')) { +- p++; +- goto after_exp; +- } else if ((*p != '_') || +- !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- } ++#define wuffs_base__utility__sign_extend_convert_u16_u32(a) \ ++ ((uint32_t)(int32_t)(int16_t)(a)) + +-after_exp: +- do { +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (;; p++) { +- if (p >= q) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } else if (*p != '_') { +- break; +- } +- } +- } ++#define wuffs_base__utility__sign_extend_rshift_u32(a, n) \ ++ ((uint32_t)(((int32_t)(a)) >> (n))) + +- int32_t exp_sign = +1; +- if (*p == '+') { +- p++; +- } else if (*p == '-') { +- exp_sign = -1; +- p++; +- } ++#define wuffs_base__utility__sign_extend_rshift_u64(a, n) \ ++ ((uint64_t)(((int64_t)(a)) >> (n))) + +- int32_t exp = 0; +- const int32_t exp_large = +- WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE + +- WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION; +- bool saw_exp_digits = false; +- for (; p < q; p++) { +- if ((*p == '_') && +- (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- // No-op. +- } else if (('0' <= *p) && (*p <= '9')) { +- saw_exp_digits = true; +- if (exp < exp_large) { +- exp = (10 * exp) + ((int32_t)(*p - '0')); +- } +- } else { +- break; +- } +- } +- if (!saw_exp_digits) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- dp += exp_sign * exp; +- } while (0); ++#define wuffs_base__utility__make_bitvec256(e00, e01, e02, e03) \ ++ wuffs_base__make_bitvec256(e00, e01, e02, e03) + +-after_all: +- if (p != q) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- h->num_digits = nd; +- if (nd == 0) { +- if (no_digits_before_separator) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- h->decimal_point = 0; +- } else if (dp < +- -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { +- h->decimal_point = +- -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE - 1; +- } else if (dp > +- +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { +- h->decimal_point = +- +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE + 1; +- } else { +- h->decimal_point = dp; +- } +- wuffs_base__private_implementation__high_prec_dec__trim(h); +- return wuffs_base__make_status(NULL); +-} ++#define wuffs_base__utility__make_optional_u63(h, v) \ ++ wuffs_base__make_optional_u63(h, v) + +-// -------- ++// ---------------- Slices and Tables + +-// wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits +-// returns the number of additional decimal digits when left-shifting by shift. ++// This function basically returns (ptr + len), except that that expression is ++// Undefined Behavior in C (but not C++) when ptr is NULL, even if len is zero. + // +-// See below for preconditions. +-static uint32_t // +-wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits( +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t shift) { +- // Masking with 0x3F should be unnecessary (assuming the preconditions) but +- // it's cheap and ensures that we don't overflow the +- // wuffs_base__private_implementation__hpd_left_shift array. +- shift &= 63; ++// Precondition: (ptr != NULL) || (len == 0). ++static inline const uint8_t* // ++wuffs_private_impl__ptr_u8_plus_len(const uint8_t* ptr, size_t len) { ++ return ptr ? (ptr + len) : NULL; ++} + +- uint32_t x_a = wuffs_base__private_implementation__hpd_left_shift[shift]; +- uint32_t x_b = wuffs_base__private_implementation__hpd_left_shift[shift + 1]; +- uint32_t num_new_digits = x_a >> 11; +- uint32_t pow5_a = 0x7FF & x_a; +- uint32_t pow5_b = 0x7FF & x_b; ++// -------- + +- const uint8_t* pow5 = +- &wuffs_base__private_implementation__powers_of_5[pow5_a]; +- uint32_t i = 0; +- uint32_t n = pow5_b - pow5_a; +- for (; i < n; i++) { +- if (i >= h->num_digits) { +- return num_new_digits - 1; +- } else if (h->digits[i] == pow5[i]) { +- continue; +- } else if (h->digits[i] < pow5[i]) { +- return num_new_digits - 1; +- } else { +- return num_new_digits; +- } ++// wuffs_private_impl__slice_u8__prefix returns up to the first up_to bytes of ++// s. ++static inline wuffs_base__slice_u8 // ++wuffs_private_impl__slice_u8__prefix(wuffs_base__slice_u8 s, uint64_t up_to) { ++ if (((uint64_t)(s.len)) > up_to) { ++ s.len = ((size_t)up_to); + } +- return num_new_digits; ++ return s; + } + +-// -------- ++// wuffs_private_impl__slice_u8__suffix returns up to the last up_to bytes of ++// s. ++static inline wuffs_base__slice_u8 // ++wuffs_private_impl__slice_u8__suffix(wuffs_base__slice_u8 s, uint64_t up_to) { ++ if (((uint64_t)(s.len)) > up_to) { ++ s.ptr += ((uint64_t)(s.len)) - up_to; ++ s.len = ((size_t)up_to); ++ } ++ return s; ++} + +-// wuffs_base__private_implementation__high_prec_dec__rounded_integer returns +-// the integral (non-fractional) part of h, provided that it is 18 or fewer +-// decimal digits. For 19 or more digits, it returns UINT64_MAX. Note that: +-// - (1 << 53) is 9007199254740992, which has 16 decimal digits. +-// - (1 << 56) is 72057594037927936, which has 17 decimal digits. +-// - (1 << 59) is 576460752303423488, which has 18 decimal digits. +-// - (1 << 63) is 9223372036854775808, which has 19 decimal digits. +-// and that IEEE 754 double precision has 52 mantissa bits. ++// wuffs_private_impl__slice_u8__copy_from_slice calls memmove(dst.ptr, ++// src.ptr, len) where len is the minimum of dst.len and src.len. + // +-// That integral part is rounded-to-even: rounding 7.5 or 8.5 both give 8. +-// +-// h's negative bit is ignored: rounding -8.6 returns 9. +-// +-// See below for preconditions. +-static uint64_t // +-wuffs_base__private_implementation__high_prec_dec__rounded_integer( +- wuffs_base__private_implementation__high_prec_dec* h) { +- if ((h->num_digits == 0) || (h->decimal_point < 0)) { +- return 0; +- } else if (h->decimal_point > 18) { +- return UINT64_MAX; ++// Passing a wuffs_base__slice_u8 with all fields NULL or zero (a valid, empty ++// slice) is valid and results in a no-op. ++static inline uint64_t // ++wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src) { ++ size_t len = dst.len < src.len ? dst.len : src.len; ++ if (len > 0) { ++ memmove(dst.ptr, src.ptr, len); + } ++ return len; ++} + +- uint32_t dp = (uint32_t)(h->decimal_point); +- uint64_t n = 0; +- uint32_t i = 0; +- for (; i < dp; i++) { +- n = (10 * n) + ((i < h->num_digits) ? h->digits[i] : 0); ++static inline wuffs_base__empty_struct // ++wuffs_private_impl__bulk_load_host_endian(void* ptr, ++ size_t len, ++ wuffs_base__slice_u8 src) { ++ if (len && (len <= src.len)) { ++ memmove(ptr, src.ptr, len); + } ++ return wuffs_base__make_empty_struct(); ++} + +- bool round_up = false; +- if (dp < h->num_digits) { +- round_up = h->digits[dp] >= 5; +- if ((h->digits[dp] == 5) && (dp + 1 == h->num_digits)) { +- // We are exactly halfway. If we're truncated, round up, otherwise round +- // to even. +- round_up = h->truncated || // +- ((dp > 0) && (1 & h->digits[dp - 1])); +- } +- } +- if (round_up) { +- n++; ++static inline wuffs_base__empty_struct // ++wuffs_private_impl__bulk_memset(void* ptr, size_t len, uint8_t byte_value) { ++ if (len) { ++ memset(ptr, byte_value, len); + } ++ return wuffs_base__make_empty_struct(); ++} + +- return n; ++static inline wuffs_base__empty_struct // ++wuffs_private_impl__bulk_save_host_endian(void* ptr, ++ size_t len, ++ wuffs_base__slice_u8 dst) { ++ if (len && (len <= dst.len)) { ++ memmove(dst.ptr, ptr, len); ++ } ++ return wuffs_base__make_empty_struct(); + } + +-// wuffs_base__private_implementation__high_prec_dec__small_xshift shifts h's +-// number (where 'x' is 'l' or 'r' for left or right) by a small shift value. +-// +-// Preconditions: +-// - h is non-NULL. +-// - h->decimal_point is "not extreme". +-// - shift is non-zero. +-// - shift is "a small shift". +-// +-// "Not extreme" means within +-// ±WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE. +-// +-// "A small shift" means not more than +-// WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL. +-// +-// wuffs_base__private_implementation__high_prec_dec__rounded_integer and +-// wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits +-// have the same preconditions. +-// +-// wuffs_base__private_implementation__high_prec_dec__lshift keeps the first +-// two preconditions but not the last two. Its shift argument is signed and +-// does not need to be "small": zero is a no-op, positive means left shift and +-// negative means right shift. ++// -------- + +-static void // +-wuffs_base__private_implementation__high_prec_dec__small_lshift( +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t shift) { +- if (h->num_digits == 0) { +- return; ++static inline wuffs_base__slice_u8 // ++wuffs_private_impl__table_u8__row_u32(wuffs_base__table_u8 t, uint32_t y) { ++ if (t.ptr && (y < t.height)) { ++ return wuffs_base__make_slice_u8(t.ptr + (t.stride * y), t.width); + } +- uint32_t num_new_digits = +- wuffs_base__private_implementation__high_prec_dec__lshift_num_new_digits( +- h, shift); +- uint32_t rx = h->num_digits - 1; // Read index. +- uint32_t wx = h->num_digits - 1 + num_new_digits; // Write index. +- uint64_t n = 0; ++ return wuffs_base__empty_slice_u8(); ++} + +- // Repeat: pick up a digit, put down a digit, right to left. +- while (((int32_t)rx) >= 0) { +- n += ((uint64_t)(h->digits[rx])) << shift; +- uint64_t quo = n / 10; +- uint64_t rem = n - (10 * quo); +- if (wx < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[wx] = (uint8_t)rem; +- } else if (rem > 0) { +- h->truncated = true; +- } +- n = quo; +- wx--; +- rx--; +- } ++// ---------------- Slices and Tables (Utility) + +- // Put down leading digits, right to left. +- while (n > 0) { +- uint64_t quo = n / 10; +- uint64_t rem = n - (10 * quo); +- if (wx < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[wx] = (uint8_t)rem; +- } else if (rem > 0) { +- h->truncated = true; +- } +- n = quo; +- wx--; +- } ++#define wuffs_base__utility__empty_slice_u8 wuffs_base__empty_slice_u8 + +- // Finish. +- h->num_digits += num_new_digits; +- if (h->num_digits > +- WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->num_digits = WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION; +- } +- h->decimal_point += (int32_t)num_new_digits; +- wuffs_base__private_implementation__high_prec_dec__trim(h); ++// ---------------- Ranges and Rects ++ ++static inline uint32_t // ++wuffs_private_impl__range_ii_u32__get_min_incl( ++ const wuffs_base__range_ii_u32* r) { ++ return r->min_incl; + } + +-static void // +-wuffs_base__private_implementation__high_prec_dec__small_rshift( +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t shift) { +- uint32_t rx = 0; // Read index. +- uint32_t wx = 0; // Write index. +- uint64_t n = 0; ++static inline uint32_t // ++wuffs_private_impl__range_ii_u32__get_max_incl( ++ const wuffs_base__range_ii_u32* r) { ++ return r->max_incl; ++} + +- // Pick up enough leading digits to cover the first shift. +- while ((n >> shift) == 0) { +- if (rx < h->num_digits) { +- // Read a digit. +- n = (10 * n) + h->digits[rx++]; +- } else if (n == 0) { +- // h's number used to be zero and remains zero. +- return; +- } else { +- // Read sufficient implicit trailing zeroes. +- while ((n >> shift) == 0) { +- n = 10 * n; +- rx++; +- } +- break; +- } +- } +- h->decimal_point -= ((int32_t)(rx - 1)); +- if (h->decimal_point < +- -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { +- // After the shift, h's number is effectively zero. +- h->num_digits = 0; +- h->decimal_point = 0; +- h->truncated = false; +- return; +- } ++static inline uint32_t // ++wuffs_private_impl__range_ie_u32__get_min_incl( ++ const wuffs_base__range_ie_u32* r) { ++ return r->min_incl; ++} + +- // Repeat: pick up a digit, put down a digit, left to right. +- uint64_t mask = (((uint64_t)(1)) << shift) - 1; +- while (rx < h->num_digits) { +- uint8_t new_digit = ((uint8_t)(n >> shift)); +- n = (10 * (n & mask)) + h->digits[rx++]; +- h->digits[wx++] = new_digit; +- } ++static inline uint32_t // ++wuffs_private_impl__range_ie_u32__get_max_excl( ++ const wuffs_base__range_ie_u32* r) { ++ return r->max_excl; ++} + +- // Put down trailing digits, left to right. +- while (n > 0) { +- uint8_t new_digit = ((uint8_t)(n >> shift)); +- n = 10 * (n & mask); +- if (wx < WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DIGITS_PRECISION) { +- h->digits[wx++] = new_digit; +- } else if (new_digit > 0) { +- h->truncated = true; +- } +- } ++static inline uint64_t // ++wuffs_private_impl__range_ii_u64__get_min_incl( ++ const wuffs_base__range_ii_u64* r) { ++ return r->min_incl; ++} + +- // Finish. +- h->num_digits = wx; +- wuffs_base__private_implementation__high_prec_dec__trim(h); ++static inline uint64_t // ++wuffs_private_impl__range_ii_u64__get_max_incl( ++ const wuffs_base__range_ii_u64* r) { ++ return r->max_incl; + } + +-static void // +-wuffs_base__private_implementation__high_prec_dec__lshift( +- wuffs_base__private_implementation__high_prec_dec* h, +- int32_t shift) { +- if (shift > 0) { +- while (shift > +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) { +- wuffs_base__private_implementation__high_prec_dec__small_lshift( +- h, WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL); +- shift -= WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; +- } +- wuffs_base__private_implementation__high_prec_dec__small_lshift( +- h, ((uint32_t)(+shift))); +- } else if (shift < 0) { +- while (shift < -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) { +- wuffs_base__private_implementation__high_prec_dec__small_rshift( +- h, WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL); +- shift += WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; +- } +- wuffs_base__private_implementation__high_prec_dec__small_rshift( +- h, ((uint32_t)(-shift))); +- } ++static inline uint64_t // ++wuffs_private_impl__range_ie_u64__get_min_incl( ++ const wuffs_base__range_ie_u64* r) { ++ return r->min_incl; + } + +-// -------- ++static inline uint64_t // ++wuffs_private_impl__range_ie_u64__get_max_excl( ++ const wuffs_base__range_ie_u64* r) { ++ return r->max_excl; ++} + +-// wuffs_base__private_implementation__high_prec_dec__round_etc rounds h's +-// number. For those functions that take an n argument, rounding produces at +-// most n digits (which is not necessarily at most n decimal places). Negative +-// n values are ignored, as well as any n greater than or equal to h's number +-// of digits. The etc__round_just_enough function implicitly chooses an n to +-// implement WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION. +-// +-// Preconditions: +-// - h is non-NULL. +-// - h->decimal_point is "not extreme". +-// +-// "Not extreme" means within +-// ±WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE. ++// ---------------- Ranges and Rects (Utility) + +-static void // +-wuffs_base__private_implementation__high_prec_dec__round_down( +- wuffs_base__private_implementation__high_prec_dec* h, +- int32_t n) { +- if ((n < 0) || (h->num_digits <= (uint32_t)n)) { +- return; ++#define wuffs_base__utility__empty_range_ii_u32 wuffs_base__empty_range_ii_u32 ++#define wuffs_base__utility__empty_range_ie_u32 wuffs_base__empty_range_ie_u32 ++#define wuffs_base__utility__empty_range_ii_u64 wuffs_base__empty_range_ii_u64 ++#define wuffs_base__utility__empty_range_ie_u64 wuffs_base__empty_range_ie_u64 ++#define wuffs_base__utility__empty_rect_ii_u32 wuffs_base__empty_rect_ii_u32 ++#define wuffs_base__utility__empty_rect_ie_u32 wuffs_base__empty_rect_ie_u32 ++#define wuffs_base__utility__make_range_ii_u32 wuffs_base__make_range_ii_u32 ++#define wuffs_base__utility__make_range_ie_u32 wuffs_base__make_range_ie_u32 ++#define wuffs_base__utility__make_range_ii_u64 wuffs_base__make_range_ii_u64 ++#define wuffs_base__utility__make_range_ie_u64 wuffs_base__make_range_ie_u64 ++#define wuffs_base__utility__make_rect_ii_u32 wuffs_base__make_rect_ii_u32 ++#define wuffs_base__utility__make_rect_ie_u32 wuffs_base__make_rect_ie_u32 ++ ++// ---------------- I/O ++ ++static inline uint64_t // ++wuffs_private_impl__io__count_since(uint64_t mark, uint64_t index) { ++ if (index >= mark) { ++ return index - mark; + } +- h->num_digits = (uint32_t)(n); +- wuffs_base__private_implementation__high_prec_dec__trim(h); ++ return 0; + } + +-static void // +-wuffs_base__private_implementation__high_prec_dec__round_up( +- wuffs_base__private_implementation__high_prec_dec* h, +- int32_t n) { +- if ((n < 0) || (h->num_digits <= (uint32_t)n)) { +- return; ++// TODO: drop the "const" in "const uint8_t* ptr". Some though required about ++// the base.io_reader.since method returning a mutable "slice base.u8". ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wcast-qual" ++#endif ++static inline wuffs_base__slice_u8 // ++wuffs_private_impl__io__since(uint64_t mark, ++ uint64_t index, ++ const uint8_t* ptr) { ++ if (index >= mark) { ++ return wuffs_base__make_slice_u8(((uint8_t*)ptr) + mark, ++ ((size_t)(index - mark))); + } ++ return wuffs_base__empty_slice_u8(); ++} ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif + +- for (n--; n >= 0; n--) { +- if (h->digits[n] < 9) { +- h->digits[n]++; +- h->num_digits = (uint32_t)(n + 1); +- return; +- } +- } ++// -------- + +- // The number is all 9s. Change to a single 1 and adjust the decimal point. +- h->digits[0] = 1; +- h->num_digits = 1; +- h->decimal_point++; ++static inline void // ++wuffs_private_impl__io_reader__limit(const uint8_t** ptr_io2_r, ++ const uint8_t* iop_r, ++ uint64_t limit) { ++ if (((uint64_t)(*ptr_io2_r - iop_r)) > limit) { ++ *ptr_io2_r = iop_r + limit; ++ } + } + +-static void // +-wuffs_base__private_implementation__high_prec_dec__round_nearest( +- wuffs_base__private_implementation__high_prec_dec* h, +- int32_t n) { +- if ((n < 0) || (h->num_digits <= (uint32_t)n)) { +- return; ++static inline uint32_t // ++wuffs_private_impl__io_reader__limited_copy_u32_to_slice( ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r, ++ uint32_t length, ++ wuffs_base__slice_u8 dst) { ++ const uint8_t* iop_r = *ptr_iop_r; ++ size_t n = dst.len; ++ if (n > length) { ++ n = length; + } +- bool up = h->digits[n] >= 5; +- if ((h->digits[n] == 5) && ((n + 1) == ((int32_t)(h->num_digits)))) { +- up = h->truncated || // +- ((n > 0) && ((h->digits[n - 1] & 1) != 0)); ++ if (n > ((size_t)(io2_r - iop_r))) { ++ n = (size_t)(io2_r - iop_r); + } +- +- if (up) { +- wuffs_base__private_implementation__high_prec_dec__round_up(h, n); +- } else { +- wuffs_base__private_implementation__high_prec_dec__round_down(h, n); ++ if (n > 0) { ++ memmove(dst.ptr, iop_r, n); ++ *ptr_iop_r += n; + } ++ return (uint32_t)(n); + } + +-static void // +-wuffs_base__private_implementation__high_prec_dec__round_just_enough( +- wuffs_base__private_implementation__high_prec_dec* h, +- int32_t exp2, +- uint64_t mantissa) { +- // The magic numbers 52 and 53 in this function are because IEEE 754 double +- // precision has 52 mantissa bits. +- // +- // Let f be the floating point number represented by exp2 and mantissa (and +- // also the number in h): the number (mantissa * (2 ** (exp2 - 52))). +- // +- // If f is zero or a small integer, we can return early. +- if ((mantissa == 0) || +- ((exp2 < 53) && (h->decimal_point >= ((int32_t)(h->num_digits))))) { +- return; ++// wuffs_private_impl__io_reader__match7 returns whether the io_reader's ++// upcoming bytes start with the given prefix (up to 7 bytes long). It is ++// peek-like, not read-like, in that there are no side-effects. ++// ++// The low 3 bits of a hold the prefix length, n. ++// ++// The high 56 bits of a hold the prefix itself, in little-endian order. The ++// first prefix byte is in bits 8..=15, the second prefix byte is in bits ++// 16..=23, etc. The high (8 * (7 - n)) bits are ignored. ++// ++// There are three possible return values: ++// - 0 means success. ++// - 1 means inconclusive, equivalent to "$short read". ++// - 2 means failure. ++static inline uint32_t // ++wuffs_private_impl__io_reader__match7(const uint8_t* iop_r, ++ const uint8_t* io2_r, ++ wuffs_base__io_buffer* r, ++ uint64_t a) { ++ uint32_t n = a & 7; ++ a >>= 8; ++ if ((io2_r - iop_r) >= 8) { ++ uint64_t x = wuffs_base__peek_u64le__no_bounds_check(iop_r); ++ uint32_t shift = 8 * (8 - n); ++ return ((a << shift) == (x << shift)) ? 0 : 2; ++ } ++ for (; n > 0; n--) { ++ if (iop_r >= io2_r) { ++ return (r && r->meta.closed) ? 2 : 1; ++ } else if (*iop_r != ((uint8_t)(a))) { ++ return 2; ++ } ++ iop_r++; ++ a >>= 8; + } ++ return 0; ++} + +- // The smallest normal f has an exp2 of -1022 and a mantissa of (1 << 52). +- // Subnormal numbers have the same exp2 but a smaller mantissa. +- static const int32_t min_incl_normal_exp2 = -1022; +- static const uint64_t min_incl_normal_mantissa = 0x0010000000000000ul; ++static inline wuffs_base__io_buffer* // ++wuffs_private_impl__io_reader__set(wuffs_base__io_buffer* b, ++ const uint8_t** ptr_iop_r, ++ const uint8_t** ptr_io0_r, ++ const uint8_t** ptr_io1_r, ++ const uint8_t** ptr_io2_r, ++ wuffs_base__slice_u8 data, ++ uint64_t history_position) { ++ b->data = data; ++ b->meta.wi = data.len; ++ b->meta.ri = 0; ++ b->meta.pos = history_position; ++ b->meta.closed = false; + +- // Compute lower and upper bounds such that any number between them (possibly +- // inclusive) will round to f. First, the lower bound. Our number f is: +- // ((mantissa + 0) * (2 ** ( exp2 - 52))) +- // +- // The next lowest floating point number is: +- // ((mantissa - 1) * (2 ** ( exp2 - 52))) +- // unless (mantissa - 1) drops the (1 << 52) bit and exp2 is not the +- // min_incl_normal_exp2. Either way, call it: +- // ((l_mantissa) * (2 ** (l_exp2 - 52))) +- // +- // The lower bound is halfway between them (noting that 52 became 53): +- // (((2 * l_mantissa) + 1) * (2 ** (l_exp2 - 53))) +- int32_t l_exp2 = exp2; +- uint64_t l_mantissa = mantissa - 1; +- if ((exp2 > min_incl_normal_exp2) && (mantissa <= min_incl_normal_mantissa)) { +- l_exp2 = exp2 - 1; +- l_mantissa = (2 * mantissa) - 1; +- } +- wuffs_base__private_implementation__high_prec_dec lower; +- wuffs_base__private_implementation__high_prec_dec__assign( +- &lower, (2 * l_mantissa) + 1, false); +- wuffs_base__private_implementation__high_prec_dec__lshift(&lower, +- l_exp2 - 53); ++ *ptr_iop_r = data.ptr; ++ *ptr_io0_r = data.ptr; ++ *ptr_io1_r = data.ptr; ++ *ptr_io2_r = data.ptr + data.len; + +- // Next, the upper bound. Our number f is: +- // ((mantissa + 0) * (2 ** (exp2 - 52))) +- // +- // The next highest floating point number is: +- // ((mantissa + 1) * (2 ** (exp2 - 52))) +- // +- // The upper bound is halfway between them (noting that 52 became 53): +- // (((2 * mantissa) + 1) * (2 ** (exp2 - 53))) +- wuffs_base__private_implementation__high_prec_dec upper; +- wuffs_base__private_implementation__high_prec_dec__assign( +- &upper, (2 * mantissa) + 1, false); +- wuffs_base__private_implementation__high_prec_dec__lshift(&upper, exp2 - 53); ++ return b; ++} + +- // The lower and upper bounds are possible outputs only if the original +- // mantissa is even, so that IEEE round-to-even would round to the original +- // mantissa and not its neighbors. +- bool inclusive = (mantissa & 1) == 0; ++// -------- + +- // As we walk the digits, we want to know whether rounding up would fall +- // within the upper bound. This is tracked by upper_delta: +- // - When -1, the digits of h and upper are the same so far. +- // - When +0, we saw a difference of 1 between h and upper on a previous +- // digit and subsequently only 9s for h and 0s for upper. Thus, rounding +- // up may fall outside of the bound if !inclusive. +- // - When +1, the difference is greater than 1 and we know that rounding up +- // falls within the bound. +- // +- // This is a state machine with three states. The numerical value for each +- // state (-1, +0 or +1) isn't important, other than their order. +- int upper_delta = -1; ++static inline uint64_t // ++wuffs_private_impl__io_writer__copy_from_slice(uint8_t** ptr_iop_w, ++ uint8_t* io2_w, ++ wuffs_base__slice_u8 src) { ++ uint8_t* iop_w = *ptr_iop_w; ++ size_t n = src.len; ++ if (n > ((size_t)(io2_w - iop_w))) { ++ n = (size_t)(io2_w - iop_w); ++ } ++ if (n > 0) { ++ memmove(iop_w, src.ptr, n); ++ *ptr_iop_w += n; ++ } ++ return (uint64_t)(n); ++} + +- // We can now figure out the shortest number of digits required. Walk the +- // digits until h has distinguished itself from lower or upper. +- // +- // The zi and zd variables are indexes and digits, for z in l (lower), h (the +- // number) and u (upper). ++static inline void // ++wuffs_private_impl__io_writer__limit(uint8_t** ptr_io2_w, ++ uint8_t* iop_w, ++ uint64_t limit) { ++ if (((uint64_t)(*ptr_io2_w - iop_w)) > limit) { ++ *ptr_io2_w = iop_w + limit; ++ } ++} ++ ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ if (!distance) { ++ return 0; ++ } ++ uint8_t* p = *ptr_iop_w; ++ if ((size_t)(p - io0_w) < (size_t)(distance)) { ++ return 0; ++ } ++ uint8_t* q = p - distance; ++ size_t n = (size_t)(io2_w - p); ++ if ((size_t)(length) > n) { ++ length = (uint32_t)(n); ++ } else { ++ n = (size_t)(length); ++ } ++ // TODO: unrolling by 3 seems best for the std/deflate benchmarks, but that ++ // is mostly because 3 is the minimum length for the deflate format. This ++ // function implementation shouldn't overfit to that one format. Perhaps the ++ // limited_copy_u32_from_history Wuffs method should also take an unroll hint ++ // argument, and the cgen can look if that argument is the constant ++ // expression '3'. + // +- // The lower, h and upper numbers may have their decimal points at different +- // places. In this case, upper is the longest, so we iterate ui starting from +- // 0 and iterate li and hi starting from either 0 or -1. +- int32_t ui = 0; +- for (;; ui++) { +- // Calculate hd, the middle number's digit. +- int32_t hi = ui - upper.decimal_point + h->decimal_point; +- if (hi >= ((int32_t)(h->num_digits))) { +- break; +- } +- uint8_t hd = (((uint32_t)hi) < h->num_digits) ? h->digits[hi] : 0; ++ // See also wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast ++ // below. ++ for (; n >= 3; n -= 3) { ++ *p++ = *q++; ++ *p++ = *q++; ++ *p++ = *q++; ++ } ++ for (; n; n--) { ++ *p++ = *q++; ++ } ++ *ptr_iop_w = p; ++ return length; ++} + +- // Calculate ld, the lower bound's digit. +- int32_t li = ui - upper.decimal_point + lower.decimal_point; +- uint8_t ld = (((uint32_t)li) < lower.num_digits) ? lower.digits[li] : 0; ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast is like ++// the wuffs_private_impl__io_writer__limited_copy_u32_from_history function ++// above, but has stronger pre-conditions. ++// ++// The caller needs to prove that: ++// - length >= 1 ++// - length <= (io2_w - *ptr_iop_w) ++// - distance >= 1 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint8_t* q = p - distance; ++ uint32_t n = length; ++ for (; n >= 3; n -= 3) { ++ *p++ = *q++; ++ *p++ = *q++; ++ *p++ = *q++; ++ } ++ for (; n; n--) { ++ *p++ = *q++; ++ } ++ *ptr_iop_w = p; ++ return length; ++} + +- // We can round down (truncate) if lower has a different digit than h or if +- // lower is inclusive and is exactly the result of rounding down (i.e. we +- // have reached the final digit of lower). +- bool can_round_down = +- (ld != hd) || // +- (inclusive && ((li + 1) == ((int32_t)(lower.num_digits)))); ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp ++// is like the ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function, ++// but also returns the cusp: a byte pair (as a u16le) being the last byte of ++// and next byte after the copied history. ++// ++// For example, if history was [10, 11, 12, 13, 14, 15, 16, 17, 18] then: ++// - copying l=3, d=8 produces [11, 12, 13] and the cusp is (13, 14). ++// - copying l=3, d=2 produces [17, 18, 17] and the cusp is (17, 18). ++// ++// The caller needs to prove that: ++// - length >= 1 ++// - length <= (io2_w - *ptr_iop_w) ++// - distance >= 1 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint8_t* q = p - distance; ++ uint32_t n = length; ++ for (; n >= 3; n -= 3) { ++ *p++ = *q++; ++ *p++ = *q++; ++ *p++ = *q++; ++ } ++ for (; n; n--) { ++ *p++ = *q++; ++ } ++ *ptr_iop_w = p; ++ return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1); ++} + +- // Calculate ud, the upper bound's digit, and update upper_delta. +- uint8_t ud = (((uint32_t)ui) < upper.num_digits) ? upper.digits[ui] : 0; +- if (upper_delta < 0) { +- if ((hd + 1) < ud) { +- // For example: +- // h = 12345??? +- // upper = 12347??? +- upper_delta = +1; +- } else if (hd != ud) { +- // For example: +- // h = 12345??? +- // upper = 12346??? +- upper_delta = +0; +- } +- } else if (upper_delta == 0) { +- if ((hd != 9) || (ud != 0)) { +- // For example: +- // h = 1234598? +- // upper = 1234600? +- upper_delta = +1; +- } ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast ++// copies the previous byte (the one immediately before *ptr_iop_w), copying 8 ++// byte chunks at a time. Each chunk contains 8 repetitions of the same byte. ++// ++// In terms of number of bytes copied, length is rounded up to a multiple of 8. ++// As a special case, a zero length rounds up to 8 (even though 0 is already a ++// multiple of 8), since there is always at least one 8 byte chunk copied. ++// ++// In terms of advancing *ptr_iop_w, length is not rounded up. ++// ++// The caller needs to prove that: ++// - length >= 1 ++// - (length + 8) <= (io2_w - *ptr_iop_w) ++// - distance == 1 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint64_t x = p[-1]; ++ x |= x << 8; ++ x |= x << 16; ++ x |= x << 32; ++ uint32_t n = length; ++ while (1) { ++ wuffs_base__poke_u64le__no_bounds_check(p, x); ++ if (n <= 8) { ++ p += n; ++ break; + } ++ p += 8; ++ n -= 8; ++ } ++ *ptr_iop_w = p; ++ return length; ++} + +- // We can round up if upper has a different digit than h and either upper +- // is inclusive or upper is bigger than the result of rounding up. +- bool can_round_up = +- (upper_delta > 0) || // +- ((upper_delta == 0) && // +- (inclusive || ((ui + 1) < ((int32_t)(upper.num_digits))))); +- +- // If we can round either way, round to nearest. If we can round only one +- // way, do it. If we can't round, continue the loop. +- if (can_round_down) { +- if (can_round_up) { +- wuffs_base__private_implementation__high_prec_dec__round_nearest( +- h, hi + 1); +- return; +- } else { +- wuffs_base__private_implementation__high_prec_dec__round_down(h, +- hi + 1); +- return; +- } +- } else { +- if (can_round_up) { +- wuffs_base__private_implementation__high_prec_dec__round_up(h, hi + 1); +- return; +- } ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast_return_cusp ++// copies the previous byte (the one immediately before *ptr_iop_w), copying 8 ++// byte chunks at a time. Each chunk contains 8 repetitions of the same byte. ++// It also returns the cusp: a byte pair (as a u16le) being the last byte of ++// and next byte after the copied history. ++// ++// In terms of number of bytes copied, length is rounded up to a multiple of 8. ++// As a special case, a zero length rounds up to 8 (even though 0 is already a ++// multiple of 8), since there is always at least one 8 byte chunk copied. ++// ++// In terms of advancing *ptr_iop_w, length is not rounded up. ++// ++// The caller needs to prove that: ++// - length >= 1 ++// - (length + 8) <= (io2_w - *ptr_iop_w) ++// - distance == 1 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast_return_cusp( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint8_t* q = p - distance; ++ uint64_t x = p[-1]; ++ x |= x << 8; ++ x |= x << 16; ++ x |= x << 32; ++ uint32_t n = length; ++ while (1) { ++ wuffs_base__poke_u64le__no_bounds_check(p, x); ++ if (n <= 8) { ++ p += n; ++ q += n; ++ break; + } ++ p += 8; ++ q += 8; ++ n -= 8; + } ++ *ptr_iop_w = p; ++ return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1); + } + +-// -------- +- +-// wuffs_base__private_implementation__parse_number_f64_eisel_lemire produces +-// the IEEE 754 double-precision value for an exact mantissa and base-10 +-// exponent. For example: +-// - when parsing "12345.678e+02", man is 12345678 and exp10 is -1. +-// - when parsing "-12", man is 12 and exp10 is 0. Processing the leading +-// minus sign is the responsibility of the caller, not this function. ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast ++// is like the ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function ++// above, but copies 8 byte chunks at a time. + // +-// On success, it returns a non-negative int64_t such that the low 63 bits hold +-// the 11-bit exponent and 52-bit mantissa. ++// In terms of number of bytes copied, length is rounded up to a multiple of 8. ++// As a special case, a zero length rounds up to 8 (even though 0 is already a ++// multiple of 8), since there is always at least one 8 byte chunk copied. + // +-// On failure, it returns a negative value. ++// In terms of advancing *ptr_iop_w, length is not rounded up. + // +-// The algorithm is based on an original idea by Michael Eisel that was refined +-// by Daniel Lemire. See +-// https://lemire.me/blog/2020/03/10/fast-float-parsing-in-practice/ +-// and +-// https://nigeltao.github.io/blog/2020/eisel-lemire.html ++// The caller needs to prove that: ++// - length >= 1 ++// - (length + 8) <= (io2_w - *ptr_iop_w) ++// - distance >= 8 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint8_t* q = p - distance; ++ uint32_t n = length; ++ while (1) { ++ memcpy(p, q, 8); ++ if (n <= 8) { ++ p += n; ++ break; ++ } ++ p += 8; ++ q += 8; ++ n -= 8; ++ } ++ *ptr_iop_w = p; ++ return length; ++} ++ ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp ++// is like the ++// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function ++// above, but copies 8 byte chunks at a time. It also returns the cusp: a byte ++// pair (as a u16le) being the last byte of and next byte after the copied ++// history. + // +-// Preconditions: +-// - man is non-zero. +-// - exp10 is in the range [-307 ..= 288], the same range of the +-// wuffs_base__private_implementation__powers_of_10 array. ++// In terms of number of bytes copied, length is rounded up to a multiple of 8. ++// As a special case, a zero length rounds up to 8 (even though 0 is already a ++// multiple of 8), since there is always at least one 8 byte chunk copied. + // +-// The exp10 range (and the fact that man is in the range [1 ..= UINT64_MAX], +-// approximately [1 ..= 1.85e+19]) means that (man * (10 ** exp10)) is in the +-// range [1e-307 ..= 1.85e+307]. This is entirely within the range of normal +-// (neither subnormal nor non-finite) f64 values: DBL_MIN and DBL_MAX are +-// approximately 2.23e–308 and 1.80e+308. +-static int64_t // +-wuffs_base__private_implementation__parse_number_f64_eisel_lemire( +- uint64_t man, +- int32_t exp10) { +- // Look up the (possibly truncated) base-2 representation of (10 ** exp10). +- // The look-up table was constructed so that it is already normalized: the +- // table entry's mantissa's MSB (most significant bit) is on. +- const uint64_t* po10 = +- &wuffs_base__private_implementation__powers_of_10[exp10 + 307][0]; ++// In terms of advancing *ptr_iop_w, length is not rounded up. ++// ++// The caller needs to prove that: ++// - length >= 1 ++// - (length + 8) <= (io2_w - *ptr_iop_w) ++// - distance >= 8 ++// - distance <= (*ptr_iop_w - io0_w) ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp( ++ uint8_t** ptr_iop_w, ++ uint8_t* io0_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ uint32_t distance) { ++ uint8_t* p = *ptr_iop_w; ++ uint8_t* q = p - distance; ++ uint32_t n = length; ++ while (1) { ++ memcpy(p, q, 8); ++ if (n <= 8) { ++ p += n; ++ q += n; ++ break; ++ } ++ p += 8; ++ q += 8; ++ n -= 8; ++ } ++ *ptr_iop_w = p; ++ return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1); ++} + +- // Normalize the man argument. The (man != 0) precondition means that a +- // non-zero bit exists. +- uint32_t clz = wuffs_base__count_leading_zeroes_u64(man); +- man <<= clz; ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_reader( ++ uint8_t** ptr_iop_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r) { ++ uint8_t* iop_w = *ptr_iop_w; ++ size_t n = length; ++ if (n > ((size_t)(io2_w - iop_w))) { ++ n = (size_t)(io2_w - iop_w); ++ } ++ const uint8_t* iop_r = *ptr_iop_r; ++ if (n > ((size_t)(io2_r - iop_r))) { ++ n = (size_t)(io2_r - iop_r); ++ } ++ if (n > 0) { ++ memmove(iop_w, iop_r, n); ++ *ptr_iop_w += n; ++ *ptr_iop_r += n; ++ } ++ return (uint32_t)(n); ++} + +- // Calculate the return value's base-2 exponent. We might tweak it by ±1 +- // later, but its initial value comes from a linear scaling of exp10, +- // converting from power-of-10 to power-of-2, and adjusting by clz. +- // +- // The magic constants are: +- // - 1087 = 1023 + 64. The 1023 is the f64 exponent bias. The 64 is because +- // the look-up table uses 64-bit mantissas. +- // - 217706 is such that the ratio 217706 / 65536 ≈ 3.321930 is close enough +- // (over the practical range of exp10) to log(10) / log(2) ≈ 3.321928. +- // - 65536 = 1<<16 is arbitrary but a power of 2, so division is a shift. +- // +- // Equality of the linearly-scaled value and the actual power-of-2, over the +- // range of exp10 arguments that this function accepts, is confirmed by +- // script/print-mpb-powers-of-10.go +- uint64_t ret_exp2 = +- ((uint64_t)(((217706 * exp10) >> 16) + 1087)) - ((uint64_t)clz); ++static inline uint32_t // ++wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ uint8_t** ptr_iop_w, ++ uint8_t* io2_w, ++ uint32_t length, ++ wuffs_base__slice_u8 src) { ++ uint8_t* iop_w = *ptr_iop_w; ++ size_t n = src.len; ++ if (n > length) { ++ n = length; ++ } ++ if (n > ((size_t)(io2_w - iop_w))) { ++ n = (size_t)(io2_w - iop_w); ++ } ++ if (n > 0) { ++ memmove(iop_w, src.ptr, n); ++ *ptr_iop_w += n; ++ } ++ return (uint32_t)(n); ++} + +- // Multiply the two mantissas. Normalization means that both mantissas are at +- // least (1<<63), so the 128-bit product must be at least (1<<126). The high +- // 64 bits of the product, x_hi, must therefore be at least (1<<62). +- // +- // As a consequence, x_hi has either 0 or 1 leading zeroes. Shifting x_hi +- // right by either 9 or 10 bits (depending on x_hi's MSB) will therefore +- // leave the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. +- wuffs_base__multiply_u64__output x = wuffs_base__multiply_u64(man, po10[1]); +- uint64_t x_hi = x.hi; +- uint64_t x_lo = x.lo; ++static inline wuffs_base__io_buffer* // ++wuffs_private_impl__io_writer__set(wuffs_base__io_buffer* b, ++ uint8_t** ptr_iop_w, ++ uint8_t** ptr_io0_w, ++ uint8_t** ptr_io1_w, ++ uint8_t** ptr_io2_w, ++ wuffs_base__slice_u8 data, ++ uint64_t history_position) { ++ b->data = data; ++ b->meta.wi = 0; ++ b->meta.ri = 0; ++ b->meta.pos = history_position; ++ b->meta.closed = false; + +- // Before we shift right by at least 9 bits, recall that the look-up table +- // entry was possibly truncated. We have so far only calculated a lower bound +- // for the product (man * e), where e is (10 ** exp10). The upper bound would +- // add a further (man * 1) to the 128-bit product, which overflows the lower +- // 64-bit limb if ((x_lo + man) < man). +- // +- // If overflow occurs, that adds 1 to x_hi. Since we're about to shift right +- // by at least 9 bits, that carried 1 can be ignored unless the higher 64-bit +- // limb's low 9 bits are all on. +- // +- // For example, parsing "9999999999999999999" will take the if-true branch +- // here, since: +- // - x_hi = 0x4563918244F3FFFF +- // - x_lo = 0x8000000000000000 +- // - man = 0x8AC7230489E7FFFF +- if (((x_hi & 0x1FF) == 0x1FF) && ((x_lo + man) < man)) { +- // Refine our calculation of (man * e). Before, our approximation of e used +- // a "low resolution" 64-bit mantissa. Now use a "high resolution" 128-bit +- // mantissa. We've already calculated x = (man * bits_0_to_63_incl_of_e). +- // Now calculate y = (man * bits_64_to_127_incl_of_e). +- wuffs_base__multiply_u64__output y = wuffs_base__multiply_u64(man, po10[0]); +- uint64_t y_hi = y.hi; +- uint64_t y_lo = y.lo; ++ *ptr_iop_w = data.ptr; ++ *ptr_io0_w = data.ptr; ++ *ptr_io1_w = data.ptr; ++ *ptr_io2_w = data.ptr + data.len; + +- // Merge the 128-bit x and 128-bit y, which overlap by 64 bits, to +- // calculate the 192-bit product of the 64-bit man by the 128-bit e. +- // As we exit this if-block, we only care about the high 128 bits +- // (merged_hi and merged_lo) of that 192-bit product. +- // +- // For example, parsing "1.234e-45" will take the if-true branch here, +- // since: +- // - x_hi = 0x70B7E3696DB29FFF +- // - x_lo = 0xE040000000000000 +- // - y_hi = 0x33718BBEAB0E0D7A +- // - y_lo = 0xA880000000000000 +- uint64_t merged_hi = x_hi; +- uint64_t merged_lo = x_lo + y_hi; +- if (merged_lo < x_lo) { +- merged_hi++; // Carry the overflow bit. +- } ++ return b; ++} + +- // The "high resolution" approximation of e is still a lower bound. Once +- // again, see if the upper bound is large enough to produce a different +- // result. This time, if it does, give up instead of reaching for an even +- // more precise approximation to e. +- // +- // This three-part check is similar to the two-part check that guarded the +- // if block that we're now in, but it has an extra term for the middle 64 +- // bits (checking that adding 1 to merged_lo would overflow). +- // +- // For example, parsing "5.9604644775390625e-8" will take the if-true +- // branch here, since: +- // - merged_hi = 0x7FFFFFFFFFFFFFFF +- // - merged_lo = 0xFFFFFFFFFFFFFFFF +- // - y_lo = 0x4DB3FFC120988200 +- // - man = 0xD3C21BCECCEDA100 +- if (((merged_hi & 0x1FF) == 0x1FF) && ((merged_lo + 1) == 0) && +- (y_lo + man < man)) { +- return -1; +- } ++// ---------------- I/O (Utility) + +- // Replace the 128-bit x with merged. +- x_hi = merged_hi; +- x_lo = merged_lo; +- } ++#define wuffs_base__utility__empty_io_reader wuffs_base__empty_io_reader ++#define wuffs_base__utility__empty_io_writer wuffs_base__empty_io_writer + +- // As mentioned above, shifting x_hi right by either 9 or 10 bits will leave +- // the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. If the +- // MSB (before shifting) was on, adjust ret_exp2 for the larger shift. +- // +- // Having bit 53 on (and higher bits off) means that ret_mantissa is a 54-bit +- // number. +- uint64_t msb = x_hi >> 63; +- uint64_t ret_mantissa = x_hi >> (msb + 9); +- ret_exp2 -= 1 ^ msb; ++// ---------------- Tokens + +- // IEEE 754 rounds to-nearest with ties rounded to-even. Rounding to-even can +- // be tricky. If we're half-way between two exactly representable numbers +- // (x's low 73 bits are zero and the next 2 bits that matter are "01"), give +- // up instead of trying to pick the winner. +- // +- // Technically, we could tighten the condition by changing "73" to "73 or 74, +- // depending on msb", but a flat "73" is simpler. +- // +- // For example, parsing "1e+23" will take the if-true branch here, since: +- // - x_hi = 0x54B40B1F852BDA00 +- // - ret_mantissa = 0x002A5A058FC295ED +- if ((x_lo == 0) && ((x_hi & 0x1FF) == 0) && ((ret_mantissa & 3) == 1)) { +- return -1; +- } ++// ---------------- Tokens (Utility) + +- // If we're not halfway then it's rounding to-nearest. Starting with a 54-bit +- // number, carry the lowest bit (bit 0) up if it's on. Regardless of whether +- // it was on or off, shifting right by one then produces a 53-bit number. If +- // carrying up overflowed, shift again. +- ret_mantissa += ret_mantissa & 1; +- ret_mantissa >>= 1; +- // This if block is equivalent to (but benchmarks slightly faster than) the +- // following branchless form: +- // uint64_t overflow_adjustment = ret_mantissa >> 53; +- // ret_mantissa >>= overflow_adjustment; +- // ret_exp2 += overflow_adjustment; +- // +- // For example, parsing "7.2057594037927933e+16" will take the if-true +- // branch here, since: +- // - x_hi = 0x7FFFFFFFFFFFFE80 +- // - ret_mantissa = 0x0020000000000000 +- if ((ret_mantissa >> 53) > 0) { +- ret_mantissa >>= 1; +- ret_exp2++; +- } ++// ---------------- Memory Allocation + +- // Starting with a 53-bit number, IEEE 754 double-precision normal numbers +- // have an implicit mantissa bit. Mask that away and keep the low 52 bits. +- ret_mantissa &= 0x000FFFFFFFFFFFFF; ++// ---------------- Images + +- // Pack the bits and return. +- return ((int64_t)(ret_mantissa | (ret_exp2 << 52))); +-} ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( ++ const wuffs_base__pixel_swizzler* p, ++ uint32_t up_to_num_pixels, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r); + +-// -------- ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r); + +-static wuffs_base__result_f64 // +-wuffs_base__private_implementation__parse_number_f64_special( +- wuffs_base__slice_u8 s, +- uint32_t options) { +- do { +- if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) { +- goto fail; +- } ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ uint64_t num_pixels); + +- uint8_t* p = s.ptr; +- uint8_t* q = s.ptr + s.len; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status // ++wuffs_base__pixel_swizzler__swizzle_ycck( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_buffer* dst, ++ wuffs_base__slice_u8 dst_palette, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ wuffs_base__slice_u8 src0, ++ wuffs_base__slice_u8 src1, ++ wuffs_base__slice_u8 src2, ++ wuffs_base__slice_u8 src3, ++ uint32_t width0, ++ uint32_t width1, ++ uint32_t width2, ++ uint32_t width3, ++ uint32_t height0, ++ uint32_t height1, ++ uint32_t height2, ++ uint32_t height3, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t stride3, ++ uint8_t h0, ++ uint8_t h1, ++ uint8_t h2, ++ uint8_t h3, ++ uint8_t v0, ++ uint8_t v1, ++ uint8_t v2, ++ uint8_t v3, ++ bool is_rgb_or_cmyk, ++ bool triangle_filter_for_2to1, ++ wuffs_base__slice_u8 scratch_buffer_2k); + +- for (; (p < q) && (*p == '_'); p++) { +- } +- if (p >= q) { +- goto fail; +- } ++// ---------------- Images (Utility) + +- // Parse sign. +- bool negative = false; +- do { +- if (*p == '+') { +- p++; +- } else if (*p == '-') { +- negative = true; +- p++; +- } else { +- break; +- } +- for (; (p < q) && (*p == '_'); p++) { +- } +- } while (0); +- if (p >= q) { +- goto fail; +- } ++#define wuffs_base__utility__make_pixel_format wuffs_base__make_pixel_format + +- bool nan = false; +- switch (p[0]) { +- case 'I': +- case 'i': +- if (((q - p) < 3) || // +- ((p[1] != 'N') && (p[1] != 'n')) || // +- ((p[2] != 'F') && (p[2] != 'f'))) { +- goto fail; +- } +- p += 3; ++// ---------------- String Conversions + +- if ((p >= q) || (*p == '_')) { +- break; +- } else if (((q - p) < 5) || // +- ((p[0] != 'I') && (p[0] != 'i')) || // +- ((p[1] != 'N') && (p[1] != 'n')) || // +- ((p[2] != 'I') && (p[2] != 'i')) || // +- ((p[3] != 'T') && (p[3] != 't')) || // +- ((p[4] != 'Y') && (p[4] != 'y'))) { +- goto fail; +- } +- p += 5; ++// ---------------- Unicode and UTF-8 + +- if ((p >= q) || (*p == '_')) { +- break; +- } +- goto fail; ++// ---------------- + +- case 'N': +- case 'n': +- if (((q - p) < 3) || // +- ((p[1] != 'A') && (p[1] != 'a')) || // +- ((p[2] != 'N') && (p[2] != 'n'))) { +- goto fail; +- } +- p += 3; ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__CORE) + +- if ((p >= q) || (*p == '_')) { +- nan = true; +- break; +- } +- goto fail; ++const uint8_t wuffs_private_impl__low_bits_mask__u8[8] = { ++ 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, ++}; + +- default: +- goto fail; +- } ++const uint16_t wuffs_private_impl__low_bits_mask__u16[16] = { ++ 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, ++ 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, ++}; + +- // Finish. +- for (; (p < q) && (*p == '_'); p++) { +- } +- if (p != q) { +- goto fail; +- } +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( +- (nan ? 0x7FFFFFFFFFFFFFFF : 0x7FF0000000000000) | +- (negative ? 0x8000000000000000 : 0)); +- return ret; +- } while (0); ++const uint32_t wuffs_private_impl__low_bits_mask__u32[32] = { ++ 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F, ++ 0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF, ++ 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 0x0001FFFF, ++ 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, ++ 0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF, ++ 0x3FFFFFFF, 0x7FFFFFFF, ++}; + +-fail: +- do { +- wuffs_base__result_f64 ret; +- ret.status.repr = wuffs_base__error__bad_argument; +- ret.value = 0; +- return ret; +- } while (0); +-} ++const uint64_t wuffs_private_impl__low_bits_mask__u64[64] = { ++ 0x0000000000000000, 0x0000000000000001, 0x0000000000000003, ++ 0x0000000000000007, 0x000000000000000F, 0x000000000000001F, ++ 0x000000000000003F, 0x000000000000007F, 0x00000000000000FF, ++ 0x00000000000001FF, 0x00000000000003FF, 0x00000000000007FF, ++ 0x0000000000000FFF, 0x0000000000001FFF, 0x0000000000003FFF, ++ 0x0000000000007FFF, 0x000000000000FFFF, 0x000000000001FFFF, ++ 0x000000000003FFFF, 0x000000000007FFFF, 0x00000000000FFFFF, ++ 0x00000000001FFFFF, 0x00000000003FFFFF, 0x00000000007FFFFF, ++ 0x0000000000FFFFFF, 0x0000000001FFFFFF, 0x0000000003FFFFFF, ++ 0x0000000007FFFFFF, 0x000000000FFFFFFF, 0x000000001FFFFFFF, ++ 0x000000003FFFFFFF, 0x000000007FFFFFFF, 0x00000000FFFFFFFF, ++ 0x00000001FFFFFFFF, 0x00000003FFFFFFFF, 0x00000007FFFFFFFF, ++ 0x0000000FFFFFFFFF, 0x0000001FFFFFFFFF, 0x0000003FFFFFFFFF, ++ 0x0000007FFFFFFFFF, 0x000000FFFFFFFFFF, 0x000001FFFFFFFFFF, ++ 0x000003FFFFFFFFFF, 0x000007FFFFFFFFFF, 0x00000FFFFFFFFFFF, ++ 0x00001FFFFFFFFFFF, 0x00003FFFFFFFFFFF, 0x00007FFFFFFFFFFF, ++ 0x0000FFFFFFFFFFFF, 0x0001FFFFFFFFFFFF, 0x0003FFFFFFFFFFFF, ++ 0x0007FFFFFFFFFFFF, 0x000FFFFFFFFFFFFF, 0x001FFFFFFFFFFFFF, ++ 0x003FFFFFFFFFFFFF, 0x007FFFFFFFFFFFFF, 0x00FFFFFFFFFFFFFF, ++ 0x01FFFFFFFFFFFFFF, 0x03FFFFFFFFFFFFFF, 0x07FFFFFFFFFFFFFF, ++ 0x0FFFFFFFFFFFFFFF, 0x1FFFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFFF, ++ 0x7FFFFFFFFFFFFFFF, ++}; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 // +-wuffs_base__private_implementation__high_prec_dec__to_f64( +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t options) { +- do { +- // powers converts decimal powers of 10 to binary powers of 2. For example, +- // (10000 >> 13) is 1. It stops before the elements exceed 60, also known +- // as WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL. +- // +- // This rounds down (1<<13 is a lower bound for 1e4). Adding 1 to the array +- // element value rounds up (1<<14 is an upper bound for 1e4) while staying +- // at or below WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL. +- // +- // When starting in the range [1e+1 .. 1e+2] (i.e. h->decimal_point == +2), +- // powers[2] == 6 and so: +- // - Right shifting by 6+0 produces the range [10/64 .. 100/64] = +- // [0.156250 .. 1.56250]. The resultant h->decimal_point is +0 or +1. +- // - Right shifting by 6+1 produces the range [10/128 .. 100/128] = +- // [0.078125 .. 0.78125]. The resultant h->decimal_point is -1 or -0. +- // +- // When starting in the range [1e-3 .. 1e-2] (i.e. h->decimal_point == -2), +- // powers[2] == 6 and so: +- // - Left shifting by 6+0 produces the range [0.001*64 .. 0.01*64] = +- // [0.064 .. 0.64]. The resultant h->decimal_point is -1 or -0. +- // - Left shifting by 6+1 produces the range [0.001*128 .. 0.01*128] = +- // [0.128 .. 1.28]. The resultant h->decimal_point is +0 or +1. +- // +- // Thus, when targeting h->decimal_point being +0 or +1, use (powers[n]+0) +- // when right shifting but (powers[n]+1) when left shifting. +- static const uint32_t num_powers = 19; +- static const uint8_t powers[19] = { +- 0, 3, 6, 9, 13, 16, 19, 23, 26, 29, // +- 33, 36, 39, 43, 46, 49, 53, 56, 59, // +- }; ++const uint32_t wuffs_private_impl__pixel_format__bits_per_channel[16] = { ++ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, ++ 0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40, ++}; + +- // Handle zero and obvious extremes. The largest and smallest positive +- // finite f64 values are approximately 1.8e+308 and 4.9e-324. +- if ((h->num_digits == 0) || (h->decimal_point < -326)) { +- goto zero; +- } else if (h->decimal_point > 310) { +- goto infinity; +- } ++const char wuffs_base__note__i_o_redirect[] = "@base: I/O redirect"; ++const char wuffs_base__note__end_of_data[] = "@base: end of data"; ++const char wuffs_base__note__metadata_reported[] = "@base: metadata reported"; ++const char wuffs_base__suspension__even_more_information[] = "$base: even more information"; ++const char wuffs_base__suspension__mispositioned_read[] = "$base: mispositioned read"; ++const char wuffs_base__suspension__mispositioned_write[] = "$base: mispositioned write"; ++const char wuffs_base__suspension__short_read[] = "$base: short read"; ++const char wuffs_base__suspension__short_workbuf[] = "$base: short workbuf"; ++const char wuffs_base__suspension__short_write[] = "$base: short write"; ++const char wuffs_base__error__bad_i_o_position[] = "#base: bad I/O position"; ++const char wuffs_base__error__bad_argument_length_too_short[] = "#base: bad argument (length too short)"; ++const char wuffs_base__error__bad_argument[] = "#base: bad argument"; ++const char wuffs_base__error__bad_call_sequence[] = "#base: bad call sequence"; ++const char wuffs_base__error__bad_data[] = "#base: bad data"; ++const char wuffs_base__error__bad_receiver[] = "#base: bad receiver"; ++const char wuffs_base__error__bad_restart[] = "#base: bad restart"; ++const char wuffs_base__error__bad_sizeof_receiver[] = "#base: bad sizeof receiver"; ++const char wuffs_base__error__bad_vtable[] = "#base: bad vtable"; ++const char wuffs_base__error__bad_workbuf_length[] = "#base: bad workbuf length"; ++const char wuffs_base__error__bad_wuffs_version[] = "#base: bad wuffs version"; ++const char wuffs_base__error__cannot_return_a_suspension[] = "#base: cannot return a suspension"; ++const char wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist[] = "#base: disabled by WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST"; ++const char wuffs_base__error__disabled_by_previous_error[] = "#base: disabled by previous error"; ++const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[] = "#base: initialize falsely claimed already zeroed"; ++const char wuffs_base__error__initialize_not_called[] = "#base: initialize not called"; ++const char wuffs_base__error__insufficient_history[] = "#base: insufficient history"; ++const char wuffs_base__error__interleaved_coroutine_calls[] = "#base: interleaved coroutine calls"; ++const char wuffs_base__error__no_more_information[] = "#base: no more information"; ++const char wuffs_base__error__not_enough_data[] = "#base: not enough data"; ++const char wuffs_base__error__out_of_bounds[] = "#base: out of bounds"; ++const char wuffs_base__error__unsupported_image_dimension[] = "#base: unsupported image dimension"; ++const char wuffs_base__error__unsupported_method[] = "#base: unsupported method"; ++const char wuffs_base__error__unsupported_option[] = "#base: unsupported option"; ++const char wuffs_base__error__unsupported_pixel_swizzler_option[] = "#base: unsupported pixel swizzler option"; ++const char wuffs_base__error__too_much_data[] = "#base: too much data"; + +- // Try the fast Eisel-Lemire algorithm again. Calculating the (man, exp10) +- // pair from the high_prec_dec h is more correct but slower than the +- // approach taken in wuffs_base__parse_number_f64. The latter is optimized +- // for the common cases (e.g. assuming no underscores or a leading '+' +- // sign) rather than the full set of cases allowed by the Wuffs API. +- // +- // When we have 19 or fewer mantissa digits, run Eisel-Lemire once (trying +- // for an exact result). When we have more than 19 mantissa digits, run it +- // twice to get a lower and upper bound. We still have an exact result +- // (within f64's rounding margin) if both bounds are equal (and valid). +- uint32_t i_max = h->num_digits; +- if (i_max > 19) { +- i_max = 19; +- } +- int32_t exp10 = h->decimal_point - ((int32_t)i_max); +- if ((-307 <= exp10) && (exp10 <= 288)) { +- uint64_t man = 0; +- uint32_t i; +- for (i = 0; i < i_max; i++) { +- man = (10 * man) + h->digits[i]; +- } +- while (man != 0) { // The 'while' is just an 'if' that we can 'break'. +- int64_t r0 = +- wuffs_base__private_implementation__parse_number_f64_eisel_lemire( +- man + 0, exp10); +- if (r0 < 0) { +- break; +- } else if (h->num_digits > 19) { +- int64_t r1 = +- wuffs_base__private_implementation__parse_number_f64_eisel_lemire( +- man + 1, exp10); +- if (r1 != r0) { +- break; +- } +- } +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( +- ((uint64_t)r0) | (((uint64_t)(h->negative)) << 63)); +- return ret; +- } +- } ++const char wuffs_base__hasher_u32__vtable_name[] = "{vtable}wuffs_base__hasher_u32"; ++const char wuffs_base__hasher_u64__vtable_name[] = "{vtable}wuffs_base__hasher_u64"; ++const char wuffs_base__hasher_bitvec256__vtable_name[] = "{vtable}wuffs_base__hasher_bitvec256"; ++const char wuffs_base__image_decoder__vtable_name[] = "{vtable}wuffs_base__image_decoder"; ++const char wuffs_base__io_transformer__vtable_name[] = "{vtable}wuffs_base__io_transformer"; ++const char wuffs_base__token_decoder__vtable_name[] = "{vtable}wuffs_base__token_decoder"; + +- // When Eisel-Lemire fails, fall back to Simple Decimal Conversion. See +- // https://nigeltao.github.io/blog/2020/parse-number-f64-simple.html +- // +- // Scale by powers of 2 until we're in the range [0.1 .. 10]. Equivalently, +- // that h->decimal_point is +0 or +1. +- // +- // First we shift right while at or above 10... +- const int32_t f64_bias = -1023; +- int32_t exp2 = 0; +- while (h->decimal_point > 1) { +- uint32_t n = (uint32_t)(+h->decimal_point); +- uint32_t shift = +- (n < num_powers) +- ? powers[n] +- : WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; +- +- wuffs_base__private_implementation__high_prec_dec__small_rshift(h, shift); +- if (h->decimal_point < +- -WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { +- goto zero; +- } +- exp2 += (int32_t)shift; +- } +- // ...then we shift left while below 0.1. +- while (h->decimal_point < 0) { +- uint32_t shift; +- uint32_t n = (uint32_t)(-h->decimal_point); +- shift = (n < num_powers) +- // The +1 is per "when targeting h->decimal_point being +0 or +- // +1... when left shifting" in the powers comment above. +- ? (powers[n] + 1) +- : WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__CORE) + +- wuffs_base__private_implementation__high_prec_dec__small_lshift(h, shift); +- if (h->decimal_point > +- +WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__DECIMAL_POINT__RANGE) { +- goto infinity; +- } +- exp2 -= (int32_t)shift; +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES) + +- // To get from "in the range [0.1 .. 10]" to "in the range [1 .. 2]" (which +- // will give us our exponent in base-2), the mantissa's first 3 digits will +- // determine the final left shift, equal to 52 (the number of explicit f64 +- // bits) plus an additional adjustment. +- int man3 = (100 * h->digits[0]) + +- ((h->num_digits > 1) ? (10 * h->digits[1]) : 0) + +- ((h->num_digits > 2) ? h->digits[2] : 0); +- int32_t additional_lshift = 0; +- if (h->decimal_point == 0) { // The value is in [0.1 .. 1]. +- if (man3 < 125) { +- additional_lshift = +4; +- } else if (man3 < 250) { +- additional_lshift = +3; +- } else if (man3 < 500) { +- additional_lshift = +2; +- } else { +- additional_lshift = +1; +- } +- } else { // The value is in [1 .. 10]. +- if (man3 < 200) { +- additional_lshift = -0; +- } else if (man3 < 400) { +- additional_lshift = -1; +- } else if (man3 < 800) { +- additional_lshift = -2; +- } else { +- additional_lshift = -3; +- } +- } +- exp2 -= additional_lshift; +- uint32_t final_lshift = (uint32_t)(52 + additional_lshift); ++// ---------------- Interface Definitions. + +- // The minimum normal exponent is (f64_bias + 1). +- while ((f64_bias + 1) > exp2) { +- uint32_t n = (uint32_t)((f64_bias + 1) - exp2); +- if (n > WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL) { +- n = WUFFS_BASE__PRIVATE_IMPLEMENTATION__HPD__SHIFT__MAX_INCL; +- } +- wuffs_base__private_implementation__high_prec_dec__small_rshift(h, n); +- exp2 += (int32_t)n; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_base__hasher_u32__checksum_u32( ++ const wuffs_base__hasher_u32* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- // Check for overflow. +- if ((exp2 - f64_bias) >= 0x07FF) { // (1 << 11) - 1. +- goto infinity; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { ++ const wuffs_base__hasher_u32__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->checksum_u32)(self); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- // Extract 53 bits for the mantissa (in base-2). +- wuffs_base__private_implementation__high_prec_dec__small_lshift( +- h, final_lshift); +- uint64_t man2 = +- wuffs_base__private_implementation__high_prec_dec__rounded_integer(h); ++ return 0; ++} + +- // Rounding might have added one bit. If so, shift and re-check overflow. +- if ((man2 >> 53) != 0) { +- man2 >>= 1; +- exp2++; +- if ((exp2 - f64_bias) >= 0x07FF) { // (1 << 11) - 1. +- goto infinity; +- } +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_u32__get_quirk( ++ const wuffs_base__hasher_u32* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- // Handle subnormal numbers. +- if ((man2 >> 52) == 0) { +- exp2 = f64_bias; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { ++ const wuffs_base__hasher_u32__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- // Pack the bits and return. +- uint64_t exp2_bits = +- (uint64_t)((exp2 - f64_bias) & 0x07FF); // (1 << 11) - 1. +- uint64_t bits = (man2 & 0x000FFFFFFFFFFFFF) | // (1 << 52) - 1. +- (exp2_bits << 52) | // +- (h->negative ? 0x8000000000000000 : 0); // (1 << 63). +- +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); +- return ret; +- } while (0); +- +-zero: +- do { +- uint64_t bits = h->negative ? 0x8000000000000000 : 0; ++ return 0; ++} + +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); +- return ret; +- } while (0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__hasher_u32__set_quirk( ++ wuffs_base__hasher_u32* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-infinity: +- do { +- if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) { +- wuffs_base__result_f64 ret; +- ret.status.repr = wuffs_base__error__bad_argument; +- ret.value = 0; +- return ret; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { ++ const wuffs_base__hasher_u32__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- uint64_t bits = h->negative ? 0xFFF0000000000000 : 0x7FF0000000000000; +- +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); +- return ret; +- } while (0); ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); + } + +-static inline bool // +-wuffs_base__private_implementation__is_decimal_digit(uint8_t c) { +- return ('0' <= c) && (c <= '9'); +-} ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_base__hasher_u32__update( ++ wuffs_base__hasher_u32* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 // +-wuffs_base__parse_number_f64(wuffs_base__slice_u8 s, uint32_t options) { +- // In practice, almost all "dd.ddddE±xxx" numbers can be represented +- // losslessly by a uint64_t mantissa "dddddd" and an int32_t base-10 +- // exponent, adjusting "xxx" for the position (if present) of the decimal +- // separator '.' or ','. +- // +- // This (u64 man, i32 exp10) data structure is superficially similar to the +- // "Do It Yourself Floating Point" type from Loitsch (†), but the exponent +- // here is base-10, not base-2. +- // +- // If s's number fits in a (man, exp10), parse that pair with the +- // Eisel-Lemire algorithm. If not, or if Eisel-Lemire fails, parsing s with +- // the fallback algorithm is slower but comprehensive. +- // +- // † "Printing Floating-Point Numbers Quickly and Accurately with Integers" +- // (https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf). +- // Florian Loitsch is also the primary contributor to +- // https://github.com/google/double-conversion +- do { +- // Calculating that (man, exp10) pair needs to stay within s's bounds. +- // Provided that s isn't extremely long, work on a NUL-terminated copy of +- // s's contents. The NUL byte isn't a valid part of "±dd.ddddE±xxx". +- // +- // As the pointer p walks the contents, it's faster to repeatedly check "is +- // *p a valid digit" than "is p within bounds and *p a valid digit". +- if (s.len >= 256) { +- goto fallback; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { ++ const wuffs_base__hasher_u32__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; + } +- uint8_t z[256]; +- memcpy(&z[0], s.ptr, s.len); +- z[s.len] = 0; +- const uint8_t* p = &z[0]; ++ v++; ++ } + +- // Look for a leading minus sign. Technically, we could also look for an +- // optional plus sign, but the "script/process-json-numbers.c with -p" +- // benchmark is noticably slower if we do. It's optional and, in practice, +- // usually absent. Let the fallback catch it. +- bool negative = (*p == '-'); +- if (negative) { +- p++; +- } ++ return wuffs_base__make_empty_struct(); ++} + +- // After walking "dd.dddd", comparing p later with p now will produce the +- // number of "d"s and "."s. +- const uint8_t* const start_of_digits_ptr = p; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_base__hasher_u32__update_u32( ++ wuffs_base__hasher_u32* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return 0; ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return 0; ++ } + +- // Walk the "d"s before a '.', 'E', NUL byte, etc. If it starts with '0', +- // it must be a single '0'. If it starts with a non-zero decimal digit, it +- // can be a sequence of decimal digits. +- // +- // Update the man variable during the walk. It's OK if man overflows now. +- // We'll detect that later. +- uint64_t man; +- if (*p == '0') { +- man = 0; +- p++; +- if (wuffs_base__private_implementation__is_decimal_digit(*p)) { +- goto fallback; +- } +- } else if (wuffs_base__private_implementation__is_decimal_digit(*p)) { +- man = ((uint8_t)(*p - '0')); +- p++; +- for (; wuffs_base__private_implementation__is_decimal_digit(*p); p++) { +- man = (10 * man) + ((uint8_t)(*p - '0')); +- } +- } else { +- goto fallback; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) { ++ const wuffs_base__hasher_u32__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update_u32)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- // Walk the "d"s after the optional decimal separator ('.' or ','), +- // updating the man and exp10 variables. +- int32_t exp10 = 0; +- if (*p == +- ((options & WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.')) { +- p++; +- const uint8_t* first_after_separator_ptr = p; +- if (!wuffs_base__private_implementation__is_decimal_digit(*p)) { +- goto fallback; +- } +- man = (10 * man) + ((uint8_t)(*p - '0')); +- p++; +- for (; wuffs_base__private_implementation__is_decimal_digit(*p); p++) { +- man = (10 * man) + ((uint8_t)(*p - '0')); +- } +- exp10 = ((int32_t)(first_after_separator_ptr - p)); +- } ++ return 0; ++} + +- // Count the number of digits: +- // - for an input of "314159", digit_count is 6. +- // - for an input of "3.14159", digit_count is 7. +- // +- // This is off-by-one if there is a decimal separator. That's OK for now. +- // We'll correct for that later. The "script/process-json-numbers.c with +- // -p" benchmark is noticably slower if we try to correct for that now. +- uint32_t digit_count = (uint32_t)(p - start_of_digits_ptr); ++// -------- + +- // Update exp10 for the optional exponent, starting with 'E' or 'e'. +- if ((*p | 0x20) == 'e') { +- p++; +- int32_t exp_sign = +1; +- if (*p == '-') { +- p++; +- exp_sign = -1; +- } else if (*p == '+') { +- p++; +- } +- if (!wuffs_base__private_implementation__is_decimal_digit(*p)) { +- goto fallback; +- } +- int32_t exp_num = ((uint8_t)(*p - '0')); +- p++; +- // The rest of the exp_num walking has a peculiar control flow but, once +- // again, the "script/process-json-numbers.c with -p" benchmark is +- // sensitive to alternative formulations. +- if (wuffs_base__private_implementation__is_decimal_digit(*p)) { +- exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); +- p++; +- } +- if (wuffs_base__private_implementation__is_decimal_digit(*p)) { +- exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); +- p++; +- } +- while (wuffs_base__private_implementation__is_decimal_digit(*p)) { +- if (exp_num > 0x1000000) { +- goto fallback; +- } +- exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); +- p++; +- } +- exp10 += exp_sign * exp_num; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_u64__checksum_u64( ++ const wuffs_base__hasher_u64* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- // The Wuffs API is that the original slice has no trailing data. It also +- // allows underscores, which we don't catch here but the fallback should. +- if (p != &z[s.len]) { +- goto fallback; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { ++ const wuffs_base__hasher_u64__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->checksum_u64)(self); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- // Check that the uint64_t typed man variable has not overflowed, based on +- // digit_count. +- // +- // For reference: +- // - (1 << 63) is 9223372036854775808, which has 19 decimal digits. +- // - (1 << 64) is 18446744073709551616, which has 20 decimal digits. +- // - 19 nines, 9999999999999999999, is 0x8AC7230489E7FFFF, which has 64 +- // bits and 16 hexadecimal digits. +- // - 20 nines, 99999999999999999999, is 0x56BC75E2D630FFFFF, which has 67 +- // bits and 17 hexadecimal digits. +- if (digit_count > 19) { +- // Even if we have more than 19 pseudo-digits, it's not yet definitely an +- // overflow. Recall that digit_count might be off-by-one (too large) if +- // there's a decimal separator. It will also over-report the number of +- // meaningful digits if the input looks something like "0.000dddExxx". +- // +- // We adjust by the number of leading '0's and '.'s and re-compare to 19. +- // Once again, technically, we could skip ','s too, but that perturbs the +- // "script/process-json-numbers.c with -p" benchmark. +- const uint8_t* q = start_of_digits_ptr; +- for (; (*q == '0') || (*q == '.'); q++) { +- } +- digit_count -= (uint32_t)(q - start_of_digits_ptr); +- if (digit_count > 19) { +- goto fallback; +- } +- } ++ return 0; ++} + +- // The wuffs_base__private_implementation__parse_number_f64_eisel_lemire +- // preconditions include that exp10 is in the range [-307 ..= 288]. +- if ((exp10 < -307) || (288 < exp10)) { +- goto fallback; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_u64__get_quirk( ++ const wuffs_base__hasher_u64* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- // If both man and (10 ** exp10) are exactly representable by a double, we +- // don't need to run the Eisel-Lemire algorithm. +- if ((-22 <= exp10) && (exp10 <= 22) && ((man >> 53) == 0)) { +- double d = (double)man; +- if (exp10 >= 0) { +- d *= wuffs_base__private_implementation__f64_powers_of_10[+exp10]; +- } else { +- d /= wuffs_base__private_implementation__f64_powers_of_10[-exp10]; +- } +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = negative ? -d : +d; +- return ret; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { ++ const wuffs_base__hasher_u64__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- // The wuffs_base__private_implementation__parse_number_f64_eisel_lemire +- // preconditions include that man is non-zero. Parsing "0" should be caught +- // by the "If both man and (10 ** exp10)" above, but "0e99" might not. +- if (man == 0) { +- goto fallback; +- } ++ return 0; ++} + +- // Our man and exp10 are in range. Run the Eisel-Lemire algorithm. +- int64_t r = +- wuffs_base__private_implementation__parse_number_f64_eisel_lemire( +- man, exp10); +- if (r < 0) { +- goto fallback; +- } +- wuffs_base__result_f64 ret; +- ret.status.repr = NULL; +- ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( +- ((uint64_t)r) | (((uint64_t)negative) << 63)); +- return ret; +- } while (0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__hasher_u64__set_quirk( ++ wuffs_base__hasher_u64* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-fallback: +- do { +- wuffs_base__private_implementation__high_prec_dec h; +- wuffs_base__status status = +- wuffs_base__private_implementation__high_prec_dec__parse(&h, s, +- options); +- if (status.repr) { +- return wuffs_base__private_implementation__parse_number_f64_special( +- s, options); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { ++ const wuffs_base__hasher_u64__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; + } +- return wuffs_base__private_implementation__high_prec_dec__to_f64(&h, +- options); +- } while (0); +-} ++ v++; ++ } + +-// -------- ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +-static inline size_t // +-wuffs_base__private_implementation__render_inf(wuffs_base__slice_u8 dst, +- bool neg, +- uint32_t options) { +- if (neg) { +- if (dst.len < 4) { +- return 0; +- } +- wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492D); // '-Inf'le. +- return 4; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_base__hasher_u64__update( ++ wuffs_base__hasher_u64* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); + } + +- if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { +- if (dst.len < 4) { +- return 0; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { ++ const wuffs_base__hasher_u64__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; + } +- wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492B); // '+Inf'le. +- return 4; ++ v++; + } + +- if (dst.len < 3) { +- return 0; +- } +- wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x666E49); // 'Inf'le. +- return 3; ++ return wuffs_base__make_empty_struct(); + } + +-static inline size_t // +-wuffs_base__private_implementation__render_nan(wuffs_base__slice_u8 dst) { +- if (dst.len < 3) { ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_u64__update_u64( ++ wuffs_base__hasher_u64* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { + return 0; + } +- wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x4E614E); // 'NaN'le. +- return 3; +-} +- +-static size_t // +-wuffs_base__private_implementation__high_prec_dec__render_exponent_absent( +- wuffs_base__slice_u8 dst, +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t precision, +- uint32_t options) { +- size_t n = (h->negative || +- (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN)) +- ? 1 +- : 0; +- if (h->decimal_point <= 0) { +- n += 1; +- } else { +- n += (size_t)(h->decimal_point); +- } +- if (precision > 0) { +- n += precision + 1; // +1 for the '.'. ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return 0; + } + +- // Don't modify dst if the formatted number won't fit. +- if (n > dst.len) { +- return 0; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) { ++ const wuffs_base__hasher_u64__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update_u64)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- // Align-left or align-right. +- uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) +- ? &dst.ptr[dst.len - n] +- : &dst.ptr[0]; ++ return 0; ++} + +- // Leading "±". +- if (h->negative) { +- *ptr++ = '-'; +- } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { +- *ptr++ = '+'; +- } ++// -------- + +- // Integral digits. +- if (h->decimal_point <= 0) { +- *ptr++ = '0'; +- } else { +- uint32_t m = +- wuffs_base__u32__min(h->num_digits, (uint32_t)(h->decimal_point)); +- uint32_t i = 0; +- for (; i < m; i++) { +- *ptr++ = (uint8_t)('0' | h->digits[i]); +- } +- for (; i < (uint32_t)(h->decimal_point); i++) { +- *ptr++ = '0'; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_base__hasher_bitvec256__checksum_bitvec256( ++ const wuffs_base__hasher_bitvec256* self) { ++ if (!self) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); + } + +- // Separator and then fractional digits. +- if (precision > 0) { +- *ptr++ = +- (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.'; +- uint32_t i = 0; +- for (; i < precision; i++) { +- uint32_t j = ((uint32_t)(h->decimal_point)) + i; +- *ptr++ = (uint8_t)('0' | ((j < h->num_digits) ? h->digits[j] : 0)); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) { ++ const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->checksum_bitvec256)(self); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; + } + +- return n; ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); + } + +-static size_t // +-wuffs_base__private_implementation__high_prec_dec__render_exponent_present( +- wuffs_base__slice_u8 dst, +- wuffs_base__private_implementation__high_prec_dec* h, +- uint32_t precision, +- uint32_t options) { +- int32_t exp = 0; +- if (h->num_digits > 0) { +- exp = h->decimal_point - 1; +- } +- bool negative_exp = exp < 0; +- if (negative_exp) { +- exp = -exp; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__hasher_bitvec256__get_quirk( ++ const wuffs_base__hasher_bitvec256* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; + } +- +- size_t n = (h->negative || +- (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN)) +- ? 4 +- : 3; // Mininum 3 bytes: first digit and then "e±". +- if (precision > 0) { +- n += precision + 1; // +1 for the '.'. ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } +- n += (exp < 100) ? 2 : 3; + +- // Don't modify dst if the formatted number won't fit. +- if (n > dst.len) { +- return 0; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) { ++ const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- // Align-left or align-right. +- uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) +- ? &dst.ptr[dst.len - n] +- : &dst.ptr[0]; ++ return 0; ++} + +- // Leading "±". +- if (h->negative) { +- *ptr++ = '-'; +- } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { +- *ptr++ = '+'; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__hasher_bitvec256__set_quirk( ++ wuffs_base__hasher_bitvec256* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- +- // Integral digit. +- if (h->num_digits > 0) { +- *ptr++ = (uint8_t)('0' | h->digits[0]); +- } else { +- *ptr++ = '0'; ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- // Separator and then fractional digits. +- if (precision > 0) { +- *ptr++ = +- (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) +- ? ',' +- : '.'; +- uint32_t i = 1; +- uint32_t j = wuffs_base__u32__min(h->num_digits, precision + 1); +- for (; i < j; i++) { +- *ptr++ = (uint8_t)('0' | h->digits[i]); +- } +- for (; i <= precision; i++) { +- *ptr++ = '0'; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) { ++ const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; + } + +- // Exponent: "e±" and then 2 or 3 digits. +- *ptr++ = 'e'; +- *ptr++ = negative_exp ? '-' : '+'; +- if (exp < 10) { +- *ptr++ = '0'; +- *ptr++ = (uint8_t)('0' | exp); +- } else if (exp < 100) { +- *ptr++ = (uint8_t)('0' | (exp / 10)); +- *ptr++ = (uint8_t)('0' | (exp % 10)); +- } else { +- int32_t e = exp / 100; +- exp -= e * 100; +- *ptr++ = (uint8_t)('0' | e); +- *ptr++ = (uint8_t)('0' | (exp / 10)); +- *ptr++ = (uint8_t)('0' | (exp % 10)); +- } +- +- return n; ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); + } + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__render_number_f64(wuffs_base__slice_u8 dst, +- double x, +- uint32_t precision, +- uint32_t options) { +- // Decompose x (64 bits) into negativity (1 bit), base-2 exponent (11 bits +- // with a -1023 bias) and mantissa (52 bits). +- uint64_t bits = wuffs_base__ieee_754_bit_representation__from_f64_to_u64(x); +- bool neg = (bits >> 63) != 0; +- int32_t exp2 = ((int32_t)(bits >> 52)) & 0x7FF; +- uint64_t man = bits & 0x000FFFFFFFFFFFFFul; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_base__hasher_bitvec256__update( ++ wuffs_base__hasher_bitvec256* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } + +- // Apply the exponent bias and set the implicit top bit of the mantissa, +- // unless x is subnormal. Also take care of Inf and NaN. +- if (exp2 == 0x7FF) { +- if (man != 0) { +- return wuffs_base__private_implementation__render_nan(dst); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) { ++ const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; + } +- return wuffs_base__private_implementation__render_inf(dst, neg, options); +- } else if (exp2 == 0) { +- exp2 = -1022; +- } else { +- exp2 -= 1023; +- man |= 0x0010000000000000ul; ++ v++; + } + +- // Ensure that precision isn't too large. +- if (precision > 4095) { +- precision = 4095; ++ return wuffs_base__make_empty_struct(); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_base__hasher_bitvec256__update_bitvec256( ++ wuffs_base__hasher_bitvec256* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); + } + +- // Convert from the (neg, exp2, man) tuple to an HPD. +- wuffs_base__private_implementation__high_prec_dec h; +- wuffs_base__private_implementation__high_prec_dec__assign(&h, man, neg); +- if (h.num_digits > 0) { +- wuffs_base__private_implementation__high_prec_dec__lshift( +- &h, exp2 - 52); // 52 mantissa bits. ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) { ++ const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs = ++ (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->update_bitvec256)(self, a_x); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- // Handle the "%e" and "%f" formats. +- switch (options & (WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT | +- WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT)) { +- case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT: // The "%"f" format. +- if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { +- wuffs_base__private_implementation__high_prec_dec__round_just_enough( +- &h, exp2, man); +- int32_t p = ((int32_t)(h.num_digits)) - h.decimal_point; +- precision = ((uint32_t)(wuffs_base__i32__max(0, p))); +- } else { +- wuffs_base__private_implementation__high_prec_dec__round_nearest( +- &h, ((int32_t)precision) + h.decimal_point); +- } +- return wuffs_base__private_implementation__high_prec_dec__render_exponent_absent( +- dst, &h, precision, options); ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); ++} + +- case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT: // The "%e" format. +- if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { +- wuffs_base__private_implementation__high_prec_dec__round_just_enough( +- &h, exp2, man); +- precision = (h.num_digits > 0) ? (h.num_digits - 1) : 0; +- } else { +- wuffs_base__private_implementation__high_prec_dec__round_nearest( +- &h, ((int32_t)precision) + 1); +- } +- return wuffs_base__private_implementation__high_prec_dec__render_exponent_present( +- dst, &h, precision, options); ++// -------- ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__decode_frame( ++ wuffs_base__image_decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- // We have the "%g" format and so precision means the number of significant +- // digits, not the number of digits after the decimal separator. Perform +- // rounding and determine whether to use "%e" or "%f". +- int32_t e_threshold = 0; +- if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { +- wuffs_base__private_implementation__high_prec_dec__round_just_enough( +- &h, exp2, man); +- precision = h.num_digits; +- e_threshold = 6; +- } else { +- if (precision == 0) { +- precision = 1; +- } +- wuffs_base__private_implementation__high_prec_dec__round_nearest( +- &h, ((int32_t)precision)); +- e_threshold = ((int32_t)precision); +- int32_t nd = ((int32_t)(h.num_digits)); +- if ((e_threshold > nd) && (nd >= h.decimal_point)) { +- e_threshold = nd; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->decode_frame)(self, a_dst, a_src, a_blend, a_workbuf, a_opts); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; + } + +- // Use the "%e" format if the exponent is large. +- int32_t e = h.decimal_point - 1; +- if ((e < -4) || (e_threshold <= e)) { +- uint32_t p = wuffs_base__u32__min(precision, h.num_digits); +- return wuffs_base__private_implementation__high_prec_dec__render_exponent_present( +- dst, &h, (p > 0) ? (p - 1) : 0, options); ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__decode_frame_config( ++ wuffs_base__image_decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- // Use the "%f" format otherwise. +- int32_t p = ((int32_t)precision); +- if (p > h.decimal_point) { +- p = ((int32_t)(h.num_digits)); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->decode_frame_config)(self, a_dst, a_src); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } +- precision = ((uint32_t)(wuffs_base__i32__max(0, p - h.decimal_point))); +- return wuffs_base__private_implementation__high_prec_dec__render_exponent_absent( +- dst, &h, precision, options); ++ ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV) ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__decode_image_config( ++ wuffs_base__image_decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__INTCONV) ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->decode_image_config)(self, a_dst, a_src); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +-// ---------------- Integer ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +-// wuffs_base__parse_number__foo_digits entries are 0x00 for invalid digits, +-// and (0x80 | v) for valid digits, where v is the 4 bit value. ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_base__image_decoder__frame_dirty_rect( ++ const wuffs_base__image_decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } + +-static const uint8_t wuffs_base__parse_number__decimal_digits[256] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. +- 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'. +- 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'. ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->frame_dirty_rect)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. ++ return wuffs_base__utility__empty_rect_ie_u32(); ++} + +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF. ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__image_decoder__get_quirk( ++ const wuffs_base__image_decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF. +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +-}; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +-static const uint8_t wuffs_base__parse_number__hexadecimal_digits[256] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. +- 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'. +- 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'. ++ return 0; ++} + +- 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x40 ..= 0x47. 'A'-'F'. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. +- 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x60 ..= 0x67. 'a'-'f'. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_base__image_decoder__num_animation_loops( ++ const wuffs_base__image_decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF. ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->num_animation_loops)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF. +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +-}; ++ return 0; ++} + +-static const uint8_t wuffs_base__private_implementation__encode_base16[16] = { +- 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // 0x00 ..= 0x07. +- 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, // 0x08 ..= 0x0F. +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__image_decoder__num_decoded_frame_configs( ++ const wuffs_base__image_decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-// -------- ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->num_decoded_frame_configs)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64 // +-wuffs_base__parse_number_i64(wuffs_base__slice_u8 s, uint32_t options) { +- uint8_t* p = s.ptr; +- uint8_t* q = s.ptr + s.len; ++ return 0; ++} + +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (; (p < q) && (*p == '_'); p++) { +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__image_decoder__num_decoded_frames( ++ const wuffs_base__image_decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- bool negative = false; +- if (p >= q) { +- goto fail_bad_argument; +- } else if (*p == '-') { +- p++; +- negative = true; +- } else if (*p == '+') { +- p++; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->num_decoded_frames)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- do { +- wuffs_base__result_u64 r = wuffs_base__parse_number_u64( +- wuffs_base__make_slice_u8(p, (size_t)(q - p)), options); +- if (r.status.repr != NULL) { +- wuffs_base__result_i64 ret; +- ret.status.repr = r.status.repr; +- ret.value = 0; +- return ret; +- } else if (negative) { +- if (r.value < 0x8000000000000000) { +- wuffs_base__result_i64 ret; +- ret.status.repr = NULL; +- ret.value = -(int64_t)(r.value); +- return ret; +- } else if (r.value == 0x8000000000000000) { +- wuffs_base__result_i64 ret; +- ret.status.repr = NULL; +- ret.value = INT64_MIN; +- return ret; +- } +- goto fail_out_of_bounds; +- } else if (r.value > 0x7FFFFFFFFFFFFFFF) { +- goto fail_out_of_bounds; +- } else { +- wuffs_base__result_i64 ret; +- ret.status.repr = NULL; +- ret.value = +(int64_t)(r.value); +- return ret; +- } +- } while (0); +- +-fail_bad_argument: +- do { +- wuffs_base__result_i64 ret; +- ret.status.repr = wuffs_base__error__bad_argument; +- ret.value = 0; +- return ret; +- } while (0); +- +-fail_out_of_bounds: +- do { +- wuffs_base__result_i64 ret; +- ret.status.repr = wuffs_base__error__out_of_bounds; +- ret.value = 0; +- return ret; +- } while (0); ++ return 0; + } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64 // +-wuffs_base__parse_number_u64(wuffs_base__slice_u8 s, uint32_t options) { +- uint8_t* p = s.ptr; +- uint8_t* q = s.ptr + s.len; +- +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (; (p < q) && (*p == '_'); p++) { +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__restart_frame( ++ wuffs_base__image_decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- if (p >= q) { +- goto fail_bad_argument; +- +- } else if (*p == '0') { +- p++; +- if (p >= q) { +- goto ok_zero; +- } +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- if (*p == '_') { +- p++; +- for (; p < q; p++) { +- if (*p != '_') { +- if (options & +- WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) { +- goto decimal; +- } +- goto fail_bad_argument; +- } +- } +- goto ok_zero; +- } ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->restart_frame)(self, a_index, a_io_position); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- if ((*p == 'x') || (*p == 'X')) { +- p++; +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (; (p < q) && (*p == '_'); p++) { +- } +- } +- if (p < q) { +- goto hexadecimal; +- } ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +- } else if ((*p == 'd') || (*p == 'D')) { +- p++; +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { +- for (; (p < q) && (*p == '_'); p++) { +- } +- } +- if (p < q) { +- goto decimal; +- } +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__set_quirk( ++ wuffs_base__image_decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +- if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) { +- goto decimal; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; + } +- goto fail_bad_argument; ++ v++; + } + +-decimal: +- do { +- uint64_t v = wuffs_base__parse_number__decimal_digits[*p++]; +- if (v == 0) { +- goto fail_bad_argument; +- } +- v &= 0x0F; ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +- // UINT64_MAX is 18446744073709551615, which is ((10 * max10) + max1). +- const uint64_t max10 = 1844674407370955161u; +- const uint8_t max1 = 5; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_base__image_decoder__set_report_metadata( ++ wuffs_base__image_decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } + +- for (; p < q; p++) { +- if ((*p == '_') && +- (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- continue; +- } +- uint8_t digit = wuffs_base__parse_number__decimal_digits[*p]; +- if (digit == 0) { +- goto fail_bad_argument; +- } +- digit &= 0x0F; +- if ((v > max10) || ((v == max10) && (digit > max1))) { +- goto fail_out_of_bounds; +- } +- v = (10 * v) + ((uint64_t)(digit)); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_report_metadata)(self, a_fourcc, a_report); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- wuffs_base__result_u64 ret; +- ret.status.repr = NULL; +- ret.value = v; +- return ret; +- } while (0); ++ return wuffs_base__make_empty_struct(); ++} + +-hexadecimal: +- do { +- uint64_t v = wuffs_base__parse_number__hexadecimal_digits[*p++]; +- if (v == 0) { +- goto fail_bad_argument; +- } +- v &= 0x0F; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__image_decoder__tell_me_more( ++ wuffs_base__image_decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +- for (; p < q; p++) { +- if ((*p == '_') && +- (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { +- continue; +- } +- uint8_t digit = wuffs_base__parse_number__hexadecimal_digits[*p]; +- if (digit == 0) { +- goto fail_bad_argument; +- } +- digit &= 0x0F; +- if ((v >> 60) != 0) { +- goto fail_out_of_bounds; +- } +- v = (v << 4) | ((uint64_t)(digit)); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->tell_me_more)(self, a_dst, a_minfo, a_src); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; ++ } + +- wuffs_base__result_u64 ret; +- ret.status.repr = NULL; +- ret.value = v; +- return ret; +- } while (0); ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +-ok_zero: +- do { +- wuffs_base__result_u64 ret; +- ret.status.repr = NULL; +- ret.value = 0; +- return ret; +- } while (0); ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_base__image_decoder__workbuf_len( ++ const wuffs_base__image_decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } + +-fail_bad_argument: +- do { +- wuffs_base__result_u64 ret; +- ret.status.repr = wuffs_base__error__bad_argument; +- ret.value = 0; +- return ret; +- } while (0); ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__image_decoder__vtable_name) { ++ const wuffs_base__image_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->workbuf_len)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +-fail_out_of_bounds: +- do { +- wuffs_base__result_u64 ret; +- ret.status.repr = wuffs_base__error__out_of_bounds; +- ret.value = 0; +- return ret; +- } while (0); ++ return wuffs_base__utility__empty_range_ii_u64(); + } + + // -------- + +-// wuffs_base__render_number__first_hundred contains the decimal encodings of +-// the first one hundred numbers [0 ..= 99]. +-static const uint8_t wuffs_base__render_number__first_hundred[200] = { +- '0', '0', '0', '1', '0', '2', '0', '3', '0', '4', // +- '0', '5', '0', '6', '0', '7', '0', '8', '0', '9', // +- '1', '0', '1', '1', '1', '2', '1', '3', '1', '4', // +- '1', '5', '1', '6', '1', '7', '1', '8', '1', '9', // +- '2', '0', '2', '1', '2', '2', '2', '3', '2', '4', // +- '2', '5', '2', '6', '2', '7', '2', '8', '2', '9', // +- '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', // +- '3', '5', '3', '6', '3', '7', '3', '8', '3', '9', // +- '4', '0', '4', '1', '4', '2', '4', '3', '4', '4', // +- '4', '5', '4', '6', '4', '7', '4', '8', '4', '9', // +- '5', '0', '5', '1', '5', '2', '5', '3', '5', '4', // +- '5', '5', '5', '6', '5', '7', '5', '8', '5', '9', // +- '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', // +- '6', '5', '6', '6', '6', '7', '6', '8', '6', '9', // +- '7', '0', '7', '1', '7', '2', '7', '3', '7', '4', // +- '7', '5', '7', '6', '7', '7', '7', '8', '7', '9', // +- '8', '0', '8', '1', '8', '2', '8', '3', '8', '4', // +- '8', '5', '8', '6', '8', '7', '8', '8', '8', '9', // +- '9', '0', '9', '1', '9', '2', '9', '3', '9', '4', // +- '9', '5', '9', '6', '9', '7', '9', '8', '9', '9', // +-}; +- +-static size_t // +-wuffs_base__private_implementation__render_number_u64(wuffs_base__slice_u8 dst, +- uint64_t x, +- uint32_t options, +- bool neg) { +- uint8_t buf[WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL]; +- uint8_t* ptr = &buf[0] + sizeof(buf); +- +- while (x >= 100) { +- size_t index = ((size_t)((x % 100) * 2)); +- x /= 100; +- uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0]; +- uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1]; +- ptr -= 2; +- ptr[0] = s0; +- ptr[1] = s1; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_base__io_transformer__dst_history_retain_length( ++ const wuffs_base__io_transformer* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); + } +- +- if (x < 10) { +- ptr -= 1; +- ptr[0] = (uint8_t)('0' + x); +- } else { +- size_t index = ((size_t)(x * 2)); +- uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0]; +- uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1]; +- ptr -= 2; +- ptr[0] = s0; +- ptr[1] = s1; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); + } + +- if (neg) { +- ptr -= 1; +- ptr[0] = '-'; +- } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { +- ptr -= 1; +- ptr[0] = '+'; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { ++ const wuffs_base__io_transformer__func_ptrs* func_ptrs = ++ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->dst_history_retain_length)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- size_t n = sizeof(buf) - ((size_t)(ptr - &buf[0])); +- if (n > dst.len) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__io_transformer__get_quirk( ++ const wuffs_base__io_transformer* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { + return 0; + } +- memcpy(dst.ptr + ((options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) +- ? (dst.len - n) +- : 0), +- ptr, n); +- return n; +-} + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__render_number_i64(wuffs_base__slice_u8 dst, +- int64_t x, +- uint32_t options) { +- uint64_t u = (uint64_t)x; +- bool neg = x < 0; +- if (neg) { +- u = 1 + ~u; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { ++ const wuffs_base__io_transformer__func_ptrs* func_ptrs = ++ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } +- return wuffs_base__private_implementation__render_number_u64(dst, u, options, +- neg); +-} + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__render_number_u64(wuffs_base__slice_u8 dst, +- uint64_t x, +- uint32_t options) { +- return wuffs_base__private_implementation__render_number_u64(dst, x, options, +- false); ++ return 0; + } + +-// ---------------- Base-16 ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__io_transformer__set_quirk( ++ wuffs_base__io_transformer* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_16__decode2(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- wuffs_base__transform__output o; +- size_t src_len2 = src.len / 2; +- size_t len; +- if (dst.len < src_len2) { +- len = dst.len; +- o.status.repr = wuffs_base__suspension__short_write; +- } else { +- len = src_len2; +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- } else if (src.len & 1) { +- o.status.repr = wuffs_base__error__bad_data; +- } else { +- o.status.repr = NULL; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { ++ const wuffs_base__io_transformer__func_ptrs* func_ptrs = ++ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; + } ++ v++; + } + +- uint8_t* d = dst.ptr; +- uint8_t* s = src.ptr; +- size_t n = len; ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +- while (n--) { +- *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[0]] << 4) | +- (wuffs_base__parse_number__hexadecimal_digits[s[1]] & 0x0F)); +- d += 1; +- s += 2; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__io_transformer__transform_io( ++ wuffs_base__io_transformer* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- o.num_dst = len; +- o.num_src = len * 2; +- return o; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { ++ const wuffs_base__io_transformer__func_ptrs* func_ptrs = ++ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->transform_io)(self, a_dst, a_src, a_workbuf); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); + } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_16__decode4(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- wuffs_base__transform__output o; +- size_t src_len4 = src.len / 4; +- size_t len = dst.len < src_len4 ? dst.len : src_len4; +- if (dst.len < src_len4) { +- len = dst.len; +- o.status.repr = wuffs_base__suspension__short_write; +- } else { +- len = src_len4; +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- } else if (src.len & 1) { +- o.status.repr = wuffs_base__error__bad_data; +- } else { +- o.status.repr = NULL; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_base__io_transformer__workbuf_len( ++ const wuffs_base__io_transformer* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } + +- uint8_t* d = dst.ptr; +- uint8_t* s = src.ptr; +- size_t n = len; +- +- while (n--) { +- *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[2]] << 4) | +- (wuffs_base__parse_number__hexadecimal_digits[s[3]] & 0x0F)); +- d += 1; +- s += 4; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__io_transformer__vtable_name) { ++ const wuffs_base__io_transformer__func_ptrs* func_ptrs = ++ (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->workbuf_len)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- o.num_dst = len; +- o.num_src = len * 4; +- return o; ++ return wuffs_base__utility__empty_range_ii_u64(); + } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- wuffs_base__transform__output o; +- size_t dst_len2 = dst.len / 2; +- size_t len; +- if (dst_len2 < src.len) { +- len = dst_len2; +- o.status.repr = wuffs_base__suspension__short_write; +- } else { +- len = src.len; +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- } else { +- o.status.repr = NULL; +- } +- } ++// -------- + +- uint8_t* d = dst.ptr; +- uint8_t* s = src.ptr; +- size_t n = len; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__token_decoder__decode_tokens( ++ wuffs_base__token_decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +- while (n--) { +- uint8_t c = *s; +- d[0] = wuffs_base__private_implementation__encode_base16[c >> 4]; +- d[1] = wuffs_base__private_implementation__encode_base16[c & 0x0F]; +- d += 2; +- s += 1; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { ++ const wuffs_base__token_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->decode_tokens)(self, a_dst, a_src, a_workbuf); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- o.num_dst = len * 2; +- o.num_src = len; +- return o; ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); + } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_16__encode4(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- wuffs_base__transform__output o; +- size_t dst_len4 = dst.len / 4; +- size_t len; +- if (dst_len4 < src.len) { +- len = dst_len4; +- o.status.repr = wuffs_base__suspension__short_write; +- } else { +- len = src.len; +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- } else { +- o.status.repr = NULL; +- } ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_base__token_decoder__get_quirk( ++ const wuffs_base__token_decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- uint8_t* d = dst.ptr; +- uint8_t* s = src.ptr; +- size_t n = len; +- +- while (n--) { +- uint8_t c = *s; +- d[0] = '\\'; +- d[1] = 'x'; +- d[2] = wuffs_base__private_implementation__encode_base16[c >> 4]; +- d[3] = wuffs_base__private_implementation__encode_base16[c & 0x0F]; +- d += 4; +- s += 1; ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { ++ const wuffs_base__token_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->get_quirk)(self, a_key); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; + } + +- o.num_dst = len * 4; +- o.num_src = len; +- return o; ++ return 0; + } + +-// ---------------- Base-64 ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_base__token_decoder__set_quirk( ++ wuffs_base__token_decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-// The two base-64 alphabets, std and url, differ only in the last two codes. +-// - std: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +-// - url: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { ++ const wuffs_base__token_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->set_quirk)(self, a_key, a_value); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +-static const uint8_t wuffs_base__base_64__decode_std[256] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x00 ..= 0x07. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x08 ..= 0x0F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x10 ..= 0x17. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x18 ..= 0x1F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x20 ..= 0x27. +- 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x80, 0x3F, // 0x28 ..= 0x2F. +- 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 0x30 ..= 0x37. +- 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x38 ..= 0x3F. ++ return wuffs_base__make_status(wuffs_base__error__bad_vtable); ++} + +- 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 0x40 ..= 0x47. +- 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 0x48 ..= 0x4F. +- 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 0x50 ..= 0x57. +- 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x58 ..= 0x5F. +- 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 0x60 ..= 0x67. +- 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 0x68 ..= 0x6F. +- 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 0x70 ..= 0x77. +- 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x78 ..= 0x7F. ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_base__token_decoder__workbuf_len( ++ const wuffs_base__token_decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } + +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x80 ..= 0x87. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x88 ..= 0x8F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x90 ..= 0x97. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x98 ..= 0x9F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA0 ..= 0xA7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA8 ..= 0xAF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB0 ..= 0xB7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB8 ..= 0xBF. ++ const wuffs_base__vtable* v = &self->private_impl.first_vtable; ++ int i; ++ for (i = 0; i < 63; i++) { ++ if (v->vtable_name == wuffs_base__token_decoder__vtable_name) { ++ const wuffs_base__token_decoder__func_ptrs* func_ptrs = ++ (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers); ++ return (*func_ptrs->workbuf_len)(self); ++ } else if (v->vtable_name == NULL) { ++ break; ++ } ++ v++; ++ } + +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC0 ..= 0xC7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC8 ..= 0xCF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD0 ..= 0xD7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD8 ..= 0xDF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE0 ..= 0xE7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE8 ..= 0xEF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +-}; ++ return wuffs_base__utility__empty_range_ii_u64(); ++} + +-static const uint8_t wuffs_base__base_64__decode_url[256] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x00 ..= 0x07. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x08 ..= 0x0F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x10 ..= 0x17. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x18 ..= 0x1F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x20 ..= 0x27. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, // 0x28 ..= 0x2F. +- 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 0x30 ..= 0x37. +- 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x38 ..= 0x3F. ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES) + +- 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 0x40 ..= 0x47. +- 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 0x48 ..= 0x4F. +- 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 0x50 ..= 0x57. +- 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x3F, // 0x58 ..= 0x5F. +- 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 0x60 ..= 0x67. +- 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 0x68 ..= 0x6F. +- 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 0x70 ..= 0x77. +- 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x78 ..= 0x7F. ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV) + +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x80 ..= 0x87. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x88 ..= 0x8F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x90 ..= 0x97. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x98 ..= 0x9F. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA0 ..= 0xA7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA8 ..= 0xAF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB0 ..= 0xB7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB8 ..= 0xBF. ++// ---------------- IEEE 754 Floating Point + +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC0 ..= 0xC7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC8 ..= 0xCF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD0 ..= 0xD7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD8 ..= 0xDF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE0 ..= 0xE7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE8 ..= 0xEF. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F ++// The etc__hpd_left_shift and etc__powers_of_5 tables were printed by ++// script/print-hpd-left-shift.go. That script has an optional -comments flag, ++// whose output is not copied here, which prints further detail. ++// ++// These tables are used in ++// wuffs_private_impl__high_prec_dec__lshift_num_new_digits. ++ ++// wuffs_private_impl__hpd_left_shift[i] encodes the number of new digits ++// created after multiplying a positive integer by (1 << i): the additional ++// length in the decimal representation. For example, shifting "234" by 3 ++// (equivalent to multiplying by 8) will produce "1872". Going from a 3-length ++// string to a 4-length string means that 1 new digit was added (and existing ++// digits may have changed). ++// ++// Shifting by i can add either N or N-1 new digits, depending on whether the ++// original positive integer compares >= or < to the i'th power of 5 (as 10 ++// equals 2 * 5). Comparison is lexicographic, not numerical. ++// ++// For example, shifting by 4 (i.e. multiplying by 16) can add 1 or 2 new ++// digits, depending on a lexicographic comparison to (5 ** 4), i.e. "625": ++// - ("1" << 4) is "16", which adds 1 new digit. ++// - ("5678" << 4) is "90848", which adds 1 new digit. ++// - ("624" << 4) is "9984", which adds 1 new digit. ++// - ("62498" << 4) is "999968", which adds 1 new digit. ++// - ("625" << 4) is "10000", which adds 2 new digits. ++// - ("625001" << 4) is "10000016", which adds 2 new digits. ++// - ("7008" << 4) is "112128", which adds 2 new digits. ++// - ("99" << 4) is "1584", which adds 2 new digits. ++// ++// Thus, when i is 4, N is 2 and (5 ** i) is "625". This etc__hpd_left_shift ++// array encodes this as: ++// - etc__hpd_left_shift[4] is 0x1006 = (2 << 11) | 0x0006. ++// - etc__hpd_left_shift[5] is 0x1009 = (? << 11) | 0x0009. ++// where the ? isn't relevant for i == 4. ++// ++// The high 5 bits of etc__hpd_left_shift[i] is N, the higher of the two ++// possible number of new digits. The low 11 bits are an offset into the ++// etc__powers_of_5 array (of length 0x051C, so offsets fit in 11 bits). When i ++// is 4, its offset and the next one is 6 and 9, and etc__powers_of_5[6 .. 9] ++// is the string "\x06\x02\x05", so the relevant power of 5 is "625". ++// ++// Thanks to Ken Thompson for the original idea. ++static const uint16_t wuffs_private_impl__hpd_left_shift[65] = { ++ 0x0000, 0x0800, 0x0801, 0x0803, 0x1006, 0x1009, 0x100D, 0x1812, 0x1817, ++ 0x181D, 0x2024, 0x202B, 0x2033, 0x203C, 0x2846, 0x2850, 0x285B, 0x3067, ++ 0x3073, 0x3080, 0x388E, 0x389C, 0x38AB, 0x38BB, 0x40CC, 0x40DD, 0x40EF, ++ 0x4902, 0x4915, 0x4929, 0x513E, 0x5153, 0x5169, 0x5180, 0x5998, 0x59B0, ++ 0x59C9, 0x61E3, 0x61FD, 0x6218, 0x6A34, 0x6A50, 0x6A6D, 0x6A8B, 0x72AA, ++ 0x72C9, 0x72E9, 0x7B0A, 0x7B2B, 0x7B4D, 0x8370, 0x8393, 0x83B7, 0x83DC, ++ 0x8C02, 0x8C28, 0x8C4F, 0x9477, 0x949F, 0x94C8, 0x9CF2, 0x051C, 0x051C, ++ 0x051C, 0x051C, + }; + +-static const uint8_t wuffs_base__base_64__encode_std[64] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // 0x00 ..= 0x07. +- 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0x08 ..= 0x0F. +- 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0x10 ..= 0x17. +- 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 0x18 ..= 0x1F. +- 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, // 0x20 ..= 0x27. +- 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, // 0x28 ..= 0x2F. +- 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, // 0x30 ..= 0x37. +- 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F, // 0x38 ..= 0x3F. ++// wuffs_private_impl__powers_of_5 contains the powers of 5, concatenated ++// together: "5", "25", "125", "625", "3125", etc. ++static const uint8_t wuffs_private_impl__powers_of_5[0x051C] = { ++ 5, 2, 5, 1, 2, 5, 6, 2, 5, 3, 1, 2, 5, 1, 5, 6, 2, 5, 7, 8, 1, 2, 5, 3, 9, ++ 0, 6, 2, 5, 1, 9, 5, 3, 1, 2, 5, 9, 7, 6, 5, 6, 2, 5, 4, 8, 8, 2, 8, 1, 2, ++ 5, 2, 4, 4, 1, 4, 0, 6, 2, 5, 1, 2, 2, 0, 7, 0, 3, 1, 2, 5, 6, 1, 0, 3, 5, ++ 1, 5, 6, 2, 5, 3, 0, 5, 1, 7, 5, 7, 8, 1, 2, 5, 1, 5, 2, 5, 8, 7, 8, 9, 0, ++ 6, 2, 5, 7, 6, 2, 9, 3, 9, 4, 5, 3, 1, 2, 5, 3, 8, 1, 4, 6, 9, 7, 2, 6, 5, ++ 6, 2, 5, 1, 9, 0, 7, 3, 4, 8, 6, 3, 2, 8, 1, 2, 5, 9, 5, 3, 6, 7, 4, 3, 1, ++ 6, 4, 0, 6, 2, 5, 4, 7, 6, 8, 3, 7, 1, 5, 8, 2, 0, 3, 1, 2, 5, 2, 3, 8, 4, ++ 1, 8, 5, 7, 9, 1, 0, 1, 5, 6, 2, 5, 1, 1, 9, 2, 0, 9, 2, 8, 9, 5, 5, 0, 7, ++ 8, 1, 2, 5, 5, 9, 6, 0, 4, 6, 4, 4, 7, 7, 5, 3, 9, 0, 6, 2, 5, 2, 9, 8, 0, ++ 2, 3, 2, 2, 3, 8, 7, 6, 9, 5, 3, 1, 2, 5, 1, 4, 9, 0, 1, 1, 6, 1, 1, 9, 3, ++ 8, 4, 7, 6, 5, 6, 2, 5, 7, 4, 5, 0, 5, 8, 0, 5, 9, 6, 9, 2, 3, 8, 2, 8, 1, ++ 2, 5, 3, 7, 2, 5, 2, 9, 0, 2, 9, 8, 4, 6, 1, 9, 1, 4, 0, 6, 2, 5, 1, 8, 6, ++ 2, 6, 4, 5, 1, 4, 9, 2, 3, 0, 9, 5, 7, 0, 3, 1, 2, 5, 9, 3, 1, 3, 2, 2, 5, ++ 7, 4, 6, 1, 5, 4, 7, 8, 5, 1, 5, 6, 2, 5, 4, 6, 5, 6, 6, 1, 2, 8, 7, 3, 0, ++ 7, 7, 3, 9, 2, 5, 7, 8, 1, 2, 5, 2, 3, 2, 8, 3, 0, 6, 4, 3, 6, 5, 3, 8, 6, ++ 9, 6, 2, 8, 9, 0, 6, 2, 5, 1, 1, 6, 4, 1, 5, 3, 2, 1, 8, 2, 6, 9, 3, 4, 8, ++ 1, 4, 4, 5, 3, 1, 2, 5, 5, 8, 2, 0, 7, 6, 6, 0, 9, 1, 3, 4, 6, 7, 4, 0, 7, ++ 2, 2, 6, 5, 6, 2, 5, 2, 9, 1, 0, 3, 8, 3, 0, 4, 5, 6, 7, 3, 3, 7, 0, 3, 6, ++ 1, 3, 2, 8, 1, 2, 5, 1, 4, 5, 5, 1, 9, 1, 5, 2, 2, 8, 3, 6, 6, 8, 5, 1, 8, ++ 0, 6, 6, 4, 0, 6, 2, 5, 7, 2, 7, 5, 9, 5, 7, 6, 1, 4, 1, 8, 3, 4, 2, 5, 9, ++ 0, 3, 3, 2, 0, 3, 1, 2, 5, 3, 6, 3, 7, 9, 7, 8, 8, 0, 7, 0, 9, 1, 7, 1, 2, ++ 9, 5, 1, 6, 6, 0, 1, 5, 6, 2, 5, 1, 8, 1, 8, 9, 8, 9, 4, 0, 3, 5, 4, 5, 8, ++ 5, 6, 4, 7, 5, 8, 3, 0, 0, 7, 8, 1, 2, 5, 9, 0, 9, 4, 9, 4, 7, 0, 1, 7, 7, ++ 2, 9, 2, 8, 2, 3, 7, 9, 1, 5, 0, 3, 9, 0, 6, 2, 5, 4, 5, 4, 7, 4, 7, 3, 5, ++ 0, 8, 8, 6, 4, 6, 4, 1, 1, 8, 9, 5, 7, 5, 1, 9, 5, 3, 1, 2, 5, 2, 2, 7, 3, ++ 7, 3, 6, 7, 5, 4, 4, 3, 2, 3, 2, 0, 5, 9, 4, 7, 8, 7, 5, 9, 7, 6, 5, 6, 2, ++ 5, 1, 1, 3, 6, 8, 6, 8, 3, 7, 7, 2, 1, 6, 1, 6, 0, 2, 9, 7, 3, 9, 3, 7, 9, ++ 8, 8, 2, 8, 1, 2, 5, 5, 6, 8, 4, 3, 4, 1, 8, 8, 6, 0, 8, 0, 8, 0, 1, 4, 8, ++ 6, 9, 6, 8, 9, 9, 4, 1, 4, 0, 6, 2, 5, 2, 8, 4, 2, 1, 7, 0, 9, 4, 3, 0, 4, ++ 0, 4, 0, 0, 7, 4, 3, 4, 8, 4, 4, 9, 7, 0, 7, 0, 3, 1, 2, 5, 1, 4, 2, 1, 0, ++ 8, 5, 4, 7, 1, 5, 2, 0, 2, 0, 0, 3, 7, 1, 7, 4, 2, 2, 4, 8, 5, 3, 5, 1, 5, ++ 6, 2, 5, 7, 1, 0, 5, 4, 2, 7, 3, 5, 7, 6, 0, 1, 0, 0, 1, 8, 5, 8, 7, 1, 1, ++ 2, 4, 2, 6, 7, 5, 7, 8, 1, 2, 5, 3, 5, 5, 2, 7, 1, 3, 6, 7, 8, 8, 0, 0, 5, ++ 0, 0, 9, 2, 9, 3, 5, 5, 6, 2, 1, 3, 3, 7, 8, 9, 0, 6, 2, 5, 1, 7, 7, 6, 3, ++ 5, 6, 8, 3, 9, 4, 0, 0, 2, 5, 0, 4, 6, 4, 6, 7, 7, 8, 1, 0, 6, 6, 8, 9, 4, ++ 5, 3, 1, 2, 5, 8, 8, 8, 1, 7, 8, 4, 1, 9, 7, 0, 0, 1, 2, 5, 2, 3, 2, 3, 3, ++ 8, 9, 0, 5, 3, 3, 4, 4, 7, 2, 6, 5, 6, 2, 5, 4, 4, 4, 0, 8, 9, 2, 0, 9, 8, ++ 5, 0, 0, 6, 2, 6, 1, 6, 1, 6, 9, 4, 5, 2, 6, 6, 7, 2, 3, 6, 3, 2, 8, 1, 2, ++ 5, 2, 2, 2, 0, 4, 4, 6, 0, 4, 9, 2, 5, 0, 3, 1, 3, 0, 8, 0, 8, 4, 7, 2, 6, ++ 3, 3, 3, 6, 1, 8, 1, 6, 4, 0, 6, 2, 5, 1, 1, 1, 0, 2, 2, 3, 0, 2, 4, 6, 2, ++ 5, 1, 5, 6, 5, 4, 0, 4, 2, 3, 6, 3, 1, 6, 6, 8, 0, 9, 0, 8, 2, 0, 3, 1, 2, ++ 5, 5, 5, 5, 1, 1, 1, 5, 1, 2, 3, 1, 2, 5, 7, 8, 2, 7, 0, 2, 1, 1, 8, 1, 5, ++ 8, 3, 4, 0, 4, 5, 4, 1, 0, 1, 5, 6, 2, 5, 2, 7, 7, 5, 5, 5, 7, 5, 6, 1, 5, ++ 6, 2, 8, 9, 1, 3, 5, 1, 0, 5, 9, 0, 7, 9, 1, 7, 0, 2, 2, 7, 0, 5, 0, 7, 8, ++ 1, 2, 5, 1, 3, 8, 7, 7, 7, 8, 7, 8, 0, 7, 8, 1, 4, 4, 5, 6, 7, 5, 5, 2, 9, ++ 5, 3, 9, 5, 8, 5, 1, 1, 3, 5, 2, 5, 3, 9, 0, 6, 2, 5, 6, 9, 3, 8, 8, 9, 3, ++ 9, 0, 3, 9, 0, 7, 2, 2, 8, 3, 7, 7, 6, 4, 7, 6, 9, 7, 9, 2, 5, 5, 6, 7, 6, ++ 2, 6, 9, 5, 3, 1, 2, 5, 3, 4, 6, 9, 4, 4, 6, 9, 5, 1, 9, 5, 3, 6, 1, 4, 1, ++ 8, 8, 8, 2, 3, 8, 4, 8, 9, 6, 2, 7, 8, 3, 8, 1, 3, 4, 7, 6, 5, 6, 2, 5, 1, ++ 7, 3, 4, 7, 2, 3, 4, 7, 5, 9, 7, 6, 8, 0, 7, 0, 9, 4, 4, 1, 1, 9, 2, 4, 4, ++ 8, 1, 3, 9, 1, 9, 0, 6, 7, 3, 8, 2, 8, 1, 2, 5, 8, 6, 7, 3, 6, 1, 7, 3, 7, ++ 9, 8, 8, 4, 0, 3, 5, 4, 7, 2, 0, 5, 9, 6, 2, 2, 4, 0, 6, 9, 5, 9, 5, 3, 3, ++ 6, 9, 1, 4, 0, 6, 2, 5, + }; + +-static const uint8_t wuffs_base__base_64__encode_url[64] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // 0x00 ..= 0x07. +- 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0x08 ..= 0x0F. +- 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0x10 ..= 0x17. +- 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 0x18 ..= 0x1F. +- 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, // 0x20 ..= 0x27. +- 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, // 0x28 ..= 0x2F. +- 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, // 0x30 ..= 0x37. +- 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2D, 0x5F, // 0x38 ..= 0x3F. ++// -------- ++ ++// wuffs_private_impl__powers_of_10 contains truncated approximations to the ++// powers of 10, ranging from 1e-307 to 1e+288 inclusive, as 596 pairs of ++// uint64_t values (a 128-bit mantissa). ++// ++// There's also an implicit third column (implied by a linear formula involving ++// the base-10 exponent) that is the base-2 exponent, biased by a magic ++// constant. That constant (1214 or 0x04BE) equals 1023 + 191. 1023 is the bias ++// for IEEE 754 double-precision floating point. 191 is ((3 * 64) - 1) and ++// wuffs_private_impl__parse_number_f64_eisel_lemire works with ++// multiples-of-64-bit mantissas. ++// ++// For example, the third row holds the approximation to 1e-305: ++// 0xE0B62E29_29ABA83C_331ACDAB_FE94DE87 * (2 ** (0x0049 - 0x04BE)) ++// ++// Similarly, 1e+4 is approximated by: ++// 0x9C400000_00000000_00000000_00000000 * (2 ** (0x044C - 0x04BE)) ++// ++// Similarly, 1e+68 is approximated by: ++// 0xED63A231_D4C4FB27_4CA7AAA8_63EE4BDD * (2 ** (0x0520 - 0x04BE)) ++// ++// This table was generated by by script/print-mpb-powers-of-10.go ++static const uint64_t wuffs_private_impl__powers_of_10[596][2] = { ++ {0xA5D3B6D479F8E056, 0x8FD0C16206306BAB}, // 1e-307 ++ {0x8F48A4899877186C, 0xB3C4F1BA87BC8696}, // 1e-306 ++ {0x331ACDABFE94DE87, 0xE0B62E2929ABA83C}, // 1e-305 ++ {0x9FF0C08B7F1D0B14, 0x8C71DCD9BA0B4925}, // 1e-304 ++ {0x07ECF0AE5EE44DD9, 0xAF8E5410288E1B6F}, // 1e-303 ++ {0xC9E82CD9F69D6150, 0xDB71E91432B1A24A}, // 1e-302 ++ {0xBE311C083A225CD2, 0x892731AC9FAF056E}, // 1e-301 ++ {0x6DBD630A48AAF406, 0xAB70FE17C79AC6CA}, // 1e-300 ++ {0x092CBBCCDAD5B108, 0xD64D3D9DB981787D}, // 1e-299 ++ {0x25BBF56008C58EA5, 0x85F0468293F0EB4E}, // 1e-298 ++ {0xAF2AF2B80AF6F24E, 0xA76C582338ED2621}, // 1e-297 ++ {0x1AF5AF660DB4AEE1, 0xD1476E2C07286FAA}, // 1e-296 ++ {0x50D98D9FC890ED4D, 0x82CCA4DB847945CA}, // 1e-295 ++ {0xE50FF107BAB528A0, 0xA37FCE126597973C}, // 1e-294 ++ {0x1E53ED49A96272C8, 0xCC5FC196FEFD7D0C}, // 1e-293 ++ {0x25E8E89C13BB0F7A, 0xFF77B1FCBEBCDC4F}, // 1e-292 ++ {0x77B191618C54E9AC, 0x9FAACF3DF73609B1}, // 1e-291 ++ {0xD59DF5B9EF6A2417, 0xC795830D75038C1D}, // 1e-290 ++ {0x4B0573286B44AD1D, 0xF97AE3D0D2446F25}, // 1e-289 ++ {0x4EE367F9430AEC32, 0x9BECCE62836AC577}, // 1e-288 ++ {0x229C41F793CDA73F, 0xC2E801FB244576D5}, // 1e-287 ++ {0x6B43527578C1110F, 0xF3A20279ED56D48A}, // 1e-286 ++ {0x830A13896B78AAA9, 0x9845418C345644D6}, // 1e-285 ++ {0x23CC986BC656D553, 0xBE5691EF416BD60C}, // 1e-284 ++ {0x2CBFBE86B7EC8AA8, 0xEDEC366B11C6CB8F}, // 1e-283 ++ {0x7BF7D71432F3D6A9, 0x94B3A202EB1C3F39}, // 1e-282 ++ {0xDAF5CCD93FB0CC53, 0xB9E08A83A5E34F07}, // 1e-281 ++ {0xD1B3400F8F9CFF68, 0xE858AD248F5C22C9}, // 1e-280 ++ {0x23100809B9C21FA1, 0x91376C36D99995BE}, // 1e-279 ++ {0xABD40A0C2832A78A, 0xB58547448FFFFB2D}, // 1e-278 ++ {0x16C90C8F323F516C, 0xE2E69915B3FFF9F9}, // 1e-277 ++ {0xAE3DA7D97F6792E3, 0x8DD01FAD907FFC3B}, // 1e-276 ++ {0x99CD11CFDF41779C, 0xB1442798F49FFB4A}, // 1e-275 ++ {0x40405643D711D583, 0xDD95317F31C7FA1D}, // 1e-274 ++ {0x482835EA666B2572, 0x8A7D3EEF7F1CFC52}, // 1e-273 ++ {0xDA3243650005EECF, 0xAD1C8EAB5EE43B66}, // 1e-272 ++ {0x90BED43E40076A82, 0xD863B256369D4A40}, // 1e-271 ++ {0x5A7744A6E804A291, 0x873E4F75E2224E68}, // 1e-270 ++ {0x711515D0A205CB36, 0xA90DE3535AAAE202}, // 1e-269 ++ {0x0D5A5B44CA873E03, 0xD3515C2831559A83}, // 1e-268 ++ {0xE858790AFE9486C2, 0x8412D9991ED58091}, // 1e-267 ++ {0x626E974DBE39A872, 0xA5178FFF668AE0B6}, // 1e-266 ++ {0xFB0A3D212DC8128F, 0xCE5D73FF402D98E3}, // 1e-265 ++ {0x7CE66634BC9D0B99, 0x80FA687F881C7F8E}, // 1e-264 ++ {0x1C1FFFC1EBC44E80, 0xA139029F6A239F72}, // 1e-263 ++ {0xA327FFB266B56220, 0xC987434744AC874E}, // 1e-262 ++ {0x4BF1FF9F0062BAA8, 0xFBE9141915D7A922}, // 1e-261 ++ {0x6F773FC3603DB4A9, 0x9D71AC8FADA6C9B5}, // 1e-260 ++ {0xCB550FB4384D21D3, 0xC4CE17B399107C22}, // 1e-259 ++ {0x7E2A53A146606A48, 0xF6019DA07F549B2B}, // 1e-258 ++ {0x2EDA7444CBFC426D, 0x99C102844F94E0FB}, // 1e-257 ++ {0xFA911155FEFB5308, 0xC0314325637A1939}, // 1e-256 ++ {0x793555AB7EBA27CA, 0xF03D93EEBC589F88}, // 1e-255 ++ {0x4BC1558B2F3458DE, 0x96267C7535B763B5}, // 1e-254 ++ {0x9EB1AAEDFB016F16, 0xBBB01B9283253CA2}, // 1e-253 ++ {0x465E15A979C1CADC, 0xEA9C227723EE8BCB}, // 1e-252 ++ {0x0BFACD89EC191EC9, 0x92A1958A7675175F}, // 1e-251 ++ {0xCEF980EC671F667B, 0xB749FAED14125D36}, // 1e-250 ++ {0x82B7E12780E7401A, 0xE51C79A85916F484}, // 1e-249 ++ {0xD1B2ECB8B0908810, 0x8F31CC0937AE58D2}, // 1e-248 ++ {0x861FA7E6DCB4AA15, 0xB2FE3F0B8599EF07}, // 1e-247 ++ {0x67A791E093E1D49A, 0xDFBDCECE67006AC9}, // 1e-246 ++ {0xE0C8BB2C5C6D24E0, 0x8BD6A141006042BD}, // 1e-245 ++ {0x58FAE9F773886E18, 0xAECC49914078536D}, // 1e-244 ++ {0xAF39A475506A899E, 0xDA7F5BF590966848}, // 1e-243 ++ {0x6D8406C952429603, 0x888F99797A5E012D}, // 1e-242 ++ {0xC8E5087BA6D33B83, 0xAAB37FD7D8F58178}, // 1e-241 ++ {0xFB1E4A9A90880A64, 0xD5605FCDCF32E1D6}, // 1e-240 ++ {0x5CF2EEA09A55067F, 0x855C3BE0A17FCD26}, // 1e-239 ++ {0xF42FAA48C0EA481E, 0xA6B34AD8C9DFC06F}, // 1e-238 ++ {0xF13B94DAF124DA26, 0xD0601D8EFC57B08B}, // 1e-237 ++ {0x76C53D08D6B70858, 0x823C12795DB6CE57}, // 1e-236 ++ {0x54768C4B0C64CA6E, 0xA2CB1717B52481ED}, // 1e-235 ++ {0xA9942F5DCF7DFD09, 0xCB7DDCDDA26DA268}, // 1e-234 ++ {0xD3F93B35435D7C4C, 0xFE5D54150B090B02}, // 1e-233 ++ {0xC47BC5014A1A6DAF, 0x9EFA548D26E5A6E1}, // 1e-232 ++ {0x359AB6419CA1091B, 0xC6B8E9B0709F109A}, // 1e-231 ++ {0xC30163D203C94B62, 0xF867241C8CC6D4C0}, // 1e-230 ++ {0x79E0DE63425DCF1D, 0x9B407691D7FC44F8}, // 1e-229 ++ {0x985915FC12F542E4, 0xC21094364DFB5636}, // 1e-228 ++ {0x3E6F5B7B17B2939D, 0xF294B943E17A2BC4}, // 1e-227 ++ {0xA705992CEECF9C42, 0x979CF3CA6CEC5B5A}, // 1e-226 ++ {0x50C6FF782A838353, 0xBD8430BD08277231}, // 1e-225 ++ {0xA4F8BF5635246428, 0xECE53CEC4A314EBD}, // 1e-224 ++ {0x871B7795E136BE99, 0x940F4613AE5ED136}, // 1e-223 ++ {0x28E2557B59846E3F, 0xB913179899F68584}, // 1e-222 ++ {0x331AEADA2FE589CF, 0xE757DD7EC07426E5}, // 1e-221 ++ {0x3FF0D2C85DEF7621, 0x9096EA6F3848984F}, // 1e-220 ++ {0x0FED077A756B53A9, 0xB4BCA50B065ABE63}, // 1e-219 ++ {0xD3E8495912C62894, 0xE1EBCE4DC7F16DFB}, // 1e-218 ++ {0x64712DD7ABBBD95C, 0x8D3360F09CF6E4BD}, // 1e-217 ++ {0xBD8D794D96AACFB3, 0xB080392CC4349DEC}, // 1e-216 ++ {0xECF0D7A0FC5583A0, 0xDCA04777F541C567}, // 1e-215 ++ {0xF41686C49DB57244, 0x89E42CAAF9491B60}, // 1e-214 ++ {0x311C2875C522CED5, 0xAC5D37D5B79B6239}, // 1e-213 ++ {0x7D633293366B828B, 0xD77485CB25823AC7}, // 1e-212 ++ {0xAE5DFF9C02033197, 0x86A8D39EF77164BC}, // 1e-211 ++ {0xD9F57F830283FDFC, 0xA8530886B54DBDEB}, // 1e-210 ++ {0xD072DF63C324FD7B, 0xD267CAA862A12D66}, // 1e-209 ++ {0x4247CB9E59F71E6D, 0x8380DEA93DA4BC60}, // 1e-208 ++ {0x52D9BE85F074E608, 0xA46116538D0DEB78}, // 1e-207 ++ {0x67902E276C921F8B, 0xCD795BE870516656}, // 1e-206 ++ {0x00BA1CD8A3DB53B6, 0x806BD9714632DFF6}, // 1e-205 ++ {0x80E8A40ECCD228A4, 0xA086CFCD97BF97F3}, // 1e-204 ++ {0x6122CD128006B2CD, 0xC8A883C0FDAF7DF0}, // 1e-203 ++ {0x796B805720085F81, 0xFAD2A4B13D1B5D6C}, // 1e-202 ++ {0xCBE3303674053BB0, 0x9CC3A6EEC6311A63}, // 1e-201 ++ {0xBEDBFC4411068A9C, 0xC3F490AA77BD60FC}, // 1e-200 ++ {0xEE92FB5515482D44, 0xF4F1B4D515ACB93B}, // 1e-199 ++ {0x751BDD152D4D1C4A, 0x991711052D8BF3C5}, // 1e-198 ++ {0xD262D45A78A0635D, 0xBF5CD54678EEF0B6}, // 1e-197 ++ {0x86FB897116C87C34, 0xEF340A98172AACE4}, // 1e-196 ++ {0xD45D35E6AE3D4DA0, 0x9580869F0E7AAC0E}, // 1e-195 ++ {0x8974836059CCA109, 0xBAE0A846D2195712}, // 1e-194 ++ {0x2BD1A438703FC94B, 0xE998D258869FACD7}, // 1e-193 ++ {0x7B6306A34627DDCF, 0x91FF83775423CC06}, // 1e-192 ++ {0x1A3BC84C17B1D542, 0xB67F6455292CBF08}, // 1e-191 ++ {0x20CABA5F1D9E4A93, 0xE41F3D6A7377EECA}, // 1e-190 ++ {0x547EB47B7282EE9C, 0x8E938662882AF53E}, // 1e-189 ++ {0xE99E619A4F23AA43, 0xB23867FB2A35B28D}, // 1e-188 ++ {0x6405FA00E2EC94D4, 0xDEC681F9F4C31F31}, // 1e-187 ++ {0xDE83BC408DD3DD04, 0x8B3C113C38F9F37E}, // 1e-186 ++ {0x9624AB50B148D445, 0xAE0B158B4738705E}, // 1e-185 ++ {0x3BADD624DD9B0957, 0xD98DDAEE19068C76}, // 1e-184 ++ {0xE54CA5D70A80E5D6, 0x87F8A8D4CFA417C9}, // 1e-183 ++ {0x5E9FCF4CCD211F4C, 0xA9F6D30A038D1DBC}, // 1e-182 ++ {0x7647C3200069671F, 0xD47487CC8470652B}, // 1e-181 ++ {0x29ECD9F40041E073, 0x84C8D4DFD2C63F3B}, // 1e-180 ++ {0xF468107100525890, 0xA5FB0A17C777CF09}, // 1e-179 ++ {0x7182148D4066EEB4, 0xCF79CC9DB955C2CC}, // 1e-178 ++ {0xC6F14CD848405530, 0x81AC1FE293D599BF}, // 1e-177 ++ {0xB8ADA00E5A506A7C, 0xA21727DB38CB002F}, // 1e-176 ++ {0xA6D90811F0E4851C, 0xCA9CF1D206FDC03B}, // 1e-175 ++ {0x908F4A166D1DA663, 0xFD442E4688BD304A}, // 1e-174 ++ {0x9A598E4E043287FE, 0x9E4A9CEC15763E2E}, // 1e-173 ++ {0x40EFF1E1853F29FD, 0xC5DD44271AD3CDBA}, // 1e-172 ++ {0xD12BEE59E68EF47C, 0xF7549530E188C128}, // 1e-171 ++ {0x82BB74F8301958CE, 0x9A94DD3E8CF578B9}, // 1e-170 ++ {0xE36A52363C1FAF01, 0xC13A148E3032D6E7}, // 1e-169 ++ {0xDC44E6C3CB279AC1, 0xF18899B1BC3F8CA1}, // 1e-168 ++ {0x29AB103A5EF8C0B9, 0x96F5600F15A7B7E5}, // 1e-167 ++ {0x7415D448F6B6F0E7, 0xBCB2B812DB11A5DE}, // 1e-166 ++ {0x111B495B3464AD21, 0xEBDF661791D60F56}, // 1e-165 ++ {0xCAB10DD900BEEC34, 0x936B9FCEBB25C995}, // 1e-164 ++ {0x3D5D514F40EEA742, 0xB84687C269EF3BFB}, // 1e-163 ++ {0x0CB4A5A3112A5112, 0xE65829B3046B0AFA}, // 1e-162 ++ {0x47F0E785EABA72AB, 0x8FF71A0FE2C2E6DC}, // 1e-161 ++ {0x59ED216765690F56, 0xB3F4E093DB73A093}, // 1e-160 ++ {0x306869C13EC3532C, 0xE0F218B8D25088B8}, // 1e-159 ++ {0x1E414218C73A13FB, 0x8C974F7383725573}, // 1e-158 ++ {0xE5D1929EF90898FA, 0xAFBD2350644EEACF}, // 1e-157 ++ {0xDF45F746B74ABF39, 0xDBAC6C247D62A583}, // 1e-156 ++ {0x6B8BBA8C328EB783, 0x894BC396CE5DA772}, // 1e-155 ++ {0x066EA92F3F326564, 0xAB9EB47C81F5114F}, // 1e-154 ++ {0xC80A537B0EFEFEBD, 0xD686619BA27255A2}, // 1e-153 ++ {0xBD06742CE95F5F36, 0x8613FD0145877585}, // 1e-152 ++ {0x2C48113823B73704, 0xA798FC4196E952E7}, // 1e-151 ++ {0xF75A15862CA504C5, 0xD17F3B51FCA3A7A0}, // 1e-150 ++ {0x9A984D73DBE722FB, 0x82EF85133DE648C4}, // 1e-149 ++ {0xC13E60D0D2E0EBBA, 0xA3AB66580D5FDAF5}, // 1e-148 ++ {0x318DF905079926A8, 0xCC963FEE10B7D1B3}, // 1e-147 ++ {0xFDF17746497F7052, 0xFFBBCFE994E5C61F}, // 1e-146 ++ {0xFEB6EA8BEDEFA633, 0x9FD561F1FD0F9BD3}, // 1e-145 ++ {0xFE64A52EE96B8FC0, 0xC7CABA6E7C5382C8}, // 1e-144 ++ {0x3DFDCE7AA3C673B0, 0xF9BD690A1B68637B}, // 1e-143 ++ {0x06BEA10CA65C084E, 0x9C1661A651213E2D}, // 1e-142 ++ {0x486E494FCFF30A62, 0xC31BFA0FE5698DB8}, // 1e-141 ++ {0x5A89DBA3C3EFCCFA, 0xF3E2F893DEC3F126}, // 1e-140 ++ {0xF89629465A75E01C, 0x986DDB5C6B3A76B7}, // 1e-139 ++ {0xF6BBB397F1135823, 0xBE89523386091465}, // 1e-138 ++ {0x746AA07DED582E2C, 0xEE2BA6C0678B597F}, // 1e-137 ++ {0xA8C2A44EB4571CDC, 0x94DB483840B717EF}, // 1e-136 ++ {0x92F34D62616CE413, 0xBA121A4650E4DDEB}, // 1e-135 ++ {0x77B020BAF9C81D17, 0xE896A0D7E51E1566}, // 1e-134 ++ {0x0ACE1474DC1D122E, 0x915E2486EF32CD60}, // 1e-133 ++ {0x0D819992132456BA, 0xB5B5ADA8AAFF80B8}, // 1e-132 ++ {0x10E1FFF697ED6C69, 0xE3231912D5BF60E6}, // 1e-131 ++ {0xCA8D3FFA1EF463C1, 0x8DF5EFABC5979C8F}, // 1e-130 ++ {0xBD308FF8A6B17CB2, 0xB1736B96B6FD83B3}, // 1e-129 ++ {0xAC7CB3F6D05DDBDE, 0xDDD0467C64BCE4A0}, // 1e-128 ++ {0x6BCDF07A423AA96B, 0x8AA22C0DBEF60EE4}, // 1e-127 ++ {0x86C16C98D2C953C6, 0xAD4AB7112EB3929D}, // 1e-126 ++ {0xE871C7BF077BA8B7, 0xD89D64D57A607744}, // 1e-125 ++ {0x11471CD764AD4972, 0x87625F056C7C4A8B}, // 1e-124 ++ {0xD598E40D3DD89BCF, 0xA93AF6C6C79B5D2D}, // 1e-123 ++ {0x4AFF1D108D4EC2C3, 0xD389B47879823479}, // 1e-122 ++ {0xCEDF722A585139BA, 0x843610CB4BF160CB}, // 1e-121 ++ {0xC2974EB4EE658828, 0xA54394FE1EEDB8FE}, // 1e-120 ++ {0x733D226229FEEA32, 0xCE947A3DA6A9273E}, // 1e-119 ++ {0x0806357D5A3F525F, 0x811CCC668829B887}, // 1e-118 ++ {0xCA07C2DCB0CF26F7, 0xA163FF802A3426A8}, // 1e-117 ++ {0xFC89B393DD02F0B5, 0xC9BCFF6034C13052}, // 1e-116 ++ {0xBBAC2078D443ACE2, 0xFC2C3F3841F17C67}, // 1e-115 ++ {0xD54B944B84AA4C0D, 0x9D9BA7832936EDC0}, // 1e-114 ++ {0x0A9E795E65D4DF11, 0xC5029163F384A931}, // 1e-113 ++ {0x4D4617B5FF4A16D5, 0xF64335BCF065D37D}, // 1e-112 ++ {0x504BCED1BF8E4E45, 0x99EA0196163FA42E}, // 1e-111 ++ {0xE45EC2862F71E1D6, 0xC06481FB9BCF8D39}, // 1e-110 ++ {0x5D767327BB4E5A4C, 0xF07DA27A82C37088}, // 1e-109 ++ {0x3A6A07F8D510F86F, 0x964E858C91BA2655}, // 1e-108 ++ {0x890489F70A55368B, 0xBBE226EFB628AFEA}, // 1e-107 ++ {0x2B45AC74CCEA842E, 0xEADAB0ABA3B2DBE5}, // 1e-106 ++ {0x3B0B8BC90012929D, 0x92C8AE6B464FC96F}, // 1e-105 ++ {0x09CE6EBB40173744, 0xB77ADA0617E3BBCB}, // 1e-104 ++ {0xCC420A6A101D0515, 0xE55990879DDCAABD}, // 1e-103 ++ {0x9FA946824A12232D, 0x8F57FA54C2A9EAB6}, // 1e-102 ++ {0x47939822DC96ABF9, 0xB32DF8E9F3546564}, // 1e-101 ++ {0x59787E2B93BC56F7, 0xDFF9772470297EBD}, // 1e-100 ++ {0x57EB4EDB3C55B65A, 0x8BFBEA76C619EF36}, // 1e-99 ++ {0xEDE622920B6B23F1, 0xAEFAE51477A06B03}, // 1e-98 ++ {0xE95FAB368E45ECED, 0xDAB99E59958885C4}, // 1e-97 ++ {0x11DBCB0218EBB414, 0x88B402F7FD75539B}, // 1e-96 ++ {0xD652BDC29F26A119, 0xAAE103B5FCD2A881}, // 1e-95 ++ {0x4BE76D3346F0495F, 0xD59944A37C0752A2}, // 1e-94 ++ {0x6F70A4400C562DDB, 0x857FCAE62D8493A5}, // 1e-93 ++ {0xCB4CCD500F6BB952, 0xA6DFBD9FB8E5B88E}, // 1e-92 ++ {0x7E2000A41346A7A7, 0xD097AD07A71F26B2}, // 1e-91 ++ {0x8ED400668C0C28C8, 0x825ECC24C873782F}, // 1e-90 ++ {0x728900802F0F32FA, 0xA2F67F2DFA90563B}, // 1e-89 ++ {0x4F2B40A03AD2FFB9, 0xCBB41EF979346BCA}, // 1e-88 ++ {0xE2F610C84987BFA8, 0xFEA126B7D78186BC}, // 1e-87 ++ {0x0DD9CA7D2DF4D7C9, 0x9F24B832E6B0F436}, // 1e-86 ++ {0x91503D1C79720DBB, 0xC6EDE63FA05D3143}, // 1e-85 ++ {0x75A44C6397CE912A, 0xF8A95FCF88747D94}, // 1e-84 ++ {0xC986AFBE3EE11ABA, 0x9B69DBE1B548CE7C}, // 1e-83 ++ {0xFBE85BADCE996168, 0xC24452DA229B021B}, // 1e-82 ++ {0xFAE27299423FB9C3, 0xF2D56790AB41C2A2}, // 1e-81 ++ {0xDCCD879FC967D41A, 0x97C560BA6B0919A5}, // 1e-80 ++ {0x5400E987BBC1C920, 0xBDB6B8E905CB600F}, // 1e-79 ++ {0x290123E9AAB23B68, 0xED246723473E3813}, // 1e-78 ++ {0xF9A0B6720AAF6521, 0x9436C0760C86E30B}, // 1e-77 ++ {0xF808E40E8D5B3E69, 0xB94470938FA89BCE}, // 1e-76 ++ {0xB60B1D1230B20E04, 0xE7958CB87392C2C2}, // 1e-75 ++ {0xB1C6F22B5E6F48C2, 0x90BD77F3483BB9B9}, // 1e-74 ++ {0x1E38AEB6360B1AF3, 0xB4ECD5F01A4AA828}, // 1e-73 ++ {0x25C6DA63C38DE1B0, 0xE2280B6C20DD5232}, // 1e-72 ++ {0x579C487E5A38AD0E, 0x8D590723948A535F}, // 1e-71 ++ {0x2D835A9DF0C6D851, 0xB0AF48EC79ACE837}, // 1e-70 ++ {0xF8E431456CF88E65, 0xDCDB1B2798182244}, // 1e-69 ++ {0x1B8E9ECB641B58FF, 0x8A08F0F8BF0F156B}, // 1e-68 ++ {0xE272467E3D222F3F, 0xAC8B2D36EED2DAC5}, // 1e-67 ++ {0x5B0ED81DCC6ABB0F, 0xD7ADF884AA879177}, // 1e-66 ++ {0x98E947129FC2B4E9, 0x86CCBB52EA94BAEA}, // 1e-65 ++ {0x3F2398D747B36224, 0xA87FEA27A539E9A5}, // 1e-64 ++ {0x8EEC7F0D19A03AAD, 0xD29FE4B18E88640E}, // 1e-63 ++ {0x1953CF68300424AC, 0x83A3EEEEF9153E89}, // 1e-62 ++ {0x5FA8C3423C052DD7, 0xA48CEAAAB75A8E2B}, // 1e-61 ++ {0x3792F412CB06794D, 0xCDB02555653131B6}, // 1e-60 ++ {0xE2BBD88BBEE40BD0, 0x808E17555F3EBF11}, // 1e-59 ++ {0x5B6ACEAEAE9D0EC4, 0xA0B19D2AB70E6ED6}, // 1e-58 ++ {0xF245825A5A445275, 0xC8DE047564D20A8B}, // 1e-57 ++ {0xEED6E2F0F0D56712, 0xFB158592BE068D2E}, // 1e-56 ++ {0x55464DD69685606B, 0x9CED737BB6C4183D}, // 1e-55 ++ {0xAA97E14C3C26B886, 0xC428D05AA4751E4C}, // 1e-54 ++ {0xD53DD99F4B3066A8, 0xF53304714D9265DF}, // 1e-53 ++ {0xE546A8038EFE4029, 0x993FE2C6D07B7FAB}, // 1e-52 ++ {0xDE98520472BDD033, 0xBF8FDB78849A5F96}, // 1e-51 ++ {0x963E66858F6D4440, 0xEF73D256A5C0F77C}, // 1e-50 ++ {0xDDE7001379A44AA8, 0x95A8637627989AAD}, // 1e-49 ++ {0x5560C018580D5D52, 0xBB127C53B17EC159}, // 1e-48 ++ {0xAAB8F01E6E10B4A6, 0xE9D71B689DDE71AF}, // 1e-47 ++ {0xCAB3961304CA70E8, 0x9226712162AB070D}, // 1e-46 ++ {0x3D607B97C5FD0D22, 0xB6B00D69BB55C8D1}, // 1e-45 ++ {0x8CB89A7DB77C506A, 0xE45C10C42A2B3B05}, // 1e-44 ++ {0x77F3608E92ADB242, 0x8EB98A7A9A5B04E3}, // 1e-43 ++ {0x55F038B237591ED3, 0xB267ED1940F1C61C}, // 1e-42 ++ {0x6B6C46DEC52F6688, 0xDF01E85F912E37A3}, // 1e-41 ++ {0x2323AC4B3B3DA015, 0x8B61313BBABCE2C6}, // 1e-40 ++ {0xABEC975E0A0D081A, 0xAE397D8AA96C1B77}, // 1e-39 ++ {0x96E7BD358C904A21, 0xD9C7DCED53C72255}, // 1e-38 ++ {0x7E50D64177DA2E54, 0x881CEA14545C7575}, // 1e-37 ++ {0xDDE50BD1D5D0B9E9, 0xAA242499697392D2}, // 1e-36 ++ {0x955E4EC64B44E864, 0xD4AD2DBFC3D07787}, // 1e-35 ++ {0xBD5AF13BEF0B113E, 0x84EC3C97DA624AB4}, // 1e-34 ++ {0xECB1AD8AEACDD58E, 0xA6274BBDD0FADD61}, // 1e-33 ++ {0x67DE18EDA5814AF2, 0xCFB11EAD453994BA}, // 1e-32 ++ {0x80EACF948770CED7, 0x81CEB32C4B43FCF4}, // 1e-31 ++ {0xA1258379A94D028D, 0xA2425FF75E14FC31}, // 1e-30 ++ {0x096EE45813A04330, 0xCAD2F7F5359A3B3E}, // 1e-29 ++ {0x8BCA9D6E188853FC, 0xFD87B5F28300CA0D}, // 1e-28 ++ {0x775EA264CF55347D, 0x9E74D1B791E07E48}, // 1e-27 ++ {0x95364AFE032A819D, 0xC612062576589DDA}, // 1e-26 ++ {0x3A83DDBD83F52204, 0xF79687AED3EEC551}, // 1e-25 ++ {0xC4926A9672793542, 0x9ABE14CD44753B52}, // 1e-24 ++ {0x75B7053C0F178293, 0xC16D9A0095928A27}, // 1e-23 ++ {0x5324C68B12DD6338, 0xF1C90080BAF72CB1}, // 1e-22 ++ {0xD3F6FC16EBCA5E03, 0x971DA05074DA7BEE}, // 1e-21 ++ {0x88F4BB1CA6BCF584, 0xBCE5086492111AEA}, // 1e-20 ++ {0x2B31E9E3D06C32E5, 0xEC1E4A7DB69561A5}, // 1e-19 ++ {0x3AFF322E62439FCF, 0x9392EE8E921D5D07}, // 1e-18 ++ {0x09BEFEB9FAD487C2, 0xB877AA3236A4B449}, // 1e-17 ++ {0x4C2EBE687989A9B3, 0xE69594BEC44DE15B}, // 1e-16 ++ {0x0F9D37014BF60A10, 0x901D7CF73AB0ACD9}, // 1e-15 ++ {0x538484C19EF38C94, 0xB424DC35095CD80F}, // 1e-14 ++ {0x2865A5F206B06FB9, 0xE12E13424BB40E13}, // 1e-13 ++ {0xF93F87B7442E45D3, 0x8CBCCC096F5088CB}, // 1e-12 ++ {0xF78F69A51539D748, 0xAFEBFF0BCB24AAFE}, // 1e-11 ++ {0xB573440E5A884D1B, 0xDBE6FECEBDEDD5BE}, // 1e-10 ++ {0x31680A88F8953030, 0x89705F4136B4A597}, // 1e-9 ++ {0xFDC20D2B36BA7C3D, 0xABCC77118461CEFC}, // 1e-8 ++ {0x3D32907604691B4C, 0xD6BF94D5E57A42BC}, // 1e-7 ++ {0xA63F9A49C2C1B10F, 0x8637BD05AF6C69B5}, // 1e-6 ++ {0x0FCF80DC33721D53, 0xA7C5AC471B478423}, // 1e-5 ++ {0xD3C36113404EA4A8, 0xD1B71758E219652B}, // 1e-4 ++ {0x645A1CAC083126E9, 0x83126E978D4FDF3B}, // 1e-3 ++ {0x3D70A3D70A3D70A3, 0xA3D70A3D70A3D70A}, // 1e-2 ++ {0xCCCCCCCCCCCCCCCC, 0xCCCCCCCCCCCCCCCC}, // 1e-1 ++ {0x0000000000000000, 0x8000000000000000}, // 1e0 ++ {0x0000000000000000, 0xA000000000000000}, // 1e1 ++ {0x0000000000000000, 0xC800000000000000}, // 1e2 ++ {0x0000000000000000, 0xFA00000000000000}, // 1e3 ++ {0x0000000000000000, 0x9C40000000000000}, // 1e4 ++ {0x0000000000000000, 0xC350000000000000}, // 1e5 ++ {0x0000000000000000, 0xF424000000000000}, // 1e6 ++ {0x0000000000000000, 0x9896800000000000}, // 1e7 ++ {0x0000000000000000, 0xBEBC200000000000}, // 1e8 ++ {0x0000000000000000, 0xEE6B280000000000}, // 1e9 ++ {0x0000000000000000, 0x9502F90000000000}, // 1e10 ++ {0x0000000000000000, 0xBA43B74000000000}, // 1e11 ++ {0x0000000000000000, 0xE8D4A51000000000}, // 1e12 ++ {0x0000000000000000, 0x9184E72A00000000}, // 1e13 ++ {0x0000000000000000, 0xB5E620F480000000}, // 1e14 ++ {0x0000000000000000, 0xE35FA931A0000000}, // 1e15 ++ {0x0000000000000000, 0x8E1BC9BF04000000}, // 1e16 ++ {0x0000000000000000, 0xB1A2BC2EC5000000}, // 1e17 ++ {0x0000000000000000, 0xDE0B6B3A76400000}, // 1e18 ++ {0x0000000000000000, 0x8AC7230489E80000}, // 1e19 ++ {0x0000000000000000, 0xAD78EBC5AC620000}, // 1e20 ++ {0x0000000000000000, 0xD8D726B7177A8000}, // 1e21 ++ {0x0000000000000000, 0x878678326EAC9000}, // 1e22 ++ {0x0000000000000000, 0xA968163F0A57B400}, // 1e23 ++ {0x0000000000000000, 0xD3C21BCECCEDA100}, // 1e24 ++ {0x0000000000000000, 0x84595161401484A0}, // 1e25 ++ {0x0000000000000000, 0xA56FA5B99019A5C8}, // 1e26 ++ {0x0000000000000000, 0xCECB8F27F4200F3A}, // 1e27 ++ {0x4000000000000000, 0x813F3978F8940984}, // 1e28 ++ {0x5000000000000000, 0xA18F07D736B90BE5}, // 1e29 ++ {0xA400000000000000, 0xC9F2C9CD04674EDE}, // 1e30 ++ {0x4D00000000000000, 0xFC6F7C4045812296}, // 1e31 ++ {0xF020000000000000, 0x9DC5ADA82B70B59D}, // 1e32 ++ {0x6C28000000000000, 0xC5371912364CE305}, // 1e33 ++ {0xC732000000000000, 0xF684DF56C3E01BC6}, // 1e34 ++ {0x3C7F400000000000, 0x9A130B963A6C115C}, // 1e35 ++ {0x4B9F100000000000, 0xC097CE7BC90715B3}, // 1e36 ++ {0x1E86D40000000000, 0xF0BDC21ABB48DB20}, // 1e37 ++ {0x1314448000000000, 0x96769950B50D88F4}, // 1e38 ++ {0x17D955A000000000, 0xBC143FA4E250EB31}, // 1e39 ++ {0x5DCFAB0800000000, 0xEB194F8E1AE525FD}, // 1e40 ++ {0x5AA1CAE500000000, 0x92EFD1B8D0CF37BE}, // 1e41 ++ {0xF14A3D9E40000000, 0xB7ABC627050305AD}, // 1e42 ++ {0x6D9CCD05D0000000, 0xE596B7B0C643C719}, // 1e43 ++ {0xE4820023A2000000, 0x8F7E32CE7BEA5C6F}, // 1e44 ++ {0xDDA2802C8A800000, 0xB35DBF821AE4F38B}, // 1e45 ++ {0xD50B2037AD200000, 0xE0352F62A19E306E}, // 1e46 ++ {0x4526F422CC340000, 0x8C213D9DA502DE45}, // 1e47 ++ {0x9670B12B7F410000, 0xAF298D050E4395D6}, // 1e48 ++ {0x3C0CDD765F114000, 0xDAF3F04651D47B4C}, // 1e49 ++ {0xA5880A69FB6AC800, 0x88D8762BF324CD0F}, // 1e50 ++ {0x8EEA0D047A457A00, 0xAB0E93B6EFEE0053}, // 1e51 ++ {0x72A4904598D6D880, 0xD5D238A4ABE98068}, // 1e52 ++ {0x47A6DA2B7F864750, 0x85A36366EB71F041}, // 1e53 ++ {0x999090B65F67D924, 0xA70C3C40A64E6C51}, // 1e54 ++ {0xFFF4B4E3F741CF6D, 0xD0CF4B50CFE20765}, // 1e55 ++ {0xBFF8F10E7A8921A4, 0x82818F1281ED449F}, // 1e56 ++ {0xAFF72D52192B6A0D, 0xA321F2D7226895C7}, // 1e57 ++ {0x9BF4F8A69F764490, 0xCBEA6F8CEB02BB39}, // 1e58 ++ {0x02F236D04753D5B4, 0xFEE50B7025C36A08}, // 1e59 ++ {0x01D762422C946590, 0x9F4F2726179A2245}, // 1e60 ++ {0x424D3AD2B7B97EF5, 0xC722F0EF9D80AAD6}, // 1e61 ++ {0xD2E0898765A7DEB2, 0xF8EBAD2B84E0D58B}, // 1e62 ++ {0x63CC55F49F88EB2F, 0x9B934C3B330C8577}, // 1e63 ++ {0x3CBF6B71C76B25FB, 0xC2781F49FFCFA6D5}, // 1e64 ++ {0x8BEF464E3945EF7A, 0xF316271C7FC3908A}, // 1e65 ++ {0x97758BF0E3CBB5AC, 0x97EDD871CFDA3A56}, // 1e66 ++ {0x3D52EEED1CBEA317, 0xBDE94E8E43D0C8EC}, // 1e67 ++ {0x4CA7AAA863EE4BDD, 0xED63A231D4C4FB27}, // 1e68 ++ {0x8FE8CAA93E74EF6A, 0x945E455F24FB1CF8}, // 1e69 ++ {0xB3E2FD538E122B44, 0xB975D6B6EE39E436}, // 1e70 ++ {0x60DBBCA87196B616, 0xE7D34C64A9C85D44}, // 1e71 ++ {0xBC8955E946FE31CD, 0x90E40FBEEA1D3A4A}, // 1e72 ++ {0x6BABAB6398BDBE41, 0xB51D13AEA4A488DD}, // 1e73 ++ {0xC696963C7EED2DD1, 0xE264589A4DCDAB14}, // 1e74 ++ {0xFC1E1DE5CF543CA2, 0x8D7EB76070A08AEC}, // 1e75 ++ {0x3B25A55F43294BCB, 0xB0DE65388CC8ADA8}, // 1e76 ++ {0x49EF0EB713F39EBE, 0xDD15FE86AFFAD912}, // 1e77 ++ {0x6E3569326C784337, 0x8A2DBF142DFCC7AB}, // 1e78 ++ {0x49C2C37F07965404, 0xACB92ED9397BF996}, // 1e79 ++ {0xDC33745EC97BE906, 0xD7E77A8F87DAF7FB}, // 1e80 ++ {0x69A028BB3DED71A3, 0x86F0AC99B4E8DAFD}, // 1e81 ++ {0xC40832EA0D68CE0C, 0xA8ACD7C0222311BC}, // 1e82 ++ {0xF50A3FA490C30190, 0xD2D80DB02AABD62B}, // 1e83 ++ {0x792667C6DA79E0FA, 0x83C7088E1AAB65DB}, // 1e84 ++ {0x577001B891185938, 0xA4B8CAB1A1563F52}, // 1e85 ++ {0xED4C0226B55E6F86, 0xCDE6FD5E09ABCF26}, // 1e86 ++ {0x544F8158315B05B4, 0x80B05E5AC60B6178}, // 1e87 ++ {0x696361AE3DB1C721, 0xA0DC75F1778E39D6}, // 1e88 ++ {0x03BC3A19CD1E38E9, 0xC913936DD571C84C}, // 1e89 ++ {0x04AB48A04065C723, 0xFB5878494ACE3A5F}, // 1e90 ++ {0x62EB0D64283F9C76, 0x9D174B2DCEC0E47B}, // 1e91 ++ {0x3BA5D0BD324F8394, 0xC45D1DF942711D9A}, // 1e92 ++ {0xCA8F44EC7EE36479, 0xF5746577930D6500}, // 1e93 ++ {0x7E998B13CF4E1ECB, 0x9968BF6ABBE85F20}, // 1e94 ++ {0x9E3FEDD8C321A67E, 0xBFC2EF456AE276E8}, // 1e95 ++ {0xC5CFE94EF3EA101E, 0xEFB3AB16C59B14A2}, // 1e96 ++ {0xBBA1F1D158724A12, 0x95D04AEE3B80ECE5}, // 1e97 ++ {0x2A8A6E45AE8EDC97, 0xBB445DA9CA61281F}, // 1e98 ++ {0xF52D09D71A3293BD, 0xEA1575143CF97226}, // 1e99 ++ {0x593C2626705F9C56, 0x924D692CA61BE758}, // 1e100 ++ {0x6F8B2FB00C77836C, 0xB6E0C377CFA2E12E}, // 1e101 ++ {0x0B6DFB9C0F956447, 0xE498F455C38B997A}, // 1e102 ++ {0x4724BD4189BD5EAC, 0x8EDF98B59A373FEC}, // 1e103 ++ {0x58EDEC91EC2CB657, 0xB2977EE300C50FE7}, // 1e104 ++ {0x2F2967B66737E3ED, 0xDF3D5E9BC0F653E1}, // 1e105 ++ {0xBD79E0D20082EE74, 0x8B865B215899F46C}, // 1e106 ++ {0xECD8590680A3AA11, 0xAE67F1E9AEC07187}, // 1e107 ++ {0xE80E6F4820CC9495, 0xDA01EE641A708DE9}, // 1e108 ++ {0x3109058D147FDCDD, 0x884134FE908658B2}, // 1e109 ++ {0xBD4B46F0599FD415, 0xAA51823E34A7EEDE}, // 1e110 ++ {0x6C9E18AC7007C91A, 0xD4E5E2CDC1D1EA96}, // 1e111 ++ {0x03E2CF6BC604DDB0, 0x850FADC09923329E}, // 1e112 ++ {0x84DB8346B786151C, 0xA6539930BF6BFF45}, // 1e113 ++ {0xE612641865679A63, 0xCFE87F7CEF46FF16}, // 1e114 ++ {0x4FCB7E8F3F60C07E, 0x81F14FAE158C5F6E}, // 1e115 ++ {0xE3BE5E330F38F09D, 0xA26DA3999AEF7749}, // 1e116 ++ {0x5CADF5BFD3072CC5, 0xCB090C8001AB551C}, // 1e117 ++ {0x73D9732FC7C8F7F6, 0xFDCB4FA002162A63}, // 1e118 ++ {0x2867E7FDDCDD9AFA, 0x9E9F11C4014DDA7E}, // 1e119 ++ {0xB281E1FD541501B8, 0xC646D63501A1511D}, // 1e120 ++ {0x1F225A7CA91A4226, 0xF7D88BC24209A565}, // 1e121 ++ {0x3375788DE9B06958, 0x9AE757596946075F}, // 1e122 ++ {0x0052D6B1641C83AE, 0xC1A12D2FC3978937}, // 1e123 ++ {0xC0678C5DBD23A49A, 0xF209787BB47D6B84}, // 1e124 ++ {0xF840B7BA963646E0, 0x9745EB4D50CE6332}, // 1e125 ++ {0xB650E5A93BC3D898, 0xBD176620A501FBFF}, // 1e126 ++ {0xA3E51F138AB4CEBE, 0xEC5D3FA8CE427AFF}, // 1e127 ++ {0xC66F336C36B10137, 0x93BA47C980E98CDF}, // 1e128 ++ {0xB80B0047445D4184, 0xB8A8D9BBE123F017}, // 1e129 ++ {0xA60DC059157491E5, 0xE6D3102AD96CEC1D}, // 1e130 ++ {0x87C89837AD68DB2F, 0x9043EA1AC7E41392}, // 1e131 ++ {0x29BABE4598C311FB, 0xB454E4A179DD1877}, // 1e132 ++ {0xF4296DD6FEF3D67A, 0xE16A1DC9D8545E94}, // 1e133 ++ {0x1899E4A65F58660C, 0x8CE2529E2734BB1D}, // 1e134 ++ {0x5EC05DCFF72E7F8F, 0xB01AE745B101E9E4}, // 1e135 ++ {0x76707543F4FA1F73, 0xDC21A1171D42645D}, // 1e136 ++ {0x6A06494A791C53A8, 0x899504AE72497EBA}, // 1e137 ++ {0x0487DB9D17636892, 0xABFA45DA0EDBDE69}, // 1e138 ++ {0x45A9D2845D3C42B6, 0xD6F8D7509292D603}, // 1e139 ++ {0x0B8A2392BA45A9B2, 0x865B86925B9BC5C2}, // 1e140 ++ {0x8E6CAC7768D7141E, 0xA7F26836F282B732}, // 1e141 ++ {0x3207D795430CD926, 0xD1EF0244AF2364FF}, // 1e142 ++ {0x7F44E6BD49E807B8, 0x8335616AED761F1F}, // 1e143 ++ {0x5F16206C9C6209A6, 0xA402B9C5A8D3A6E7}, // 1e144 ++ {0x36DBA887C37A8C0F, 0xCD036837130890A1}, // 1e145 ++ {0xC2494954DA2C9789, 0x802221226BE55A64}, // 1e146 ++ {0xF2DB9BAA10B7BD6C, 0xA02AA96B06DEB0FD}, // 1e147 ++ {0x6F92829494E5ACC7, 0xC83553C5C8965D3D}, // 1e148 ++ {0xCB772339BA1F17F9, 0xFA42A8B73ABBF48C}, // 1e149 ++ {0xFF2A760414536EFB, 0x9C69A97284B578D7}, // 1e150 ++ {0xFEF5138519684ABA, 0xC38413CF25E2D70D}, // 1e151 ++ {0x7EB258665FC25D69, 0xF46518C2EF5B8CD1}, // 1e152 ++ {0xEF2F773FFBD97A61, 0x98BF2F79D5993802}, // 1e153 ++ {0xAAFB550FFACFD8FA, 0xBEEEFB584AFF8603}, // 1e154 ++ {0x95BA2A53F983CF38, 0xEEAABA2E5DBF6784}, // 1e155 ++ {0xDD945A747BF26183, 0x952AB45CFA97A0B2}, // 1e156 ++ {0x94F971119AEEF9E4, 0xBA756174393D88DF}, // 1e157 ++ {0x7A37CD5601AAB85D, 0xE912B9D1478CEB17}, // 1e158 ++ {0xAC62E055C10AB33A, 0x91ABB422CCB812EE}, // 1e159 ++ {0x577B986B314D6009, 0xB616A12B7FE617AA}, // 1e160 ++ {0xED5A7E85FDA0B80B, 0xE39C49765FDF9D94}, // 1e161 ++ {0x14588F13BE847307, 0x8E41ADE9FBEBC27D}, // 1e162 ++ {0x596EB2D8AE258FC8, 0xB1D219647AE6B31C}, // 1e163 ++ {0x6FCA5F8ED9AEF3BB, 0xDE469FBD99A05FE3}, // 1e164 ++ {0x25DE7BB9480D5854, 0x8AEC23D680043BEE}, // 1e165 ++ {0xAF561AA79A10AE6A, 0xADA72CCC20054AE9}, // 1e166 ++ {0x1B2BA1518094DA04, 0xD910F7FF28069DA4}, // 1e167 ++ {0x90FB44D2F05D0842, 0x87AA9AFF79042286}, // 1e168 ++ {0x353A1607AC744A53, 0xA99541BF57452B28}, // 1e169 ++ {0x42889B8997915CE8, 0xD3FA922F2D1675F2}, // 1e170 ++ {0x69956135FEBADA11, 0x847C9B5D7C2E09B7}, // 1e171 ++ {0x43FAB9837E699095, 0xA59BC234DB398C25}, // 1e172 ++ {0x94F967E45E03F4BB, 0xCF02B2C21207EF2E}, // 1e173 ++ {0x1D1BE0EEBAC278F5, 0x8161AFB94B44F57D}, // 1e174 ++ {0x6462D92A69731732, 0xA1BA1BA79E1632DC}, // 1e175 ++ {0x7D7B8F7503CFDCFE, 0xCA28A291859BBF93}, // 1e176 ++ {0x5CDA735244C3D43E, 0xFCB2CB35E702AF78}, // 1e177 ++ {0x3A0888136AFA64A7, 0x9DEFBF01B061ADAB}, // 1e178 ++ {0x088AAA1845B8FDD0, 0xC56BAEC21C7A1916}, // 1e179 ++ {0x8AAD549E57273D45, 0xF6C69A72A3989F5B}, // 1e180 ++ {0x36AC54E2F678864B, 0x9A3C2087A63F6399}, // 1e181 ++ {0x84576A1BB416A7DD, 0xC0CB28A98FCF3C7F}, // 1e182 ++ {0x656D44A2A11C51D5, 0xF0FDF2D3F3C30B9F}, // 1e183 ++ {0x9F644AE5A4B1B325, 0x969EB7C47859E743}, // 1e184 ++ {0x873D5D9F0DDE1FEE, 0xBC4665B596706114}, // 1e185 ++ {0xA90CB506D155A7EA, 0xEB57FF22FC0C7959}, // 1e186 ++ {0x09A7F12442D588F2, 0x9316FF75DD87CBD8}, // 1e187 ++ {0x0C11ED6D538AEB2F, 0xB7DCBF5354E9BECE}, // 1e188 ++ {0x8F1668C8A86DA5FA, 0xE5D3EF282A242E81}, // 1e189 ++ {0xF96E017D694487BC, 0x8FA475791A569D10}, // 1e190 ++ {0x37C981DCC395A9AC, 0xB38D92D760EC4455}, // 1e191 ++ {0x85BBE253F47B1417, 0xE070F78D3927556A}, // 1e192 ++ {0x93956D7478CCEC8E, 0x8C469AB843B89562}, // 1e193 ++ {0x387AC8D1970027B2, 0xAF58416654A6BABB}, // 1e194 ++ {0x06997B05FCC0319E, 0xDB2E51BFE9D0696A}, // 1e195 ++ {0x441FECE3BDF81F03, 0x88FCF317F22241E2}, // 1e196 ++ {0xD527E81CAD7626C3, 0xAB3C2FDDEEAAD25A}, // 1e197 ++ {0x8A71E223D8D3B074, 0xD60B3BD56A5586F1}, // 1e198 ++ {0xF6872D5667844E49, 0x85C7056562757456}, // 1e199 ++ {0xB428F8AC016561DB, 0xA738C6BEBB12D16C}, // 1e200 ++ {0xE13336D701BEBA52, 0xD106F86E69D785C7}, // 1e201 ++ {0xECC0024661173473, 0x82A45B450226B39C}, // 1e202 ++ {0x27F002D7F95D0190, 0xA34D721642B06084}, // 1e203 ++ {0x31EC038DF7B441F4, 0xCC20CE9BD35C78A5}, // 1e204 ++ {0x7E67047175A15271, 0xFF290242C83396CE}, // 1e205 ++ {0x0F0062C6E984D386, 0x9F79A169BD203E41}, // 1e206 ++ {0x52C07B78A3E60868, 0xC75809C42C684DD1}, // 1e207 ++ {0xA7709A56CCDF8A82, 0xF92E0C3537826145}, // 1e208 ++ {0x88A66076400BB691, 0x9BBCC7A142B17CCB}, // 1e209 ++ {0x6ACFF893D00EA435, 0xC2ABF989935DDBFE}, // 1e210 ++ {0x0583F6B8C4124D43, 0xF356F7EBF83552FE}, // 1e211 ++ {0xC3727A337A8B704A, 0x98165AF37B2153DE}, // 1e212 ++ {0x744F18C0592E4C5C, 0xBE1BF1B059E9A8D6}, // 1e213 ++ {0x1162DEF06F79DF73, 0xEDA2EE1C7064130C}, // 1e214 ++ {0x8ADDCB5645AC2BA8, 0x9485D4D1C63E8BE7}, // 1e215 ++ {0x6D953E2BD7173692, 0xB9A74A0637CE2EE1}, // 1e216 ++ {0xC8FA8DB6CCDD0437, 0xE8111C87C5C1BA99}, // 1e217 ++ {0x1D9C9892400A22A2, 0x910AB1D4DB9914A0}, // 1e218 ++ {0x2503BEB6D00CAB4B, 0xB54D5E4A127F59C8}, // 1e219 ++ {0x2E44AE64840FD61D, 0xE2A0B5DC971F303A}, // 1e220 ++ {0x5CEAECFED289E5D2, 0x8DA471A9DE737E24}, // 1e221 ++ {0x7425A83E872C5F47, 0xB10D8E1456105DAD}, // 1e222 ++ {0xD12F124E28F77719, 0xDD50F1996B947518}, // 1e223 ++ {0x82BD6B70D99AAA6F, 0x8A5296FFE33CC92F}, // 1e224 ++ {0x636CC64D1001550B, 0xACE73CBFDC0BFB7B}, // 1e225 ++ {0x3C47F7E05401AA4E, 0xD8210BEFD30EFA5A}, // 1e226 ++ {0x65ACFAEC34810A71, 0x8714A775E3E95C78}, // 1e227 ++ {0x7F1839A741A14D0D, 0xA8D9D1535CE3B396}, // 1e228 ++ {0x1EDE48111209A050, 0xD31045A8341CA07C}, // 1e229 ++ {0x934AED0AAB460432, 0x83EA2B892091E44D}, // 1e230 ++ {0xF81DA84D5617853F, 0xA4E4B66B68B65D60}, // 1e231 ++ {0x36251260AB9D668E, 0xCE1DE40642E3F4B9}, // 1e232 ++ {0xC1D72B7C6B426019, 0x80D2AE83E9CE78F3}, // 1e233 ++ {0xB24CF65B8612F81F, 0xA1075A24E4421730}, // 1e234 ++ {0xDEE033F26797B627, 0xC94930AE1D529CFC}, // 1e235 ++ {0x169840EF017DA3B1, 0xFB9B7CD9A4A7443C}, // 1e236 ++ {0x8E1F289560EE864E, 0x9D412E0806E88AA5}, // 1e237 ++ {0xF1A6F2BAB92A27E2, 0xC491798A08A2AD4E}, // 1e238 ++ {0xAE10AF696774B1DB, 0xF5B5D7EC8ACB58A2}, // 1e239 ++ {0xACCA6DA1E0A8EF29, 0x9991A6F3D6BF1765}, // 1e240 ++ {0x17FD090A58D32AF3, 0xBFF610B0CC6EDD3F}, // 1e241 ++ {0xDDFC4B4CEF07F5B0, 0xEFF394DCFF8A948E}, // 1e242 ++ {0x4ABDAF101564F98E, 0x95F83D0A1FB69CD9}, // 1e243 ++ {0x9D6D1AD41ABE37F1, 0xBB764C4CA7A4440F}, // 1e244 ++ {0x84C86189216DC5ED, 0xEA53DF5FD18D5513}, // 1e245 ++ {0x32FD3CF5B4E49BB4, 0x92746B9BE2F8552C}, // 1e246 ++ {0x3FBC8C33221DC2A1, 0xB7118682DBB66A77}, // 1e247 ++ {0x0FABAF3FEAA5334A, 0xE4D5E82392A40515}, // 1e248 ++ {0x29CB4D87F2A7400E, 0x8F05B1163BA6832D}, // 1e249 ++ {0x743E20E9EF511012, 0xB2C71D5BCA9023F8}, // 1e250 ++ {0x914DA9246B255416, 0xDF78E4B2BD342CF6}, // 1e251 ++ {0x1AD089B6C2F7548E, 0x8BAB8EEFB6409C1A}, // 1e252 ++ {0xA184AC2473B529B1, 0xAE9672ABA3D0C320}, // 1e253 ++ {0xC9E5D72D90A2741E, 0xDA3C0F568CC4F3E8}, // 1e254 ++ {0x7E2FA67C7A658892, 0x8865899617FB1871}, // 1e255 ++ {0xDDBB901B98FEEAB7, 0xAA7EEBFB9DF9DE8D}, // 1e256 ++ {0x552A74227F3EA565, 0xD51EA6FA85785631}, // 1e257 ++ {0xD53A88958F87275F, 0x8533285C936B35DE}, // 1e258 ++ {0x8A892ABAF368F137, 0xA67FF273B8460356}, // 1e259 ++ {0x2D2B7569B0432D85, 0xD01FEF10A657842C}, // 1e260 ++ {0x9C3B29620E29FC73, 0x8213F56A67F6B29B}, // 1e261 ++ {0x8349F3BA91B47B8F, 0xA298F2C501F45F42}, // 1e262 ++ {0x241C70A936219A73, 0xCB3F2F7642717713}, // 1e263 ++ {0xED238CD383AA0110, 0xFE0EFB53D30DD4D7}, // 1e264 ++ {0xF4363804324A40AA, 0x9EC95D1463E8A506}, // 1e265 ++ {0xB143C6053EDCD0D5, 0xC67BB4597CE2CE48}, // 1e266 ++ {0xDD94B7868E94050A, 0xF81AA16FDC1B81DA}, // 1e267 ++ {0xCA7CF2B4191C8326, 0x9B10A4E5E9913128}, // 1e268 ++ {0xFD1C2F611F63A3F0, 0xC1D4CE1F63F57D72}, // 1e269 ++ {0xBC633B39673C8CEC, 0xF24A01A73CF2DCCF}, // 1e270 ++ {0xD5BE0503E085D813, 0x976E41088617CA01}, // 1e271 ++ {0x4B2D8644D8A74E18, 0xBD49D14AA79DBC82}, // 1e272 ++ {0xDDF8E7D60ED1219E, 0xEC9C459D51852BA2}, // 1e273 ++ {0xCABB90E5C942B503, 0x93E1AB8252F33B45}, // 1e274 ++ {0x3D6A751F3B936243, 0xB8DA1662E7B00A17}, // 1e275 ++ {0x0CC512670A783AD4, 0xE7109BFBA19C0C9D}, // 1e276 ++ {0x27FB2B80668B24C5, 0x906A617D450187E2}, // 1e277 ++ {0xB1F9F660802DEDF6, 0xB484F9DC9641E9DA}, // 1e278 ++ {0x5E7873F8A0396973, 0xE1A63853BBD26451}, // 1e279 ++ {0xDB0B487B6423E1E8, 0x8D07E33455637EB2}, // 1e280 ++ {0x91CE1A9A3D2CDA62, 0xB049DC016ABC5E5F}, // 1e281 ++ {0x7641A140CC7810FB, 0xDC5C5301C56B75F7}, // 1e282 ++ {0xA9E904C87FCB0A9D, 0x89B9B3E11B6329BA}, // 1e283 ++ {0x546345FA9FBDCD44, 0xAC2820D9623BF429}, // 1e284 ++ {0xA97C177947AD4095, 0xD732290FBACAF133}, // 1e285 ++ {0x49ED8EABCCCC485D, 0x867F59A9D4BED6C0}, // 1e286 ++ {0x5C68F256BFFF5A74, 0xA81F301449EE8C70}, // 1e287 ++ {0x73832EEC6FFF3111, 0xD226FC195C6A2F8C}, // 1e288 + }; + +-// -------- ++// wuffs_private_impl__f64_powers_of_10 holds powers of 10 that can be exactly ++// represented by a float64 (what C calls a double). ++static const double wuffs_private_impl__f64_powers_of_10[23] = { ++ 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, ++ 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, ++}; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_64__decode(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET) +- ? wuffs_base__base_64__decode_url +- : wuffs_base__base_64__decode_std; +- wuffs_base__transform__output o; +- uint8_t* d_ptr = dst.ptr; +- size_t d_len = dst.len; +- const uint8_t* s_ptr = src.ptr; +- size_t s_len = src.len; +- bool pad = false; ++// ---------------- IEEE 754 Floating Point + +- while (s_len >= 4) { +- uint32_t s = wuffs_base__peek_u32le__no_bounds_check(s_ptr); +- uint32_t s0 = alphabet[0xFF & (s >> 0)]; +- uint32_t s1 = alphabet[0xFF & (s >> 8)]; +- uint32_t s2 = alphabet[0xFF & (s >> 16)]; +- uint32_t s3 = alphabet[0xFF & (s >> 24)]; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u16 // ++wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(double f) { ++ uint64_t u = 0; ++ if (sizeof(uint64_t) == sizeof(double)) { ++ memcpy(&u, &f, sizeof(uint64_t)); ++ } ++ uint16_t neg = ((uint16_t)((u >> 63) << 15)); ++ u &= 0x7FFFFFFFFFFFFFFF; ++ uint64_t exp = u >> 52; ++ uint64_t man = u & 0x000FFFFFFFFFFFFF; + +- if (((s0 | s1 | s2 | s3) & 0xC0) != 0) { +- if (s_len > 4) { +- o.status.repr = wuffs_base__error__bad_data; +- goto done; +- } else if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- goto done; +- } else if ((options & WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING) && +- (s_ptr[3] == '=')) { +- pad = true; +- if (s_ptr[2] == '=') { +- goto src2; +- } +- goto src3; +- } +- o.status.repr = wuffs_base__error__bad_data; +- goto done; ++ if (exp == 0x7FF) { ++ if (man == 0) { // Infinity. ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg | 0x7C00; ++ ret.lossy = false; ++ return ret; + } ++ // NaN. Shift the 52 mantissa bits to 10 mantissa bits, keeping the most ++ // significant mantissa bit (quiet vs signaling NaNs). Also set the low 9 ++ // bits of ret.value so that the 10-bit mantissa is non-zero. ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg | 0x7DFF | ((uint16_t)(man >> 42)); ++ ret.lossy = false; ++ return ret; + +- if (d_len < 3) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } ++ } else if (exp > 0x40E) { // Truncate to the largest finite f16. ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg | 0x7BFF; ++ ret.lossy = true; ++ return ret; + +- s_ptr += 4; +- s_len -= 4; +- s = (s0 << 18) | (s1 << 12) | (s2 << 6) | (s3 << 0); +- *d_ptr++ = (uint8_t)(s >> 16); +- *d_ptr++ = (uint8_t)(s >> 8); +- *d_ptr++ = (uint8_t)(s >> 0); +- d_len -= 3; +- } +- +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- goto done; +- } ++ } else if (exp <= 0x3E6) { // Truncate to zero. ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg; ++ ret.lossy = (u != 0); ++ return ret; + +- if (s_len == 0) { +- o.status.repr = NULL; +- goto done; +- } else if (s_len == 1) { +- o.status.repr = wuffs_base__error__bad_data; +- goto done; +- } else if (s_len == 2) { +- goto src2; ++ } else if (exp <= 0x3F0) { // Normal f64, subnormal f16. ++ // Convert from a 53-bit mantissa (after realizing the implicit bit) to a ++ // 10-bit mantissa and then adjust for the exponent. ++ man |= 0x0010000000000000; ++ uint32_t shift = ((uint32_t)(1051 - exp)); // 1051 = 0x3F0 + 53 - 10. ++ uint64_t shifted_man = man >> shift; ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg | ((uint16_t)shifted_man); ++ ret.lossy = (shifted_man << shift) != man; ++ return ret; + } + +-src3: +- do { +- uint32_t s = wuffs_base__peek_u24le__no_bounds_check(s_ptr); +- uint32_t s0 = alphabet[0xFF & (s >> 0)]; +- uint32_t s1 = alphabet[0xFF & (s >> 8)]; +- uint32_t s2 = alphabet[0xFF & (s >> 16)]; +- if ((s0 & 0xC0) || (s1 & 0xC0) || (s2 & 0xC3)) { +- o.status.repr = wuffs_base__error__bad_data; +- goto done; +- } +- if (d_len < 2) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } +- s_ptr += pad ? 4 : 3; +- s = (s0 << 18) | (s1 << 12) | (s2 << 6); +- *d_ptr++ = (uint8_t)(s >> 16); +- *d_ptr++ = (uint8_t)(s >> 8); +- o.status.repr = NULL; +- goto done; +- } while (0); ++ // Normal f64, normal f16. + +-src2: +- do { +- uint32_t s = wuffs_base__peek_u16le__no_bounds_check(s_ptr); +- uint32_t s0 = alphabet[0xFF & (s >> 0)]; +- uint32_t s1 = alphabet[0xFF & (s >> 8)]; +- if ((s0 & 0xC0) || (s1 & 0xCF)) { +- o.status.repr = wuffs_base__error__bad_data; +- goto done; +- } +- if (d_len < 1) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } +- s_ptr += pad ? 4 : 2; +- s = (s0 << 18) | (s1 << 12); +- *d_ptr++ = (uint8_t)(s >> 16); +- o.status.repr = NULL; +- goto done; +- } while (0); ++ // Re-bias from 1023 to 15 and shift above f16's 10 mantissa bits. ++ exp = (exp - 1008) << 10; // 1008 = 1023 - 15 = 0x3FF - 0xF. + +-done: +- o.num_dst = (size_t)(d_ptr - dst.ptr); +- o.num_src = (size_t)(s_ptr - src.ptr); +- return o; ++ // Convert from a 52-bit mantissa (excluding the implicit bit) to a 10-bit ++ // mantissa (again excluding the implicit bit). We lose some information if ++ // any of the bottom 42 bits are non-zero. ++ wuffs_base__lossy_value_u16 ret; ++ ret.value = neg | ((uint16_t)exp) | ((uint16_t)(man >> 42)); ++ ret.lossy = (man << 22) != 0; ++ return ret; + } + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // +-wuffs_base__base_64__encode(wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 src, +- bool src_closed, +- uint32_t options) { +- const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET) +- ? wuffs_base__base_64__encode_url +- : wuffs_base__base_64__encode_std; +- wuffs_base__transform__output o; +- uint8_t* d_ptr = dst.ptr; +- size_t d_len = dst.len; +- const uint8_t* s_ptr = src.ptr; +- size_t s_len = src.len; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u32 // ++wuffs_base__ieee_754_bit_representation__from_f64_to_u32_truncate(double f) { ++ uint64_t u = 0; ++ if (sizeof(uint64_t) == sizeof(double)) { ++ memcpy(&u, &f, sizeof(uint64_t)); ++ } ++ uint32_t neg = ((uint32_t)(u >> 63)) << 31; ++ u &= 0x7FFFFFFFFFFFFFFF; ++ uint64_t exp = u >> 52; ++ uint64_t man = u & 0x000FFFFFFFFFFFFF; + +- do { +- while (s_len >= 3) { +- if (d_len < 4) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } +- uint32_t s = wuffs_base__peek_u24be__no_bounds_check(s_ptr); +- s_ptr += 3; +- s_len -= 3; +- *d_ptr++ = alphabet[0x3F & (s >> 18)]; +- *d_ptr++ = alphabet[0x3F & (s >> 12)]; +- *d_ptr++ = alphabet[0x3F & (s >> 6)]; +- *d_ptr++ = alphabet[0x3F & (s >> 0)]; +- d_len -= 4; ++ if (exp == 0x7FF) { ++ if (man == 0) { // Infinity. ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg | 0x7F800000; ++ ret.lossy = false; ++ return ret; + } ++ // NaN. Shift the 52 mantissa bits to 23 mantissa bits, keeping the most ++ // significant mantissa bit (quiet vs signaling NaNs). Also set the low 22 ++ // bits of ret.value so that the 23-bit mantissa is non-zero. ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg | 0x7FBFFFFF | ((uint32_t)(man >> 29)); ++ ret.lossy = false; ++ return ret; + +- if (!src_closed) { +- o.status.repr = wuffs_base__suspension__short_read; +- goto done; +- } ++ } else if (exp > 0x47E) { // Truncate to the largest finite f32. ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg | 0x7F7FFFFF; ++ ret.lossy = true; ++ return ret; + +- if (s_len == 2) { +- if (d_len < +- ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 3)) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } +- uint32_t s = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(s_ptr))) +- << 8; +- s_ptr += 2; +- *d_ptr++ = alphabet[0x3F & (s >> 18)]; +- *d_ptr++ = alphabet[0x3F & (s >> 12)]; +- *d_ptr++ = alphabet[0x3F & (s >> 6)]; +- if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) { +- *d_ptr++ = '='; +- } +- o.status.repr = NULL; +- goto done; ++ } else if (exp <= 0x369) { // Truncate to zero. ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg; ++ ret.lossy = (u != 0); ++ return ret; + +- } else if (s_len == 1) { +- if (d_len < +- ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 2)) { +- o.status.repr = wuffs_base__suspension__short_write; +- goto done; +- } +- uint32_t s = ((uint32_t)(wuffs_base__peek_u8__no_bounds_check(s_ptr))) +- << 16; +- s_ptr += 1; +- *d_ptr++ = alphabet[0x3F & (s >> 18)]; +- *d_ptr++ = alphabet[0x3F & (s >> 12)]; +- if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) { +- *d_ptr++ = '='; +- *d_ptr++ = '='; +- } +- o.status.repr = NULL; +- goto done; ++ } else if (exp <= 0x380) { // Normal f64, subnormal f32. ++ // Convert from a 53-bit mantissa (after realizing the implicit bit) to a ++ // 23-bit mantissa and then adjust for the exponent. ++ man |= 0x0010000000000000; ++ uint32_t shift = ((uint32_t)(926 - exp)); // 926 = 0x380 + 53 - 23. ++ uint64_t shifted_man = man >> shift; ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg | ((uint32_t)shifted_man); ++ ret.lossy = (shifted_man << shift) != man; ++ return ret; ++ } + +- } else { +- o.status.repr = NULL; +- goto done; +- } +- } while (0); ++ // Normal f64, normal f32. + +-done: +- o.num_dst = (size_t)(d_ptr - dst.ptr); +- o.num_src = (size_t)(s_ptr - src.ptr); +- return o; ++ // Re-bias from 1023 to 127 and shift above f32's 23 mantissa bits. ++ exp = (exp - 896) << 23; // 896 = 1023 - 127 = 0x3FF - 0x7F. ++ ++ // Convert from a 52-bit mantissa (excluding the implicit bit) to a 23-bit ++ // mantissa (again excluding the implicit bit). We lose some information if ++ // any of the bottom 29 bits are non-zero. ++ wuffs_base__lossy_value_u32 ret; ++ ret.value = neg | ((uint32_t)exp) | ((uint32_t)(man >> 29)); ++ ret.lossy = (man << 35) != 0; ++ return ret; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__INTCONV) ++// -------- + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__MAGIC) ++#define WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE 2047 ++#define WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION 800 + +-// ---------------- Magic Numbers ++// WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL is the largest N such that ++// ((10 << N) < (1 << 64)). ++#define WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL 60 + +-// ICO doesn't start with a magic identifier. Instead, see if the opening bytes +-// are plausibly ICO. ++// wuffs_private_impl__high_prec_dec (abbreviated as HPD) is a fixed precision ++// floating point decimal number, augmented with ±infinity values, but it ++// cannot represent NaN (Not a Number). + // +-// Callers should have already verified that (prefix_data.len >= 2) and the +-// first two bytes are 0x00. ++// "High precision" means that the mantissa holds 800 decimal digits. 800 is ++// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION. + // +-// See: +-// - https://docs.fileformat.com/image/ico/ +-static int32_t // +-wuffs_base__magic_number_guess_fourcc__maybe_ico( +- wuffs_base__slice_u8 prefix_data, +- bool prefix_closed) { +- // Allow-list for the Image Type field. +- if (prefix_data.len < 4) { +- return prefix_closed ? 0 : -1; +- } else if (prefix_data.ptr[3] != 0) { +- return 0; +- } +- switch (prefix_data.ptr[2]) { +- case 0x01: // ICO +- case 0x02: // CUR +- break; +- default: +- return 0; +- } +- +- // The Number Of Images should be positive. +- if (prefix_data.len < 6) { +- return prefix_closed ? 0 : -1; +- } else if ((prefix_data.ptr[4] == 0) && (prefix_data.ptr[5] == 0)) { +- return 0; +- } ++// An HPD isn't for general purpose arithmetic, only for conversions to and ++// from IEEE 754 double-precision floating point, where the largest and ++// smallest positive, finite values are approximately 1.8e+308 and 4.9e-324. ++// HPD exponents above +2047 mean infinity, below -2047 mean zero. The ±2047 ++// bounds are further away from zero than ±(324 + 800), where 800 and 2047 is ++// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION and ++// WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE. ++// ++// digits[.. num_digits] are the number's digits in big-endian order. The ++// uint8_t values are in the range [0 ..= 9], not ['0' ..= '9'], where e.g. '7' ++// is the ASCII value 0x37. ++// ++// decimal_point is the index (within digits) of the decimal point. It may be ++// negative or be larger than num_digits, in which case the explicit digits are ++// padded with implicit zeroes. ++// ++// For example, if num_digits is 3 and digits is "\x07\x08\x09": ++// - A decimal_point of -2 means ".00789" ++// - A decimal_point of -1 means ".0789" ++// - A decimal_point of +0 means ".789" ++// - A decimal_point of +1 means "7.89" ++// - A decimal_point of +2 means "78.9" ++// - A decimal_point of +3 means "789." ++// - A decimal_point of +4 means "7890." ++// - A decimal_point of +5 means "78900." ++// ++// As above, a decimal_point higher than +2047 means that the overall value is ++// infinity, lower than -2047 means zero. ++// ++// negative is a sign bit. An HPD can distinguish positive and negative zero. ++// ++// truncated is whether there are more than ++// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION digits, and at least one of those ++// extra digits are non-zero. The existence of long-tail digits can affect ++// rounding. ++// ++// The "all fields are zero" value is valid, and represents the number +0. ++typedef struct wuffs_private_impl__high_prec_dec__struct { ++ uint32_t num_digits; ++ int32_t decimal_point; ++ bool negative; ++ bool truncated; ++ uint8_t digits[WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION]; ++} wuffs_private_impl__high_prec_dec; + +- // The first ICONDIRENTRY's fourth byte should be zero. +- if (prefix_data.len < 10) { +- return prefix_closed ? 0 : -1; +- } else if (prefix_data.ptr[9] != 0) { +- return 0; ++// wuffs_private_impl__high_prec_dec__trim trims trailing zeroes from the ++// h->digits[.. h->num_digits] slice. They have no benefit, since we explicitly ++// track h->decimal_point. ++// ++// Preconditions: ++// - h is non-NULL. ++static inline void // ++wuffs_private_impl__high_prec_dec__trim(wuffs_private_impl__high_prec_dec* h) { ++ while ((h->num_digits > 0) && (h->digits[h->num_digits - 1] == 0)) { ++ h->num_digits--; + } +- +- // TODO: have a separate FourCC for CUR? +- return 0x49434F20; // 'ICO 'be + } + +-// TGA doesn't start with a magic identifier. Instead, see if the opening bytes +-// are plausibly TGA. ++// wuffs_private_impl__high_prec_dec__assign sets h to represent the number x. + // +-// Callers should have already verified that (prefix_data.len >= 2) and the +-// second byte (prefix_data.ptr[1], the Color Map Type byte), is either 0x00 or +-// 0x01. +-// +-// See: +-// - https://docs.fileformat.com/image/tga/ +-// - https://www.dca.fee.unicamp.br/~martino/disciplinas/ea978/tgaffs.pdf +-static int32_t // +-wuffs_base__magic_number_guess_fourcc__maybe_tga( +- wuffs_base__slice_u8 prefix_data, +- bool prefix_closed) { +- // Allow-list for the Image Type field. +- if (prefix_data.len < 3) { +- return prefix_closed ? 0 : -1; +- } +- switch (prefix_data.ptr[2]) { +- case 0x01: +- case 0x02: +- case 0x03: +- case 0x09: +- case 0x0A: +- case 0x0B: +- break; +- default: +- // TODO: 0x20 and 0x21 are invalid, according to the spec, but are +- // apparently unofficial extensions. +- return 0; +- } +- +- // Allow-list for the Color Map Entry Size field (if the Color Map Type field +- // is non-zero) or else all the Color Map fields should be zero. +- if (prefix_data.len < 8) { +- return prefix_closed ? 0 : -1; +- } else if (prefix_data.ptr[1] != 0x00) { +- switch (prefix_data.ptr[7]) { +- case 0x0F: +- case 0x10: +- case 0x18: +- case 0x20: +- break; +- default: +- return 0; +- } +- } else if ((prefix_data.ptr[3] | prefix_data.ptr[4] | prefix_data.ptr[5] | +- prefix_data.ptr[6] | prefix_data.ptr[7]) != 0x00) { +- return 0; +- } ++// Preconditions: ++// - h is non-NULL. ++static void // ++wuffs_private_impl__high_prec_dec__assign(wuffs_private_impl__high_prec_dec* h, ++ uint64_t x, ++ bool negative) { ++ uint32_t n = 0; + +- // Allow-list for the Pixel Depth field. +- if (prefix_data.len < 17) { +- return prefix_closed ? 0 : -1; +- } +- switch (prefix_data.ptr[16]) { +- case 0x01: +- case 0x08: +- case 0x0F: +- case 0x10: +- case 0x18: +- case 0x20: +- break; +- default: +- return 0; ++ // Set h->digits. ++ if (x > 0) { ++ // Calculate the digits, working right-to-left. After we determine n (how ++ // many digits there are), copy from buf to h->digits. ++ // ++ // UINT64_MAX, 18446744073709551615, is 20 digits long. It can be faster to ++ // copy a constant number of bytes than a variable number (20 instead of ++ // n). Make buf large enough (and start writing to it from the middle) so ++ // that can we always copy 20 bytes: the slice buf[(20-n) .. (40-n)]. ++ uint8_t buf[40] = {0}; ++ uint8_t* ptr = &buf[20]; ++ do { ++ uint64_t remaining = x / 10; ++ x -= remaining * 10; ++ ptr--; ++ *ptr = (uint8_t)x; ++ n++; ++ x = remaining; ++ } while (x > 0); ++ memcpy(h->digits, ptr, 20); + } + +- return 0x54474120; // 'TGA 'be ++ // Set h's other fields. ++ h->num_digits = n; ++ h->decimal_point = (int32_t)n; ++ h->negative = negative; ++ h->truncated = false; ++ wuffs_private_impl__high_prec_dec__trim(h); + } + +-WUFFS_BASE__MAYBE_STATIC int32_t // +-wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data, +- bool prefix_closed) { +- // This is similar to (but different from): +- // - the magic/Magdir tables under https://github.com/file/file +- // - the MIME Sniffing algorithm at https://mimesniff.spec.whatwg.org/ +- +- // table holds the 'magic numbers' (which are actually variable length +- // strings). The strings may contain NUL bytes, so the "const char* magic" +- // value starts with the length-minus-1 of the 'magic number'. +- // +- // Keep it sorted by magic[1], then magic[0] descending (prioritizing longer +- // matches) and finally by magic[2:]. When multiple entries match, the +- // longest one wins. +- // +- // The fourcc field might be negated, in which case there's further +- // specialization (see § below). +- static struct { +- int32_t fourcc; +- const char* magic; +- } table[] = { +- {-0x30302020, "\x01\x00\x00"}, // '00 'be +- {+0x475A2020, "\x02\x1F\x8B\x08"}, // GZ +- {+0x5A535444, "\x03\x28\xB5\x2F\xFD"}, // ZSTD +- {+0x425A3220, "\x02\x42\x5A\x68"}, // BZ2 +- {+0x424D5020, "\x01\x42\x4D"}, // BMP +- {+0x47494620, "\x03\x47\x49\x46\x38"}, // GIF +- {+0x54494646, "\x03\x49\x49\x2A\x00"}, // TIFF (little-endian) +- {+0x54494646, "\x03\x4D\x4D\x00\x2A"}, // TIFF (big-endian) +- {+0x4E50424D, "\x02\x50\x35\x0A"}, // NPBM (P5; *.pgm) +- {+0x4E50424D, "\x02\x50\x36\x0A"}, // NPBM (P6; *.ppm) +- {-0x52494646, "\x03\x52\x49\x46\x46"}, // RIFF +- {+0x4C5A4D41, "\x04\x5D\x00\x10\x00\x00"}, // LZMA +- {+0x4C5A4D41, "\x02\x5D\x00\x00"}, // LZMA +- {+0x4E494520, "\x02\x6E\xC3\xAF"}, // NIE +- {+0x514F4920, "\x03\x71\x6F\x69\x66"}, // QOI +- {+0x5A4C4942, "\x01\x78\x9C"}, // ZLIB +- {+0x504E4720, "\x03\x89\x50\x4E\x47"}, // PNG +- {+0x585A2020, "\x04\xFD\x37\x7A\x58\x5A"}, // XZ +- {+0x4A504547, "\x01\xFF\xD8"}, // JPEG +- }; +- static const size_t table_len = sizeof(table) / sizeof(table[0]); +- +- if (prefix_data.len == 0) { +- return prefix_closed ? 0 : -1; ++static wuffs_base__status // ++wuffs_private_impl__high_prec_dec__parse(wuffs_private_impl__high_prec_dec* h, ++ wuffs_base__slice_u8 s, ++ uint32_t options) { ++ if (!h) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- uint8_t pre_first_byte = prefix_data.ptr[0]; ++ h->num_digits = 0; ++ h->decimal_point = 0; ++ h->negative = false; ++ h->truncated = false; + +- int32_t fourcc = 0; +- size_t i; +- for (i = 0; i < table_len; i++) { +- uint8_t mag_first_byte = ((uint8_t)(table[i].magic[1])); +- if (pre_first_byte < mag_first_byte) { +- break; +- } else if (pre_first_byte > mag_first_byte) { +- continue; +- } +- fourcc = table[i].fourcc; ++ uint8_t* p = s.ptr; ++ uint8_t* q = s.ptr + s.len; + +- uint8_t mag_remaining_len = ((uint8_t)(table[i].magic[0])); +- if (mag_remaining_len == 0) { +- goto match; ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (;; p++) { ++ if (p >= q) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } else if (*p != '_') { ++ break; ++ } + } ++ } + +- const char* mag_remaining_ptr = table[i].magic + 2; +- uint8_t* pre_remaining_ptr = prefix_data.ptr + 1; +- size_t pre_remaining_len = prefix_data.len - 1; +- if (pre_remaining_len < mag_remaining_len) { +- if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, pre_remaining_len)) { +- return prefix_closed ? 0 : -1; +- } ++ // Parse sign. ++ do { ++ if (*p == '+') { ++ p++; ++ } else if (*p == '-') { ++ h->negative = true; ++ p++; + } else { +- if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, mag_remaining_len)) { +- goto match; ++ break; ++ } ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (;; p++) { ++ if (p >= q) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } else if (*p != '_') { ++ break; ++ } + } + } +- } +- +- if (prefix_data.len < 2) { +- return prefix_closed ? 0 : -1; +- } else if ((prefix_data.ptr[1] == 0x00) || (prefix_data.ptr[1] == 0x01)) { +- return wuffs_base__magic_number_guess_fourcc__maybe_tga(prefix_data, +- prefix_closed); +- } +- +- return 0; +- +-match: +- // Negative FourCC values (see § above) are further specialized. +- if (fourcc < 0) { +- fourcc = -fourcc; ++ } while (0); + +- if (fourcc == 0x52494646) { // 'RIFF'be +- if (prefix_data.len < 12) { +- return prefix_closed ? 0 : -1; ++ // Parse digits, up to (and including) a '.', 'E' or 'e'. Examples for each ++ // limb in this if-else chain: ++ // - "0.789" ++ // - "1002.789" ++ // - ".789" ++ // - Other (invalid input). ++ uint32_t nd = 0; ++ int32_t dp = 0; ++ bool no_digits_before_separator = false; ++ if (('0' == *p) && ++ !(options & ++ WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES)) { ++ p++; ++ for (;; p++) { ++ if (p >= q) { ++ goto after_all; ++ } else if (*p == ++ ((options & ++ WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.')) { ++ p++; ++ goto after_sep; ++ } else if ((*p == 'E') || (*p == 'e')) { ++ p++; ++ goto after_exp; ++ } else if ((*p != '_') || ++ !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } +- uint32_t x = wuffs_base__peek_u32be__no_bounds_check(prefix_data.ptr + 8); +- if (x == 0x57454250) { // 'WEBP'be +- return 0x57454250; // 'WEBP'be ++ } ++ ++ } else if (('0' <= *p) && (*p <= '9')) { ++ if (*p == '0') { ++ for (; (p < q) && (*p == '0'); p++) { + } ++ } else { ++ h->digits[nd++] = (uint8_t)(*p - '0'); ++ dp = (int32_t)nd; ++ p++; ++ } + +- } else if (fourcc == 0x30302020) { // '00 'be +- // Binary data starting with multiple 0x00 NUL bytes is quite common. +- // Unfortunately, some file formats also don't start with a magic +- // identifier, so we have to use heuristics (where the order matters, the +- // same as /usr/bin/file's magic/Magdir tables) as best we can. Maybe +- // it's TGA, ICO/CUR, etc. Maybe it's something else. +- int32_t tga = wuffs_base__magic_number_guess_fourcc__maybe_tga( +- prefix_data, prefix_closed); +- if (tga != 0) { +- return tga; ++ for (;; p++) { ++ if (p >= q) { ++ goto after_all; ++ } else if (('0' <= *p) && (*p <= '9')) { ++ if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[nd++] = (uint8_t)(*p - '0'); ++ dp = (int32_t)nd; ++ } else if ('0' != *p) { ++ // Long-tail non-zeroes set the truncated bit. ++ h->truncated = true; ++ } ++ } else if (*p == ++ ((options & ++ WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.')) { ++ p++; ++ goto after_sep; ++ } else if ((*p == 'E') || (*p == 'e')) { ++ p++; ++ goto after_exp; ++ } else if ((*p != '_') || ++ !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } +- int32_t ico = wuffs_base__magic_number_guess_fourcc__maybe_ico( +- prefix_data, prefix_closed); +- if (ico != 0) { +- return ico; ++ } ++ ++ } else if (*p == ((options & ++ WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.')) { ++ p++; ++ no_digits_before_separator = true; ++ ++ } else { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ ++after_sep: ++ for (;; p++) { ++ if (p >= q) { ++ goto after_all; ++ } else if ('0' == *p) { ++ if (nd == 0) { ++ // Track leading zeroes implicitly. ++ dp--; ++ } else if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[nd++] = (uint8_t)(*p - '0'); + } +- if (prefix_data.len < 4) { +- return prefix_closed ? 0 : -1; +- } else if ((prefix_data.ptr[2] != 0x00) && +- ((prefix_data.ptr[2] >= 0x80) || +- (prefix_data.ptr[3] != 0x00))) { +- // Roughly speaking, this could be a non-degenerate (non-0-width and +- // non-0-height) WBMP image. +- return 0x57424D50; // 'WBMP'be ++ } else if (('0' < *p) && (*p <= '9')) { ++ if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[nd++] = (uint8_t)(*p - '0'); ++ } else { ++ // Long-tail non-zeroes set the truncated bit. ++ h->truncated = true; + } +- return 0; ++ } else if ((*p == 'E') || (*p == 'e')) { ++ p++; ++ goto after_exp; ++ } else if ((*p != '_') || ++ !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + } +- return fourcc; +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__MAGIC) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV) + +-// ---------------- Pixel Swizzler ++after_exp: ++ do { ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (;; p++) { ++ if (p >= q) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } else if (*p != '_') { ++ break; ++ } ++ } ++ } + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__rgb__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len); ++ int32_t exp_sign = +1; ++ if (*p == '+') { ++ p++; ++ } else if (*p == '-') { ++ exp_sign = -1; ++ p++; ++ } + +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-static uint64_t // +-wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len); ++ int32_t exp = 0; ++ const int32_t exp_large = WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE + ++ WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION; ++ bool saw_exp_digits = false; ++ for (; p < q; p++) { ++ if ((*p == '_') && ++ (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ // No-op. ++ } else if (('0' <= *p) && (*p <= '9')) { ++ saw_exp_digits = true; ++ if (exp < exp_large) { ++ exp = (10 * exp) + ((int32_t)(*p - '0')); ++ } ++ } else { ++ break; ++ } ++ } ++ if (!saw_exp_digits) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ dp += exp_sign * exp; ++ } while (0); + +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__y__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++after_all: ++ if (p != q) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ h->num_digits = nd; ++ if (nd == 0) { ++ if (no_digits_before_separator) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ h->decimal_point = 0; ++ } else if (dp < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) { ++ h->decimal_point = -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE - 1; ++ } else if (dp > +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) { ++ h->decimal_point = +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE + 1; ++ } else { ++ h->decimal_point = dp; ++ } ++ wuffs_private_impl__high_prec_dec__trim(h); ++ return wuffs_base__make_status(NULL); ++} + + // -------- + +-static inline uint32_t // +-wuffs_base__swap_u32_argb_abgr(uint32_t u) { +- uint32_t o = u & 0xFF00FF00ul; +- uint32_t r = u & 0x00FF0000ul; +- uint32_t b = u & 0x000000FFul; +- return o | (r >> 16) | (b << 16); +-} ++// wuffs_private_impl__high_prec_dec__lshift_num_new_digits returns the number ++// of additional decimal digits when left-shifting by shift. ++// ++// See below for preconditions. ++static uint32_t // ++wuffs_private_impl__high_prec_dec__lshift_num_new_digits( ++ wuffs_private_impl__high_prec_dec* h, ++ uint32_t shift) { ++ // Masking with 0x3F should be unnecessary (assuming the preconditions) but ++ // it's cheap and ensures that we don't overflow the ++ // wuffs_private_impl__hpd_left_shift array. ++ shift &= 63; + +-static inline uint64_t // +-wuffs_base__swap_u64_argb_abgr(uint64_t u) { +- uint64_t o = u & 0xFFFF0000FFFF0000ull; +- uint64_t r = u & 0x0000FFFF00000000ull; +- uint64_t b = u & 0x000000000000FFFFull; +- return o | (r >> 32) | (b << 32); +-} ++ uint32_t x_a = wuffs_private_impl__hpd_left_shift[shift]; ++ uint32_t x_b = wuffs_private_impl__hpd_left_shift[shift + 1]; ++ uint32_t num_new_digits = x_a >> 11; ++ uint32_t pow5_a = 0x7FF & x_a; ++ uint32_t pow5_b = 0x7FF & x_b; + +-static inline uint32_t // +-wuffs_base__color_u64__as__color_u32__swap_u32_argb_abgr(uint64_t c) { +- uint32_t a = ((uint32_t)(0xFF & (c >> 56))); +- uint32_t r = ((uint32_t)(0xFF & (c >> 40))); +- uint32_t g = ((uint32_t)(0xFF & (c >> 24))); +- uint32_t b = ((uint32_t)(0xFF & (c >> 8))); +- return (a << 24) | (b << 16) | (g << 8) | (r << 0); ++ const uint8_t* pow5 = &wuffs_private_impl__powers_of_5[pow5_a]; ++ uint32_t i = 0; ++ uint32_t n = pow5_b - pow5_a; ++ for (; i < n; i++) { ++ if (i >= h->num_digits) { ++ return num_new_digits - 1; ++ } else if (h->digits[i] == pow5[i]) { ++ continue; ++ } else if (h->digits[i] < pow5[i]) { ++ return num_new_digits - 1; ++ } else { ++ return num_new_digits; ++ } ++ } ++ return num_new_digits; + } + + // -------- + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__color_u32_argb_premul // +-wuffs_base__pixel_buffer__color_u32_at(const wuffs_base__pixel_buffer* pb, +- uint32_t x, +- uint32_t y) { +- if (!pb || (x >= pb->pixcfg.private_impl.width) || +- (y >= pb->pixcfg.private_impl.height)) { ++// wuffs_private_impl__high_prec_dec__rounded_integer returns the integral ++// (non-fractional) part of h, provided that it is 18 or fewer decimal digits. ++// For 19 or more digits, it returns UINT64_MAX. Note that: ++// - (1 << 53) is 9007199254740992, which has 16 decimal digits. ++// - (1 << 56) is 72057594037927936, which has 17 decimal digits. ++// - (1 << 59) is 576460752303423488, which has 18 decimal digits. ++// - (1 << 63) is 9223372036854775808, which has 19 decimal digits. ++// and that IEEE 754 double precision has 52 mantissa bits. ++// ++// That integral part is rounded-to-even: rounding 7.5 or 8.5 both give 8. ++// ++// h's negative bit is ignored: rounding -8.6 returns 9. ++// ++// See below for preconditions. ++static uint64_t // ++wuffs_private_impl__high_prec_dec__rounded_integer( ++ wuffs_private_impl__high_prec_dec* h) { ++ if ((h->num_digits == 0) || (h->decimal_point < 0)) { + return 0; ++ } else if (h->decimal_point > 18) { ++ return UINT64_MAX; + } + +- if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { +- // TODO: support planar formats. +- return 0; ++ uint32_t dp = (uint32_t)(h->decimal_point); ++ uint64_t n = 0; ++ uint32_t i = 0; ++ for (; i < dp; i++) { ++ n = (10 * n) + ((i < h->num_digits) ? h->digits[i] : 0); + } + +- size_t stride = pb->private_impl.planes[0].stride; +- const uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)); ++ bool round_up = false; ++ if (dp < h->num_digits) { ++ round_up = h->digits[dp] >= 5; ++ if ((h->digits[dp] == 5) && (dp + 1 == h->num_digits)) { ++ // We are exactly halfway. If we're truncated, round up, otherwise round ++ // to even. ++ round_up = h->truncated || // ++ ((dp > 0) && (1 & h->digits[dp - 1])); ++ } ++ } ++ if (round_up) { ++ n++; ++ } + +- switch (pb->pixcfg.private_impl.pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- return wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))); ++ return n; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: { +- uint8_t* palette = pb->private_impl.planes[3].ptr; +- return wuffs_base__peek_u32le__no_bounds_check(palette + +- (4 * ((size_t)row[x]))); +- } ++// wuffs_private_impl__high_prec_dec__small_xshift shifts h's number (where 'x' ++// is 'l' or 'r' for left or right) by a small shift value. ++// ++// Preconditions: ++// - h is non-NULL. ++// - h->decimal_point is "not extreme". ++// - shift is non-zero. ++// - shift is "a small shift". ++// ++// "Not extreme" means within ±WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE. ++// ++// "A small shift" means not more than ++// WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL. ++// ++// wuffs_private_impl__high_prec_dec__rounded_integer and ++// wuffs_private_impl__high_prec_dec__lshift_num_new_digits have the same ++// preconditions. ++// ++// wuffs_private_impl__high_prec_dec__lshift keeps the first two preconditions ++// but not the last two. Its shift argument is signed and does not need to be ++// "small": zero is a no-op, positive means left shift and negative means right ++// shift. + +- // Common formats above. Rarer formats below. ++static void // ++wuffs_private_impl__high_prec_dec__small_lshift( ++ wuffs_private_impl__high_prec_dec* h, ++ uint32_t shift) { ++ if (h->num_digits == 0) { ++ return; ++ } ++ uint32_t num_new_digits = ++ wuffs_private_impl__high_prec_dec__lshift_num_new_digits(h, shift); ++ uint32_t rx = h->num_digits - 1; // Read index. ++ uint32_t wx = h->num_digits - 1 + num_new_digits; // Write index. ++ uint64_t n = 0; + +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- return 0xFF000000 | (0x00010101 * ((uint32_t)(row[x]))); +- case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: +- return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 1]))); +- case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: +- return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 0]))); ++ // Repeat: pick up a digit, put down a digit, right to left. ++ while (((int32_t)rx) >= 0) { ++ n += ((uint64_t)(h->digits[rx])) << shift; ++ uint64_t quo = n / 10; ++ uint64_t rem = n - (10 * quo); ++ if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[wx] = (uint8_t)rem; ++ } else if (rem > 0) { ++ h->truncated = true; ++ } ++ n = quo; ++ wx--; ++ rx--; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: { +- uint8_t* palette = pb->private_impl.planes[3].ptr; +- return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(palette + +- (4 * ((size_t)row[x])))); ++ // Put down leading digits, right to left. ++ while (n > 0) { ++ uint64_t quo = n / 10; ++ uint64_t rem = n - (10 * quo); ++ if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[wx] = (uint8_t)rem; ++ } else if (rem > 0) { ++ h->truncated = true; + } ++ n = quo; ++ wx--; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(row + (2 * ((size_t)x)))); +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- return 0xFF000000 | +- wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x))); +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- return wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u64le__no_bounds_check(row + (8 * ((size_t)x)))); +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- return 0xFF000000 | +- wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))); ++ // Finish. ++ h->num_digits += num_new_digits; ++ if (h->num_digits > WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->num_digits = WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION; ++ } ++ h->decimal_point += (int32_t)num_new_digits; ++ wuffs_private_impl__high_prec_dec__trim(h); ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__swap_u32_argb_abgr( +- 0xFF000000 | +- wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x)))); +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- return wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(row + +- (4 * ((size_t)x))))); +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- return wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- return wuffs_base__swap_u32_argb_abgr( +- 0xFF000000 | +- wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); ++static void // ++wuffs_private_impl__high_prec_dec__small_rshift( ++ wuffs_private_impl__high_prec_dec* h, ++ uint32_t shift) { ++ uint32_t rx = 0; // Read index. ++ uint32_t wx = 0; // Write index. ++ uint64_t n = 0; + +- default: +- // TODO: support more formats. ++ // Pick up enough leading digits to cover the first shift. ++ while ((n >> shift) == 0) { ++ if (rx < h->num_digits) { ++ // Read a digit. ++ n = (10 * n) + h->digits[rx++]; ++ } else if (n == 0) { ++ // h's number used to be zero and remains zero. ++ return; ++ } else { ++ // Read sufficient implicit trailing zeroes. ++ while ((n >> shift) == 0) { ++ n = 10 * n; ++ rx++; ++ } + break; ++ } ++ } ++ h->decimal_point -= ((int32_t)(rx - 1)); ++ if (h->decimal_point < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) { ++ // After the shift, h's number is effectively zero. ++ h->num_digits = 0; ++ h->decimal_point = 0; ++ h->truncated = false; ++ return; + } + +- return 0; ++ // Repeat: pick up a digit, put down a digit, left to right. ++ uint64_t mask = (((uint64_t)(1)) << shift) - 1; ++ while (rx < h->num_digits) { ++ uint8_t new_digit = ((uint8_t)(n >> shift)); ++ n = (10 * (n & mask)) + h->digits[rx++]; ++ h->digits[wx++] = new_digit; ++ } ++ ++ // Put down trailing digits, left to right. ++ while (n > 0) { ++ uint8_t new_digit = ((uint8_t)(n >> shift)); ++ n = 10 * (n & mask); ++ if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) { ++ h->digits[wx++] = new_digit; ++ } else if (new_digit > 0) { ++ h->truncated = true; ++ } ++ } ++ ++ // Finish. ++ h->num_digits = wx; ++ wuffs_private_impl__high_prec_dec__trim(h); ++} ++ ++static void // ++wuffs_private_impl__high_prec_dec__lshift(wuffs_private_impl__high_prec_dec* h, ++ int32_t shift) { ++ if (shift > 0) { ++ while (shift > +WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) { ++ wuffs_private_impl__high_prec_dec__small_lshift( ++ h, WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL); ++ shift -= WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL; ++ } ++ wuffs_private_impl__high_prec_dec__small_lshift(h, ((uint32_t)(+shift))); ++ } else if (shift < 0) { ++ while (shift < -WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) { ++ wuffs_private_impl__high_prec_dec__small_rshift( ++ h, WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL); ++ shift += WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL; ++ } ++ wuffs_private_impl__high_prec_dec__small_rshift(h, ((uint32_t)(-shift))); ++ } + } + + // -------- + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +-wuffs_base__pixel_buffer__set_color_u32_at( +- wuffs_base__pixel_buffer* pb, +- uint32_t x, +- uint32_t y, +- wuffs_base__color_u32_argb_premul color) { +- if (!pb) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++// wuffs_private_impl__high_prec_dec__round_etc rounds h's number. For those ++// functions that take an n argument, rounding produces at most n digits (which ++// is not necessarily at most n decimal places). Negative n values are ignored, ++// as well as any n greater than or equal to h's number of digits. The ++// etc__round_just_enough function implicitly chooses an n to implement ++// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION. ++// ++// Preconditions: ++// - h is non-NULL. ++// - h->decimal_point is "not extreme". ++// ++// "Not extreme" means within ±WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE. ++ ++static void // ++wuffs_private_impl__high_prec_dec__round_down( ++ wuffs_private_impl__high_prec_dec* h, ++ int32_t n) { ++ if ((n < 0) || (h->num_digits <= (uint32_t)n)) { ++ return; + } +- if ((x >= pb->pixcfg.private_impl.width) || +- (y >= pb->pixcfg.private_impl.height)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ h->num_digits = (uint32_t)(n); ++ wuffs_private_impl__high_prec_dec__trim(h); ++} ++ ++static void // ++wuffs_private_impl__high_prec_dec__round_up( ++ wuffs_private_impl__high_prec_dec* h, ++ int32_t n) { ++ if ((n < 0) || (h->num_digits <= (uint32_t)n)) { ++ return; + } + +- if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { +- // TODO: support planar formats. +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ for (n--; n >= 0; n--) { ++ if (h->digits[n] < 9) { ++ h->digits[n]++; ++ h->num_digits = (uint32_t)(n + 1); ++ return; ++ } + } + +- size_t stride = pb->private_impl.planes[0].stride; +- uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)); ++ // The number is all 9s. Change to a single 1 and adjust the decimal point. ++ h->digits[0] = 1; ++ h->num_digits = 1; ++ h->decimal_point++; ++} + +- switch (pb->pixcfg.private_impl.pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- wuffs_base__poke_u32le__no_bounds_check(row + (4 * ((size_t)x)), color); +- break; ++static void // ++wuffs_private_impl__high_prec_dec__round_nearest( ++ wuffs_private_impl__high_prec_dec* h, ++ int32_t n) { ++ if ((n < 0) || (h->num_digits <= (uint32_t)n)) { ++ return; ++ } ++ bool up = h->digits[n] >= 5; ++ if ((h->digits[n] == 5) && ((n + 1) == ((int32_t)(h->num_digits)))) { ++ up = h->truncated || // ++ ((n > 0) && ((h->digits[n - 1] & 1) != 0)); ++ } + +- // Common formats above. Rarer formats below. +- +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- wuffs_base__poke_u8__no_bounds_check( +- row + ((size_t)x), +- wuffs_base__color_u32_argb_premul__as__color_u8_gray(color)); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: +- wuffs_base__poke_u16le__no_bounds_check( +- row + (2 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u16_gray(color)); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: +- wuffs_base__poke_u16be__no_bounds_check( +- row + (2 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u16_gray(color)); +- break; +- +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: +- wuffs_base__poke_u8__no_bounds_check( +- row + ((size_t)x), wuffs_base__pixel_palette__closest_element( +- wuffs_base__pixel_buffer__palette(pb), +- pb->pixcfg.private_impl.pixfmt, color)); +- break; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- wuffs_base__poke_u16le__no_bounds_check( +- row + (2 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color)); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- wuffs_base__poke_u24le__no_bounds_check(row + (3 * ((size_t)x)), color); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- wuffs_base__poke_u32le__no_bounds_check( +- row + (4 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- color)); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- wuffs_base__poke_u64le__no_bounds_check( +- row + (8 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul( +- color)); +- break; +- +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- wuffs_base__poke_u24le__no_bounds_check( +- row + (3 * ((size_t)x)), wuffs_base__swap_u32_argb_abgr(color)); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- wuffs_base__poke_u32le__no_bounds_check( +- row + (4 * ((size_t)x)), +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- wuffs_base__swap_u32_argb_abgr(color))); +- break; +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- wuffs_base__poke_u32le__no_bounds_check( +- row + (4 * ((size_t)x)), wuffs_base__swap_u32_argb_abgr(color)); +- break; +- +- default: +- // TODO: support more formats. +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ if (up) { ++ wuffs_private_impl__high_prec_dec__round_up(h, n); ++ } else { ++ wuffs_private_impl__high_prec_dec__round_down(h, n); + } +- +- return wuffs_base__make_status(NULL); + } + +-// -------- +- +-static inline void // +-wuffs_base__pixel_buffer__set_color_u32_fill_rect__xx( +- wuffs_base__pixel_buffer* pb, +- wuffs_base__rect_ie_u32 rect, +- uint16_t color) { +- size_t stride = pb->private_impl.planes[0].stride; +- uint32_t width = wuffs_base__rect_ie_u32__width(&rect); +- if ((stride == (2 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { +- uint8_t* ptr = +- pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); +- uint32_t height = wuffs_base__rect_ie_u32__height(&rect); +- size_t n; +- for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { +- wuffs_base__poke_u16le__no_bounds_check(ptr, color); +- ptr += 2; +- } ++static void // ++wuffs_private_impl__high_prec_dec__round_just_enough( ++ wuffs_private_impl__high_prec_dec* h, ++ int32_t exp2, ++ uint64_t mantissa) { ++ // The magic numbers 52 and 53 in this function are because IEEE 754 double ++ // precision has 52 mantissa bits. ++ // ++ // Let f be the floating point number represented by exp2 and mantissa (and ++ // also the number in h): the number (mantissa * (2 ** (exp2 - 52))). ++ // ++ // If f is zero or a small integer, we can return early. ++ if ((mantissa == 0) || ++ ((exp2 < 53) && (h->decimal_point >= ((int32_t)(h->num_digits))))) { + return; + } + +- uint32_t y; +- for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { +- uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + +- (2 * ((size_t)rect.min_incl_x)); +- uint32_t n; +- for (n = width; n > 0; n--) { +- wuffs_base__poke_u16le__no_bounds_check(ptr, color); +- ptr += 2; +- } +- } +-} ++ // The smallest normal f has an exp2 of -1022 and a mantissa of (1 << 52). ++ // Subnormal numbers have the same exp2 but a smaller mantissa. ++ static const int32_t min_incl_normal_exp2 = -1022; ++ static const uint64_t min_incl_normal_mantissa = 0x0010000000000000ul; + +-static inline void // +-wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxx( +- wuffs_base__pixel_buffer* pb, +- wuffs_base__rect_ie_u32 rect, +- uint32_t color) { +- size_t stride = pb->private_impl.planes[0].stride; +- uint32_t width = wuffs_base__rect_ie_u32__width(&rect); +- if ((stride == (3 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { +- uint8_t* ptr = +- pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); +- uint32_t height = wuffs_base__rect_ie_u32__height(&rect); +- size_t n; +- for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { +- wuffs_base__poke_u24le__no_bounds_check(ptr, color); +- ptr += 3; +- } +- return; ++ // Compute lower and upper bounds such that any number between them (possibly ++ // inclusive) will round to f. First, the lower bound. Our number f is: ++ // ((mantissa + 0) * (2 ** ( exp2 - 52))) ++ // ++ // The next lowest floating point number is: ++ // ((mantissa - 1) * (2 ** ( exp2 - 52))) ++ // unless (mantissa - 1) drops the (1 << 52) bit and exp2 is not the ++ // min_incl_normal_exp2. Either way, call it: ++ // ((l_mantissa) * (2 ** (l_exp2 - 52))) ++ // ++ // The lower bound is halfway between them (noting that 52 became 53): ++ // (((2 * l_mantissa) + 1) * (2 ** (l_exp2 - 53))) ++ int32_t l_exp2 = exp2; ++ uint64_t l_mantissa = mantissa - 1; ++ if ((exp2 > min_incl_normal_exp2) && (mantissa <= min_incl_normal_mantissa)) { ++ l_exp2 = exp2 - 1; ++ l_mantissa = (2 * mantissa) - 1; + } ++ wuffs_private_impl__high_prec_dec lower; ++ wuffs_private_impl__high_prec_dec__assign(&lower, (2 * l_mantissa) + 1, ++ false); ++ wuffs_private_impl__high_prec_dec__lshift(&lower, l_exp2 - 53); + +- uint32_t y; +- for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { +- uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + +- (3 * ((size_t)rect.min_incl_x)); +- uint32_t n; +- for (n = width; n > 0; n--) { +- wuffs_base__poke_u24le__no_bounds_check(ptr, color); +- ptr += 3; +- } +- } +-} ++ // Next, the upper bound. Our number f is: ++ // ((mantissa + 0) * (2 ** (exp2 - 52))) ++ // ++ // The next highest floating point number is: ++ // ((mantissa + 1) * (2 ** (exp2 - 52))) ++ // ++ // The upper bound is halfway between them (noting that 52 became 53): ++ // (((2 * mantissa) + 1) * (2 ** (exp2 - 53))) ++ wuffs_private_impl__high_prec_dec upper; ++ wuffs_private_impl__high_prec_dec__assign(&upper, (2 * mantissa) + 1, false); ++ wuffs_private_impl__high_prec_dec__lshift(&upper, exp2 - 53); + +-static inline void // +-wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx( +- wuffs_base__pixel_buffer* pb, +- wuffs_base__rect_ie_u32 rect, +- uint32_t color) { +- size_t stride = pb->private_impl.planes[0].stride; +- uint32_t width = wuffs_base__rect_ie_u32__width(&rect); +- if ((stride == (4 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { +- uint8_t* ptr = +- pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); +- uint32_t height = wuffs_base__rect_ie_u32__height(&rect); +- size_t n; +- for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { +- wuffs_base__poke_u32le__no_bounds_check(ptr, color); +- ptr += 4; +- } +- return; +- } ++ // The lower and upper bounds are possible outputs only if the original ++ // mantissa is even, so that IEEE round-to-even would round to the original ++ // mantissa and not its neighbors. ++ bool inclusive = (mantissa & 1) == 0; + +- uint32_t y; +- for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { +- uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + +- (4 * ((size_t)rect.min_incl_x)); +- uint32_t n; +- for (n = width; n > 0; n--) { +- wuffs_base__poke_u32le__no_bounds_check(ptr, color); +- ptr += 4; +- } +- } +-} ++ // As we walk the digits, we want to know whether rounding up would fall ++ // within the upper bound. This is tracked by upper_delta: ++ // - When -1, the digits of h and upper are the same so far. ++ // - When +0, we saw a difference of 1 between h and upper on a previous ++ // digit and subsequently only 9s for h and 0s for upper. Thus, rounding ++ // up may fall outside of the bound if !inclusive. ++ // - When +1, the difference is greater than 1 and we know that rounding up ++ // falls within the bound. ++ // ++ // This is a state machine with three states. The numerical value for each ++ // state (-1, +0 or +1) isn't important, other than their order. ++ int upper_delta = -1; + +-static inline void // +-wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx( +- wuffs_base__pixel_buffer* pb, +- wuffs_base__rect_ie_u32 rect, +- uint64_t color) { +- size_t stride = pb->private_impl.planes[0].stride; +- uint32_t width = wuffs_base__rect_ie_u32__width(&rect); +- if ((stride == (8 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { +- uint8_t* ptr = +- pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); +- uint32_t height = wuffs_base__rect_ie_u32__height(&rect); +- size_t n; +- for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { +- wuffs_base__poke_u64le__no_bounds_check(ptr, color); +- ptr += 8; ++ // We can now figure out the shortest number of digits required. Walk the ++ // digits until h has distinguished itself from lower or upper. ++ // ++ // The zi and zd variables are indexes and digits, for z in l (lower), h (the ++ // number) and u (upper). ++ // ++ // The lower, h and upper numbers may have their decimal points at different ++ // places. In this case, upper is the longest, so we iterate ui starting from ++ // 0 and iterate li and hi starting from either 0 or -1. ++ int32_t ui = 0; ++ for (;; ui++) { ++ // Calculate hd, the middle number's digit. ++ int32_t hi = ui - upper.decimal_point + h->decimal_point; ++ if (hi >= ((int32_t)(h->num_digits))) { ++ break; + } +- return; +- } ++ uint8_t hd = (((uint32_t)hi) < h->num_digits) ? h->digits[hi] : 0; + +- uint32_t y; +- for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { +- uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + +- (8 * ((size_t)rect.min_incl_x)); +- uint32_t n; +- for (n = width; n > 0; n--) { +- wuffs_base__poke_u64le__no_bounds_check(ptr, color); +- ptr += 8; ++ // Calculate ld, the lower bound's digit. ++ int32_t li = ui - upper.decimal_point + lower.decimal_point; ++ uint8_t ld = (((uint32_t)li) < lower.num_digits) ? lower.digits[li] : 0; ++ ++ // We can round down (truncate) if lower has a different digit than h or if ++ // lower is inclusive and is exactly the result of rounding down (i.e. we ++ // have reached the final digit of lower). ++ bool can_round_down = ++ (ld != hd) || // ++ (inclusive && ((li + 1) == ((int32_t)(lower.num_digits)))); ++ ++ // Calculate ud, the upper bound's digit, and update upper_delta. ++ uint8_t ud = (((uint32_t)ui) < upper.num_digits) ? upper.digits[ui] : 0; ++ if (upper_delta < 0) { ++ if ((hd + 1) < ud) { ++ // For example: ++ // h = 12345??? ++ // upper = 12347??? ++ upper_delta = +1; ++ } else if (hd != ud) { ++ // For example: ++ // h = 12345??? ++ // upper = 12346??? ++ upper_delta = +0; ++ } ++ } else if (upper_delta == 0) { ++ if ((hd != 9) || (ud != 0)) { ++ // For example: ++ // h = 1234598? ++ // upper = 1234600? ++ upper_delta = +1; ++ } + } +- } +-} + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +-wuffs_base__pixel_buffer__set_color_u32_fill_rect( +- wuffs_base__pixel_buffer* pb, +- wuffs_base__rect_ie_u32 rect, +- wuffs_base__color_u32_argb_premul color) { +- if (!pb) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } else if (wuffs_base__rect_ie_u32__is_empty(&rect)) { +- return wuffs_base__make_status(NULL); +- } +- wuffs_base__rect_ie_u32 bounds = +- wuffs_base__pixel_config__bounds(&pb->pixcfg); +- if (!wuffs_base__rect_ie_u32__contains_rect(&bounds, rect)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } ++ // We can round up if upper has a different digit than h and either upper ++ // is inclusive or upper is bigger than the result of rounding up. ++ bool can_round_up = ++ (upper_delta > 0) || // ++ ((upper_delta == 0) && // ++ (inclusive || ((ui + 1) < ((int32_t)(upper.num_digits))))); + +- if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { +- // TODO: support planar formats. +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ // If we can round either way, round to nearest. If we can round only one ++ // way, do it. If we can't round, continue the loop. ++ if (can_round_down) { ++ if (can_round_up) { ++ wuffs_private_impl__high_prec_dec__round_nearest(h, hi + 1); ++ return; ++ } else { ++ wuffs_private_impl__high_prec_dec__round_down(h, hi + 1); ++ return; ++ } ++ } else { ++ if (can_round_up) { ++ wuffs_private_impl__high_prec_dec__round_up(h, hi + 1); ++ return; ++ } ++ } + } ++} + +- switch (pb->pixcfg.private_impl.pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx(pb, rect, color); +- return wuffs_base__make_status(NULL); +- +- // Common formats above. Rarer formats below. ++// -------- + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xx( +- pb, rect, +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color)); +- return wuffs_base__make_status(NULL); ++// wuffs_private_impl__parse_number_f64_eisel_lemire produces the IEEE 754 ++// double-precision value for an exact mantissa and base-10 exponent. For ++// example: ++// - when parsing "12345.678e+02", man is 12345678 and exp10 is -1. ++// - when parsing "-12", man is 12 and exp10 is 0. Processing the leading ++// minus sign is the responsibility of the caller, not this function. ++// ++// On success, it returns a non-negative int64_t such that the low 63 bits hold ++// the 11-bit exponent and 52-bit mantissa. ++// ++// On failure, it returns a negative value. ++// ++// The algorithm is based on an original idea by Michael Eisel that was refined ++// by Daniel Lemire. See ++// https://lemire.me/blog/2020/03/10/fast-float-parsing-in-practice/ ++// and ++// https://nigeltao.github.io/blog/2020/eisel-lemire.html ++// ++// Preconditions: ++// - man is non-zero. ++// - exp10 is in the range [-307 ..= 288], the same range of the ++// wuffs_private_impl__powers_of_10 array. ++// ++// The exp10 range (and the fact that man is in the range [1 ..= UINT64_MAX], ++// approximately [1 ..= 1.85e+19]) means that (man * (10 ** exp10)) is in the ++// range [1e-307 ..= 1.85e+307]. This is entirely within the range of normal ++// (neither subnormal nor non-finite) f64 values: DBL_MIN and DBL_MAX are ++// approximately 2.23e–308 and 1.80e+308. ++static int64_t // ++wuffs_private_impl__parse_number_f64_eisel_lemire(uint64_t man, int32_t exp10) { ++ // Look up the (possibly truncated) base-2 representation of (10 ** exp10). ++ // The look-up table was constructed so that it is already normalized: the ++ // table entry's mantissa's MSB (most significant bit) is on. ++ const uint64_t* po10 = &wuffs_private_impl__powers_of_10[exp10 + 307][0]; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxx(pb, rect, color); +- return wuffs_base__make_status(NULL); ++ // Normalize the man argument. The (man != 0) precondition means that a ++ // non-zero bit exists. ++ uint32_t clz = wuffs_base__count_leading_zeroes_u64(man); ++ man <<= clz; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx( +- pb, rect, +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- color)); +- return wuffs_base__make_status(NULL); ++ // Calculate the return value's base-2 exponent. We might tweak it by ±1 ++ // later, but its initial value comes from a linear scaling of exp10, ++ // converting from power-of-10 to power-of-2, and adjusting by clz. ++ // ++ // The magic constants are: ++ // - 1087 = 1023 + 64. The 1023 is the f64 exponent bias. The 64 is because ++ // the look-up table uses 64-bit mantissas. ++ // - 217706 is such that the ratio 217706 / 65536 ≈ 3.321930 is close enough ++ // (over the practical range of exp10) to log(10) / log(2) ≈ 3.321928. ++ // - 65536 = 1<<16 is arbitrary but a power of 2, so division is a shift. ++ // ++ // Equality of the linearly-scaled value and the actual power-of-2, over the ++ // range of exp10 arguments that this function accepts, is confirmed by ++ // script/print-mpb-powers-of-10.go ++ uint64_t ret_exp2 = ++ ((uint64_t)(((217706 * exp10) >> 16) + 1087)) - ((uint64_t)clz); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx( +- pb, rect, +- wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul( +- color)); +- return wuffs_base__make_status(NULL); ++ // Multiply the two mantissas. Normalization means that both mantissas are at ++ // least (1<<63), so the 128-bit product must be at least (1<<126). The high ++ // 64 bits of the product, x_hi, must therefore be at least (1<<62). ++ // ++ // As a consequence, x_hi has either 0 or 1 leading zeroes. Shifting x_hi ++ // right by either 9 or 10 bits (depending on x_hi's MSB) will therefore ++ // leave the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. ++ wuffs_base__multiply_u64__output x = wuffs_base__multiply_u64(man, po10[1]); ++ uint64_t x_hi = x.hi; ++ uint64_t x_lo = x.lo; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx( +- pb, rect, +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- wuffs_base__swap_u32_argb_abgr(color))); +- return wuffs_base__make_status(NULL); ++ // Before we shift right by at least 9 bits, recall that the look-up table ++ // entry was possibly truncated. We have so far only calculated a lower bound ++ // for the product (man * e), where e is (10 ** exp10). The upper bound would ++ // add a further (man * 1) to the 128-bit product, which overflows the lower ++ // 64-bit limb if ((x_lo + man) < man). ++ // ++ // If overflow occurs, that adds 1 to x_hi. Since we're about to shift right ++ // by at least 9 bits, that carried 1 can be ignored unless the higher 64-bit ++ // limb's low 9 bits are all on. ++ // ++ // For example, parsing "9999999999999999999" will take the if-true branch ++ // here, since: ++ // - x_hi = 0x4563918244F3FFFF ++ // - x_lo = 0x8000000000000000 ++ // - man = 0x8AC7230489E7FFFF ++ if (((x_hi & 0x1FF) == 0x1FF) && ((x_lo + man) < man)) { ++ // Refine our calculation of (man * e). Before, our approximation of e used ++ // a "low resolution" 64-bit mantissa. Now use a "high resolution" 128-bit ++ // mantissa. We've already calculated x = (man * bits_0_to_63_incl_of_e). ++ // Now calculate y = (man * bits_64_to_127_incl_of_e). ++ wuffs_base__multiply_u64__output y = wuffs_base__multiply_u64(man, po10[0]); ++ uint64_t y_hi = y.hi; ++ uint64_t y_lo = y.lo; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- wuffs_base__pixel_buffer__set_color_u32_fill_rect__xxxx( +- pb, rect, wuffs_base__swap_u32_argb_abgr(color)); +- return wuffs_base__make_status(NULL); +- } ++ // Merge the 128-bit x and 128-bit y, which overlap by 64 bits, to ++ // calculate the 192-bit product of the 64-bit man by the 128-bit e. ++ // As we exit this if-block, we only care about the high 128 bits ++ // (merged_hi and merged_lo) of that 192-bit product. ++ // ++ // For example, parsing "1.234e-45" will take the if-true branch here, ++ // since: ++ // - x_hi = 0x70B7E3696DB29FFF ++ // - x_lo = 0xE040000000000000 ++ // - y_hi = 0x33718BBEAB0E0D7A ++ // - y_lo = 0xA880000000000000 ++ uint64_t merged_hi = x_hi; ++ uint64_t merged_lo = x_lo + y_hi; ++ if (merged_lo < x_lo) { ++ merged_hi++; // Carry the overflow bit. ++ } + +- uint32_t y; +- for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { +- uint32_t x; +- for (x = rect.min_incl_x; x < rect.max_excl_x; x++) { +- wuffs_base__pixel_buffer__set_color_u32_at(pb, x, y, color); ++ // The "high resolution" approximation of e is still a lower bound. Once ++ // again, see if the upper bound is large enough to produce a different ++ // result. This time, if it does, give up instead of reaching for an even ++ // more precise approximation to e. ++ // ++ // This three-part check is similar to the two-part check that guarded the ++ // if block that we're now in, but it has an extra term for the middle 64 ++ // bits (checking that adding 1 to merged_lo would overflow). ++ // ++ // For example, parsing "5.9604644775390625e-8" will take the if-true ++ // branch here, since: ++ // - merged_hi = 0x7FFFFFFFFFFFFFFF ++ // - merged_lo = 0xFFFFFFFFFFFFFFFF ++ // - y_lo = 0x4DB3FFC120988200 ++ // - man = 0xD3C21BCECCEDA100 ++ if (((merged_hi & 0x1FF) == 0x1FF) && ((merged_lo + 1) == 0) && ++ (y_lo + man < man)) { ++ return -1; + } ++ ++ // Replace the 128-bit x with merged. ++ x_hi = merged_hi; ++ x_lo = merged_lo; + } +- return wuffs_base__make_status(NULL); +-} + +-// -------- ++ // As mentioned above, shifting x_hi right by either 9 or 10 bits will leave ++ // the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. If the ++ // MSB (before shifting) was on, adjust ret_exp2 for the larger shift. ++ // ++ // Having bit 53 on (and higher bits off) means that ret_mantissa is a 54-bit ++ // number. ++ uint64_t msb = x_hi >> 63; ++ uint64_t ret_mantissa = x_hi >> (msb + 9); ++ ret_exp2 -= 1 ^ msb; + +-WUFFS_BASE__MAYBE_STATIC uint8_t // +-wuffs_base__pixel_palette__closest_element( +- wuffs_base__slice_u8 palette_slice, +- wuffs_base__pixel_format palette_format, +- wuffs_base__color_u32_argb_premul c) { +- size_t n = palette_slice.len / 4; +- if (n > (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- n = (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4); ++ // IEEE 754 rounds to-nearest with ties rounded to-even. Rounding to-even can ++ // be tricky. If we're half-way between two exactly representable numbers ++ // (x's low 73 bits are zero and the next 2 bits that matter are "01"), give ++ // up instead of trying to pick the winner. ++ // ++ // Technically, we could tighten the condition by changing "73" to "73 or 74, ++ // depending on msb", but a flat "73" is simpler. ++ // ++ // For example, parsing "1e+23" will take the if-true branch here, since: ++ // - x_hi = 0x54B40B1F852BDA00 ++ // - ret_mantissa = 0x002A5A058FC295ED ++ if ((x_lo == 0) && ((x_hi & 0x1FF) == 0) && ((ret_mantissa & 3) == 1)) { ++ return -1; + } +- size_t best_index = 0; +- uint64_t best_score = 0xFFFFFFFFFFFFFFFF; + +- // Work in 16-bit color. +- uint32_t ca = 0x101 * (0xFF & (c >> 24)); +- uint32_t cr = 0x101 * (0xFF & (c >> 16)); +- uint32_t cg = 0x101 * (0xFF & (c >> 8)); +- uint32_t cb = 0x101 * (0xFF & (c >> 0)); +- +- switch (palette_format.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: { +- bool nonpremul = palette_format.repr == +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL; +- +- size_t i; +- for (i = 0; i < n; i++) { +- // Work in 16-bit color. +- uint32_t pb = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 0])); +- uint32_t pg = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 1])); +- uint32_t pr = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 2])); +- uint32_t pa = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 3])); +- +- // Convert to premultiplied alpha. +- if (nonpremul && (pa != 0xFFFF)) { +- pb = (pb * pa) / 0xFFFF; +- pg = (pg * pa) / 0xFFFF; +- pr = (pr * pa) / 0xFFFF; +- } +- +- // These deltas are conceptually int32_t (signed) but after squaring, +- // it's equivalent to work in uint32_t (unsigned). +- pb -= cb; +- pg -= cg; +- pr -= cr; +- pa -= ca; +- uint64_t score = ((uint64_t)(pb * pb)) + ((uint64_t)(pg * pg)) + +- ((uint64_t)(pr * pr)) + ((uint64_t)(pa * pa)); +- if (best_score > score) { +- best_score = score; +- best_index = i; +- } +- } +- break; +- } ++ // If we're not halfway then it's rounding to-nearest. Starting with a 54-bit ++ // number, carry the lowest bit (bit 0) up if it's on. Regardless of whether ++ // it was on or off, shifting right by one then produces a 53-bit number. If ++ // carrying up overflowed, shift again. ++ ret_mantissa += ret_mantissa & 1; ++ ret_mantissa >>= 1; ++ // This if block is equivalent to (but benchmarks slightly faster than) the ++ // following branchless form: ++ // uint64_t overflow_adjustment = ret_mantissa >> 53; ++ // ret_mantissa >>= overflow_adjustment; ++ // ret_exp2 += overflow_adjustment; ++ // ++ // For example, parsing "7.2057594037927933e+16" will take the if-true ++ // branch here, since: ++ // - x_hi = 0x7FFFFFFFFFFFFE80 ++ // - ret_mantissa = 0x0020000000000000 ++ if ((ret_mantissa >> 53) > 0) { ++ ret_mantissa >>= 1; ++ ret_exp2++; + } + +- return (uint8_t)best_index; ++ // Starting with a 53-bit number, IEEE 754 double-precision normal numbers ++ // have an implicit mantissa bit. Mask that away and keep the low 52 bits. ++ ret_mantissa &= 0x000FFFFFFFFFFFFF; ++ ++ // Pack the bits and return. ++ return ((int64_t)(ret_mantissa | (ret_exp2 << 52))); + } + + // -------- + +-static inline uint32_t // +-wuffs_base__composite_nonpremul_nonpremul_u32_axxx(uint32_t dst_nonpremul, +- uint32_t src_nonpremul) { +- // Extract 16-bit color components. +- // +- // If the destination is transparent then SRC_OVER is equivalent to SRC: just +- // return src_nonpremul. This isn't just an optimization (skipping the rest +- // of the function's computation). It also preserves the nonpremul +- // distinction between e.g. transparent red and transparent blue that would +- // otherwise be lost by converting from nonpremul to premul and back. +- uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24)); +- if (da == 0) { +- return src_nonpremul; +- } +- uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16)); +- uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8)); +- uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0)); +- uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24)); +- uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16)); +- uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8)); +- uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0)); +- +- // Convert dst from nonpremul to premul. +- dr = (dr * da) / 0xFFFF; +- dg = (dg * da) / 0xFFFF; +- db = (db * da) / 0xFFFF; ++static wuffs_base__result_f64 // ++wuffs_private_impl__parse_number_f64_special(wuffs_base__slice_u8 s, ++ uint32_t options) { ++ do { ++ if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) { ++ goto fail; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ uint8_t* p = s.ptr; ++ uint8_t* q = s.ptr + s.len; + +- // Composite src (nonpremul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ if (p >= q) { ++ goto fail; ++ } + +- // Convert dst from premul to nonpremul. +- if (da != 0) { +- dr = (dr * 0xFFFF) / da; +- dg = (dg * 0xFFFF) / da; +- db = (db * 0xFFFF) / da; +- } ++ // Parse sign. ++ bool negative = false; ++ do { ++ if (*p == '+') { ++ p++; ++ } else if (*p == '-') { ++ negative = true; ++ p++; ++ } else { ++ break; ++ } ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ } while (0); ++ if (p >= q) { ++ goto fail; ++ } + +- // Convert from 16-bit color to 8-bit color. +- da >>= 8; +- dr >>= 8; +- dg >>= 8; +- db >>= 8; ++ bool nan = false; ++ switch (p[0]) { ++ case 'I': ++ case 'i': ++ if (((q - p) < 3) || // ++ ((p[1] != 'N') && (p[1] != 'n')) || // ++ ((p[2] != 'F') && (p[2] != 'f'))) { ++ goto fail; ++ } ++ p += 3; + +- // Combine components. +- return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); +-} ++ if ((p >= q) || (*p == '_')) { ++ break; ++ } else if (((q - p) < 5) || // ++ ((p[0] != 'I') && (p[0] != 'i')) || // ++ ((p[1] != 'N') && (p[1] != 'n')) || // ++ ((p[2] != 'I') && (p[2] != 'i')) || // ++ ((p[3] != 'T') && (p[3] != 't')) || // ++ ((p[4] != 'Y') && (p[4] != 'y'))) { ++ goto fail; ++ } ++ p += 5; + +-static inline uint64_t // +-wuffs_base__composite_nonpremul_nonpremul_u64_axxx(uint64_t dst_nonpremul, +- uint64_t src_nonpremul) { +- // Extract components. +- // +- // If the destination is transparent then SRC_OVER is equivalent to SRC: just +- // return src_nonpremul. This isn't just an optimization (skipping the rest +- // of the function's computation). It also preserves the nonpremul +- // distinction between e.g. transparent red and transparent blue that would +- // otherwise be lost by converting from nonpremul to premul and back. +- uint64_t da = 0xFFFF & (dst_nonpremul >> 48); +- if (da == 0) { +- return src_nonpremul; +- } +- uint64_t dr = 0xFFFF & (dst_nonpremul >> 32); +- uint64_t dg = 0xFFFF & (dst_nonpremul >> 16); +- uint64_t db = 0xFFFF & (dst_nonpremul >> 0); +- uint64_t sa = 0xFFFF & (src_nonpremul >> 48); +- uint64_t sr = 0xFFFF & (src_nonpremul >> 32); +- uint64_t sg = 0xFFFF & (src_nonpremul >> 16); +- uint64_t sb = 0xFFFF & (src_nonpremul >> 0); ++ if ((p >= q) || (*p == '_')) { ++ break; ++ } ++ goto fail; + +- // Convert dst from nonpremul to premul. +- dr = (dr * da) / 0xFFFF; +- dg = (dg * da) / 0xFFFF; +- db = (db * da) / 0xFFFF; ++ case 'N': ++ case 'n': ++ if (((q - p) < 3) || // ++ ((p[1] != 'A') && (p[1] != 'a')) || // ++ ((p[2] != 'N') && (p[2] != 'n'))) { ++ goto fail; ++ } ++ p += 3; + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint64_t ia = 0xFFFF - sa; ++ if ((p >= q) || (*p == '_')) { ++ nan = true; ++ break; ++ } ++ goto fail; + +- // Composite src (nonpremul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ default: ++ goto fail; ++ } + +- // Convert dst from premul to nonpremul. +- if (da != 0) { +- dr = (dr * 0xFFFF) / da; +- dg = (dg * 0xFFFF) / da; +- db = (db * 0xFFFF) / da; +- } ++ // Finish. ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ if (p != q) { ++ goto fail; ++ } ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( ++ (nan ? 0x7FFFFFFFFFFFFFFF : 0x7FF0000000000000) | ++ (negative ? 0x8000000000000000 : 0)); ++ return ret; ++ } while (0); + +- // Combine components. +- return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); ++fail: ++ do { ++ wuffs_base__result_f64 ret; ++ ret.status.repr = wuffs_base__error__bad_argument; ++ ret.value = 0; ++ return ret; ++ } while (0); + } + +-static inline uint32_t // +-wuffs_base__composite_nonpremul_premul_u32_axxx(uint32_t dst_nonpremul, +- uint32_t src_premul) { +- // Extract 16-bit color components. +- uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24)); +- uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16)); +- uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8)); +- uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0)); +- uint32_t sa = 0x101 * (0xFF & (src_premul >> 24)); +- uint32_t sr = 0x101 * (0xFF & (src_premul >> 16)); +- uint32_t sg = 0x101 * (0xFF & (src_premul >> 8)); +- uint32_t sb = 0x101 * (0xFF & (src_premul >> 0)); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 // ++wuffs_private_impl__high_prec_dec__to_f64(wuffs_private_impl__high_prec_dec* h, ++ uint32_t options) { ++ do { ++ // powers converts decimal powers of 10 to binary powers of 2. For example, ++ // (10000 >> 13) is 1. It stops before the elements exceed 60, also known ++ // as WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL. ++ // ++ // This rounds down (1<<13 is a lower bound for 1e4). Adding 1 to the array ++ // element value rounds up (1<<14 is an upper bound for 1e4) while staying ++ // at or below WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL. ++ // ++ // When starting in the range [1e+1 .. 1e+2] (i.e. h->decimal_point == +2), ++ // powers[2] == 6 and so: ++ // - Right shifting by 6+0 produces the range [10/64 .. 100/64] = ++ // [0.156250 .. 1.56250]. The resultant h->decimal_point is +0 or +1. ++ // - Right shifting by 6+1 produces the range [10/128 .. 100/128] = ++ // [0.078125 .. 0.78125]. The resultant h->decimal_point is -1 or -0. ++ // ++ // When starting in the range [1e-3 .. 1e-2] (i.e. h->decimal_point == -2), ++ // powers[2] == 6 and so: ++ // - Left shifting by 6+0 produces the range [0.001*64 .. 0.01*64] = ++ // [0.064 .. 0.64]. The resultant h->decimal_point is -1 or -0. ++ // - Left shifting by 6+1 produces the range [0.001*128 .. 0.01*128] = ++ // [0.128 .. 1.28]. The resultant h->decimal_point is +0 or +1. ++ // ++ // Thus, when targeting h->decimal_point being +0 or +1, use (powers[n]+0) ++ // when right shifting but (powers[n]+1) when left shifting. ++ static const uint32_t num_powers = 19; ++ static const uint8_t powers[19] = { ++ 0, 3, 6, 9, 13, 16, 19, 23, 26, 29, // ++ 33, 36, 39, 43, 46, 49, 53, 56, 59, // ++ }; + +- // Convert dst from nonpremul to premul. +- dr = (dr * da) / 0xFFFF; +- dg = (dg * da) / 0xFFFF; +- db = (db * da) / 0xFFFF; ++ // Handle zero and obvious extremes. The largest and smallest positive ++ // finite f64 values are approximately 1.8e+308 and 4.9e-324. ++ if ((h->num_digits == 0) || (h->decimal_point < -326)) { ++ goto zero; ++ } else if (h->decimal_point > 310) { ++ goto infinity; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ // Try the fast Eisel-Lemire algorithm again. Calculating the (man, exp10) ++ // pair from the high_prec_dec h is more correct but slower than the ++ // approach taken in wuffs_base__parse_number_f64. The latter is optimized ++ // for the common cases (e.g. assuming no underscores or a leading '+' ++ // sign) rather than the full set of cases allowed by the Wuffs API. ++ // ++ // When we have 19 or fewer mantissa digits, run Eisel-Lemire once (trying ++ // for an exact result). When we have more than 19 mantissa digits, run it ++ // twice to get a lower and upper bound. We still have an exact result ++ // (within f64's rounding margin) if both bounds are equal (and valid). ++ uint32_t i_max = h->num_digits; ++ if (i_max > 19) { ++ i_max = 19; ++ } ++ int32_t exp10 = h->decimal_point - ((int32_t)i_max); ++ if ((-307 <= exp10) && (exp10 <= 288)) { ++ uint64_t man = 0; ++ uint32_t i; ++ for (i = 0; i < i_max; i++) { ++ man = (10 * man) + h->digits[i]; ++ } ++ while (man != 0) { // The 'while' is just an 'if' that we can 'break'. ++ int64_t r0 = ++ wuffs_private_impl__parse_number_f64_eisel_lemire(man + 0, exp10); ++ if (r0 < 0) { ++ break; ++ } else if (h->num_digits > 19) { ++ int64_t r1 = ++ wuffs_private_impl__parse_number_f64_eisel_lemire(man + 1, exp10); ++ if (r1 != r0) { ++ break; ++ } ++ } ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( ++ ((uint64_t)r0) | (((uint64_t)(h->negative)) << 63)); ++ return ret; ++ } ++ } + +- // Composite src (premul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); ++ // When Eisel-Lemire fails, fall back to Simple Decimal Conversion. See ++ // https://nigeltao.github.io/blog/2020/parse-number-f64-simple.html ++ // ++ // Scale by powers of 2 until we're in the range [0.1 .. 10]. Equivalently, ++ // that h->decimal_point is +0 or +1. ++ // ++ // First we shift right while at or above 10... ++ const int32_t f64_bias = -1023; ++ int32_t exp2 = 0; ++ while (h->decimal_point > 1) { ++ uint32_t n = (uint32_t)(+h->decimal_point); ++ uint32_t shift = (n < num_powers) ++ ? powers[n] ++ : WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL; + +- // Convert dst from premul to nonpremul. +- if (da != 0) { +- dr = (dr * 0xFFFF) / da; +- dg = (dg * 0xFFFF) / da; +- db = (db * 0xFFFF) / da; +- } ++ wuffs_private_impl__high_prec_dec__small_rshift(h, shift); ++ if (h->decimal_point < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) { ++ goto zero; ++ } ++ exp2 += (int32_t)shift; ++ } ++ // ...then we shift left while below 0.1. ++ while (h->decimal_point < 0) { ++ uint32_t shift; ++ uint32_t n = (uint32_t)(-h->decimal_point); ++ shift = (n < num_powers) ++ // The +1 is per "when targeting h->decimal_point being +0 or ++ // +1... when left shifting" in the powers comment above. ++ ? (powers[n] + 1u) ++ : WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL; + +- // Convert from 16-bit color to 8-bit color. +- da >>= 8; +- dr >>= 8; +- dg >>= 8; +- db >>= 8; ++ wuffs_private_impl__high_prec_dec__small_lshift(h, shift); ++ if (h->decimal_point > +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) { ++ goto infinity; ++ } ++ exp2 -= (int32_t)shift; ++ } + +- // Combine components. +- return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); +-} ++ // To get from "in the range [0.1 .. 10]" to "in the range [1 .. 2]" (which ++ // will give us our exponent in base-2), the mantissa's first 3 digits will ++ // determine the final left shift, equal to 52 (the number of explicit f64 ++ // bits) plus an additional adjustment. ++ int man3 = (100 * h->digits[0]) + ++ ((h->num_digits > 1) ? (10 * h->digits[1]) : 0) + ++ ((h->num_digits > 2) ? h->digits[2] : 0); ++ int32_t additional_lshift = 0; ++ if (h->decimal_point == 0) { // The value is in [0.1 .. 1]. ++ if (man3 < 125) { ++ additional_lshift = +4; ++ } else if (man3 < 250) { ++ additional_lshift = +3; ++ } else if (man3 < 500) { ++ additional_lshift = +2; ++ } else { ++ additional_lshift = +1; ++ } ++ } else { // The value is in [1 .. 10]. ++ if (man3 < 200) { ++ additional_lshift = -0; ++ } else if (man3 < 400) { ++ additional_lshift = -1; ++ } else if (man3 < 800) { ++ additional_lshift = -2; ++ } else { ++ additional_lshift = -3; ++ } ++ } ++ exp2 -= additional_lshift; ++ uint32_t final_lshift = (uint32_t)(52 + additional_lshift); + +-static inline uint64_t // +-wuffs_base__composite_nonpremul_premul_u64_axxx(uint64_t dst_nonpremul, +- uint64_t src_premul) { +- // Extract components. +- uint64_t da = 0xFFFF & (dst_nonpremul >> 48); +- uint64_t dr = 0xFFFF & (dst_nonpremul >> 32); +- uint64_t dg = 0xFFFF & (dst_nonpremul >> 16); +- uint64_t db = 0xFFFF & (dst_nonpremul >> 0); +- uint64_t sa = 0xFFFF & (src_premul >> 48); +- uint64_t sr = 0xFFFF & (src_premul >> 32); +- uint64_t sg = 0xFFFF & (src_premul >> 16); +- uint64_t sb = 0xFFFF & (src_premul >> 0); ++ // The minimum normal exponent is (f64_bias + 1). ++ while ((f64_bias + 1) > exp2) { ++ uint32_t n = (uint32_t)((f64_bias + 1) - exp2); ++ if (n > WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) { ++ n = WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL; ++ } ++ wuffs_private_impl__high_prec_dec__small_rshift(h, n); ++ exp2 += (int32_t)n; ++ } + +- // Convert dst from nonpremul to premul. +- dr = (dr * da) / 0xFFFF; +- dg = (dg * da) / 0xFFFF; +- db = (db * da) / 0xFFFF; ++ // Check for overflow. ++ if ((exp2 - f64_bias) >= 0x07FF) { // (1 << 11) - 1. ++ goto infinity; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint64_t ia = 0xFFFF - sa; ++ // Extract 53 bits for the mantissa (in base-2). ++ wuffs_private_impl__high_prec_dec__small_lshift(h, final_lshift); ++ uint64_t man2 = wuffs_private_impl__high_prec_dec__rounded_integer(h); + +- // Composite src (premul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); ++ // Rounding might have added one bit. If so, shift and re-check overflow. ++ if ((man2 >> 53) != 0) { ++ man2 >>= 1; ++ exp2++; ++ if ((exp2 - f64_bias) >= 0x07FF) { // (1 << 11) - 1. ++ goto infinity; ++ } ++ } + +- // Convert dst from premul to nonpremul. +- if (da != 0) { +- dr = (dr * 0xFFFF) / da; +- dg = (dg * 0xFFFF) / da; +- db = (db * 0xFFFF) / da; +- } ++ // Handle subnormal numbers. ++ if ((man2 >> 52) == 0) { ++ exp2 = f64_bias; ++ } + +- // Combine components. +- return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); +-} ++ // Pack the bits and return. ++ uint64_t exp2_bits = ++ (uint64_t)((exp2 - f64_bias) & 0x07FF); // (1 << 11) - 1. ++ uint64_t bits = (man2 & 0x000FFFFFFFFFFFFF) | // (1 << 52) - 1. ++ (exp2_bits << 52) | // ++ (h->negative ? 0x8000000000000000 : 0); // (1 << 63). + +-static inline uint32_t // +-wuffs_base__composite_premul_nonpremul_u32_axxx(uint32_t dst_premul, +- uint32_t src_nonpremul) { +- // Extract 16-bit color components. +- uint32_t da = 0x101 * (0xFF & (dst_premul >> 24)); +- uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16)); +- uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8)); +- uint32_t db = 0x101 * (0xFF & (dst_premul >> 0)); +- uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24)); +- uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16)); +- uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8)); +- uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0)); ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); ++ return ret; ++ } while (0); + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++zero: ++ do { ++ uint64_t bits = h->negative ? 0x8000000000000000 : 0; + +- // Composite src (nonpremul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); ++ return ret; ++ } while (0); + +- // Convert from 16-bit color to 8-bit color. +- da >>= 8; +- dr >>= 8; +- dg >>= 8; +- db >>= 8; ++infinity: ++ do { ++ if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) { ++ wuffs_base__result_f64 ret; ++ ret.status.repr = wuffs_base__error__bad_argument; ++ ret.value = 0; ++ return ret; ++ } + +- // Combine components. +- return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); +-} ++ uint64_t bits = h->negative ? 0xFFF0000000000000 : 0x7FF0000000000000; + +-static inline uint64_t // +-wuffs_base__composite_premul_nonpremul_u64_axxx(uint64_t dst_premul, +- uint64_t src_nonpremul) { +- // Extract components. +- uint64_t da = 0xFFFF & (dst_premul >> 48); +- uint64_t dr = 0xFFFF & (dst_premul >> 32); +- uint64_t dg = 0xFFFF & (dst_premul >> 16); +- uint64_t db = 0xFFFF & (dst_premul >> 0); +- uint64_t sa = 0xFFFF & (src_nonpremul >> 48); +- uint64_t sr = 0xFFFF & (src_nonpremul >> 32); +- uint64_t sg = 0xFFFF & (src_nonpremul >> 16); +- uint64_t sb = 0xFFFF & (src_nonpremul >> 0); +- +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint64_t ia = 0xFFFF - sa; +- +- // Composite src (nonpremul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; +- +- // Combine components. +- return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits); ++ return ret; ++ } while (0); + } + +-static inline uint32_t // +-wuffs_base__composite_premul_premul_u32_axxx(uint32_t dst_premul, +- uint32_t src_premul) { +- // Extract 16-bit color components. +- uint32_t da = 0x101 * (0xFF & (dst_premul >> 24)); +- uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16)); +- uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8)); +- uint32_t db = 0x101 * (0xFF & (dst_premul >> 0)); +- uint32_t sa = 0x101 * (0xFF & (src_premul >> 24)); +- uint32_t sr = 0x101 * (0xFF & (src_premul >> 16)); +- uint32_t sg = 0x101 * (0xFF & (src_premul >> 8)); +- uint32_t sb = 0x101 * (0xFF & (src_premul >> 0)); +- +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; +- +- // Composite src (premul) over dst (premul). +- da = sa + ((da * ia) / 0xFFFF); +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); +- +- // Convert from 16-bit color to 8-bit color. +- da >>= 8; +- dr >>= 8; +- dg >>= 8; +- db >>= 8; +- +- // Combine components. +- return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); ++static inline bool // ++wuffs_private_impl__is_decimal_digit(uint8_t c) { ++ return ('0' <= c) && (c <= '9'); + } + +-// -------- ++WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64 // ++wuffs_base__parse_number_f64(wuffs_base__slice_u8 s, uint32_t options) { ++ // In practice, almost all "dd.ddddE±xxx" numbers can be represented ++ // losslessly by a uint64_t mantissa "dddddd" and an int32_t base-10 ++ // exponent, adjusting "xxx" for the position (if present) of the decimal ++ // separator '.' or ','. ++ // ++ // This (u64 man, i32 exp10) data structure is superficially similar to the ++ // "Do It Yourself Floating Point" type from Loitsch (†), but the exponent ++ // here is base-10, not base-2. ++ // ++ // If s's number fits in a (man, exp10), parse that pair with the ++ // Eisel-Lemire algorithm. If not, or if Eisel-Lemire fails, parsing s with ++ // the fallback algorithm is slower but comprehensive. ++ // ++ // † "Printing Floating-Point Numbers Quickly and Accurately with Integers" ++ // (https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf). ++ // Florian Loitsch is also the primary contributor to ++ // https://github.com/google/double-conversion ++ do { ++ // Calculating that (man, exp10) pair needs to stay within s's bounds. ++ // Provided that s isn't extremely long, work on a NUL-terminated copy of ++ // s's contents. The NUL byte isn't a valid part of "±dd.ddddE±xxx". ++ // ++ // As the pointer p walks the contents, it's faster to repeatedly check "is ++ // *p a valid digit" than "is p within bounds and *p a valid digit". ++ if (s.len >= 256) { ++ goto fallback; ++ } ++ uint8_t z[256]; ++ memcpy(&z[0], s.ptr, s.len); ++ z[s.len] = 0; ++ const uint8_t* p = &z[0]; + +-static uint64_t // +-wuffs_base__pixel_swizzler__squash_align4_bgr_565_8888(uint8_t* dst_ptr, +- size_t dst_len, +- const uint8_t* src_ptr, +- size_t src_len, +- bool nonpremul) { +- size_t len = (dst_len < src_len ? dst_len : src_len) / 4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; ++ // Look for a leading minus sign. Technically, we could also look for an ++ // optional plus sign, but the "script/process-json-numbers.c with -p" ++ // benchmark is noticably slower if we do. It's optional and, in practice, ++ // usually absent. Let the fallback catch it. ++ bool negative = (*p == '-'); ++ if (negative) { ++ p++; ++ } + +- size_t n = len; +- while (n--) { +- uint32_t argb = wuffs_base__peek_u32le__no_bounds_check(s); +- if (nonpremul) { +- argb = +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(argb); ++ // After walking "dd.dddd", comparing p later with p now will produce the ++ // number of "d"s and "."s. ++ const uint8_t* const start_of_digits_ptr = p; ++ ++ // Walk the "d"s before a '.', 'E', NUL byte, etc. If it starts with '0', ++ // it must be a single '0'. If it starts with a non-zero decimal digit, it ++ // can be a sequence of decimal digits. ++ // ++ // Update the man variable during the walk. It's OK if man overflows now. ++ // We'll detect that later. ++ uint64_t man; ++ if (*p == '0') { ++ man = 0; ++ p++; ++ if (wuffs_private_impl__is_decimal_digit(*p)) { ++ goto fallback; ++ } ++ } else if (wuffs_private_impl__is_decimal_digit(*p)) { ++ man = ((uint8_t)(*p - '0')); ++ p++; ++ for (; wuffs_private_impl__is_decimal_digit(*p); p++) { ++ man = (10 * man) + ((uint8_t)(*p - '0')); ++ } ++ } else { ++ goto fallback; + } +- uint32_t b5 = 0x1F & (argb >> (8 - 5)); +- uint32_t g6 = 0x3F & (argb >> (16 - 6)); +- uint32_t r5 = 0x1F & (argb >> (24 - 5)); +- uint32_t alpha = argb & 0xFF000000; +- wuffs_base__poke_u32le__no_bounds_check( +- d, alpha | (r5 << 11) | (g6 << 5) | (b5 << 0)); +- s += 4; +- d += 4; +- } +- return len; +-} + +-// -------- ++ // Walk the "d"s after the optional decimal separator ('.' or ','), ++ // updating the man and exp10 variables. ++ int32_t exp10 = 0; ++ if (*p == ++ ((options & WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.')) { ++ p++; ++ const uint8_t* first_after_separator_ptr = p; ++ if (!wuffs_private_impl__is_decimal_digit(*p)) { ++ goto fallback; ++ } ++ man = (10 * man) + ((uint8_t)(*p - '0')); ++ p++; ++ for (; wuffs_private_impl__is_decimal_digit(*p); p++) { ++ man = (10 * man) + ((uint8_t)(*p - '0')); ++ } ++ exp10 = ((int32_t)(first_after_separator_ptr - p)); ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__swap_rgb_bgr(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t len = (dst_len < src_len ? dst_len : src_len) / 3; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; ++ // Count the number of digits: ++ // - for an input of "314159", digit_count is 6. ++ // - for an input of "3.14159", digit_count is 7. ++ // ++ // This is off-by-one if there is a decimal separator. That's OK for now. ++ // We'll correct for that later. The "script/process-json-numbers.c with ++ // -p" benchmark is noticably slower if we try to correct for that now. ++ uint32_t digit_count = (uint32_t)(p - start_of_digits_ptr); + +- size_t n = len; +- while (n--) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s2; +- d[1] = s1; +- d[2] = s0; +- s += 3; +- d += 3; +- } +- return len; +-} ++ // Update exp10 for the optional exponent, starting with 'E' or 'e'. ++ if ((*p | 0x20) == 'e') { ++ p++; ++ int32_t exp_sign = +1; ++ if (*p == '-') { ++ p++; ++ exp_sign = -1; ++ } else if (*p == '+') { ++ p++; ++ } ++ if (!wuffs_private_impl__is_decimal_digit(*p)) { ++ goto fallback; ++ } ++ int32_t exp_num = ((uint8_t)(*p - '0')); ++ p++; ++ // The rest of the exp_num walking has a peculiar control flow but, once ++ // again, the "script/process-json-numbers.c with -p" benchmark is ++ // sensitive to alternative formulations. ++ if (wuffs_private_impl__is_decimal_digit(*p)) { ++ exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); ++ p++; ++ } ++ if (wuffs_private_impl__is_decimal_digit(*p)) { ++ exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); ++ p++; ++ } ++ while (wuffs_private_impl__is_decimal_digit(*p)) { ++ if (exp_num > 0x1000000) { ++ goto fallback; ++ } ++ exp_num = (10 * exp_num) + ((uint8_t)(*p - '0')); ++ p++; ++ } ++ exp10 += exp_sign * exp_num; ++ } + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-static uint64_t // +-wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t len = (dst_len < src_len ? dst_len : src_len) / 4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // The Wuffs API is that the original slice has no trailing data. It also ++ // allows underscores, which we don't catch here but the fallback should. ++ if (p != &z[s.len]) { ++ goto fallback; ++ } + +- __m128i shuffle = _mm_set_epi8(+0x0F, +0x0C, +0x0D, +0x0E, // +- +0x0B, +0x08, +0x09, +0x0A, // +- +0x07, +0x04, +0x05, +0x06, // +- +0x03, +0x00, +0x01, +0x02); ++ // Check that the uint64_t typed man variable has not overflowed, based on ++ // digit_count. ++ // ++ // For reference: ++ // - (1 << 63) is 9223372036854775808, which has 19 decimal digits. ++ // - (1 << 64) is 18446744073709551616, which has 20 decimal digits. ++ // - 19 nines, 9999999999999999999, is 0x8AC7230489E7FFFF, which has 64 ++ // bits and 16 hexadecimal digits. ++ // - 20 nines, 99999999999999999999, is 0x56BC75E2D630FFFFF, which has 67 ++ // bits and 17 hexadecimal digits. ++ if (digit_count > 19) { ++ // Even if we have more than 19 pseudo-digits, it's not yet definitely an ++ // overflow. Recall that digit_count might be off-by-one (too large) if ++ // there's a decimal separator. It will also over-report the number of ++ // meaningful digits if the input looks something like "0.000dddExxx". ++ // ++ // We adjust by the number of leading '0's and '.'s and re-compare to 19. ++ // Once again, technically, we could skip ','s too, but that perturbs the ++ // "script/process-json-numbers.c with -p" benchmark. ++ const uint8_t* q = start_of_digits_ptr; ++ for (; (*q == '0') || (*q == '.'); q++) { ++ } ++ digit_count -= (uint32_t)(q - start_of_digits_ptr); ++ if (digit_count > 19) { ++ goto fallback; ++ } ++ } + +- while (n >= 4) { +- __m128i x; +- x = _mm_lddqu_si128((const __m128i*)(const void*)s); +- x = _mm_shuffle_epi8(x, shuffle); +- _mm_storeu_si128((__m128i*)(void*)d, x); ++ // The wuffs_private_impl__parse_number_f64_eisel_lemire preconditions ++ // include that exp10 is in the range [-307 ..= 288]. ++ if ((exp10 < -307) || (288 < exp10)) { ++ goto fallback; ++ } + +- s += 4 * 4; +- d += 4 * 4; +- n -= 4; +- } ++ // If both man and (10 ** exp10) are exactly representable by a double, we ++ // don't need to run the Eisel-Lemire algorithm. ++ if ((-22 <= exp10) && (exp10 <= 22) && ((man >> 53) == 0)) { ++ double d = (double)man; ++ if (exp10 >= 0) { ++ d *= wuffs_private_impl__f64_powers_of_10[+exp10]; ++ } else { ++ d /= wuffs_private_impl__f64_powers_of_10[-exp10]; ++ } ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = negative ? -d : +d; ++ return ret; ++ } + +- while (n--) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- uint8_t s3 = s[3]; +- d[0] = s2; +- d[1] = s1; +- d[2] = s0; +- d[3] = s3; +- s += 4; +- d += 4; +- } +- return len; +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 ++ // The wuffs_private_impl__parse_number_f64_eisel_lemire preconditions ++ // include that man is non-zero. Parsing "0" should be caught by the "If ++ // both man and (10 ** exp10)" above, but "0e99" might not. ++ if (man == 0) { ++ goto fallback; ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__swap_rgbx_bgrx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t len = (dst_len < src_len ? dst_len : src_len) / 4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; ++ // Our man and exp10 are in range. Run the Eisel-Lemire algorithm. ++ int64_t r = wuffs_private_impl__parse_number_f64_eisel_lemire(man, exp10); ++ if (r < 0) { ++ goto fallback; ++ } ++ wuffs_base__result_f64 ret; ++ ret.status.repr = NULL; ++ ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64( ++ ((uint64_t)r) | (((uint64_t)negative) << 63)); ++ return ret; ++ } while (0); + +- size_t n = len; +- while (n--) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- uint8_t s3 = s[3]; +- d[0] = s2; +- d[1] = s1; +- d[2] = s0; +- d[3] = s3; +- s += 4; +- d += 4; +- } +- return len; ++fallback: ++ do { ++ wuffs_private_impl__high_prec_dec h; ++ wuffs_base__status status = ++ wuffs_private_impl__high_prec_dec__parse(&h, s, options); ++ if (status.repr) { ++ return wuffs_private_impl__parse_number_f64_special(s, options); ++ } ++ return wuffs_private_impl__high_prec_dec__to_f64(&h, options); ++ } while (0); + } + + // -------- + +-static uint64_t // +-wuffs_base__pixel_swizzler__copy_1_1(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t len = (dst_len < src_len) ? dst_len : src_len; +- if (len > 0) { +- memmove(dst_ptr, src_ptr, len); ++static inline size_t // ++wuffs_private_impl__render_inf(wuffs_base__slice_u8 dst, ++ bool neg, ++ uint32_t options) { ++ if (neg) { ++ if (dst.len < 4) { ++ return 0; ++ } ++ wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492D); // '-Inf'le. ++ return 4; + } +- return len; +-} + +-static uint64_t // +-wuffs_base__pixel_swizzler__copy_2_2(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; +- if (len > 0) { +- memmove(dst_ptr, src_ptr, len * 2); ++ if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { ++ if (dst.len < 4) { ++ return 0; ++ } ++ wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492B); // '+Inf'le. ++ return 4; + } +- return len; +-} + +-static uint64_t // +-wuffs_base__pixel_swizzler__copy_3_3(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len3 < src_len3) ? dst_len3 : src_len3; +- if (len > 0) { +- memmove(dst_ptr, src_ptr, len * 3); ++ if (dst.len < 3) { ++ return 0; + } +- return len; ++ wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x666E49); // 'Inf'le. ++ return 3; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__copy_4_4(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- if (len > 0) { +- memmove(dst_ptr, src_ptr, len * 4); ++static inline size_t // ++wuffs_private_impl__render_nan(wuffs_base__slice_u8 dst) { ++ if (dst.len < 3) { ++ return 0; + } +- return len; ++ wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x4E614E); // 'NaN'le. ++ return 3; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__copy_8_8(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8; +- if (len > 0) { +- memmove(dst_ptr, src_ptr, len * 8); ++static size_t // ++wuffs_private_impl__high_prec_dec__render_exponent_absent( ++ wuffs_base__slice_u8 dst, ++ wuffs_private_impl__high_prec_dec* h, ++ uint32_t precision, ++ uint32_t options) { ++ size_t n = (h->negative || ++ (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN)) ++ ? 1 ++ : 0; ++ if (h->decimal_point <= 0) { ++ n += 1; ++ } else { ++ n += (size_t)(h->decimal_point); ++ } ++ if (precision > 0) { ++ n += precision + 1; // +1 for the '.'. + } +- return len; +-} + +-// -------- ++ // Don't modify dst if the formatted number won't fit. ++ if (n > dst.len) { ++ return 0; ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgr(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // Align-left or align-right. ++ uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) ++ ? &dst.ptr[dst.len - n] ++ : &dst.ptr[0]; + +- // TODO: unroll. ++ // Leading "±". ++ if (h->negative) { ++ *ptr++ = '-'; ++ } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { ++ *ptr++ = '+'; ++ } + +- while (n >= 1) { +- uint32_t b5 = s[0] >> 3; +- uint32_t g6 = s[1] >> 2; +- uint32_t r5 = s[2] >> 3; +- uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); ++ // Integral digits. ++ if (h->decimal_point <= 0) { ++ *ptr++ = '0'; ++ } else { ++ uint32_t m = ++ wuffs_base__u32__min(h->num_digits, (uint32_t)(h->decimal_point)); ++ uint32_t i = 0; ++ for (; i < m; i++) { ++ *ptr++ = (uint8_t)('0' | h->digits[i]); ++ } ++ for (; i < (uint32_t)(h->decimal_point); i++) { ++ *ptr++ = '0'; ++ } ++ } + +- s += 1 * 3; +- d += 1 * 2; +- n -= 1; ++ // Separator and then fractional digits. ++ if (precision > 0) { ++ *ptr++ = ++ (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.'; ++ uint32_t i = 0; ++ for (; i < precision; i++) { ++ uint32_t j = ((uint32_t)(h->decimal_point)) + i; ++ *ptr++ = (uint8_t)('0' | ((j < h->num_digits) ? h->digits[j] : 0)); ++ } + } + +- return len; ++ return n; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgrx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- // TODO: unroll. ++static size_t // ++wuffs_private_impl__high_prec_dec__render_exponent_present( ++ wuffs_base__slice_u8 dst, ++ wuffs_private_impl__high_prec_dec* h, ++ uint32_t precision, ++ uint32_t options) { ++ int32_t exp = 0; ++ if (h->num_digits > 0) { ++ exp = h->decimal_point - 1; ++ } ++ bool negative_exp = exp < 0; ++ if (negative_exp) { ++ exp = -exp; ++ } + +- while (n >= 1) { +- uint32_t b5 = s[0] >> 3; +- uint32_t g6 = s[1] >> 2; +- uint32_t r5 = s[2] >> 3; +- uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); ++ size_t n = (h->negative || ++ (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN)) ++ ? 4 ++ : 3; // Mininum 3 bytes: first digit and then "e±". ++ if (precision > 0) { ++ n += precision + 1; // +1 for the '.'. ++ } ++ n += (exp < 100) ? 2 : 3; + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ // Don't modify dst if the formatted number won't fit. ++ if (n > dst.len) { ++ return 0; + } + +- return len; +-} ++ // Align-left or align-right. ++ uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) ++ ? &dst.ptr[dst.len - n] ++ : &dst.ptr[0]; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // Leading "±". ++ if (h->negative) { ++ *ptr++ = '-'; ++ } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { ++ *ptr++ = '+'; ++ } + +- // TODO: unroll. ++ // Integral digit. ++ if (h->num_digits > 0) { ++ *ptr++ = (uint8_t)('0' | h->digits[0]); ++ } else { ++ *ptr++ = '0'; ++ } + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); ++ // Separator and then fractional digits. ++ if (precision > 0) { ++ *ptr++ = ++ (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA) ++ ? ',' ++ : '.'; ++ uint32_t i = 1; ++ uint32_t j = wuffs_base__u32__min(h->num_digits, precision + 1); ++ for (; i < j; i++) { ++ *ptr++ = (uint8_t)('0' | h->digits[i]); ++ } ++ for (; i <= precision; i++) { ++ *ptr++ = '0'; ++ } ++ } + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ // Exponent: "e±" and then 2 or 3 digits. ++ *ptr++ = 'e'; ++ *ptr++ = negative_exp ? '-' : '+'; ++ if (exp < 10) { ++ *ptr++ = '0'; ++ *ptr++ = (uint8_t)('0' | exp); ++ } else if (exp < 100) { ++ *ptr++ = (uint8_t)('0' | (exp / 10)); ++ *ptr++ = (uint8_t)('0' | (exp % 10)); ++ } else { ++ int32_t e = exp / 100; ++ exp -= e * 100; ++ *ptr++ = (uint8_t)('0' | e); ++ *ptr++ = (uint8_t)('0' | (exp / 10)); ++ *ptr++ = (uint8_t)('0' | (exp % 10)); + } + +- return len; ++ return n; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__render_number_f64(wuffs_base__slice_u8 dst, ++ double x, ++ uint32_t precision, ++ uint32_t options) { ++ // Decompose x (64 bits) into negativity (1 bit), base-2 exponent (11 bits ++ // with a -1023 bias) and mantissa (52 bits). ++ uint64_t bits = wuffs_base__ieee_754_bit_representation__from_f64_to_u64(x); ++ bool neg = (bits >> 63) != 0; ++ int32_t exp2 = ((int32_t)(bits >> 52)) & 0x7FF; ++ uint64_t man = bits & 0x000FFFFFFFFFFFFFul; + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))))); ++ // Apply the exponent bias and set the implicit top bit of the mantissa, ++ // unless x is subnormal. Also take care of Inf and NaN. ++ if (exp2 == 0x7FF) { ++ if (man != 0) { ++ return wuffs_private_impl__render_nan(dst); ++ } ++ return wuffs_private_impl__render_inf(dst, neg, options); ++ } else if (exp2 == 0) { ++ exp2 = -1022; ++ } else { ++ exp2 -= 1023; ++ man |= 0x0010000000000000ul; ++ } + +- s += 1 * 8; +- d += 1 * 2; +- n -= 1; ++ // Ensure that precision isn't too large. ++ if (precision > 4095) { ++ precision = 4095; + } + +- return len; +-} ++ // Convert from the (neg, exp2, man) tuple to an HPD. ++ wuffs_private_impl__high_prec_dec h; ++ wuffs_private_impl__high_prec_dec__assign(&h, man, neg); ++ if (h.num_digits > 0) { ++ wuffs_private_impl__high_prec_dec__lshift(&h, ++ exp2 - 52); // 52 mantissa bits. ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // Handle the "%e" and "%f" formats. ++ switch (options & (WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT | ++ WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT)) { ++ case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT: // The "%"f" format. ++ if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { ++ wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man); ++ int32_t p = ((int32_t)(h.num_digits)) - h.decimal_point; ++ precision = ((uint32_t)(wuffs_base__i32__max(0, p))); ++ } else { ++ wuffs_private_impl__high_prec_dec__round_nearest( ++ &h, ((int32_t)precision) + h.decimal_point); ++ } ++ return wuffs_private_impl__high_prec_dec__render_exponent_absent( ++ dst, &h, precision, options); + +- // TODO: unroll. ++ case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT: // The "%e" format. ++ if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { ++ wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man); ++ precision = (h.num_digits > 0) ? (h.num_digits - 1) : 0; ++ } else { ++ wuffs_private_impl__high_prec_dec__round_nearest( ++ &h, ((int32_t)precision) + 1); ++ } ++ return wuffs_private_impl__high_prec_dec__render_exponent_present( ++ dst, &h, precision, options); ++ } + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sr = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sb = 0x101 * ((uint32_t)s[0]); ++ // We have the "%g" format and so precision means the number of significant ++ // digits, not the number of digits after the decimal separator. Perform ++ // rounding and determine whether to use "%e" or "%f". ++ int32_t e_threshold = 0; ++ if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) { ++ wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man); ++ precision = h.num_digits; ++ e_threshold = 6; ++ } else { ++ if (precision == 0) { ++ precision = 1; ++ } ++ wuffs_private_impl__high_prec_dec__round_nearest(&h, ((int32_t)precision)); ++ e_threshold = ((int32_t)precision); ++ int32_t nd = ((int32_t)(h.num_digits)); ++ if ((e_threshold > nd) && (nd >= h.decimal_point)) { ++ e_threshold = nd; ++ } ++ } + +- // Convert from 565 color to 16-bit color. +- uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); +- uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); +- uint32_t dr = (0x8421 * old_r5) >> 4; +- uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); +- uint32_t dg = (0x1041 * old_g6) >> 2; +- uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); +- uint32_t db = (0x8421 * old_b5) >> 4; ++ // Use the "%e" format if the exponent is large. ++ int32_t e = h.decimal_point - 1; ++ if ((e < -4) || (e_threshold <= e)) { ++ uint32_t p = wuffs_base__u32__min(precision, h.num_digits); ++ return wuffs_private_impl__high_prec_dec__render_exponent_present( ++ dst, &h, (p > 0) ? (p - 1) : 0, options); ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ // Use the "%f" format otherwise. ++ int32_t p = ((int32_t)precision); ++ if (p > h.decimal_point) { ++ p = ((int32_t)(h.num_digits)); ++ } ++ precision = ((uint32_t)(wuffs_base__i32__max(0, p - h.decimal_point))); ++ return wuffs_private_impl__high_prec_dec__render_exponent_absent( ++ dst, &h, precision, options); ++} + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV) + +- // Convert from 16-bit color to 565 color and combine the components. +- uint32_t new_r5 = 0x1F & (dr >> 11); +- uint32_t new_g6 = 0x3F & (dg >> 10); +- uint32_t new_b5 = 0x1F & (db >> 11); +- uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__INTCONV) + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; +- } ++// ---------------- Integer + +- return len; +-} ++// wuffs_base__parse_number__foo_digits entries are 0x00 for invalid digits, ++// and (0x80 | v) for valid digits, where v is the 4 bit value. + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static const uint8_t wuffs_base__parse_number__decimal_digits[256] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. ++ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'. ++ 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'. + +- // TODO: unroll. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); +- uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); +- uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); +- uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF. + +- // Convert from 565 color to 16-bit color. +- uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); +- uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); +- uint32_t dr = (0x8421 * old_r5) >> 4; +- uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); +- uint32_t dg = (0x1041 * old_g6) >> 2; +- uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); +- uint32_t db = (0x8421 * old_b5) >> 4; ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF. ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++}; + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++static const uint8_t wuffs_base__parse_number__hexadecimal_digits[256] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. ++ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x30 ..= 0x37. '0'-'7'. ++ 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. '8'-'9'. + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x40 ..= 0x47. 'A'-'F'. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. ++ 0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00, // 0x60 ..= 0x67. 'a'-'f'. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. + +- // Convert from 16-bit color to 565 color and combine the components. +- uint32_t new_r5 = 0x1F & (dr >> 11); +- uint32_t new_g6 = 0x3F & (dg >> 10); +- uint32_t new_b5 = 0x1F & (db >> 11); +- uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x80 ..= 0x87. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x88 ..= 0x8F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x90 ..= 0x97. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x98 ..= 0x9F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA0 ..= 0xA7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xA8 ..= 0xAF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB0 ..= 0xB7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xB8 ..= 0xBF. + +- s += 1 * 8; +- d += 1 * 2; +- n -= 1; +- } ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC0 ..= 0xC7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xC8 ..= 0xCF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD0 ..= 0xD7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xD8 ..= 0xDF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE0 ..= 0xE7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xE8 ..= 0xEF. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF0 ..= 0xF7. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xF8 ..= 0xFF. ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++}; + +- return len; +-} ++static const uint8_t wuffs_private_impl__encode_base16[16] = { ++ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // 0x00 ..= 0x07. ++ 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, // 0x08 ..= 0x0F. ++}; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// -------- + +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64 // ++wuffs_base__parse_number_i64(wuffs_base__slice_u8 s, uint32_t options) { ++ uint8_t* p = s.ptr; ++ uint8_t* q = s.ptr + s.len; + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ } + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ bool negative = false; ++ if (p >= q) { ++ goto fail_bad_argument; ++ } else if (*p == '-') { ++ p++; ++ negative = true; ++ } else if (*p == '+') { ++ p++; + } + +- return len; +-} ++ do { ++ wuffs_base__result_u64 r = wuffs_base__parse_number_u64( ++ wuffs_base__make_slice_u8(p, (size_t)(q - p)), options); ++ if (r.status.repr != NULL) { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = r.status.repr; ++ ret.value = 0; ++ return ret; ++ } else if (negative) { ++ if (r.value < 0x8000000000000000) { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = NULL; ++ ret.value = -(int64_t)(r.value); ++ return ret; ++ } else if (r.value == 0x8000000000000000) { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = NULL; ++ ret.value = INT64_MIN; ++ return ret; ++ } ++ goto fail_out_of_bounds; ++ } else if (r.value > 0x7FFFFFFFFFFFFFFF) { ++ goto fail_out_of_bounds; ++ } else { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = NULL; ++ ret.value = +(int64_t)(r.value); ++ return ret; ++ } ++ } while (0); + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++fail_bad_argument: ++ do { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = wuffs_base__error__bad_argument; ++ ret.value = 0; ++ return ret; ++ } while (0); + +- // TODO: unroll. ++fail_out_of_bounds: ++ do { ++ wuffs_base__result_i64 ret; ++ ret.status.repr = wuffs_base__error__out_of_bounds; ++ ret.value = 0; ++ return ret; ++ } while (0); ++} + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sr = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sb = 0x101 * ((uint32_t)s[0]); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64 // ++wuffs_base__parse_number_u64(wuffs_base__slice_u8 s, uint32_t options) { ++ uint8_t* p = s.ptr; ++ uint8_t* q = s.ptr + s.len; + +- // Convert from 565 color to 16-bit color. +- uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); +- uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); +- uint32_t dr = (0x8421 * old_r5) >> 4; +- uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); +- uint32_t dg = (0x1041 * old_g6) >> 2; +- uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); +- uint32_t db = (0x8421 * old_b5) >> 4; +- +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; +- +- // Composite src (premul) over dst (premul). +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); +- +- // Convert from 16-bit color to 565 color and combine the components. +- uint32_t new_r5 = 0x1F & (dr >> 11); +- uint32_t new_g6 = 0x3F & (dg >> 10); +- uint32_t new_b5 = 0x1F & (db >> 11); +- uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); +- +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (; (p < q) && (*p == '_'); p++) { ++ } + } + +- return len; +-} ++ if (p >= q) { ++ goto fail_bad_argument; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__rgb(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ } else if (*p == '0') { ++ p++; ++ if (p >= q) { ++ goto ok_zero; ++ } ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ if (*p == '_') { ++ p++; ++ for (; p < q; p++) { ++ if (*p != '_') { ++ if (options & ++ WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) { ++ goto decimal; ++ } ++ goto fail_bad_argument; ++ } ++ } ++ goto ok_zero; ++ } ++ } + +- // TODO: unroll. ++ if ((*p == 'x') || (*p == 'X')) { ++ p++; ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ } ++ if (p < q) { ++ goto hexadecimal; ++ } + +- while (n >= 1) { +- uint32_t r5 = s[0] >> 3; +- uint32_t g6 = s[1] >> 2; +- uint32_t b5 = s[2] >> 3; +- uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); ++ } else if ((*p == 'd') || (*p == 'D')) { ++ p++; ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) { ++ for (; (p < q) && (*p == '_'); p++) { ++ } ++ } ++ if (p < q) { ++ goto decimal; ++ } ++ } + +- s += 1 * 3; +- d += 1 * 2; +- n -= 1; ++ if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) { ++ goto decimal; ++ } ++ goto fail_bad_argument; + } + +- return len; +-} ++decimal: ++ do { ++ uint64_t v = wuffs_base__parse_number__decimal_digits[*p++]; ++ if (v == 0) { ++ goto fail_bad_argument; ++ } ++ v &= 0x0F; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // UINT64_MAX is 18446744073709551615, which is ((10 * max10) + max1). ++ const uint64_t max10 = 1844674407370955161u; ++ const uint8_t max1 = 5; + +- // TODO: unroll. ++ for (; p < q; p++) { ++ if ((*p == '_') && ++ (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ continue; ++ } ++ uint8_t digit = wuffs_base__parse_number__decimal_digits[*p]; ++ if (digit == 0) { ++ goto fail_bad_argument; ++ } ++ digit &= 0x0F; ++ if ((v > max10) || ((v == max10) && (digit > max1))) { ++ goto fail_out_of_bounds; ++ } ++ v = (10 * v) + ((uint64_t)(digit)); ++ } + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))))); ++ wuffs_base__result_u64 ret; ++ ret.status.repr = NULL; ++ ret.value = v; ++ return ret; ++ } while (0); + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; +- } ++hexadecimal: ++ do { ++ uint64_t v = wuffs_base__parse_number__hexadecimal_digits[*p++]; ++ if (v == 0) { ++ goto fail_bad_argument; ++ } ++ v &= 0x0F; + +- return len; +-} ++ for (; p < q; p++) { ++ if ((*p == '_') && ++ (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) { ++ continue; ++ } ++ uint8_t digit = wuffs_base__parse_number__hexadecimal_digits[*p]; ++ if (digit == 0) { ++ goto fail_bad_argument; ++ } ++ digit &= 0x0F; ++ if ((v >> 60) != 0) { ++ goto fail_out_of_bounds; ++ } ++ v = (v << 4) | ((uint64_t)(digit)); ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ wuffs_base__result_u64 ret; ++ ret.status.repr = NULL; ++ ret.value = v; ++ return ret; ++ } while (0); + +- // TODO: unroll. ++ok_zero: ++ do { ++ wuffs_base__result_u64 ret; ++ ret.status.repr = NULL; ++ ret.value = 0; ++ return ret; ++ } while (0); + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sb = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sr = 0x101 * ((uint32_t)s[0]); ++fail_bad_argument: ++ do { ++ wuffs_base__result_u64 ret; ++ ret.status.repr = wuffs_base__error__bad_argument; ++ ret.value = 0; ++ return ret; ++ } while (0); + +- // Convert from 565 color to 16-bit color. +- uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); +- uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); +- uint32_t dr = (0x8421 * old_r5) >> 4; +- uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); +- uint32_t dg = (0x1041 * old_g6) >> 2; +- uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); +- uint32_t db = (0x8421 * old_b5) >> 4; ++fail_out_of_bounds: ++ do { ++ wuffs_base__result_u64 ret; ++ ret.status.repr = wuffs_base__error__out_of_bounds; ++ ret.value = 0; ++ return ret; ++ } while (0); ++} + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++// -------- + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++// wuffs_base__render_number__first_hundred contains the decimal encodings of ++// the first one hundred numbers [0 ..= 99]. ++static const uint8_t wuffs_base__render_number__first_hundred[200] = { ++ '0', '0', '0', '1', '0', '2', '0', '3', '0', '4', // ++ '0', '5', '0', '6', '0', '7', '0', '8', '0', '9', // ++ '1', '0', '1', '1', '1', '2', '1', '3', '1', '4', // ++ '1', '5', '1', '6', '1', '7', '1', '8', '1', '9', // ++ '2', '0', '2', '1', '2', '2', '2', '3', '2', '4', // ++ '2', '5', '2', '6', '2', '7', '2', '8', '2', '9', // ++ '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', // ++ '3', '5', '3', '6', '3', '7', '3', '8', '3', '9', // ++ '4', '0', '4', '1', '4', '2', '4', '3', '4', '4', // ++ '4', '5', '4', '6', '4', '7', '4', '8', '4', '9', // ++ '5', '0', '5', '1', '5', '2', '5', '3', '5', '4', // ++ '5', '5', '5', '6', '5', '7', '5', '8', '5', '9', // ++ '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', // ++ '6', '5', '6', '6', '6', '7', '6', '8', '6', '9', // ++ '7', '0', '7', '1', '7', '2', '7', '3', '7', '4', // ++ '7', '5', '7', '6', '7', '7', '7', '8', '7', '9', // ++ '8', '0', '8', '1', '8', '2', '8', '3', '8', '4', // ++ '8', '5', '8', '6', '8', '7', '8', '8', '8', '9', // ++ '9', '0', '9', '1', '9', '2', '9', '3', '9', '4', // ++ '9', '5', '9', '6', '9', '7', '9', '8', '9', '9', // ++}; + +- // Convert from 16-bit color to 565 color and combine the components. +- uint32_t new_r5 = 0x1F & (dr >> 11); +- uint32_t new_g6 = 0x3F & (dg >> 10); +- uint32_t new_b5 = 0x1F & (db >> 11); +- uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++static size_t // ++wuffs_private_impl__render_number_u64(wuffs_base__slice_u8 dst, ++ uint64_t x, ++ uint32_t options, ++ bool neg) { ++ uint8_t buf[WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL]; ++ uint8_t* ptr = &buf[0] + sizeof(buf); + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ while (x >= 100) { ++ size_t index = ((size_t)((x % 100) * 2)); ++ x /= 100; ++ uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0]; ++ uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1]; ++ ptr -= 2; ++ ptr[0] = s0; ++ ptr[1] = s1; + } + +- return len; +-} +- +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ if (x < 10) { ++ ptr -= 1; ++ ptr[0] = (uint8_t)('0' + x); ++ } else { ++ size_t index = ((size_t)(x * 2)); ++ uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0]; ++ uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1]; ++ ptr -= 2; ++ ptr[0] = s0; ++ ptr[1] = s1; ++ } + +- // TODO: unroll. ++ if (neg) { ++ ptr -= 1; ++ ptr[0] = '-'; ++ } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) { ++ ptr -= 1; ++ ptr[0] = '+'; ++ } + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); ++ size_t n = sizeof(buf) - ((size_t)(ptr - &buf[0])); ++ if (n > dst.len) { ++ return 0; ++ } ++ memcpy(dst.ptr + ((options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT) ++ ? (dst.len - n) ++ : 0), ++ ptr, n); ++ return n; ++} + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__render_number_i64(wuffs_base__slice_u8 dst, ++ int64_t x, ++ uint32_t options) { ++ uint64_t u = (uint64_t)x; ++ bool neg = x < 0; ++ if (neg) { ++ u = 1 + ~u; + } ++ return wuffs_private_impl__render_number_u64(dst, u, options, neg); ++} + +- return len; ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__render_number_u64(wuffs_base__slice_u8 dst, ++ uint64_t x, ++ uint32_t options) { ++ return wuffs_private_impl__render_number_u64(dst, x, options, false); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// ---------------- Base-16 + +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_16__decode2(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ wuffs_base__transform__output o; ++ size_t src_len2 = src.len / 2; ++ size_t len; ++ if (dst.len < src_len2) { ++ len = dst.len; ++ o.status.repr = wuffs_base__suspension__short_write; ++ } else { ++ len = src_len2; ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ } else if (src.len & 1) { ++ o.status.repr = wuffs_base__error__bad_data; ++ } else { ++ o.status.repr = NULL; ++ } ++ } + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sb = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sr = 0x101 * ((uint32_t)s[0]); ++ uint8_t* d = dst.ptr; ++ uint8_t* s = src.ptr; ++ size_t n = len; + +- // Convert from 565 color to 16-bit color. +- uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); +- uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); +- uint32_t dr = (0x8421 * old_r5) >> 4; +- uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); +- uint32_t dg = (0x1041 * old_g6) >> 2; +- uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); +- uint32_t db = (0x8421 * old_b5) >> 4; ++ while (n--) { ++ *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[0]] << 4) | ++ (wuffs_base__parse_number__hexadecimal_digits[s[1]] & 0x0F)); ++ d += 1; ++ s += 2; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ o.num_dst = len; ++ o.num_src = len * 2; ++ return o; ++} + +- // Composite src (premul) over dst (premul). +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_16__decode4(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ wuffs_base__transform__output o; ++ size_t src_len4 = src.len / 4; ++ size_t len = dst.len < src_len4 ? dst.len : src_len4; ++ if (dst.len < src_len4) { ++ len = dst.len; ++ o.status.repr = wuffs_base__suspension__short_write; ++ } else { ++ len = src_len4; ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ } else if (src.len & 1) { ++ o.status.repr = wuffs_base__error__bad_data; ++ } else { ++ o.status.repr = NULL; ++ } ++ } + +- // Convert from 16-bit color to 565 color and combine the components. +- uint32_t new_r5 = 0x1F & (dr >> 11); +- uint32_t new_g6 = 0x3F & (dg >> 10); +- uint32_t new_b5 = 0x1F & (db >> 11); +- uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++ uint8_t* d = dst.ptr; ++ uint8_t* s = src.ptr; ++ size_t n = len; + +- s += 1 * 4; +- d += 1 * 2; +- n -= 1; ++ while (n--) { ++ *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[2]] << 4) | ++ (wuffs_base__parse_number__hexadecimal_digits[s[3]] & 0x0F)); ++ d += 1; ++ s += 4; + } + +- return len; ++ o.num_dst = len; ++ o.num_src = len * 4; ++ return o; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__y(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ wuffs_base__transform__output o; ++ size_t dst_len2 = dst.len / 2; ++ size_t len; ++ if (dst_len2 < src.len) { ++ len = dst_len2; ++ o.status.repr = wuffs_base__suspension__short_write; ++ } else { ++ len = src.len; ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ } else { ++ o.status.repr = NULL; ++ } ++ } + +- while (n >= 1) { +- uint32_t y5 = s[0] >> 3; +- uint32_t y6 = s[0] >> 2; +- uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); ++ uint8_t* d = dst.ptr; ++ uint8_t* s = src.ptr; ++ size_t n = len; + +- s += 1 * 1; +- d += 1 * 2; +- n -= 1; ++ while (n--) { ++ uint8_t c = *s; ++ d[0] = wuffs_private_impl__encode_base16[c >> 4]; ++ d[1] = wuffs_private_impl__encode_base16[c & 0x0F]; ++ d += 2; ++ s += 1; + } + +- return len; ++ o.num_dst = len * 2; ++ o.num_src = len; ++ return o; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_16__encode4(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ wuffs_base__transform__output o; ++ size_t dst_len4 = dst.len / 4; ++ size_t len; ++ if (dst_len4 < src.len) { ++ len = dst_len4; ++ o.status.repr = wuffs_base__suspension__short_write; ++ } else { ++ len = src.len; ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ } else { ++ o.status.repr = NULL; ++ } ++ } + +- while (n >= 1) { +- uint32_t y5 = s[0] >> 3; +- uint32_t y6 = s[0] >> 2; +- uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0); +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); ++ uint8_t* d = dst.ptr; ++ uint8_t* s = src.ptr; ++ size_t n = len; + +- s += 1 * 2; +- d += 1 * 2; +- n -= 1; ++ while (n--) { ++ uint8_t c = *s; ++ d[0] = '\\'; ++ d[1] = 'x'; ++ d[2] = wuffs_private_impl__encode_base16[c >> 4]; ++ d[3] = wuffs_private_impl__encode_base16[c & 0x0F]; ++ d += 4; ++ s += 1; + } + +- return len; ++ o.num_dst = len * 4; ++ o.num_src = len; ++ return o; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__index__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len2 = dst_len / 2; +- size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// ---------------- Base-64 + +- const size_t loop_unroll_count = 4; ++// The two base-64 alphabets, std and url, differ only in the last two codes. ++// - std: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ++// - url: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" + +- while (n >= loop_unroll_count) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4))); +- wuffs_base__poke_u16le__no_bounds_check( +- d + (1 * 2), wuffs_base__peek_u16le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[1] * 4))); +- wuffs_base__poke_u16le__no_bounds_check( +- d + (2 * 2), wuffs_base__peek_u16le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[2] * 4))); +- wuffs_base__poke_u16le__no_bounds_check( +- d + (3 * 2), wuffs_base__peek_u16le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[3] * 4))); ++static const uint8_t wuffs_base__base_64__decode_std[256] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x00 ..= 0x07. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x08 ..= 0x0F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x10 ..= 0x17. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x18 ..= 0x1F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x20 ..= 0x27. ++ 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x80, 0x3F, // 0x28 ..= 0x2F. ++ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 0x30 ..= 0x37. ++ 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x38 ..= 0x3F. + +- s += loop_unroll_count * 1; +- d += loop_unroll_count * 2; +- n -= loop_unroll_count; +- } ++ 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 0x40 ..= 0x47. ++ 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 0x48 ..= 0x4F. ++ 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 0x50 ..= 0x57. ++ 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x58 ..= 0x5F. ++ 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 0x60 ..= 0x67. ++ 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 0x68 ..= 0x6F. ++ 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 0x70 ..= 0x77. ++ 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x78 ..= 0x7F. + +- while (n >= 1) { +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4))); ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x80 ..= 0x87. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x88 ..= 0x8F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x90 ..= 0x97. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x98 ..= 0x9F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA0 ..= 0xA7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA8 ..= 0xAF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB0 ..= 0xB7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB8 ..= 0xBF. + +- s += 1 * 1; +- d += 1 * 2; +- n -= 1; +- } ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC0 ..= 0xC7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC8 ..= 0xCF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD0 ..= 0xD7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD8 ..= 0xDF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE0 ..= 0xE7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE8 ..= 0xEF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++}; + +- return len; +-} ++static const uint8_t wuffs_base__base_64__decode_url[256] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x00 ..= 0x07. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x08 ..= 0x0F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x10 ..= 0x17. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x18 ..= 0x1F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x20 ..= 0x27. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, // 0x28 ..= 0x2F. ++ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 0x30 ..= 0x37. ++ 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x38 ..= 0x3F. + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__index_bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len2 = dst_len / 2; +- size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 0x40 ..= 0x47. ++ 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 0x48 ..= 0x4F. ++ 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 0x50 ..= 0x57. ++ 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x3F, // 0x58 ..= 0x5F. ++ 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 0x60 ..= 0x67. ++ 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 0x68 ..= 0x6F. ++ 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 0x70 ..= 0x77. ++ 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x78 ..= 0x7F. + +- // TODO: unroll. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x80 ..= 0x87. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x88 ..= 0x8F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x90 ..= 0x97. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0x98 ..= 0x9F. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA0 ..= 0xA7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xA8 ..= 0xAF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB0 ..= 0xB7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xB8 ..= 0xBF. + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2))); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- wuffs_base__poke_u16le__no_bounds_check( +- d + (0 * 2), +- wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( +- wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0))); ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC0 ..= 0xC7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xC8 ..= 0xCF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD0 ..= 0xD7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xD8 ..= 0xDF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE0 ..= 0xE7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xE8 ..= 0xEF. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++}; + +- s += 1 * 1; +- d += 1 * 2; +- n -= 1; +- } ++static const uint8_t wuffs_base__base_64__encode_std[64] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // 0x00 ..= 0x07. ++ 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0x08 ..= 0x0F. ++ 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0x10 ..= 0x17. ++ 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 0x18 ..= 0x1F. ++ 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, // 0x20 ..= 0x27. ++ 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, // 0x28 ..= 0x2F. ++ 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, // 0x30 ..= 0x37. ++ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F, // 0x38 ..= 0x3F. ++}; + +- return len; +-} ++static const uint8_t wuffs_base__base_64__encode_url[64] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // 0x00 ..= 0x07. ++ 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // 0x08 ..= 0x0F. ++ 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // 0x10 ..= 0x17. ++ 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, // 0x18 ..= 0x1F. ++ 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, // 0x20 ..= 0x27. ++ 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, // 0x28 ..= 0x2F. ++ 0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33, // 0x30 ..= 0x37. ++ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2D, 0x5F, // 0x38 ..= 0x3F. ++}; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr_565__index_binary_alpha__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len2 = dst_len / 2; +- size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// -------- + +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_64__decode(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET) ++ ? wuffs_base__base_64__decode_url ++ : wuffs_base__base_64__decode_std; ++ wuffs_base__transform__output o; ++ uint8_t* d_ptr = dst.ptr; ++ size_t d_len = dst.len; ++ const uint8_t* s_ptr = src.ptr; ++ size_t s_len = src.len; ++ bool pad = false; + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)s0); +- } ++ while (s_len >= 4) { ++ uint32_t s = wuffs_base__peek_u32le__no_bounds_check(s_ptr); ++ uint32_t s0 = alphabet[0xFF & (s >> 0)]; ++ uint32_t s1 = alphabet[0xFF & (s >> 8)]; ++ uint32_t s2 = alphabet[0xFF & (s >> 16)]; ++ uint32_t s3 = alphabet[0xFF & (s >> 24)]; + +- s += 1 * 1; +- d += 1 * 2; +- n -= 1; +- } ++ if (((s0 | s1 | s2 | s3) & 0xC0) != 0) { ++ if (s_len > 4) { ++ o.status.repr = wuffs_base__error__bad_data; ++ goto done; ++ } else if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ goto done; ++ } else if ((options & WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING) && ++ (s_ptr[3] == '=')) { ++ pad = true; ++ if (s_ptr[2] == '=') { ++ goto src2; ++ } ++ goto src3; ++ } ++ o.status.repr = wuffs_base__error__bad_data; ++ goto done; ++ } + +- return len; +-} ++ if (d_len < 3) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } + +-// -------- ++ s_ptr += 4; ++ s_len -= 4; ++ s = (s0 << 18) | (s1 << 12) | (s2 << 6) | (s3 << 0); ++ *d_ptr++ = (uint8_t)(s >> 16); ++ *d_ptr++ = (uint8_t)(s >> 8); ++ *d_ptr++ = (uint8_t)(s >> 0); ++ d_len -= 3; ++ } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgr_565(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ goto done; ++ } + +- // TODO: unroll. ++ if (s_len == 0) { ++ o.status.repr = NULL; ++ goto done; ++ } else if (s_len == 1) { ++ o.status.repr = wuffs_base__error__bad_data; ++ goto done; ++ } else if (s_len == 2) { ++ goto src2; ++ } + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))); +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++src3: ++ do { ++ uint32_t s = wuffs_base__peek_u24le__no_bounds_check(s_ptr); ++ uint32_t s0 = alphabet[0xFF & (s >> 0)]; ++ uint32_t s1 = alphabet[0xFF & (s >> 8)]; ++ uint32_t s2 = alphabet[0xFF & (s >> 16)]; ++ if ((s0 & 0xC0) || (s1 & 0xC0) || (s2 & 0xC3)) { ++ o.status.repr = wuffs_base__error__bad_data; ++ goto done; ++ } ++ if (d_len < 2) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } ++ s_ptr += pad ? 4 : 3; ++ s = (s0 << 18) | (s1 << 12) | (s2 << 6); ++ *d_ptr++ = (uint8_t)(s >> 16); ++ *d_ptr++ = (uint8_t)(s >> 8); ++ o.status.repr = NULL; ++ goto done; ++ } while (0); + +- s += 1 * 2; +- d += 1 * 3; +- n -= 1; +- } ++src2: ++ do { ++ uint32_t s = wuffs_base__peek_u16le__no_bounds_check(s_ptr); ++ uint32_t s0 = alphabet[0xFF & (s >> 0)]; ++ uint32_t s1 = alphabet[0xFF & (s >> 8)]; ++ if ((s0 & 0xC0) || (s1 & 0xCF)) { ++ o.status.repr = wuffs_base__error__bad_data; ++ goto done; ++ } ++ if (d_len < 1) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } ++ s_ptr += pad ? 4 : 2; ++ s = (s0 << 18) | (s1 << 12); ++ *d_ptr++ = (uint8_t)(s >> 16); ++ o.status.repr = NULL; ++ goto done; ++ } while (0); + +- return len; ++done: ++ o.num_dst = (size_t)(d_ptr - dst.ptr); ++ o.num_src = (size_t)(s_ptr - src.ptr); ++ return o; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output // ++wuffs_base__base_64__encode(wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 src, ++ bool src_closed, ++ uint32_t options) { ++ const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET) ++ ? wuffs_base__base_64__encode_url ++ : wuffs_base__base_64__encode_std; ++ wuffs_base__transform__output o; ++ uint8_t* d_ptr = dst.ptr; ++ size_t d_len = dst.len; ++ const uint8_t* s_ptr = src.ptr; ++ size_t s_len = src.len; + +- // TODO: unroll. ++ do { ++ while (s_len >= 3) { ++ if (d_len < 4) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } ++ uint32_t s = wuffs_base__peek_u24be__no_bounds_check(s_ptr); ++ s_ptr += 3; ++ s_len -= 3; ++ *d_ptr++ = alphabet[0x3F & (s >> 18)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 12)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 6)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 0)]; ++ d_len -= 4; ++ } + +- while (n >= 1) { +- uint32_t s0 = +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++ if (!src_closed) { ++ o.status.repr = wuffs_base__suspension__short_read; ++ goto done; ++ } + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; +- } ++ if (s_len == 2) { ++ if (d_len < ++ ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 3)) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } ++ uint32_t s = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(s_ptr))) ++ << 8; ++ s_ptr += 2; ++ *d_ptr++ = alphabet[0x3F & (s >> 18)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 12)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 6)]; ++ if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) { ++ *d_ptr++ = '='; ++ } ++ o.status.repr = NULL; ++ goto done; + +- return len; +-} ++ } else if (s_len == 1) { ++ if (d_len < ++ ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 2)) { ++ o.status.repr = wuffs_base__suspension__short_write; ++ goto done; ++ } ++ uint32_t s = ((uint32_t)(wuffs_base__peek_u8__no_bounds_check(s_ptr))) ++ << 16; ++ s_ptr += 1; ++ *d_ptr++ = alphabet[0x3F & (s >> 18)]; ++ *d_ptr++ = alphabet[0x3F & (s >> 12)]; ++ if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) { ++ *d_ptr++ = '='; ++ *d_ptr++ = '='; ++ } ++ o.status.repr = NULL; ++ goto done; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ } else { ++ o.status.repr = NULL; ++ goto done; ++ } ++ } while (0); + +- // TODO: unroll. ++done: ++ o.num_dst = (size_t)(d_ptr - dst.ptr); ++ o.num_src = (size_t)(s_ptr - src.ptr); ++ return o; ++} + +- while (n >= 1) { +- uint32_t s0 = +- wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__INTCONV) + +- s += 1 * 8; +- d += 1 * 3; +- n -= 1; +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__MAGIC) + +- return len; +-} ++// ---------------- Magic Numbers + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// ICO doesn't start with a magic identifier. Instead, see if the opening bytes ++// are plausibly ICO. ++// ++// Callers should have already verified that (prefix_data.len >= 2) and the ++// first two bytes are 0x00. ++// ++// See: ++// - https://docs.fileformat.com/image/ico/ ++static int32_t // ++wuffs_base__magic_number_guess_fourcc__maybe_ico( ++ wuffs_base__slice_u8 prefix_data, ++ bool prefix_closed) { ++ // Allow-list for the Image Type field. ++ if (prefix_data.len < 4) { ++ return prefix_closed ? 0 : -1; ++ } else if (prefix_data.ptr[3] != 0) { ++ return 0; ++ } ++ switch (prefix_data.ptr[2]) { ++ case 0x01: // ICO ++ case 0x02: // CUR ++ break; ++ default: ++ return 0; ++ } + +- // TODO: unroll. ++ // The Number Of Images should be positive. ++ if (prefix_data.len < 6) { ++ return prefix_closed ? 0 : -1; ++ } else if ((prefix_data.ptr[4] == 0) && (prefix_data.ptr[5] == 0)) { ++ return 0; ++ } + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sr = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sb = 0x101 * ((uint32_t)s[0]); ++ // The first ICONDIRENTRY's fourth byte should be zero. ++ if (prefix_data.len < 10) { ++ return prefix_closed ? 0 : -1; ++ } else if (prefix_data.ptr[9] != 0) { ++ return 0; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ // TODO: have a separate FourCC for CUR? ++ return 0x49434F20; // 'ICO 'be ++} + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++// TGA doesn't start with a magic identifier. Instead, see if the opening bytes ++// are plausibly TGA. ++// ++// Callers should have already verified that (prefix_data.len >= 2) and the ++// second byte (prefix_data.ptr[1], the Color Map Type byte), is either 0x00 or ++// 0x01. ++// ++// See: ++// - https://docs.fileformat.com/image/tga/ ++// - https://www.dca.fee.unicamp.br/~martino/disciplinas/ea978/tgaffs.pdf ++static int32_t // ++wuffs_base__magic_number_guess_fourcc__maybe_tga( ++ wuffs_base__slice_u8 prefix_data, ++ bool prefix_closed) { ++ // Allow-list for the Image Type field. ++ if (prefix_data.len < 3) { ++ return prefix_closed ? 0 : -1; ++ } ++ switch (prefix_data.ptr[2]) { ++ case 0x01: ++ case 0x02: ++ case 0x03: ++ case 0x09: ++ case 0x0A: ++ case 0x0B: ++ break; ++ default: ++ // TODO: 0x20 and 0x21 are invalid, according to the spec, but are ++ // apparently unofficial extensions. ++ return 0; ++ } + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++ // Allow-list for the Color Map Entry Size field (if the Color Map Type field ++ // is non-zero) or else all the Color Map fields should be zero. ++ if (prefix_data.len < 8) { ++ return prefix_closed ? 0 : -1; ++ } else if (prefix_data.ptr[1] != 0x00) { ++ switch (prefix_data.ptr[7]) { ++ case 0x0F: ++ case 0x10: ++ case 0x18: ++ case 0x20: ++ break; ++ default: ++ return 0; ++ } ++ } else if ((prefix_data.ptr[3] | prefix_data.ptr[4] | prefix_data.ptr[5] | ++ prefix_data.ptr[6] | prefix_data.ptr[7]) != 0x00) { ++ return 0; ++ } + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++ // Allow-list for the Pixel Depth field. ++ if (prefix_data.len < 17) { ++ return prefix_closed ? 0 : -1; ++ } ++ switch (prefix_data.ptr[16]) { ++ case 0x01: ++ case 0x08: ++ case 0x0F: ++ case 0x10: ++ case 0x18: ++ case 0x20: ++ break; ++ default: ++ return 0; + } + +- return len; ++ return 0x54474120; // 'TGA 'be + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++WUFFS_BASE__MAYBE_STATIC int32_t // ++wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data, ++ bool prefix_closed) { ++ // This is similar to (but different from): ++ // - the magic/Magdir tables under https://github.com/file/file ++ // - the MIME Sniffing algorithm at https://mimesniff.spec.whatwg.org/ + +- // TODO: unroll. ++ // table holds the 'magic numbers' (which are actually variable length ++ // strings). The strings may contain NUL bytes, so the "const char* magic" ++ // value starts with the length-minus-1 of the 'magic number'. ++ // ++ // Keep it sorted by magic[1], then magic[0] descending (prioritizing longer ++ // matches) and finally by magic[2:]. When multiple entries match, the ++ // longest one wins. ++ // ++ // The fourcc field might be negated, in which case there's further ++ // specialization (see § below). ++ static struct { ++ int32_t fourcc; ++ const char* magic; ++ } table[] = { ++ {-0x30302020, "\x01\x00\x00"}, // '00 'be ++ {+0x475A2020, "\x02\x1F\x8B\x08"}, // GZ ++ {+0x5A535444, "\x03\x28\xB5\x2F\xFD"}, // ZSTD ++ {+0x425A3220, "\x02\x42\x5A\x68"}, // BZ2 ++ {+0x424D5020, "\x01\x42\x4D"}, // BMP ++ {+0x47494620, "\x03\x47\x49\x46\x38"}, // GIF ++ {+0x54494646, "\x03\x49\x49\x2A\x00"}, // TIFF (little-endian) ++ {+0x4C5A4950, "\x04\x4C\x5A\x49\x50\x01"}, // LZIP ++ {+0x54494646, "\x03\x4D\x4D\x00\x2A"}, // TIFF (big-endian) ++ {+0x4E50424D, "\x02\x50\x35\x0A"}, // NPBM (P5; *.pgm) ++ {+0x4E50424D, "\x02\x50\x36\x0A"}, // NPBM (P6; *.ppm) ++ {-0x52494646, "\x03\x52\x49\x46\x46"}, // RIFF ++ {+0x4C5A4D41, "\x04\x5D\x00\x10\x00\x00"}, // LZMA ++ {+0x4C5A4D41, "\x02\x5D\x00\x00"}, // LZMA ++ {+0x4E494520, "\x02\x6E\xC3\xAF"}, // NIE ++ {+0x514F4920, "\x03\x71\x6F\x69\x66"}, // QOI ++ {+0x5A4C4942, "\x01\x78\x9C"}, // ZLIB ++ {+0x504E4720, "\x03\x89\x50\x4E\x47"}, // PNG ++ {+0x585A2020, "\x04\xFD\x37\x7A\x58\x5A"}, // XZ ++ {+0x4A504547, "\x01\xFF\xD8"}, // JPEG ++ }; ++ static const size_t table_len = sizeof(table) / sizeof(table[0]); + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); +- uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); +- uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); +- uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); ++ if (prefix_data.len == 0) { ++ return prefix_closed ? 0 : -1; ++ } ++ uint8_t pre_first_byte = prefix_data.ptr[0]; + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ int32_t fourcc = 0; ++ size_t i; ++ for (i = 0; i < table_len; i++) { ++ uint8_t mag_first_byte = ((uint8_t)(table[i].magic[1])); ++ if (pre_first_byte < mag_first_byte) { ++ break; ++ } else if (pre_first_byte > mag_first_byte) { ++ continue; ++ } ++ fourcc = table[i].fourcc; + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ uint8_t mag_remaining_len = ((uint8_t)(table[i].magic[0])); ++ if (mag_remaining_len == 0) { ++ goto match; ++ } + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++ const char* mag_remaining_ptr = table[i].magic + 2; ++ uint8_t* pre_remaining_ptr = prefix_data.ptr + 1; ++ size_t pre_remaining_len = prefix_data.len - 1; ++ if (pre_remaining_len < mag_remaining_len) { ++ if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, pre_remaining_len)) { ++ return prefix_closed ? 0 : -1; ++ } ++ } else { ++ if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, mag_remaining_len)) { ++ goto match; ++ } ++ } ++ } + +- s += 1 * 8; +- d += 1 * 3; +- n -= 1; ++ if (prefix_data.len < 2) { ++ return prefix_closed ? 0 : -1; ++ } else if ((prefix_data.ptr[1] == 0x00) || (prefix_data.ptr[1] == 0x01)) { ++ return wuffs_base__magic_number_guess_fourcc__maybe_tga(prefix_data, ++ prefix_closed); + } + +- return len; +-} ++ return 0; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_premul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++match: ++ // Negative FourCC values (see § above) are further specialized. ++ if (fourcc < 0) { ++ fourcc = -fourcc; + +- while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s0; +- d[1] = s1; +- d[2] = s2; ++ if (fourcc == 0x52494646) { // 'RIFF'be ++ if (prefix_data.len < 12) { ++ return prefix_closed ? 0 : -1; ++ } ++ uint32_t x = wuffs_base__peek_u32be__no_bounds_check(prefix_data.ptr + 8); ++ if (x == 0x57454250) { // 'WEBP'be ++ return 0x57454250; // 'WEBP'be ++ } + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++ } else if (fourcc == 0x30302020) { // '00 'be ++ // Binary data starting with multiple 0x00 NUL bytes is quite common. ++ // Unfortunately, some file formats also don't start with a magic ++ // identifier, so we have to use heuristics (where the order matters, the ++ // same as /usr/bin/file's magic/Magdir tables) as best we can. Maybe ++ // it's TGA, ICO/CUR, etc. Maybe it's something else. ++ int32_t tga = wuffs_base__magic_number_guess_fourcc__maybe_tga( ++ prefix_data, prefix_closed); ++ if (tga != 0) { ++ return tga; ++ } ++ int32_t ico = wuffs_base__magic_number_guess_fourcc__maybe_ico( ++ prefix_data, prefix_closed); ++ if (ico != 0) { ++ return ico; ++ } ++ if (prefix_data.len < 4) { ++ return prefix_closed ? 0 : -1; ++ } else if ((prefix_data.ptr[2] != 0x00) && ++ ((prefix_data.ptr[2] >= 0x80) || ++ (prefix_data.ptr[3] != 0x00))) { ++ // Roughly speaking, this could be a non-degenerate (non-0-width and ++ // non-0-height) WBMP image. ++ return 0x57424D50; // 'WBMP'be ++ } ++ return 0; ++ } + } +- +- return len; ++ return fourcc; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__bgra_premul__src_over(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sr = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sb = 0x101 * ((uint32_t)s[0]); +- +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__MAGIC) + +- // Composite src (premul) over dst (premul). +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV) + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++// ---------------- Pixel Swizzler + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; +- } ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len); + +- return len; +-} ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len); + ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len); + +- // TODO: unroll. ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++static uint64_t // ++wuffs_private_impl__swizzle_xxxx__y__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++// -------- + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; +- } ++static inline uint32_t // ++wuffs_private_impl__swap_u32_argb_abgr(uint32_t u) { ++ uint32_t o = u & 0xFF00FF00ul; ++ uint32_t r = u & 0x00FF0000ul; ++ uint32_t b = u & 0x000000FFul; ++ return o | (r >> 16) | (b << 16); ++} + +- return len; ++static inline uint64_t // ++wuffs_private_impl__swap_u64_argb_abgr(uint64_t u) { ++ uint64_t o = u & 0xFFFF0000FFFF0000ull; ++ uint64_t r = u & 0x0000FFFF00000000ull; ++ uint64_t b = u & 0x000000000000FFFFull; ++ return o | (r >> 32) | (b << 32); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_nonpremul_4x16le__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static inline uint32_t // ++wuffs_private_impl__color_u64__as__color_u32__swap_u32_argb_abgr(uint64_t c) { ++ uint32_t a = ((uint32_t)(0xFF & (c >> 56))); ++ uint32_t r = ((uint32_t)(0xFF & (c >> 40))); ++ uint32_t g = ((uint32_t)(0xFF & (c >> 24))); ++ uint32_t b = ((uint32_t)(0xFF & (c >> 8))); ++ return (a << 24) | (b << 16) | (g << 8) | (r << 0); ++} + +- // TODO: unroll. ++// -------- + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__color_u32_argb_premul // ++wuffs_base__pixel_buffer__color_u32_at(const wuffs_base__pixel_buffer* pb, ++ uint32_t x, ++ uint32_t y) { ++ if (!pb || (x >= pb->pixcfg.private_impl.width) || ++ (y >= pb->pixcfg.private_impl.height)) { ++ return 0; ++ } + +- s += 1 * 8; +- d += 1 * 3; +- n -= 1; ++ if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { ++ // TODO: support planar formats. ++ return 0; + } + +- return len; +-} ++ size_t stride = pb->private_impl.planes[0].stride; ++ const uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)); + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ switch (pb->pixcfg.private_impl.pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ return wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))); + +- // TODO: unroll. ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: { ++ uint8_t* palette = pb->private_impl.planes[3].ptr; ++ return wuffs_base__peek_u32le__no_bounds_check(palette + ++ (4 * ((size_t)row[x]))); ++ } + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sb = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sr = 0x101 * ((uint32_t)s[0]); ++ // Common formats above. Rarer formats below. + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ return 0xFF000000 | (0x00010101 * ((uint32_t)(row[x]))); ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: ++ return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 1]))); ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: ++ return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 0]))); ++ case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: ++ return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ (((uint32_t)(row[(2 * x) + 1])) << 24) | ++ (((uint32_t)(row[(2 * x) + 0])) * 0x00010101)); + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: { ++ uint8_t* palette = pb->private_impl.planes[3].ptr; ++ return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(palette + ++ (4 * ((size_t)row[x])))); ++ } + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(row + (2 * ((size_t)x)))); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ return 0xFF000000 | ++ wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x))); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ return wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u64le__no_bounds_check(row + (8 * ((size_t)x)))); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ return 0xFF000000 | ++ wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))); + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swap_u32_argb_abgr( ++ 0xFF000000 | ++ wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x)))); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ return wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(row + ++ (4 * ((size_t)x))))); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ return wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ return wuffs_private_impl__swap_u32_argb_abgr( ++ 0xFF000000 | ++ wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)))); ++ ++ default: ++ // TODO: support more formats. ++ break; + } + +- return len; ++ return 0; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// -------- + +- // TODO: unroll. ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status // ++wuffs_base__pixel_buffer__set_color_u32_at( ++ wuffs_base__pixel_buffer* pb, ++ uint32_t x, ++ uint32_t y, ++ wuffs_base__color_u32_argb_premul color) { ++ if (!pb) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if ((x >= pb->pixcfg.private_impl.width) || ++ (y >= pb->pixcfg.private_impl.height)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); +- uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); +- uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); +- uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); ++ if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { ++ // TODO: support planar formats. ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ size_t stride = pb->private_impl.planes[0].stride; ++ uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)); + +- // Composite src (nonpremul) over dst (premul). +- dr = ((sr * sa) + (dr * ia)) / 0xFFFF; +- dg = ((sg * sa) + (dg * ia)) / 0xFFFF; +- db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ switch (pb->pixcfg.private_impl.pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ wuffs_base__poke_u32le__no_bounds_check(row + (4 * ((size_t)x)), color); ++ break; + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++ // Common formats above. Rarer formats below. + +- s += 1 * 8; +- d += 1 * 3; +- n -= 1; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ wuffs_base__poke_u8__no_bounds_check( ++ row + ((size_t)x), ++ wuffs_base__color_u32_argb_premul__as__color_u8_gray(color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: ++ wuffs_base__poke_u16le__no_bounds_check( ++ row + (2 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u16_gray(color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: ++ wuffs_base__poke_u16be__no_bounds_check( ++ row + (2 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u16_gray(color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: ++ wuffs_base__poke_u16le__no_bounds_check( ++ row + (2 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u16_alpha_gray_nonpremul( ++ color)); ++ break; + +- return len; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: ++ wuffs_base__poke_u8__no_bounds_check( ++ row + ((size_t)x), wuffs_base__pixel_palette__closest_element( ++ wuffs_base__pixel_buffer__palette(pb), ++ pb->pixcfg.private_impl.pixfmt, color)); ++ break; + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_premul__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ wuffs_base__poke_u16le__no_bounds_check( ++ row + (2 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ wuffs_base__poke_u24le__no_bounds_check(row + (3 * ((size_t)x)), color); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ wuffs_base__poke_u32le__no_bounds_check( ++ row + (4 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ wuffs_base__poke_u64le__no_bounds_check( ++ row + (8 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul( ++ color)); ++ break; + +- while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s2; +- d[1] = s1; +- d[2] = s0; ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ wuffs_base__poke_u24le__no_bounds_check( ++ row + (3 * ((size_t)x)), ++ wuffs_private_impl__swap_u32_argb_abgr(color)); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ wuffs_base__poke_u32le__no_bounds_check( ++ row + (4 * ((size_t)x)), ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ wuffs_private_impl__swap_u32_argb_abgr(color))); ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ wuffs_base__poke_u32le__no_bounds_check( ++ row + (4 * ((size_t)x)), ++ wuffs_private_impl__swap_u32_argb_abgr(color)); ++ break; + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++ default: ++ // TODO: support more formats. ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +- return len; ++ return wuffs_base__make_status(NULL); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgba_premul__src_over(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// -------- + +- while (n >= 1) { +- // Extract 16-bit color components. +- uint32_t dr = 0x101 * ((uint32_t)d[2]); +- uint32_t dg = 0x101 * ((uint32_t)d[1]); +- uint32_t db = 0x101 * ((uint32_t)d[0]); +- uint32_t sa = 0x101 * ((uint32_t)s[3]); +- uint32_t sb = 0x101 * ((uint32_t)s[2]); +- uint32_t sg = 0x101 * ((uint32_t)s[1]); +- uint32_t sr = 0x101 * ((uint32_t)s[0]); ++static inline void // ++wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xx( ++ wuffs_base__pixel_buffer* pb, ++ wuffs_base__rect_ie_u32 rect, ++ uint16_t color) { ++ size_t stride = pb->private_impl.planes[0].stride; ++ uint32_t width = wuffs_base__rect_ie_u32__width(&rect); ++ if ((stride == (2 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { ++ uint8_t* ptr = ++ pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); ++ uint32_t height = wuffs_base__rect_ie_u32__height(&rect); ++ size_t n; ++ for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { ++ wuffs_base__poke_u16le__no_bounds_check(ptr, color); ++ ptr += 2; ++ } ++ return; ++ } + +- // Calculate the inverse of the src-alpha: how much of the dst to keep. +- uint32_t ia = 0xFFFF - sa; ++ uint32_t y; ++ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { ++ uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + ++ (2 * ((size_t)rect.min_incl_x)); ++ uint32_t n; ++ for (n = width; n > 0; n--) { ++ wuffs_base__poke_u16le__no_bounds_check(ptr, color); ++ ptr += 2; ++ } ++ } ++} + +- // Composite src (premul) over dst (premul). +- dr = sr + ((dr * ia) / 0xFFFF); +- dg = sg + ((dg * ia) / 0xFFFF); +- db = sb + ((db * ia) / 0xFFFF); ++static inline void // ++wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxx( ++ wuffs_base__pixel_buffer* pb, ++ wuffs_base__rect_ie_u32 rect, ++ uint32_t color) { ++ size_t stride = pb->private_impl.planes[0].stride; ++ uint32_t width = wuffs_base__rect_ie_u32__width(&rect); ++ if ((stride == (3 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { ++ uint8_t* ptr = ++ pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); ++ uint32_t height = wuffs_base__rect_ie_u32__height(&rect); ++ size_t n; ++ for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { ++ wuffs_base__poke_u24le__no_bounds_check(ptr, color); ++ ptr += 3; ++ } ++ return; ++ } + +- // Convert from 16-bit color to 8-bit color. +- d[0] = (uint8_t)(db >> 8); +- d[1] = (uint8_t)(dg >> 8); +- d[2] = (uint8_t)(dr >> 8); ++ uint32_t y; ++ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { ++ uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + ++ (3 * ((size_t)rect.min_incl_x)); ++ uint32_t n; ++ for (n = width; n > 0; n--) { ++ wuffs_base__poke_u24le__no_bounds_check(ptr, color); ++ ptr += 3; ++ } ++ } ++} + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++static inline void // ++wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx( ++ wuffs_base__pixel_buffer* pb, ++ wuffs_base__rect_ie_u32 rect, ++ uint32_t color) { ++ size_t stride = pb->private_impl.planes[0].stride; ++ uint32_t width = wuffs_base__rect_ie_u32__width(&rect); ++ if ((stride == (4 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { ++ uint8_t* ptr = ++ pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); ++ uint32_t height = wuffs_base__rect_ie_u32__height(&rect); ++ size_t n; ++ for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { ++ wuffs_base__poke_u32le__no_bounds_check(ptr, color); ++ ptr += 4; ++ } ++ return; + } + +- return len; ++ uint32_t y; ++ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { ++ uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + ++ (4 * ((size_t)rect.min_incl_x)); ++ uint32_t n; ++ for (n = width; n > 0; n--) { ++ wuffs_base__poke_u32le__no_bounds_check(ptr, color); ++ ptr += 4; ++ } ++ } + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgr__rgbx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static inline void // ++wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx( ++ wuffs_base__pixel_buffer* pb, ++ wuffs_base__rect_ie_u32 rect, ++ uint64_t color) { ++ size_t stride = pb->private_impl.planes[0].stride; ++ uint32_t width = wuffs_base__rect_ie_u32__width(&rect); ++ if ((stride == (8 * ((uint64_t)width))) && (rect.min_incl_x == 0)) { ++ uint8_t* ptr = ++ pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y)); ++ uint32_t height = wuffs_base__rect_ie_u32__height(&rect); ++ size_t n; ++ for (n = ((size_t)width) * ((size_t)height); n > 0; n--) { ++ wuffs_base__poke_u64le__no_bounds_check(ptr, color); ++ ptr += 8; ++ } ++ return; ++ } + +- // TODO: unroll. ++ uint32_t y; ++ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { ++ uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) + ++ (8 * ((size_t)rect.min_incl_x)); ++ uint32_t n; ++ for (n = width; n > 0; n--) { ++ wuffs_base__poke_u64le__no_bounds_check(ptr, color); ++ ptr += 8; ++ } ++ } ++} + +- while (n >= 1) { +- uint8_t b0 = s[0]; +- uint8_t b1 = s[1]; +- uint8_t b2 = s[2]; +- d[0] = b2; +- d[1] = b1; +- d[2] = b0; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status // ++wuffs_base__pixel_buffer__set_color_u32_fill_rect( ++ wuffs_base__pixel_buffer* pb, ++ wuffs_base__rect_ie_u32 rect, ++ wuffs_base__color_u32_argb_premul color) { ++ if (!pb) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } else if (wuffs_base__rect_ie_u32__is_empty(&rect)) { ++ return wuffs_base__make_status(NULL); ++ } ++ wuffs_base__rect_ie_u32 bounds = ++ wuffs_base__pixel_config__bounds(&pb->pixcfg); ++ if (!wuffs_base__rect_ie_u32__contains_rect(&bounds, rect)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } + +- s += 1 * 4; +- d += 1 * 3; +- n -= 1; ++ if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) { ++ // TODO: support planar formats. ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +- return len; +-} ++ switch (pb->pixcfg.private_impl.pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(pb, rect, ++ color); ++ return wuffs_base__make_status(NULL); + +-// -------- ++ // Common formats above. Rarer formats below. + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xx( ++ pb, rect, ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color)); ++ return wuffs_base__make_status(NULL); + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxx(pb, rect, ++ color); ++ return wuffs_base__make_status(NULL); + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx( ++ pb, rect, ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ color)); ++ return wuffs_base__make_status(NULL); + +- return len; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx( ++ pb, rect, ++ wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul( ++ color)); ++ return wuffs_base__make_status(NULL); + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx( ++ pb, rect, ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ wuffs_private_impl__swap_u32_argb_abgr(color))); ++ return wuffs_base__make_status(NULL); + +- size_t n = len; +- while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__color_u64__as__color_u32( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx( ++ pb, rect, wuffs_private_impl__swap_u32_argb_abgr(color)); ++ return wuffs_base__make_status(NULL); ++ } + +- s += 1 * 8; +- d += 1 * 4; +- n -= 1; ++ uint32_t y; ++ for (y = rect.min_incl_y; y < rect.max_excl_y; y++) { ++ uint32_t x; ++ for (x = rect.min_incl_x; x < rect.max_excl_x; x++) { ++ wuffs_base__pixel_buffer__set_color_u32_at(pb, x, y, color); ++ } + } +- return len; ++ return wuffs_base__make_status(NULL); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- while (n >= 1) { +- uint64_t d0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); +- uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u64__as__color_u32( +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0))); ++// -------- + +- s += 1 * 8; +- d += 1 * 4; +- n -= 1; ++WUFFS_BASE__MAYBE_STATIC uint8_t // ++wuffs_base__pixel_palette__closest_element( ++ wuffs_base__slice_u8 palette_slice, ++ wuffs_base__pixel_format palette_format, ++ wuffs_base__color_u32_argb_premul c) { ++ size_t n = palette_slice.len / 4; ++ if (n > (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ n = (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4); + } ++ size_t best_index = 0; ++ uint64_t best_score = 0xFFFFFFFFFFFFFFFF; + +- return len; +-} +- +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // Work in 16-bit color. ++ uint32_t ca = 0x101 * (0xFF & (c >> 24)); ++ uint32_t cr = 0x101 * (0xFF & (c >> 16)); ++ uint32_t cg = 0x101 * (0xFF & (c >> 8)); ++ uint32_t cb = 0x101 * (0xFF & (c >> 0)); + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0)); ++ switch (palette_format.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: { ++ bool nonpremul = palette_format.repr == ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL; + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; ++ size_t i; ++ for (i = 0; i < n; i++) { ++ // Work in 16-bit color. ++ uint32_t pb = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 0])); ++ uint32_t pg = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 1])); ++ uint32_t pr = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 2])); ++ uint32_t pa = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 3])); ++ ++ // Convert to premultiplied alpha. ++ if (nonpremul && (pa != 0xFFFF)) { ++ pb = (pb * pa) / 0xFFFF; ++ pg = (pg * pa) / 0xFFFF; ++ pr = (pr * pa) / 0xFFFF; ++ } ++ ++ // These deltas are conceptually int32_t (signed) but after squaring, ++ // it's equivalent to work in uint32_t (unsigned). ++ pb -= cb; ++ pg -= cg; ++ pr -= cr; ++ pa -= ca; ++ uint64_t score = ((uint64_t)(pb * pb)) + ((uint64_t)(pg * pg)) + ++ ((uint64_t)(pr * pr)) + ((uint64_t)(pa * pa)); ++ if (best_score > score) { ++ best_score = score; ++ best_index = i; ++ } ++ } ++ break; ++ } + } + +- return len; ++ return (uint8_t)best_index; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++// -------- + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_nonpremul_premul_u32_axxx(d0, s0)); ++static inline uint32_t // ++wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx( ++ uint32_t dst_nonpremul, ++ uint32_t src_nonpremul) { ++ // Extract 16-bit color components. ++ // ++ // If the destination is transparent then SRC_OVER is equivalent to SRC: just ++ // return src_nonpremul. This isn't just an optimization (skipping the rest ++ // of the function's computation). It also preserves the nonpremul ++ // distinction between e.g. transparent red and transparent blue that would ++ // otherwise be lost by converting from nonpremul to premul and back. ++ uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24)); ++ if (da == 0) { ++ return src_nonpremul; ++ } ++ uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16)); ++ uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8)); ++ uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0)); ++ uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24)); ++ uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16)); ++ uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8)); ++ uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0)); + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; ++ // Convert dst from nonpremul to premul. ++ dr = (dr * da) / 0xFFFF; ++ dg = (dg * da) / 0xFFFF; ++ db = (db * da) / 0xFFFF; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert dst from premul to nonpremul. ++ if (da != 0) { ++ dr = (dr * 0xFFFF) / da; ++ dg = (dg * 0xFFFF) / da; ++ db = (db * 0xFFFF) / da; + } + +- return len; ++ // Convert from 16-bit color to 8-bit color. ++ da >>= 8; ++ dr >>= 8; ++ dg >>= 8; ++ db >>= 8; ++ ++ // Combine components. ++ return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__index_bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; ++static inline uint64_t // ++wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx( ++ uint64_t dst_nonpremul, ++ uint64_t src_nonpremul) { ++ // Extract components. ++ // ++ // If the destination is transparent then SRC_OVER is equivalent to SRC: just ++ // return src_nonpremul. This isn't just an optimization (skipping the rest ++ // of the function's computation). It also preserves the nonpremul ++ // distinction between e.g. transparent red and transparent blue that would ++ // otherwise be lost by converting from nonpremul to premul and back. ++ uint64_t da = 0xFFFF & (dst_nonpremul >> 48); ++ if (da == 0) { ++ return src_nonpremul; + } +- size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ uint64_t dr = 0xFFFF & (dst_nonpremul >> 32); ++ uint64_t dg = 0xFFFF & (dst_nonpremul >> 16); ++ uint64_t db = 0xFFFF & (dst_nonpremul >> 0); ++ uint64_t sa = 0xFFFF & (src_nonpremul >> 48); ++ uint64_t sr = 0xFFFF & (src_nonpremul >> 32); ++ uint64_t sg = 0xFFFF & (src_nonpremul >> 16); ++ uint64_t sb = 0xFFFF & (src_nonpremul >> 0); + +- // TODO: unroll. ++ // Convert dst from nonpremul to premul. ++ dr = (dr * da) / 0xFFFF; ++ dg = (dg * da) / 0xFFFF; ++ db = (db * da) / 0xFFFF; + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint64_t ia = 0xFFFF - sa; + +- s += 1 * 1; +- d += 1 * 4; +- n -= 1; ++ // Composite src (nonpremul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert dst from premul to nonpremul. ++ if (da != 0) { ++ dr = (dr * 0xFFFF) / da; ++ dg = (dg * 0xFFFF) / da; ++ db = (db * 0xFFFF) / da; + } + +- return len; ++ // Combine components. ++ return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static inline uint32_t // ++wuffs_private_impl__composite_nonpremul_premul_u32_axxx(uint32_t dst_nonpremul, ++ uint32_t src_premul) { ++ // Extract 16-bit color components. ++ uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24)); ++ uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16)); ++ uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8)); ++ uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0)); ++ uint32_t sa = 0x101 * (0xFF & (src_premul >> 24)); ++ uint32_t sr = 0x101 * (0xFF & (src_premul >> 16)); ++ uint32_t sg = 0x101 * (0xFF & (src_premul >> 8)); ++ uint32_t sb = 0x101 * (0xFF & (src_premul >> 0)); + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); ++ // Convert dst from nonpremul to premul. ++ dr = (dr * da) / 0xFFFF; ++ dg = (dg * da) / 0xFFFF; ++ db = (db * da) / 0xFFFF; + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert dst from premul to nonpremul. ++ if (da != 0) { ++ dr = (dr * 0xFFFF) / da; ++ dg = (dg * 0xFFFF) / da; ++ db = (db * 0xFFFF) / da; + } + +- return len; ++ // Convert from 16-bit color to 8-bit color. ++ da >>= 8; ++ dr >>= 8; ++ dg >>= 8; ++ db >>= 8; ++ ++ // Combine components. ++ return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static inline uint64_t // ++wuffs_private_impl__composite_nonpremul_premul_u64_axxx(uint64_t dst_nonpremul, ++ uint64_t src_premul) { ++ // Extract components. ++ uint64_t da = 0xFFFF & (dst_nonpremul >> 48); ++ uint64_t dr = 0xFFFF & (dst_nonpremul >> 32); ++ uint64_t dg = 0xFFFF & (dst_nonpremul >> 16); ++ uint64_t db = 0xFFFF & (dst_nonpremul >> 0); ++ uint64_t sa = 0xFFFF & (src_premul >> 48); ++ uint64_t sr = 0xFFFF & (src_premul >> 32); ++ uint64_t sg = 0xFFFF & (src_premul >> 16); ++ uint64_t sb = 0xFFFF & (src_premul >> 0); + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0)); ++ // Convert dst from nonpremul to premul. ++ dr = (dr * da) / 0xFFFF; ++ dg = (dg * da) / 0xFFFF; ++ db = (db * da) / 0xFFFF; + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint64_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert dst from premul to nonpremul. ++ if (da != 0) { ++ dr = (dr * 0xFFFF) / da; ++ dg = (dg * 0xFFFF) / da; ++ db = (db * 0xFFFF) / da; + } + +- return len; ++ // Combine components. ++ return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++static inline uint32_t // ++wuffs_private_impl__composite_premul_nonpremul_u32_axxx( ++ uint32_t dst_premul, ++ uint32_t src_nonpremul) { ++ // Extract 16-bit color components. ++ uint32_t da = 0x101 * (0xFF & (dst_premul >> 24)); ++ uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16)); ++ uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8)); ++ uint32_t db = 0x101 * (0xFF & (dst_premul >> 0)); ++ uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24)); ++ uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16)); ++ uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8)); ++ uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0)); + +- while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_nonpremul_premul_u32_axxx(d0, s0)); ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; + +- s += 1 * 4; +- d += 1 * 4; +- n -= 1; +- } ++ // Composite src (nonpremul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; + +- return len; ++ // Convert from 16-bit color to 8-bit color. ++ da >>= 8; ++ dr >>= 8; ++ dg >>= 8; ++ db >>= 8; ++ ++ // Combine components. ++ return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); ++} ++ ++static inline uint64_t // ++wuffs_private_impl__composite_premul_nonpremul_u64_axxx( ++ uint64_t dst_premul, ++ uint64_t src_nonpremul) { ++ // Extract components. ++ uint64_t da = 0xFFFF & (dst_premul >> 48); ++ uint64_t dr = 0xFFFF & (dst_premul >> 32); ++ uint64_t dg = 0xFFFF & (dst_premul >> 16); ++ uint64_t db = 0xFFFF & (dst_premul >> 0); ++ uint64_t sa = 0xFFFF & (src_nonpremul >> 48); ++ uint64_t sr = 0xFFFF & (src_nonpremul >> 32); ++ uint64_t sg = 0xFFFF & (src_nonpremul >> 16); ++ uint64_t sb = 0xFFFF & (src_nonpremul >> 0); ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint64_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Combine components. ++ return (db << 0) | (dg << 16) | (dr << 32) | (da << 48); ++} ++ ++static inline uint32_t // ++wuffs_private_impl__composite_premul_premul_u32_axxx(uint32_t dst_premul, ++ uint32_t src_premul) { ++ // Extract 16-bit color components. ++ uint32_t da = 0x101 * (0xFF & (dst_premul >> 24)); ++ uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16)); ++ uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8)); ++ uint32_t db = 0x101 * (0xFF & (dst_premul >> 0)); ++ uint32_t sa = 0x101 * (0xFF & (src_premul >> 24)); ++ uint32_t sr = 0x101 * (0xFF & (src_premul >> 16)); ++ uint32_t sg = 0x101 * (0xFF & (src_premul >> 8)); ++ uint32_t sb = 0x101 * (0xFF & (src_premul >> 0)); ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ da = sa + ((da * ia) / 0xFFFF); ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert from 16-bit color to 8-bit color. ++ da >>= 8; ++ dr >>= 8; ++ dg >>= 8; ++ db >>= 8; ++ ++ // Combine components. ++ return (db << 0) | (dg << 8) | (dr << 16) | (da << 24); + } + + // -------- + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++wuffs_private_impl__swizzle_squash_align4_bgr_565_8888(uint8_t* dst_ptr, ++ size_t dst_len, ++ const uint8_t* src_ptr, ++ size_t src_len, ++ bool nonpremul) { ++ size_t len = (dst_len < src_len ? dst_len : src_len) / 4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; +- while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- uint8_t s3 = s[3]; +- d[0] = s0; +- d[1] = s0; +- d[2] = s1; +- d[3] = s1; +- d[4] = s2; +- d[5] = s2; +- d[6] = s3; +- d[7] = s3; +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++ while (n--) { ++ uint32_t argb = wuffs_base__peek_u32le__no_bounds_check(s); ++ if (nonpremul) { ++ argb = ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(argb); ++ } ++ uint32_t b5 = 0x1F & (argb >> (8 - 5)); ++ uint32_t g6 = 0x3F & (argb >> (16 - 6)); ++ uint32_t r5 = 0x1F & (argb >> (24 - 5)); ++ uint32_t alpha = argb & 0xFF000000; ++ wuffs_base__poke_u32le__no_bounds_check( ++ d, alpha | (r5 << 11) | (g6 << 5) | (b5 << 0)); ++ s += 4; ++ d += 4; + } + return len; + } + ++// -------- ++ + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++wuffs_private_impl__swizzle_swap_rgb_bgr(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t len = (dst_len < src_len ? dst_len : src_len) / 3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; +- while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++ while (n--) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s2; ++ d[1] = s1; ++ d[2] = s0; ++ s += 3; ++ d += 3; + } + return len; + } + ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8; ++wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t len = (dst_len < src_len ? dst_len : src_len) / 4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; +- + size_t n = len; +- while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + +- s += 1 * 8; +- d += 1 * 8; +- n -= 1; ++ __m128i shuffle = _mm_set_epi8(+0x0F, +0x0C, +0x0D, +0x0E, // ++ +0x0B, +0x08, +0x09, +0x0A, // ++ +0x07, +0x04, +0x05, +0x06, // ++ +0x03, +0x00, +0x01, +0x02); ++ ++ while (n >= 4) { ++ __m128i x; ++ x = _mm_lddqu_si128((const __m128i*)(const void*)s); ++ x = _mm_shuffle_epi8(x, shuffle); ++ _mm_storeu_si128((__m128i*)(void*)d, x); ++ ++ s += 4 * 4; ++ d += 4 * 4; ++ n -= 4; ++ } ++ ++ while (n--) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ uint8_t s3 = s[3]; ++ d[0] = s2; ++ d[1] = s1; ++ d[2] = s0; ++ d[3] = s3; ++ s += 4; ++ d += 4; + } + return len; + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++wuffs_private_impl__swizzle_swap_rgbx_bgrx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t len = (dst_len < src_len ? dst_len : src_len) / 4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + + size_t n = len; +- while (n >= 1) { +- uint64_t s0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); +- wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++ while (n--) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ uint8_t s3 = s[3]; ++ d[0] = s2; ++ d[1] = s1; ++ d[2] = s0; ++ d[3] = s3; ++ s += 4; ++ d += 4; + } + return len; + } + +-static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- +- size_t n = len; +- while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), wuffs_base__composite_nonpremul_premul_u64_axxx(d0, s0)); ++// -------- + +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++static uint64_t // ++wuffs_private_impl__swizzle_copy_1_1(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t len = (dst_len < src_len) ? dst_len : src_len; ++ if (len > 0) { ++ memmove(dst_ptr, src_ptr, len); + } + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; ++wuffs_private_impl__swizzle_copy_2_2(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; ++ if (len > 0) { ++ memmove(dst_ptr, src_ptr, len * 2); + } +- size_t dst_len8 = dst_len / 8; +- size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; +- +- while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); ++ return len; ++} + +- s += 1 * 1; +- d += 1 * 8; +- n -= 1; ++static uint64_t // ++wuffs_private_impl__swizzle_copy_3_3(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len3 < src_len3) ? dst_len3 : src_len3; ++ if (len > 0) { ++ memmove(dst_ptr, src_ptr, len * 3); + } +- + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; ++wuffs_private_impl__swizzle_copy_4_4(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- +- size_t n = len; +- while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- uint8_t s3 = s[3]; +- d[0] = s2; +- d[1] = s2; +- d[2] = s1; +- d[3] = s1; +- d[4] = s0; +- d[5] = s0; +- d[6] = s3; +- d[7] = s3; +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ if (len > 0) { ++ memmove(dst_ptr, src_ptr, len * 4); + } + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_copy_8_8(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- +- size_t n = len; +- while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = +- wuffs_base__color_u32__as__color_u64(wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8; ++ if (len > 0) { ++ memmove(dst_ptr, src_ptr, len * 8); + } + return len; + } + ++// -------- ++ + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++wuffs_private_impl__swizzle_bgr_565__bgr(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; +- + size_t n = len; ++ ++ // TODO: unroll. ++ + while (n >= 1) { +- uint64_t s0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); +- wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); ++ uint32_t b5 = (uint32_t)(s[0] >> 3); ++ uint32_t g6 = (uint32_t)(s[1] >> 2); ++ uint32_t r5 = (uint32_t)(s[2] >> 3); ++ uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + +- s += 1 * 4; +- d += 1 * 8; ++ s += 1 * 3; ++ d += 1 * 2; + n -= 1; + } ++ + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; ++wuffs_private_impl__swizzle_bgr_565__bgrx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; +- + size_t n = len; ++ ++ // TODO: unroll. ++ + while (n >= 1) { +- uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); +- uint64_t s0 = +- wuffs_base__color_u32__as__color_u64(wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), wuffs_base__composite_nonpremul_premul_u64_axxx(d0, s0)); ++ uint32_t b5 = (uint32_t)(s[0] >> 3); ++ uint32_t g6 = (uint32_t)(s[1] >> 2); ++ uint32_t r5 = (uint32_t)(s[2] >> 3); ++ uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + + s += 1 * 4; +- d += 1 * 8; ++ d += 1 * 2; + n -= 1; + } ++ + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( ++wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22217,13 +23221,14 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( + // TODO: unroll. + + while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); + + s += 1 * 4; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22231,16 +23236,16 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src( ++wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22248,13 +23253,14 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src( + // TODO: unroll. + + while (n >= 1) { +- uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(s0)); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))))); + + s += 1 * 8; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22262,16 +23268,16 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over( ++wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22279,13 +23285,38 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)); ++ // Extract 16-bit color components. ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sr = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sb = 0x101 * ((uint32_t)s[0]); ++ ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); + + s += 1 * 4; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22293,16 +23324,16 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src_over( ++wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22310,16 +23341,38 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint64_t d0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); +- uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u64__as__color_u32( +- wuffs_base__composite_premul_nonpremul_u64_axxx(d0, s0))); ++ // Extract 16-bit color components. ++ uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); ++ uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); ++ uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); ++ uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); ++ ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); + + s += 1 * 8; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22327,16 +23380,15 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++wuffs_private_impl__swizzle_bgr_565__bgra_premul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22344,13 +23396,12 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_premul_premul_u32_axxx(d0, s0)); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); + + s += 1 * 4; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22358,19 +23409,16 @@ wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over( ++wuffs_private_impl__swizzle_bgr_565__bgra_premul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22378,14 +23426,38 @@ wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)); ++ // Extract 16-bit color components. ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sr = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sb = 0x101 * ((uint32_t)s[0]); + +- s += 1 * 1; +- d += 1 * 4; ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++ ++ s += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22393,16 +23465,15 @@ wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++wuffs_private_impl__swizzle_bgr_565__rgb(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22410,14 +23481,14 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( + // TODO: unroll. + + while (n >= 1) { +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); ++ uint32_t r5 = (uint32_t)(s[0] >> 3); ++ uint32_t g6 = (uint32_t)(s[1] >> 2); ++ uint32_t b5 = (uint32_t)(s[2] >> 3); ++ uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + +- s += 1 * 4; +- d += 1 * 4; ++ s += 1 * 3; ++ d += 1 * 2; + n -= 1; + } + +@@ -22425,16 +23496,16 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over( ++wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22442,14 +23513,15 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))))); + + s += 1 * 4; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22457,16 +23529,16 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src( ++wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22474,32 +23546,54 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src( + // TODO: unroll. + + while (n >= 1) { +- uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( +- s0))); +- +- s += 1 * 8; +- d += 1 * 4; +- n -= 1; ++ // Extract 16-bit color components. ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sb = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sr = 0x101 * ((uint32_t)s[0]); ++ ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++ ++ s += 1 * 4; ++ d += 1 * 2; ++ n -= 1; + } + + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src_over( +- uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++wuffs_private_impl__swizzle_bgr_565__rgba_premul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22507,17 +23601,14 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint64_t d0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); +- uint64_t s0 = wuffs_base__swap_u64_argb_abgr( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u64__as__color_u32( +- wuffs_base__composite_premul_nonpremul_u64_axxx(d0, s0))); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); + +- s += 1 * 8; +- d += 1 * 4; ++ s += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22525,47 +23616,70 @@ wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgra_premul__rgba_premul__src_over( ++wuffs_private_impl__swizzle_bgr_565__rgba_premul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len2 = dst_len / 2; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); +- uint32_t s0 = wuffs_base__swap_u32_argb_abgr( +- wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__composite_premul_premul_u32_axxx(d0, s0)); ++ // Extract 16-bit color components. ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sb = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sr = 0x101 * ((uint32_t)s[0]); ++ ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); + + s += 1 * 4; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__bgr(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++wuffs_private_impl__swizzle_bgr_565__y(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22573,12 +23687,13 @@ wuffs_base__pixel_swizzler__bgrw__bgr(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- 0xFF000000 | wuffs_base__peek_u24le__no_bounds_check(s + (0 * 3))); ++ uint32_t y5 = (uint32_t)(s[0] >> 3); ++ uint32_t y6 = (uint32_t)(s[0] >> 2); ++ uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + +- s += 1 * 3; +- d += 1 * 4; ++ s += 1 * 1; ++ d += 1 * 2; + n -= 1; + } + +@@ -22586,15 +23701,15 @@ wuffs_base__pixel_swizzler__bgrw__bgr(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__bgr_565(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++wuffs_private_impl__swizzle_bgr_565__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; + size_t src_len2 = src_len / 2; +- size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22602,12 +23717,13 @@ wuffs_base__pixel_swizzler__bgrw__bgr_565(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))); ++ uint32_t y5 = (uint32_t)(s[0] >> 3); ++ uint32_t y6 = (uint32_t)(s[0] >> 2); ++ uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565); + + s += 1 * 2; +- d += 1 * 4; ++ d += 1 * 2; + n -= 1; + } + +@@ -22615,15 +23731,15 @@ wuffs_base__pixel_swizzler__bgrw__bgr_565(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__bgrx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22631,100 +23747,121 @@ wuffs_base__pixel_swizzler__bgrw__bgrx(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- 0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); + +- s += 1 * 4; +- d += 1 * 4; ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ s0))); ++ ++ s += 1 * 2; ++ d += 1 * 2; + n -= 1; + } + + return len; + } + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__rgb__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- __m128i shuffle = _mm_set_epi8(+0x00, +0x09, +0x0A, +0x0B, // +- +0x00, +0x06, +0x07, +0x08, // +- +0x00, +0x03, +0x04, +0x05, // +- +0x00, +0x00, +0x01, +0x02); +- __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00); ++ // TODO: unroll. + +- while (n >= 6) { +- __m128i x; +- x = _mm_lddqu_si128((const __m128i*)(const void*)s); +- x = _mm_shuffle_epi8(x, shuffle); +- x = _mm_or_si128(x, or_ff); +- _mm_storeu_si128((__m128i*)(void*)d, x); ++ while (n >= 1) { ++ // Extract 16-bit color components. ++ uint32_t sa = 0x101 * ((uint32_t)s[1]); ++ uint32_t sy = 0x101 * ((uint32_t)s[0]); + +- s += 4 * 3; +- d += 4 * 4; +- n -= 4; +- } ++ // Convert from 565 color to 16-bit color. ++ uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)); ++ uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11); ++ uint32_t dr = (0x8421 * old_r5) >> 4; ++ uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5); ++ uint32_t dg = (0x1041 * old_g6) >> 2; ++ uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0); ++ uint32_t db = (0x8421 * old_b5) >> 4; + +- while (n >= 1) { +- uint8_t b0 = s[0]; +- uint8_t b1 = s[1]; +- uint8_t b2 = s[2]; +- d[0] = b2; +- d[1] = b1; +- d[2] = b0; +- d[3] = 0xFF; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; + +- s += 1 * 3; +- d += 1 * 4; ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sy * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sy * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sy * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 565 color and combine the components. ++ uint32_t new_r5 = 0x1F & (dr >> 11); ++ uint32_t new_g6 = 0x3F & (dg >> 10); ++ uint32_t new_b5 = 0x1F & (db >> 11); ++ uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565); ++ ++ s += 1 * 2; ++ d += 1 * 2; + n -= 1; + } + + return len; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__rgb(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++wuffs_private_impl__swizzle_bgr_565__index__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len2 = dst_len / 2; ++ size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ const size_t loop_unroll_count = 4; ++ ++ while (n >= loop_unroll_count) { ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4))); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (1 * 2), wuffs_base__peek_u16le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[1] * 4))); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (2 * 2), wuffs_base__peek_u16le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[2] * 4))); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (3 * 2), wuffs_base__peek_u16le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[3] * 4))); ++ ++ s += loop_unroll_count * 1; ++ d += loop_unroll_count * 2; ++ n -= loop_unroll_count; ++ } ++ + while (n >= 1) { +- uint8_t b0 = s[0]; +- uint8_t b1 = s[1]; +- uint8_t b2 = s[2]; +- d[0] = b2; +- d[1] = b1; +- d[2] = b0; +- d[3] = 0xFF; ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4))); + +- s += 1 * 3; +- d += 1 * 4; ++ s += 1 * 1; ++ d += 1 * 2; + n -= 1; + } + +@@ -22732,15 +23869,19 @@ wuffs_base__pixel_swizzler__bgrw__rgb(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw__rgbx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++wuffs_private_impl__swizzle_bgr_565__index_bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len2 = dst_len / 2; ++ size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22748,82 +23889,83 @@ wuffs_base__pixel_swizzler__bgrw__rgbx(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- uint8_t b0 = s[0]; +- uint8_t b1 = s[1]; +- uint8_t b2 = s[2]; +- d[0] = b2; +- d[1] = b1; +- d[2] = b0; +- d[3] = 0xFF; ++ uint32_t d0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2))); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ wuffs_base__poke_u16le__no_bounds_check( ++ d + (0 * 2), ++ wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565( ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0))); + +- s += 1 * 4; +- d += 1 * 4; ++ s += 1 * 1; ++ d += 1 * 2; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw_4x16le__bgr(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3; ++wuffs_private_impl__swizzle_bgr_565__index_binary_alpha__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len2 = dst_len / 2; ++ size_t len = (dst_len2 < src_len) ? dst_len2 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s0; +- d[1] = s0; +- d[2] = s1; +- d[3] = s1; +- d[4] = s2; +- d[5] = s2; +- d[6] = 0xFF; +- d[7] = 0xFF; ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)s0); ++ } + +- s += 1 * 3; +- d += 1 * 8; ++ s += 1 * 1; ++ d += 1 * 2; + n -= 1; + } + + return len; + } + ++// -------- ++ + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw_4x16le__bgr_565(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; ++wuffs_private_impl__swizzle_bgr__bgr_565(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; + size_t src_len2 = src_len / 2; +- size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), +- wuffs_base__color_u32__as__color_u64( +- wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); ++ uint32_t s0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))); ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + + s += 1 * 2; +- d += 1 * 8; ++ d += 1 * 3; + n -= 1; + } + +@@ -22831,87 +23973,46 @@ wuffs_base__pixel_swizzler__bgrw_4x16le__bgr_565(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__bgrw_4x16le__bgrx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; ++wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; + size_t src_len4 = src_len / 4; +- size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s0; +- d[1] = s0; +- d[2] = s1; +- d[3] = s1; +- d[4] = s2; +- d[5] = s2; +- d[6] = 0xFF; +- d[7] = 0xFF; +- +- s += 1 * 4; +- d += 1 * 8; +- n -= 1; +- } +- +- return len; +-} +- +-static uint64_t // +-wuffs_base__pixel_swizzler__bgrw_4x16le__rgb(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len3 = src_len / 3; +- size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3; +- uint8_t* d = dst_ptr; +- const uint8_t* s = src_ptr; +- size_t n = len; ++ // TODO: unroll. + + while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- uint8_t s2 = s[2]; +- d[0] = s2; +- d[1] = s2; +- d[2] = s1; +- d[3] = s1; +- d[4] = s0; +- d[5] = s0; +- d[6] = 0xFF; +- d[7] = 0xFF; ++ uint32_t s0 = ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + +- s += 1 * 3; +- d += 1 * 8; ++ s += 1 * 4; ++ d += 1 * 3; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__rgb__bgr_565(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len3 = dst_len / 3; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -22919,13 +24020,12 @@ wuffs_base__pixel_swizzler__rgb__bgr_565(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u24le__no_bounds_check( +- d + (0 * 3), +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); ++ uint32_t s0 = ++ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + +- s += 1 * 2; ++ s += 1 * 8; + d += 1 * 3; + n -= 1; + } +@@ -22933,154 +24033,200 @@ wuffs_base__pixel_swizzler__rgb__bgr_565(uint8_t* dst_ptr, + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src( ++wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; +- + size_t n = len; ++ ++ // TODO: unroll. ++ + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__color_u64__as__color_u32__swap_u32_argb_abgr( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sr = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sb = 0x101 * ((uint32_t)s[0]); + +- s += 1 * 8; +- d += 1 * 4; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); ++ ++ s += 1 * 4; ++ d += 1 * 3; + n -= 1; + } ++ + return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src_over( ++wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- size_t dst_len4 = dst_len / 4; ++ size_t dst_len3 = dst_len / 3; + size_t src_len8 = src_len / 8; +- size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- uint64_t d0 = wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); +- uint64_t s0 = wuffs_base__swap_u64_argb_abgr( +- wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__color_u64__as__color_u32( +- wuffs_base__composite_nonpremul_nonpremul_u64_axxx(d0, s0))); ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); ++ uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); ++ uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); ++ uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); ++ ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); + + s += 1 * 8; +- d += 1 * 4; ++ d += 1 * 3; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__rgbw__bgr_565(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len4 = dst_len / 4; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++wuffs_private_impl__swizzle_bgr__bgra_premul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- // TODO: unroll. +- + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), +- wuffs_base__swap_u32_argb_abgr( +- wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( +- wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s0; ++ d[1] = s1; ++ d[2] = s2; + +- s += 1 * 2; +- d += 1 * 4; ++ s += 1 * 4; ++ d += 1 * 3; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__index__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } ++wuffs_private_impl__swizzle_bgr__bgra_premul__src_over(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len3 = dst_len / 3; +- size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- const size_t loop_unroll_count = 4; ++ while (n >= 1) { ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sr = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sb = 0x101 * ((uint32_t)s[0]); + +- // The comparison in the while condition is ">", not ">=", because with +- // ">=", the last 4-byte store could write past the end of the dst slice. +- // +- // Each 4-byte store writes one too many bytes, but a subsequent store +- // will overwrite that with the correct byte. There is always another +- // store, whether a 4-byte store in this loop or a 1-byte store in the +- // next loop. +- while (n > loop_unroll_count) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (1 * 3), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[1] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (2 * 3), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[2] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (3 * 3), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[3] * 4))); ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; + +- s += loop_unroll_count * 1; +- d += loop_unroll_count * 3; +- n -= loop_unroll_count; ++ // Composite src (premul) over dst (premul). ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); ++ ++ s += 1 * 4; ++ d += 1 * 3; ++ n -= 1; + } + ++ return len; ++} ++ ++static uint64_t // ++wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; ++ ++ // TODO: unroll. ++ + while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); + wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + +- s += 1 * 1; ++ s += 1 * 4; + d += 1 * 3; + n -= 1; + } +@@ -23089,19 +24235,16 @@ wuffs_base__pixel_swizzler__xxx__index__src(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over( ++wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } + size_t dst_len3 = dst_len / 3; +- size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -23109,14 +24252,12 @@ wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over( + // TODO: unroll. + + while (n >= 1) { +- uint32_t d0 = +- wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000; +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- wuffs_base__poke_u24le__no_bounds_check( +- d + (0 * 3), wuffs_base__composite_premul_nonpremul_u32_axxx(d0, s0)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + +- s += 1 * 1; ++ s += 1 * 8; + d += 1 * 3; + n -= 1; + } +@@ -23125,60 +24266,46 @@ wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over( ++wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } + size_t dst_len3 = dst_len / 3; +- size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- const size_t loop_unroll_count = 4; ++ // TODO: unroll. + +- while (n >= loop_unroll_count) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); +- } +- uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[1] * 4)); +- if (s1) { +- wuffs_base__poke_u24le__no_bounds_check(d + (1 * 3), s1); +- } +- uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[2] * 4)); +- if (s2) { +- wuffs_base__poke_u24le__no_bounds_check(d + (2 * 3), s2); +- } +- uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[3] * 4)); +- if (s3) { +- wuffs_base__poke_u24le__no_bounds_check(d + (3 * 3), s3); +- } ++ while (n >= 1) { ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sb = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sr = 0x101 * ((uint32_t)s[0]); + +- s += loop_unroll_count * 1; +- d += loop_unroll_count * 3; +- n -= loop_unroll_count; +- } ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; + +- while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); +- } ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; + +- s += 1 * 1; ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); ++ ++ s += 1 * 4; + d += 1 * 3; + n -= 1; + } +@@ -23187,15 +24314,16 @@ wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__xxxx(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len3 = dst_len / 3; +- size_t src_len4 = src_len / 4; +- size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; +@@ -23203,10 +24331,29 @@ wuffs_base__pixel_swizzler__xxx__xxxx(uint8_t* dst_ptr, + // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u24le__no_bounds_check( +- d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6)); ++ uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4)); ++ uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2)); ++ uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0)); + +- s += 1 * 4; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (nonpremul) over dst (premul). ++ dr = ((sr * sa) + (dr * ia)) / 0xFFFF; ++ dg = ((sg * sa) + (dg * ia)) / 0xFFFF; ++ db = ((sb * sa) + (db * ia)) / 0xFFFF; ++ ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); ++ ++ s += 1 * 8; + d += 1 * 3; + n -= 1; + } +@@ -23215,27 +24362,28 @@ wuffs_base__pixel_swizzler__xxx__xxxx(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__y(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgr__rgba_premul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len3 = dst_len / 3; +- size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- // TODO: unroll. +- + while (n >= 1) { + uint8_t s0 = s[0]; +- d[0] = s0; +- d[1] = s0; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s2; ++ d[1] = s1; + d[2] = s0; + +- s += 1 * 1; ++ s += 1 * 4; + d += 1 * 3; + n -= 1; + } +@@ -23244,28 +24392,43 @@ wuffs_base__pixel_swizzler__xxx__y(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxx__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgr__rgba_premul__src_over(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len3 = dst_len / 3; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- // TODO: unroll. +- + while (n >= 1) { +- uint8_t s0 = s[0]; +- d[0] = s0; +- d[1] = s0; +- d[2] = s0; ++ // Extract 16-bit color components. ++ uint32_t dr = 0x101 * ((uint32_t)d[2]); ++ uint32_t dg = 0x101 * ((uint32_t)d[1]); ++ uint32_t db = 0x101 * ((uint32_t)d[0]); ++ uint32_t sa = 0x101 * ((uint32_t)s[3]); ++ uint32_t sb = 0x101 * ((uint32_t)s[2]); ++ uint32_t sg = 0x101 * ((uint32_t)s[1]); ++ uint32_t sr = 0x101 * ((uint32_t)s[0]); + +- s += 1 * 2; ++ // Calculate the inverse of the src-alpha: how much of the dst to keep. ++ uint32_t ia = 0xFFFF - sa; ++ ++ // Composite src (premul) over dst (premul). ++ dr = sr + ((dr * ia) / 0xFFFF); ++ dg = sg + ((dg * ia) / 0xFFFF); ++ db = sb + ((db * ia) / 0xFFFF); ++ ++ // Convert from 16-bit color to 8-bit color. ++ d[0] = (uint8_t)(db >> 8); ++ d[1] = (uint8_t)(dg >> 8); ++ d[2] = (uint8_t)(dr >> 8); ++ ++ s += 1 * 4; + d += 1 * 3; + n -= 1; + } +@@ -23273,114 +24436,63 @@ wuffs_base__pixel_swizzler__xxx__y_16be(uint8_t* dst_ptr, + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__index__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++wuffs_private_impl__swizzle_bgr__rgbx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- const size_t loop_unroll_count = 4; +- +- while (n >= loop_unroll_count) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (1 * 4), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[1] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (2 * 4), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[2] * 4))); +- wuffs_base__poke_u32le__no_bounds_check( +- d + (3 * 4), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[3] * 4))); +- +- s += loop_unroll_count * 1; +- d += loop_unroll_count * 4; +- n -= loop_unroll_count; +- } ++ // TODO: unroll. + + while (n >= 1) { +- wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4))); ++ uint8_t b0 = s[0]; ++ uint8_t b1 = s[1]; ++ uint8_t b2 = s[2]; ++ d[0] = b2; ++ d[1] = b1; ++ d[2] = b0; + +- s += 1 * 1; +- d += 1 * 4; ++ s += 1 * 4; ++ d += 1 * 3; + n -= 1; + } + + return len; + } + ++// -------- ++ + static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over( ++wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } + size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + +- const size_t loop_unroll_count = 4; +- +- while (n >= loop_unroll_count) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); +- } +- uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[1] * 4)); +- if (s1) { +- wuffs_base__poke_u32le__no_bounds_check(d + (1 * 4), s1); +- } +- uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[2] * 4)); +- if (s2) { +- wuffs_base__poke_u32le__no_bounds_check(d + (2 * 4), s2); +- } +- uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[3] * 4)); +- if (s3) { +- wuffs_base__poke_u32le__no_bounds_check(d + (3 * 4), s3); +- } +- +- s += loop_unroll_count * 1; +- d += loop_unroll_count * 4; +- n -= loop_unroll_count; +- } +- + while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); +- } ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); + +- s += 1 * 1; ++ s += 1 * 4; + d += 1 * 4; + n -= 1; + } +@@ -23388,75 +24500,88 @@ wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over( + return len; + } + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__y__x86_sse42(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; ++ + size_t n = len; ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), wuffs_base__color_u64__as__color_u32( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); + +- __m128i shuffle = _mm_set_epi8(+0x03, +0x03, +0x03, +0x03, // +- +0x02, +0x02, +0x02, +0x02, // +- +0x01, +0x01, +0x01, +0x01, // +- +0x00, +0x00, +0x00, +0x00); +- __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00, // +- -0x01, +0x00, +0x00, +0x00); +- +- while (n >= 4) { +- __m128i x; +- x = _mm_cvtsi32_si128((int)(wuffs_base__peek_u32le__no_bounds_check(s))); +- x = _mm_shuffle_epi8(x, shuffle); +- x = _mm_or_si128(x, or_ff); +- _mm_storeu_si128((__m128i*)(void*)d, x); +- +- s += 4 * 1; +- d += 4 * 4; +- n -= 4; ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; + } ++ return len; ++} ++ ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + + while (n >= 1) { ++ uint64_t d0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); ++ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); + wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); ++ d + (0 * 4), ++ wuffs_base__color_u64__as__color_u32( ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, ++ s0))); + +- s += 1 * 1; ++ s += 1 * 8; + d += 1 * 4; + n -= 1; + } + + return len; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + + static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__y(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len4 = dst_len / 4; +- size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); + wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); ++ d + (0 * 4), ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0)); + +- s += 1 * 1; ++ s += 1 * 4; + d += 1 * 4; + n -= 1; + } +@@ -23465,24 +24590,28 @@ wuffs_base__pixel_swizzler__xxxx__y(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxxx__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + size_t dst_len4 = dst_len / 4; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); + wuffs_base__poke_u32le__no_bounds_check( +- d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_premul_u32_axxx(d0, s0)); + +- s += 1 * 2; ++ s += 1 * 4; + d += 1 * 4; + n -= 1; + } +@@ -23490,33 +24619,36 @@ wuffs_base__pixel_swizzler__xxxx__y_16be(uint8_t* dst_ptr, + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__xxxxxxxx__index__src(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { + if (dst_palette_len != + WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { + return 0; + } +- size_t dst_len8 = dst_len / 8; +- size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), wuffs_base__color_u32__as__color_u64( +- wuffs_base__peek_u32le__no_bounds_check( +- dst_palette_ptr + ((size_t)s[0] * 4)))); ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); + + s += 1 * 1; +- d += 1 * 8; ++ d += 1 * 4; + n -= 1; + } + +@@ -23524,33 +24656,30 @@ wuffs_base__pixel_swizzler__xxxxxxxx__index__src(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxxxxxxx__index_binary_alpha__src_over( ++wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, + const uint8_t* src_ptr, + size_t src_len) { +- if (dst_palette_len != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return 0; +- } +- size_t dst_len8 = dst_len / 8; +- size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { +- uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + +- ((size_t)s[0] * 4)); +- if (s0) { +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), wuffs_base__color_u32__as__color_u64(s0)); +- } ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); + +- s += 1 * 1; +- d += 1 * 8; ++ s += 1 * 4; ++ d += 1 * 4; + n -= 1; + } + +@@ -23558,24 +24687,29 @@ wuffs_base__pixel_swizzler__xxxxxxxx__index_binary_alpha__src_over( + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxxxxxxx__y(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), 0xFFFF000000000000 | (0x010101010101 * (uint64_t)s[0])); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0)); + +- s += 1 * 1; +- d += 1 * 8; ++ s += 1 * 4; ++ d += 1 * 4; + n -= 1; + } + +@@ -23583,53 +24717,59 @@ wuffs_base__pixel_swizzler__xxxxxxxx__y(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__xxxxxxxx__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len8 = dst_len / 8; +- size_t src_len2 = src_len / 2; +- size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + + while (n >= 1) { +- uint64_t s0 = +- ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(s + (0 * 2)))); +- wuffs_base__poke_u64le__no_bounds_check( +- d + (0 * 8), 0xFFFF000000000000 | (0x000100010001 * s0)); ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_premul_u32_axxx(d0, s0)); + +- s += 1 * 2; +- d += 1 * 8; ++ s += 1 * 4; ++ d += 1 * 4; + n -= 1; + } + + return len; + } + +-// -------- +- + static uint64_t // +-wuffs_base__pixel_swizzler__y__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { ++wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; + size_t src_len2 = src_len / 2; +- size_t len = (dst_len < src_len2) ? dst_len : src_len2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- d[0] = s[0]; ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); + + s += 1 * 2; +- d += 1 * 1; ++ d += 1 * 4; + n -= 1; + } + +@@ -23637,27 +24777,31 @@ wuffs_base__pixel_swizzler__y__y_16be(uint8_t* dst_ptr, + } + + static uint64_t // +-wuffs_base__pixel_swizzler__y_16le__y_16be(uint8_t* dst_ptr, +- size_t dst_len, +- uint8_t* dst_palette_ptr, +- size_t dst_palette_len, +- const uint8_t* src_ptr, +- size_t src_len) { +- size_t dst_len2 = dst_len / 2; ++wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; + size_t src_len2 = src_len / 2; +- size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; + uint8_t* d = dst_ptr; + const uint8_t* s = src_ptr; + size_t n = len; + ++ // TODO: unroll. ++ + while (n >= 1) { +- uint8_t s0 = s[0]; +- uint8_t s1 = s[1]; +- d[0] = s1; +- d[1] = s0; ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0)); + + s += 1 * 2; +- d += 1 * 2; ++ d += 1 * 4; + n -= 1; + } + +@@ -23667,6862 +24811,6000 @@ wuffs_base__pixel_swizzler__y_16le__y_16be(uint8_t* dst_ptr, + // -------- + + static uint64_t // +-wuffs_base__pixel_swizzler__transparent_black_src( ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, +- uint64_t num_pixels, +- uint32_t dst_pixfmt_bytes_per_pixel) { +- uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel; +- if (n > num_pixels) { +- n = num_pixels; ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ ++ size_t n = len; ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ uint8_t s3 = s[3]; ++ d[0] = s0; ++ d[1] = s0; ++ d[2] = s1; ++ d[3] = s1; ++ d[4] = s2; ++ d[5] = s2; ++ d[6] = s3; ++ d[7] = s3; ++ ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; + } +- memset(dst_ptr, 0, ((size_t)(n * dst_pixfmt_bytes_per_pixel))); +- return n; ++ return len; + } + + static uint64_t // +-wuffs_base__pixel_swizzler__transparent_black_src_over( ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src_over( + uint8_t* dst_ptr, + size_t dst_len, + uint8_t* dst_palette_ptr, + size_t dst_palette_len, +- uint64_t num_pixels, +- uint32_t dst_pixfmt_bytes_per_pixel) { +- uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel; +- if (n > num_pixels) { +- n = num_pixels; ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); ++ ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; + } +- return n; ++ return len; + } + +-// -------- ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__y(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- return wuffs_base__pixel_swizzler__copy_1_1; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__bgr_565__y; ++ s += 1 * 8; ++ d += 1 * 8; ++ n -= 1; ++ } ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__xxx__y; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__xxxx__y__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__xxxx__y; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); ++ wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__xxxxxxxx__y; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; + } +- return NULL; ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__y_16be(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- return wuffs_base__pixel_swizzler__y__y_16be; +- +- case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: +- return wuffs_base__pixel_swizzler__y_16le__y_16be; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: +- return wuffs_base__pixel_swizzler__copy_2_2; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_premul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__bgr_565__y_16be; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; ++ } ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__xxx__y_16be; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len8 = dst_len / 8; ++ size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- return wuffs_base__pixel_swizzler__xxxx__y_16be; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__xxxxxxxx__y_16be; ++ s += 1 * 1; ++ d += 1 * 8; ++ n -= 1; + } +- return NULL; +-} + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__indexed__bgra_nonpremul( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_1_1; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- if (wuffs_base__pixel_swizzler__squash_align4_bgr_565_8888( +- dst_palette.ptr, dst_palette.len, src_palette.ptr, +- src_palette.len, true) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__bgr_565__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__bgr_565__index_bgra_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- if (wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over; +- } +- return NULL; ++ size_t n = len; ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ uint8_t s3 = s[3]; ++ d[0] = s2; ++ d[1] = s2; ++ d[2] = s1; ++ d[3] = s1; ++ d[4] = s0; ++ d[5] = s0; ++ d[6] = s3; ++ d[7] = s3; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__index_bgra_nonpremul__src_over; +- } +- return NULL; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxxxxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over; +- } +- return NULL; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- if (wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over; +- } +- return NULL; +- +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- if (wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxx__index_bgra_nonpremul__src_over; +- } +- return NULL; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; ++ } ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__index_bgra_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- if (wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- return wuffs_base__pixel_swizzler__bgra_premul__index_bgra_nonpremul__src_over; +- } +- return NULL; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- // TODO. +- break; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; + } +- return NULL; ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__indexed__bgra_binary( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_1_1; +- } +- return NULL; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- if (wuffs_base__pixel_swizzler__squash_align4_bgr_565_8888( +- dst_palette.ptr, dst_palette.len, src_palette.ptr, +- src_palette.len, false) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__index_binary_alpha__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over; +- } +- return NULL; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul( ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))); ++ wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over; +- } +- return NULL; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; ++ } ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: +- if (wuffs_base__slice_u8__copy_from_slice(dst_palette, src_palette) != +- WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxxxxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__xxxxxxxx__index_binary_alpha__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__xxx__index_binary_alpha__src_over; +- } +- return NULL; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_premul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- if (wuffs_base__pixel_swizzler__swap_rgbx_bgrx( +- dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, +- src_palette.len) != +- (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { +- return NULL; +- } +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__xxxx__index__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__xxxx__index_binary_alpha__src_over; +- } +- return NULL; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; + } +- return NULL; ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgr_565( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__copy_2_2; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- return wuffs_base__pixel_swizzler__bgr__bgr_565; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t s0 = ((uint64_t)(s[1]) * 0x0101000000000000) | ++ ((uint64_t)(s[0]) * 0x0000010101010101); ++ wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- return wuffs_base__pixel_swizzler__bgrw__bgr_565; ++ s += 1 * 2; ++ d += 1 * 8; ++ n -= 1; ++ } ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__bgrw_4x16le__bgr_565; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__rgb__bgr_565; ++ size_t n = len; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8)); ++ uint64_t s0 = ((uint64_t)(s[1]) * 0x0101000000000000) | ++ ((uint64_t)(s[0]) * 0x0000010101010101); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- return wuffs_base__pixel_swizzler__rgbw__bgr_565; ++ s += 1 * 2; ++ d += 1 * 8; ++ n -= 1; + } +- return NULL; ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgr(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__bgr_565__bgr; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- return wuffs_base__pixel_swizzler__copy_3_3; ++// -------- + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- return wuffs_base__pixel_swizzler__bgrw__bgr; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__bgrw_4x16le__bgr; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__swap_rgb_bgr; ++ while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__bgrw__rgb__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__bgrw__rgb; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; +-} + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgra_nonpremul( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_4_4; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over; +- } +- return NULL; ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- // TODO. +- break; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_nonpremul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- // TODO. +- break; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; ++ ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgra_nonpremul_4x16le( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_nonpremul_4x16le__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul_4x16le__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul_4x16le__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); ++ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u64__as__color_u32( ++ wuffs_private_impl__composite_premul_nonpremul_u64_axxx(d0, s0))); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_8_8; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over; +- } +- return NULL; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul_4x16le__src_over; +- } +- return NULL; ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- // TODO. +- break; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul_4x16le__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__rgba_nonpremul__bgra_nonpremul_4x16le__src_over; +- } +- break; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul_4x16le__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_premul_u32_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- // TODO. +- break; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; +-} + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgra_premul( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__bgra_premul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__bgra_premul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__bgra_premul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_4_4; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over; +- } +- return NULL; ++ s += 1 * 1; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__rgba_premul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_premul__src_over; +- } +- return NULL; +- } +- return NULL; +-} ++ // TODO: unroll. + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__bgrx(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__bgr_565__bgrx; ++ while (n >= 1) { ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- return wuffs_base__pixel_swizzler__xxx__xxxx; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- return wuffs_base__pixel_swizzler__bgrw__bgrx; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__bgrw_4x16le__bgrx; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- return wuffs_base__pixel_swizzler__copy_4_4; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__bgr__rgbx; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- return wuffs_base__pixel_swizzler__bgrw__rgbx; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; +-} + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__rgb(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- return wuffs_base__pixel_swizzler__bgr_565__rgb; +- +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- return wuffs_base__pixel_swizzler__swap_rgb_bgr; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__bgrw__rgb__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__bgrw__rgb; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- return wuffs_base__pixel_swizzler__bgrw_4x16le__rgb; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- return wuffs_base__pixel_swizzler__copy_3_3; ++ while (n >= 1) { ++ uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul( ++ s0))); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- return wuffs_base__pixel_swizzler__bgrw__bgr; ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; +-} +- +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__rgba_nonpremul( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__rgba_nonpremul__src_over; +- } +- return NULL; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__rgba_nonpremul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_nonpremul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_nonpremul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); ++ uint64_t s0 = wuffs_private_impl__swap_u64_argb_abgr( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u64__as__color_u32( ++ wuffs_private_impl__composite_premul_nonpremul_u64_axxx(d0, s0))); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- // TODO. +- break; ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__bgra_nonpremul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_4_4; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_nonpremul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_nonpremul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_premul_u32_axxx(d0, s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- // TODO. +- break; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; ++ ++ return len; + } + +-static wuffs_base__pixel_swizzler__func // +-wuffs_base__pixel_swizzler__prepare__rgba_premul( +- wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- switch (dst_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr_565__rgba_premul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__rgba_premul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__rgba_premul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul_4x16le__rgba_premul__src_over; +- } +- return NULL; ++ s += 1 * 2; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- if (wuffs_base__cpu_arch__have_x86_sse42()) { +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx__x86_sse42; +- } +-#endif +- return wuffs_base__pixel_swizzler__swap_rgbx_bgrx; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__rgba_premul__src_over; +- } +- return NULL; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgr__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgr__bgra_premul__src_over; +- } +- return NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_nonpremul__bgra_premul__src_over; +- } +- return NULL; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- return wuffs_base__pixel_swizzler__copy_4_4; +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- return wuffs_base__pixel_swizzler__bgra_premul__bgra_premul__src_over; +- } +- return NULL; ++ while (n >= 1) { ++ uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)); ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); ++ ++ s += 1 * 2; ++ d += 1 * 4; ++ n -= 1; + } +- return NULL; ++ ++ return len; + } + + // -------- + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +-wuffs_base__pixel_swizzler__prepare(wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_format dst_pixfmt, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__pixel_format src_pixfmt, +- wuffs_base__slice_u8 src_palette, +- wuffs_base__pixel_blend blend) { +- if (!p) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- p->private_impl.func = NULL; +- p->private_impl.transparent_black_func = NULL; +- p->private_impl.dst_pixfmt_bytes_per_pixel = 0; +- p->private_impl.src_pixfmt_bytes_per_pixel = 0; ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__bgr(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- wuffs_base__pixel_swizzler__func func = NULL; +- wuffs_base__pixel_swizzler__transparent_black_func transparent_black_func = +- NULL; ++ // TODO: unroll. + +- uint32_t dst_pixfmt_bits_per_pixel = +- wuffs_base__pixel_format__bits_per_pixel(&dst_pixfmt); +- if ((dst_pixfmt_bits_per_pixel == 0) || +- ((dst_pixfmt_bits_per_pixel & 7) != 0)) { +- return wuffs_base__make_status( +- wuffs_base__error__unsupported_pixel_swizzler_option); +- } ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ 0xFF000000 | wuffs_base__peek_u24le__no_bounds_check(s + (0 * 3))); + +- uint32_t src_pixfmt_bits_per_pixel = +- wuffs_base__pixel_format__bits_per_pixel(&src_pixfmt); +- if ((src_pixfmt_bits_per_pixel == 0) || +- ((src_pixfmt_bits_per_pixel & 7) != 0)) { +- return wuffs_base__make_status( +- wuffs_base__error__unsupported_pixel_swizzler_option); ++ s += 1 * 3; ++ d += 1 * 4; ++ n -= 1; + } + +- // TODO: support many more formats. +- +- switch (blend) { +- case WUFFS_BASE__PIXEL_BLEND__SRC: +- transparent_black_func = +- wuffs_base__pixel_swizzler__transparent_black_src; +- break; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: +- transparent_black_func = +- wuffs_base__pixel_swizzler__transparent_black_src_over; +- break; +- } ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__bgr_565(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- switch (src_pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- func = wuffs_base__pixel_swizzler__prepare__y(p, dst_pixfmt, dst_palette, +- src_palette, blend); +- break; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: +- func = wuffs_base__pixel_swizzler__prepare__y_16be( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))); + +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- func = wuffs_base__pixel_swizzler__prepare__indexed__bgra_nonpremul( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ s += 1 * 2; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: +- func = wuffs_base__pixel_swizzler__prepare__indexed__bgra_binary( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- func = wuffs_base__pixel_swizzler__prepare__bgr_565( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__bgrx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- func = wuffs_base__pixel_swizzler__prepare__bgr( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ // TODO: unroll. + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- func = wuffs_base__pixel_swizzler__prepare__bgra_nonpremul( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ 0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- func = wuffs_base__pixel_swizzler__prepare__bgra_nonpremul_4x16le( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; ++ } + +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- func = wuffs_base__pixel_swizzler__prepare__bgra_premul( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ return len; ++} + +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- func = wuffs_base__pixel_swizzler__prepare__bgrx( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- func = wuffs_base__pixel_swizzler__prepare__rgb( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ __m128i shuffle = _mm_set_epi8(+0x00, +0x0B, +0x0A, +0x09, // ++ +0x00, +0x08, +0x07, +0x06, // ++ +0x00, +0x05, +0x04, +0x03, // ++ +0x00, +0x02, +0x01, +0x00); ++ __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- func = wuffs_base__pixel_swizzler__prepare__rgba_nonpremul( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ while (n >= 6) { ++ __m128i x; ++ x = _mm_lddqu_si128((const __m128i*)(const void*)s); ++ x = _mm_shuffle_epi8(x, shuffle); ++ x = _mm_or_si128(x, or_ff); ++ _mm_storeu_si128((__m128i*)(void*)d, x); + +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- func = wuffs_base__pixel_swizzler__prepare__rgba_premul( +- p, dst_pixfmt, dst_palette, src_palette, blend); +- break; ++ s += 4 * 3; ++ d += 4 * 4; ++ n -= 4; + } + +- p->private_impl.func = func; +- p->private_impl.transparent_black_func = transparent_black_func; +- p->private_impl.dst_pixfmt_bytes_per_pixel = dst_pixfmt_bits_per_pixel / 8; +- p->private_impl.src_pixfmt_bytes_per_pixel = src_pixfmt_bits_per_pixel / 8; +- return wuffs_base__make_status( +- func ? NULL : wuffs_base__error__unsupported_pixel_swizzler_option); +-} ++ while (n >= 1) { ++ uint8_t b0 = s[0]; ++ uint8_t b1 = s[1]; ++ uint8_t b2 = s[2]; ++ d[0] = b0; ++ d[1] = b1; ++ d[2] = b2; ++ d[3] = 0xFF; + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( +- const wuffs_base__pixel_swizzler* p, +- uint32_t up_to_num_pixels, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- const uint8_t** ptr_iop_r, +- const uint8_t* io2_r) { +- if (p && p->private_impl.func) { +- const uint8_t* iop_r = *ptr_iop_r; +- uint64_t src_len = wuffs_base__u64__min( +- ((uint64_t)up_to_num_pixels) * +- ((uint64_t)p->private_impl.src_pixfmt_bytes_per_pixel), +- ((uint64_t)(io2_r - iop_r))); +- uint64_t n = +- (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, +- dst_palette.len, iop_r, (size_t)src_len); +- *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel; +- return n; ++ s += 1 * 3; ++ d += 1 * 4; ++ n -= 1; + } +- return 0; +-} + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- const uint8_t** ptr_iop_r, +- const uint8_t* io2_r) { +- if (p && p->private_impl.func) { +- const uint8_t* iop_r = *ptr_iop_r; +- uint64_t src_len = ((uint64_t)(io2_r - iop_r)); +- uint64_t n = +- (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, +- dst_palette.len, iop_r, (size_t)src_len); +- *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel; +- return n; +- } +- return 0; ++ return len; + } + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- wuffs_base__slice_u8 src) { +- if (p && p->private_impl.func) { +- return (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, +- dst_palette.len, src.ptr, src.len); +- } +- return 0; +-} ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-WUFFS_BASE__MAYBE_STATIC uint64_t // +-wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__slice_u8 dst, +- wuffs_base__slice_u8 dst_palette, +- uint64_t num_pixels) { +- if (p && p->private_impl.transparent_black_func) { +- return (*p->private_impl.transparent_black_func)( +- dst.ptr, dst.len, dst_palette.ptr, dst_palette.len, num_pixels, +- p->private_impl.dst_pixfmt_bytes_per_pixel); ++ __m128i shuffle = _mm_set_epi8(+0x00, +0x09, +0x0A, +0x0B, // ++ +0x00, +0x06, +0x07, +0x08, // ++ +0x00, +0x03, +0x04, +0x05, // ++ +0x00, +0x00, +0x01, +0x02); ++ __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00); ++ ++ while (n >= 6) { ++ __m128i x; ++ x = _mm_lddqu_si128((const __m128i*)(const void*)s); ++ x = _mm_shuffle_epi8(x, shuffle); ++ x = _mm_or_si128(x, or_ff); ++ _mm_storeu_si128((__m128i*)(void*)d, x); ++ ++ s += 4 * 3; ++ d += 4 * 4; ++ n -= 4; + } +- return 0; +-} + +-// -------- ++ while (n >= 1) { ++ uint8_t b0 = s[0]; ++ uint8_t b1 = s[1]; ++ uint8_t b2 = s[2]; ++ d[0] = b2; ++ d[1] = b1; ++ d[2] = b0; ++ d[3] = 0xFF; + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx_x86_avx2( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2); ++ s += 1 * 3; ++ d += 1 * 4; ++ n -= 1; ++ } + +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_rgbx_x86_avx2( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2); ++ return len; ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-#if defined(__GNUC__) && !defined(__clang__) +-// No-op. +-#else +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column, +- bool last_column); +-#endif +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__rgb(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-// -------- ++ while (n >= 1) { ++ uint8_t b0 = s[0]; ++ uint8_t b1 = s[1]; ++ uint8_t b2 = s[2]; ++ d[0] = b2; ++ d[1] = b1; ++ d[2] = b0; ++ d[3] = 0xFF; + +-static inline uint32_t // +-wuffs_base__u32__max_of_4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) { +- return wuffs_base__u32__max( // +- wuffs_base__u32__max(a, b), // +- wuffs_base__u32__max(c, d)); +-} ++ s += 1 * 3; ++ d += 1 * 4; ++ n -= 1; ++ } + +-static inline uint32_t // +-wuffs_base__u32__min_of_5(uint32_t a, +- uint32_t b, +- uint32_t c, +- uint32_t d, +- uint32_t e) { +- return wuffs_base__u32__min( // +- wuffs_base__u32__min( // +- wuffs_base__u32__min(a, b), // +- wuffs_base__u32__min(c, d)), // +- e); ++ return len; + } + +-// -------- ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw__rgbx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-typedef void (*wuffs_base__pixel_swizzler__swizzle_ycc__convert_4_func)( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2, +- const uint8_t* up3); ++ // TODO: unroll. + +-static void // +-wuffs_base__pixel_swizzler__swizzle_cmyk__convert_4_general( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2, +- const uint8_t* up3) { +- for (; x < x_end; x++) { +- // It's called CMYK but, but for Adobe CMYK JPEG images in practice, it's +- // RGBW: 0xFFu means no ink instead of full ink. Note that a double +- // inversion is a no-op, so inversions might be implicit in the code below. +- uint32_t r = ((uint32_t)(*up0++)); +- uint32_t g = ((uint32_t)(*up1++)); +- uint32_t b = ((uint32_t)(*up2++)); +- uint32_t w = ((uint32_t)(*up3++)); +- r = ((r * w) + 0x7Fu) / 0xFFu; +- g = ((g * w) + 0x7Fu) / 0xFFu; +- b = ((b * w) + 0x7Fu) / 0xFFu; +- wuffs_base__pixel_buffer__set_color_u32_at( +- dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u)); +- } +-} ++ while (n >= 1) { ++ uint8_t b0 = s[0]; ++ uint8_t b1 = s[1]; ++ uint8_t b2 = s[2]; ++ d[0] = b2; ++ d[1] = b1; ++ d[2] = b0; ++ d[3] = 0xFF; + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycck__convert_4_general( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2, +- const uint8_t* up3) { +- for (; x < x_end; x++) { +- // We invert once again: 0xFFu means no ink instead of full ink. +- uint32_t color = // +- wuffs_base__color_ycc__as__color_u32( // +- *up0++, *up1++, *up2++); +- uint32_t r = 0xFFu - (0xFFu & (color >> 16u)); +- uint32_t g = 0xFFu - (0xFFu & (color >> 8u)); +- uint32_t b = 0xFFu - (0xFFu & (color >> 0u)); +- uint32_t w = ((uint32_t)(*up3++)); +- r = ((r * w) + 0x7Fu) / 0xFFu; +- g = ((g * w) + 0x7Fu) / 0xFFu; +- b = ((b * w) + 0x7Fu) / 0xFFu; +- wuffs_base__pixel_buffer__set_color_u32_at( +- dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u)); ++ s += 1 * 4; ++ d += 1 * 4; ++ n -= 1; + } ++ ++ return len; + } + + // -------- + +-typedef void (*wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func)( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2); ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw_4x16le__bgr(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-static void // +-wuffs_base__pixel_swizzler__swizzle_rgb__convert_3_general( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- for (; x < x_end; x++) { +- uint32_t color = 0xFF000000u | // +- (((uint32_t)(*up0++)) << 16u) | // +- (((uint32_t)(*up1++)) << 8u) | // +- (((uint32_t)(*up2++)) << 0u); +- wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color); +- } +-} ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s0; ++ d[1] = s0; ++ d[2] = s1; ++ d[3] = s1; ++ d[4] = s2; ++ d[5] = s2; ++ d[6] = 0xFF; ++ d[7] = 0xFF; + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_general( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- for (; x < x_end; x++) { +- uint32_t color = // +- wuffs_base__color_ycc__as__color_u32( // +- *up0++, *up1++, *up2++); +- wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color); ++ s += 1 * 3; ++ d += 1 * 8; ++ n -= 1; + } +-} +- +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- size_t dst_stride = dst->private_impl.planes[0].stride; +- uint8_t* dst_iter = dst->private_impl.planes[0].ptr + +- (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); + +- for (; x < x_end; x++) { +- uint32_t color = // +- wuffs_base__color_ycc__as__color_u32( // +- *up0++, *up1++, *up2++); +- wuffs_base__poke_u32le__no_bounds_check(dst_iter, color); +- dst_iter += 4u; +- } ++ return len; + } + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_rgbx( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- size_t dst_stride = dst->private_impl.planes[0].stride; +- uint8_t* dst_iter = dst->private_impl.planes[0].ptr + +- (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw_4x16le__bgr_565(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- for (; x < x_end; x++) { +- uint32_t color = // +- wuffs_base__color_ycc__as__color_u32_abgr( // +- *up0++, *up1++, *up2++); +- wuffs_base__poke_u32le__no_bounds_check(dst_iter, color); +- dst_iter += 4u; ++ while (n >= 1) { ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), ++ wuffs_base__color_u32__as__color_u64( ++ wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); ++ ++ s += 1 * 2; ++ d += 1 * 8; ++ n -= 1; + } ++ ++ return len; + } + +-// -------- ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw_4x16le__bgrx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-// wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upsamples to a +-// destination slice at least 480 (YCCK) or 672 (YCC) bytes long and whose +-// src_len (multiplied by 1, 2, 3 or 4) is positive but no more than that. This +-// 480 or 672 length is just under 1/4 or 1/3 of the scratch_buffer_2k slice +-// length. Both (480 * 4) = 1920 and (672 * 3) = 2016 are less than 2048. +-// +-// 480 and 672 are nice round numbers because a JPEG MCU is 1, 2, 3 or 4 blocks +-// wide and each block is 8 pixels wide. We have: +-// 480 = 1 * 8 * 60, 672 = 1 * 8 * 84 +-// 480 = 2 * 8 * 30, 672 = 2 * 8 * 42 +-// 480 = 3 * 8 * 20, 672 = 3 * 8 * 28 +-// 480 = 4 * 8 * 15, 672 = 4 * 8 * 21 +-// +-// Box filters are equivalent to nearest neighbor upsampling. These ignore the +-// src_ptr_minor, h1v2_bias, first_column and last_column arguments. +-// +-// Triangle filters use a 3:1 ratio (in 1 dimension), or 9:3:3:1 (in 2 +-// dimensions), which is higher quality (less blocky) but also higher +-// computational effort. +-// +-// In theory, we could use triangle filters for any (inv_h, inv_v) combination. +-// In practice, matching libjpeg-turbo, we only implement it for the common +-// chroma subsampling ratios (YCC420, YCC422 or YCC440), corresponding to an +-// (inv_h, inv_v) pair of (2, 2), (2, 1) or (1, 2). +-typedef const uint8_t* ( +- *wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func)( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, // Nearest row. +- const uint8_t* src_ptr_minor, // Adjacent row, alternating above or below. +- size_t src_len, +- uint32_t h1v2_bias, +- bool first_column, +- bool last_column); ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s0; ++ d[1] = s0; ++ d[2] = s1; ++ d[3] = s1; ++ d[4] = s2; ++ d[5] = s2; ++ d[6] = 0xFF; ++ d[7] = 0xFF; + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1vn_box( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor_ignored, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column_ignored, +- bool last_column_ignored) { +- return src_ptr_major; ++ s += 1 * 4; ++ d += 1 * 8; ++ n -= 1; ++ } ++ ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2vn_box( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor_ignored, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column_ignored, +- bool last_column_ignored) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp = src_ptr_major; +- while (src_len--) { +- uint8_t sv = *sp++; +- *dp++ = sv; +- *dp++ = sv; ++static uint64_t // ++wuffs_private_impl__swizzle_bgrw_4x16le__rgb(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len3 = src_len / 3; ++ size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; ++ ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ uint8_t s2 = s[2]; ++ d[0] = s2; ++ d[1] = s2; ++ d[2] = s1; ++ d[3] = s1; ++ d[4] = s0; ++ d[5] = s0; ++ d[6] = 0xFF; ++ d[7] = 0xFF; ++ ++ s += 1 * 3; ++ d += 1 * 8; ++ n -= 1; + } +- return dst_ptr; ++ ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h3vn_box( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor_ignored, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column_ignored, +- bool last_column_ignored) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp = src_ptr_major; +- while (src_len--) { +- uint8_t sv = *sp++; +- *dp++ = sv; +- *dp++ = sv; +- *dp++ = sv; ++// -------- ++ ++static uint64_t // ++wuffs_private_impl__swizzle_rgb__bgr_565(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; ++ ++ // TODO: unroll. ++ ++ while (n >= 1) { ++ wuffs_base__poke_u24le__no_bounds_check( ++ d + (0 * 3), ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); ++ ++ s += 1 * 2; ++ d += 1 * 3; ++ n -= 1; + } +- return dst_ptr; ++ ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h4vn_box( ++// -------- ++ ++static uint64_t // ++wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src( + uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor_ignored, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column_ignored, +- bool last_column_ignored) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp = src_ptr_major; +- while (src_len--) { +- uint8_t sv = *sp++; +- *dp++ = sv; +- *dp++ = sv; +- *dp++ = sv; +- *dp++ = sv; ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ ++ size_t n = len; ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__color_u64__as__color_u32__swap_u32_argb_abgr( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))); ++ ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; + } +- return dst_ptr; ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1v2_triangle( ++static uint64_t // ++wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src_over( + uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor, +- size_t src_len, +- uint32_t h1v2_bias, +- bool first_column, +- bool last_column) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp_major = src_ptr_major; +- const uint8_t* sp_minor = src_ptr_minor; +- while (src_len--) { +- *dp++ = (uint8_t)(((3u * ((uint32_t)(*sp_major++))) + // +- (1u * ((uint32_t)(*sp_minor++))) + // +- h1v2_bias) >> +- 2u); ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len8 = src_len / 8; ++ size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; ++ ++ while (n >= 1) { ++ uint64_t d0 = wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4))); ++ uint64_t s0 = wuffs_private_impl__swap_u64_argb_abgr( ++ wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_base__color_u64__as__color_u32( ++ wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, ++ s0))); ++ ++ s += 1 * 8; ++ d += 1 * 4; ++ n -= 1; + } +- return dst_ptr; ++ ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v1_triangle( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column, +- bool last_column) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp = src_ptr_major; ++// -------- + +- if (first_column) { +- src_len--; +- if ((src_len <= 0u) && last_column) { +- uint8_t sv = *sp++; +- *dp++ = sv; +- *dp++ = sv; +- return dst_ptr; +- } +- uint32_t svp1 = sp[+1]; +- uint8_t sv = *sp++; +- *dp++ = sv; +- *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svp1 + 2u) >> 2u); +- if (src_len <= 0u) { +- return dst_ptr; +- } +- } ++static uint64_t // ++wuffs_private_impl__swizzle_rgbw__bgr_565(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- if (last_column) { +- src_len--; +- } ++ // TODO: unroll. + +- for (; src_len > 0u; src_len--) { +- uint32_t svm1 = sp[-1]; +- uint32_t svp1 = sp[+1]; +- uint32_t sv3 = 3u * (uint32_t)(*sp++); +- *dp++ = (uint8_t)((sv3 + svm1 + 1u) >> 2u); +- *dp++ = (uint8_t)((sv3 + svp1 + 2u) >> 2u); +- } ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), ++ wuffs_private_impl__swap_u32_argb_abgr( ++ wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul( ++ wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))))); + +- if (last_column) { +- uint32_t svm1 = sp[-1]; +- uint8_t sv = *sp++; +- *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svm1 + 1u) >> 2u); +- *dp++ = sv; ++ s += 1 * 2; ++ d += 1 * 4; ++ n -= 1; + } + +- return dst_ptr; ++ return len; + } + +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v2_triangle( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column, +- bool last_column) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp_major = src_ptr_major; +- const uint8_t* sp_minor = src_ptr_minor; ++// -------- + +- if (first_column) { +- src_len--; +- if ((src_len <= 0u) && last_column) { +- uint32_t sv = (12u * ((uint32_t)(*sp_major++))) + // +- (4u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + 7u) >> 4u); +- return dst_ptr; +- } ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__index__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len3 = dst_len / 3; ++ size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- uint32_t sv_major_m1 = sp_major[-0]; // Clamp offset to zero. +- uint32_t sv_minor_m1 = sp_minor[-0]; // Clamp offset to zero. +- uint32_t sv_major_p1 = sp_major[+1]; +- uint32_t sv_minor_p1 = sp_minor[+1]; ++ const size_t loop_unroll_count = 4; + +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); +- if (src_len <= 0u) { +- return dst_ptr; +- } +- } ++ // The comparison in the while condition is ">", not ">=", because with ++ // ">=", the last 4-byte store could write past the end of the dst slice. ++ // ++ // Each 4-byte store writes one too many bytes, but a subsequent store ++ // will overwrite that with the correct byte. There is always another ++ // store, whether a 4-byte store in this loop or a 1-byte store in the ++ // next loop. ++ while (n > loop_unroll_count) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (1 * 3), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[1] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (2 * 3), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[2] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (3 * 3), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[3] * 4))); + +- if (last_column) { +- src_len--; ++ s += loop_unroll_count * 1; ++ d += loop_unroll_count * 3; ++ n -= loop_unroll_count; + } + +- for (; src_len > 0u; src_len--) { +- uint32_t sv_major_m1 = sp_major[-1]; +- uint32_t sv_minor_m1 = sp_minor[-1]; +- uint32_t sv_major_p1 = sp_major[+1]; +- uint32_t sv_minor_p1 = sp_minor[+1]; ++ while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); + +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ s += 1 * 1; ++ d += 1 * 3; ++ n -= 1; + } + +- if (last_column) { +- uint32_t sv_major_m1 = sp_major[-1]; +- uint32_t sv_minor_m1 = sp_minor[-1]; +- uint32_t sv_major_p1 = sp_major[+0]; // Clamp offset to zero. +- uint32_t sv_minor_p1 = sp_minor[+0]; // Clamp offset to zero. ++ return len; ++} + +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; + } ++ size_t dst_len3 = dst_len / 3; ++ size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- return dst_ptr; +-} ++ // TODO: unroll. + +-// wuffs_base__pixel_swizzler__swizzle_ycc__upsample_funcs is indexed by inv_h +-// and then inv_v. +-static const wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_funcs[4][4] = { +- { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1vn_box, +- }, +- { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2vn_box, +- }, +- { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h3vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h3vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h3vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h3vn_box, +- }, +- { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h4vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h4vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h4vn_box, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h4vn_box, +- }, +-}; ++ while (n >= 1) { ++ uint32_t d0 = ++ wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000; ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ wuffs_base__poke_u24le__no_bounds_check( ++ d + (0 * 3), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +-static inline uint32_t // +-wuffs_base__pixel_swizzler__has_triangle_upsampler(uint32_t inv_h, +- uint32_t inv_v) { +- if (inv_h == 1u) { +- return inv_v == 2u; +- } else if (inv_h == 2u) { +- return (inv_v == 1u) || (inv_v == 2u); ++ s += 1 * 1; ++ d += 1 * 3; ++ n -= 1; + } +- return false; ++ ++ return len; + } + +-// -------- ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len3 = dst_len / 3; ++ size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-// All of the wuffs_base__pixel_swizzler__swizzle_ycc__etc functions have +-// preconditions. See all of the checks made in +-// wuffs_base__pixel_swizzler__swizzle_ycck before calling these functions. For +-// example, (width > 0) is a precondition, but there are many more. ++ const size_t loop_unroll_count = 4; + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycck__general__triangle_filter_edge_row( +- wuffs_base__pixel_buffer* dst, +- uint32_t width, +- uint32_t y, +- const uint8_t* src_ptr0, +- const uint8_t* src_ptr1, +- const uint8_t* src_ptr2, +- const uint8_t* src_ptr3, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t stride3, +- uint32_t inv_h0, +- uint32_t inv_h1, +- uint32_t inv_h2, +- uint32_t inv_h3, +- uint32_t inv_v0, +- uint32_t inv_v1, +- uint32_t inv_v2, +- uint32_t inv_v3, +- uint32_t half_width_for_2to1, +- uint32_t h1v2_bias, +- uint8_t* scratch_buffer_2k_ptr, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc0, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc1, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc2, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc3, +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_4_func conv4func) { +- const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0); +- const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1); +- const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2); +- const uint8_t* src3 = src_ptr3 + ((y / inv_v3) * (size_t)stride3); +- uint32_t total_src_len0 = 0u; +- uint32_t total_src_len1 = 0u; +- uint32_t total_src_len2 = 0u; +- uint32_t total_src_len3 = 0u; +- +- uint32_t x = 0u; +- while (x < width) { +- bool first_column = x == 0u; +- uint32_t end = x + 480u; +- if (end > width) { +- end = width; ++ while (n >= loop_unroll_count) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++ } ++ uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[1] * 4)); ++ if (s1) { ++ wuffs_base__poke_u24le__no_bounds_check(d + (1 * 3), s1); ++ } ++ uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[2] * 4)); ++ if (s2) { ++ wuffs_base__poke_u24le__no_bounds_check(d + (2 * 3), s2); ++ } ++ uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[3] * 4)); ++ if (s3) { ++ wuffs_base__poke_u24le__no_bounds_check(d + (3 * 3), s3); + } + +- uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; +- uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; +- uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; +- uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3; +- total_src_len0 += src_len0; +- total_src_len1 += src_len1; +- total_src_len2 += src_len2; +- total_src_len3 += src_len3; +- +- const uint8_t* src_ptr_x0 = src0 + (x / inv_h0); +- const uint8_t* up0 = (*upfunc0)( // +- scratch_buffer_2k_ptr + (0u * 480u), // +- src_ptr_x0, // +- src_ptr_x0, // +- src_len0, // +- h1v2_bias, // +- first_column, // +- (total_src_len0 >= half_width_for_2to1)); +- +- const uint8_t* src_ptr_x1 = src1 + (x / inv_h1); +- const uint8_t* up1 = (*upfunc1)( // +- scratch_buffer_2k_ptr + (1u * 480u), // +- src_ptr_x1, // +- src_ptr_x1, // +- src_len1, // +- h1v2_bias, // +- first_column, // +- (total_src_len1 >= half_width_for_2to1)); +- +- const uint8_t* src_ptr_x2 = src2 + (x / inv_h2); +- const uint8_t* up2 = (*upfunc2)( // +- scratch_buffer_2k_ptr + (2u * 480u), // +- src_ptr_x2, // +- src_ptr_x2, // +- src_len2, // +- h1v2_bias, // +- first_column, // +- (total_src_len2 >= half_width_for_2to1)); ++ s += loop_unroll_count * 1; ++ d += loop_unroll_count * 3; ++ n -= loop_unroll_count; ++ } + +- const uint8_t* src_ptr_x3 = src3 + (x / inv_h3); +- const uint8_t* up3 = (*upfunc3)( // +- scratch_buffer_2k_ptr + (3u * 480u), // +- src_ptr_x3, // +- src_ptr_x3, // +- src_len3, // +- h1v2_bias, // +- first_column, // +- (total_src_len3 >= half_width_for_2to1)); ++ while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0); ++ } + +- (*conv4func)(dst, x, end, y, up0, up1, up2, up3); +- x = end; ++ s += 1 * 1; ++ d += 1 * 3; ++ n -= 1; + } +-} +- +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycck__general__triangle_filter( +- wuffs_base__pixel_buffer* dst, +- uint32_t width, +- uint32_t height, +- const uint8_t* src_ptr0, +- const uint8_t* src_ptr1, +- const uint8_t* src_ptr2, +- const uint8_t* src_ptr3, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t stride3, +- uint32_t inv_h0, +- uint32_t inv_h1, +- uint32_t inv_h2, +- uint32_t inv_h3, +- uint32_t inv_v0, +- uint32_t inv_v1, +- uint32_t inv_v2, +- uint32_t inv_v3, +- uint32_t half_width_for_2to1, +- uint32_t half_height_for_2to1, +- uint8_t* scratch_buffer_2k_ptr, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func (*upfuncs)[4][4], +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_4_func conv4func) { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc0 = +- (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc1 = +- (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc2 = +- (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc3 = +- (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u]; + +- // First row. +- uint32_t h1v2_bias = 1u; +- wuffs_base__pixel_swizzler__swizzle_ycck__general__triangle_filter_edge_row( +- dst, width, 0u, // +- src_ptr0, src_ptr1, src_ptr2, src_ptr3, // +- stride0, stride1, stride2, stride3, // +- inv_h0, inv_h1, inv_h2, inv_h3, // +- inv_v0, inv_v1, inv_v2, inv_v3, // +- half_width_for_2to1, // +- h1v2_bias, // +- scratch_buffer_2k_ptr, // +- upfunc0, upfunc1, upfunc2, upfunc3, conv4func); +- h1v2_bias = 2u; ++ return len; ++} + +- // Middle rows. +- bool last_row = height == 2u * half_height_for_2to1; +- uint32_t y_max_excl = last_row ? (height - 1u) : height; +- uint32_t y; +- for (y = 1u; y < y_max_excl; y++) { +- const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0); +- const uint8_t* src0_minor = +- (inv_v0 != 2u) +- ? src0_major +- : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0)); +- const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1); +- const uint8_t* src1_minor = +- (inv_v1 != 2u) +- ? src1_major +- : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1)); +- const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2); +- const uint8_t* src2_minor = +- (inv_v2 != 2u) +- ? src2_major +- : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2)); +- const uint8_t* src3_major = src_ptr3 + ((y / inv_v3) * (size_t)stride3); +- const uint8_t* src3_minor = +- (inv_v3 != 2u) +- ? src3_major +- : ((y & 1u) ? (src3_major + stride3) : (src3_major - stride3)); +- uint32_t total_src_len0 = 0u; +- uint32_t total_src_len1 = 0u; +- uint32_t total_src_len2 = 0u; +- uint32_t total_src_len3 = 0u; ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__xxxx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- uint32_t x = 0u; +- while (x < width) { +- bool first_column = x == 0u; +- uint32_t end = x + 480u; +- if (end > width) { +- end = width; +- } ++ // TODO: unroll. + +- uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; +- uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; +- uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; +- uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3; +- total_src_len0 += src_len0; +- total_src_len1 += src_len1; +- total_src_len2 += src_len2; +- total_src_len3 += src_len3; ++ while (n >= 1) { ++ wuffs_base__poke_u24le__no_bounds_check( ++ d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); + +- const uint8_t* up0 = (*upfunc0)( // +- scratch_buffer_2k_ptr + (0u * 480u), // +- src0_major + (x / inv_h0), // +- src0_minor + (x / inv_h0), // +- src_len0, // +- h1v2_bias, // +- first_column, // +- (total_src_len0 >= half_width_for_2to1)); ++ s += 1 * 4; ++ d += 1 * 3; ++ n -= 1; ++ } + +- const uint8_t* up1 = (*upfunc1)( // +- scratch_buffer_2k_ptr + (1u * 480u), // +- src1_major + (x / inv_h1), // +- src1_minor + (x / inv_h1), // +- src_len1, // +- h1v2_bias, // +- first_column, // +- (total_src_len1 >= half_width_for_2to1)); ++ return len; ++} + +- const uint8_t* up2 = (*upfunc2)( // +- scratch_buffer_2k_ptr + (2u * 480u), // +- src2_major + (x / inv_h2), // +- src2_minor + (x / inv_h2), // +- src_len2, // +- h1v2_bias, // +- first_column, // +- (total_src_len2 >= half_width_for_2to1)); ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__y(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t len = (dst_len3 < src_len) ? dst_len3 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- const uint8_t* up3 = (*upfunc3)( // +- scratch_buffer_2k_ptr + (3u * 480u), // +- src3_major + (x / inv_h3), // +- src3_minor + (x / inv_h3), // +- src_len3, // +- h1v2_bias, // +- first_column, // +- (total_src_len3 >= half_width_for_2to1)); ++ // TODO: unroll. + +- (*conv4func)(dst, x, end, y, up0, up1, up2, up3); +- x = end; +- } ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ d[0] = s0; ++ d[1] = s0; ++ d[2] = s0; + +- h1v2_bias ^= 3u; ++ s += 1 * 1; ++ d += 1 * 3; ++ n -= 1; + } + +- // Last row. +- if (y_max_excl != height) { +- wuffs_base__pixel_swizzler__swizzle_ycck__general__triangle_filter_edge_row( +- dst, width, height - 1u, // +- src_ptr0, src_ptr1, src_ptr2, src_ptr3, // +- stride0, stride1, stride2, stride3, // +- inv_h0, inv_h1, inv_h2, inv_h3, // +- inv_v0, inv_v1, inv_v2, inv_v3, // +- half_width_for_2to1, // +- h1v2_bias, // +- scratch_buffer_2k_ptr, // +- upfunc0, upfunc1, upfunc2, upfunc3, conv4func); +- } ++ return len; + } + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__general__triangle_filter_edge_row( +- wuffs_base__pixel_buffer* dst, +- uint32_t width, +- uint32_t y, +- const uint8_t* src_ptr0, +- const uint8_t* src_ptr1, +- const uint8_t* src_ptr2, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t inv_h0, +- uint32_t inv_h1, +- uint32_t inv_h2, +- uint32_t inv_v0, +- uint32_t inv_v1, +- uint32_t inv_v2, +- uint32_t half_width_for_2to1, +- uint32_t h1v2_bias, +- uint8_t* scratch_buffer_2k_ptr, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc0, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc1, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc2, +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func conv3func) { +- const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0); +- const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1); +- const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2); +- uint32_t total_src_len0 = 0u; +- uint32_t total_src_len1 = 0u; +- uint32_t total_src_len2 = 0u; +- +- uint32_t x = 0u; +- while (x < width) { +- bool first_column = x == 0u; +- uint32_t end = x + 672u; +- if (end > width) { +- end = width; +- } +- +- uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; +- uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; +- uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; +- total_src_len0 += src_len0; +- total_src_len1 += src_len1; +- total_src_len2 += src_len2; +- +- const uint8_t* src_ptr_x0 = src0 + (x / inv_h0); +- const uint8_t* up0 = (*upfunc0)( // +- scratch_buffer_2k_ptr + (0u * 672u), // +- src_ptr_x0, // +- src_ptr_x0, // +- src_len0, // +- h1v2_bias, // +- first_column, // +- (total_src_len0 >= half_width_for_2to1)); ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- const uint8_t* src_ptr_x1 = src1 + (x / inv_h1); +- const uint8_t* up1 = (*upfunc1)( // +- scratch_buffer_2k_ptr + (1u * 672u), // +- src_ptr_x1, // +- src_ptr_x1, // +- src_len1, // +- h1v2_bias, // +- first_column, // +- (total_src_len1 >= half_width_for_2to1)); ++ // TODO: unroll. + +- const uint8_t* src_ptr_x2 = src2 + (x / inv_h2); +- const uint8_t* up2 = (*upfunc2)( // +- scratch_buffer_2k_ptr + (2u * 672u), // +- src_ptr_x2, // +- src_ptr_x2, // +- src_len2, // +- h1v2_bias, // +- first_column, // +- (total_src_len2 >= half_width_for_2to1)); ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ d[0] = s0; ++ d[1] = s0; ++ d[2] = s0; + +- (*conv3func)(dst, x, end, y, up0, up1, up2); +- x = end; ++ s += 1 * 2; ++ d += 1 * 3; ++ n -= 1; + } +-} + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__general__triangle_filter( +- wuffs_base__pixel_buffer* dst, +- uint32_t width, +- uint32_t height, +- const uint8_t* src_ptr0, +- const uint8_t* src_ptr1, +- const uint8_t* src_ptr2, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t inv_h0, +- uint32_t inv_h1, +- uint32_t inv_h2, +- uint32_t inv_v0, +- uint32_t inv_v1, +- uint32_t inv_v2, +- uint32_t half_width_for_2to1, +- uint32_t half_height_for_2to1, +- uint8_t* scratch_buffer_2k_ptr, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func (*upfuncs)[4][4], +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func conv3func) { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc0 = +- (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc1 = +- (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc2 = +- (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; ++ return len; ++} + +- // First row. +- uint32_t h1v2_bias = 1u; +- wuffs_base__pixel_swizzler__swizzle_ycc__general__triangle_filter_edge_row( +- dst, width, 0u, // +- src_ptr0, src_ptr1, src_ptr2, // +- stride0, stride1, stride2, // +- inv_h0, inv_h1, inv_h2, // +- inv_v0, inv_v1, inv_v2, // +- half_width_for_2to1, // +- h1v2_bias, // +- scratch_buffer_2k_ptr, // +- upfunc0, upfunc1, upfunc2, conv3func); +- h1v2_bias = 2u; ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__ya_nonpremul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // Middle rows. +- bool last_row = height == 2u * half_height_for_2to1; +- uint32_t y_max_excl = last_row ? (height - 1u) : height; +- uint32_t y; +- for (y = 1u; y < y_max_excl; y++) { +- const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0); +- const uint8_t* src0_minor = +- (inv_v0 != 2u) +- ? src0_major +- : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0)); +- const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1); +- const uint8_t* src1_minor = +- (inv_v1 != 2u) +- ? src1_major +- : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1)); +- const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2); +- const uint8_t* src2_minor = +- (inv_v2 != 2u) +- ? src2_major +- : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2)); +- uint32_t total_src_len0 = 0u; +- uint32_t total_src_len1 = 0u; +- uint32_t total_src_len2 = 0u; ++ // TODO: unroll. + +- uint32_t x = 0u; +- while (x < width) { +- bool first_column = x == 0u; +- uint32_t end = x + 672u; +- if (end > width) { +- end = width; +- } ++ while (n >= 1) { ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u24le__no_bounds_check( ++ d + (0 * 3), ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0)); + +- uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; +- uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; +- uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; +- total_src_len0 += src_len0; +- total_src_len1 += src_len1; +- total_src_len2 += src_len2; ++ s += 1 * 2; ++ d += 1 * 3; ++ n -= 1; ++ } + +- const uint8_t* up0 = (*upfunc0)( // +- scratch_buffer_2k_ptr + (0u * 672u), // +- src0_major + (x / inv_h0), // +- src0_minor + (x / inv_h0), // +- src_len0, // +- h1v2_bias, // +- first_column, // +- (total_src_len0 >= half_width_for_2to1)); ++ return len; ++} + +- const uint8_t* up1 = (*upfunc1)( // +- scratch_buffer_2k_ptr + (1u * 672u), // +- src1_major + (x / inv_h1), // +- src1_minor + (x / inv_h1), // +- src_len1, // +- h1v2_bias, // +- first_column, // +- (total_src_len1 >= half_width_for_2to1)); ++static uint64_t // ++wuffs_private_impl__swizzle_xxx__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len3 = dst_len / 3; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- const uint8_t* up2 = (*upfunc2)( // +- scratch_buffer_2k_ptr + (2u * 672u), // +- src2_major + (x / inv_h2), // +- src2_minor + (x / inv_h2), // +- src_len2, // +- h1v2_bias, // +- first_column, // +- (total_src_len2 >= half_width_for_2to1)); ++ // TODO: unroll. + +- (*conv3func)(dst, x, end, y, up0, up1, up2); +- x = end; +- } ++ while (n >= 1) { ++ uint32_t d0 = ++ wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000; ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ wuffs_base__poke_u24le__no_bounds_check( ++ d + (0 * 3), ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +- h1v2_bias ^= 3u; ++ s += 1 * 2; ++ d += 1 * 3; ++ n -= 1; + } + +- // Last row. +- if (y_max_excl != height) { +- wuffs_base__pixel_swizzler__swizzle_ycc__general__triangle_filter_edge_row( +- dst, width, height - 1u, // +- src_ptr0, src_ptr1, src_ptr2, // +- stride0, stride1, stride2, // +- inv_h0, inv_h1, inv_h2, // +- inv_v0, inv_v1, inv_v2, // +- half_width_for_2to1, // +- h1v2_bias, // +- scratch_buffer_2k_ptr, // +- upfunc0, upfunc1, upfunc2, conv3func); +- } ++ return len; + } + +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__general__box_filter( +- wuffs_base__pixel_buffer* dst, +- uint32_t width, +- uint32_t height, +- const uint8_t* src_ptr0, +- const uint8_t* src_ptr1, +- const uint8_t* src_ptr2, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t inv_h0, +- uint32_t inv_h1, +- uint32_t inv_h2, +- uint32_t inv_v0, +- uint32_t inv_v1, +- uint32_t inv_v2, +- uint32_t half_width_for_2to1, +- uint32_t half_height_for_2to1, +- uint8_t* scratch_buffer_2k_ptr, +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func (*upfuncs)[4][4], +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func conv3func) { +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc0 = +- (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc1 = +- (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfunc2 = +- (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; +- +- uint32_t y; +- for (y = 0u; y < height; y++) { +- const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0); +- const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1); +- const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2); ++// -------- + +- uint32_t x = 0u; +- while (x < width) { +- uint32_t end = x + 672u; +- if (end > width) { +- end = width; +- } ++static uint64_t // ++wuffs_private_impl__swizzle_xxxx__index__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; +- uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; +- uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ const size_t loop_unroll_count = 4; + +- const uint8_t* up0 = (*upfunc0)( // +- scratch_buffer_2k_ptr + (0u * 672u), // +- src0_major + (x / inv_h0), // +- src0_major + (x / inv_h0), // +- src_len0, // +- 0u, false, false); ++ while (n >= loop_unroll_count) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (1 * 4), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[1] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (2 * 4), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[2] * 4))); ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (3 * 4), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[3] * 4))); + +- const uint8_t* up1 = (*upfunc1)( // +- scratch_buffer_2k_ptr + (1u * 672u), // +- src1_major + (x / inv_h1), // +- src1_major + (x / inv_h1), // +- src_len1, // +- 0u, false, false); ++ s += loop_unroll_count * 1; ++ d += loop_unroll_count * 4; ++ n -= loop_unroll_count; ++ } + +- const uint8_t* up2 = (*upfunc2)( // +- scratch_buffer_2k_ptr + (2u * 672u), // +- src2_major + (x / inv_h2), // +- src2_major + (x / inv_h2), // +- src_len2, // +- 0u, false, false); ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4))); + +- (*conv3func)(dst, x, end, y, up0, up1, up2); +- x = end; +- } ++ s += 1 * 1; ++ d += 1 * 4; ++ n -= 1; + } +-} + +-// -------- ++ return len; ++} + +-// wuffs_base__pixel_swizzler__flattened_length is like +-// wuffs_base__table__flattened_length but returns uint64_t (not size_t) and +-// also accounts for subsampling. + static uint64_t // +-wuffs_base__pixel_swizzler__flattened_length(uint32_t width, +- uint32_t height, +- uint32_t stride, +- uint32_t inv_h, +- uint32_t inv_v) { +- uint64_t scaled_width = (((uint64_t)width) + (inv_h - 1u)) / inv_h; +- uint64_t scaled_height = (((uint64_t)height) + (inv_v - 1u)) / inv_v; +- if (scaled_height <= 0u) { +- return 0u; ++wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; + } +- return ((scaled_height - 1u) * stride) + scaled_width; +-} ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status // +-wuffs_base__pixel_swizzler__swizzle_ycck( +- const wuffs_base__pixel_swizzler* p, +- wuffs_base__pixel_buffer* dst, +- wuffs_base__slice_u8 dst_palette, +- uint32_t width, +- uint32_t height, +- wuffs_base__slice_u8 src0, +- wuffs_base__slice_u8 src1, +- wuffs_base__slice_u8 src2, +- wuffs_base__slice_u8 src3, +- uint32_t width0, +- uint32_t width1, +- uint32_t width2, +- uint32_t width3, +- uint32_t height0, +- uint32_t height1, +- uint32_t height2, +- uint32_t height3, +- uint32_t stride0, +- uint32_t stride1, +- uint32_t stride2, +- uint32_t stride3, +- uint8_t h0, +- uint8_t h1, +- uint8_t h2, +- uint8_t h3, +- uint8_t v0, +- uint8_t v1, +- uint8_t v2, +- uint8_t v3, +- bool is_rgb_or_cmyk, +- bool triangle_filter_for_2to1, +- wuffs_base__slice_u8 scratch_buffer_2k) { +- if (!p) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } else if (!dst || (width > 0xFFFFu) || (height > 0xFFFFu) || // +- (4u <= ((unsigned int)h0 - 1u)) || // +- (4u <= ((unsigned int)h1 - 1u)) || // +- (4u <= ((unsigned int)h2 - 1u)) || // +- (4u <= ((unsigned int)v0 - 1u)) || // +- (4u <= ((unsigned int)v1 - 1u)) || // +- (4u <= ((unsigned int)v2 - 1u)) || // +- (scratch_buffer_2k.len < 2048u)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ const size_t loop_unroll_count = 4; ++ ++ while (n >= loop_unroll_count) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); ++ } ++ uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[1] * 4)); ++ if (s1) { ++ wuffs_base__poke_u32le__no_bounds_check(d + (1 * 4), s1); ++ } ++ uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[2] * 4)); ++ if (s2) { ++ wuffs_base__poke_u32le__no_bounds_check(d + (2 * 4), s2); ++ } ++ uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[3] * 4)); ++ if (s3) { ++ wuffs_base__poke_u32le__no_bounds_check(d + (3 * 4), s3); ++ } ++ ++ s += loop_unroll_count * 1; ++ d += loop_unroll_count * 4; ++ n -= loop_unroll_count; + } +- if ((h3 != 0u) || (v3 != 0u)) { +- if ((4u <= ((unsigned int)h3 - 1u)) || // +- (4u <= ((unsigned int)v3 - 1u))) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ ++ while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0); + } ++ ++ s += 1 * 1; ++ d += 1 * 4; ++ n -= 1; + } + +- uint32_t max_incl_h = wuffs_base__u32__max_of_4(h0, h1, h2, h3); +- uint32_t max_incl_v = wuffs_base__u32__max_of_4(v0, v1, v2, v3); ++ return len; ++} + +- // Calculate the inverse h and v ratios. +- // +- // It also canonicalizes (h=2 and max_incl_h=4) as equivalent to (h=1 and +- // max_incl_h=2). In both cases, the inv_h value is 2. +- uint32_t inv_h0 = max_incl_h / h0; +- uint32_t inv_h1 = max_incl_h / h1; +- uint32_t inv_h2 = max_incl_h / h2; +- uint32_t inv_h3 = h3 ? (max_incl_h / h3) : 0u; +- uint32_t inv_v0 = max_incl_v / v0; +- uint32_t inv_v1 = max_incl_v / v1; +- uint32_t inv_v2 = max_incl_v / v2; +- uint32_t inv_v3 = v3 ? (max_incl_v / v3) : 0u; ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++static uint64_t // ++wuffs_private_impl__swizzle_xxxx__y__x86_sse42(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- uint32_t half_width_for_2to1 = (width + 1u) / 2u; +- uint32_t half_height_for_2to1 = (height + 1u) / 2u; +- +- width = wuffs_base__u32__min_of_5( // +- width, // +- width0 * inv_h0, // +- width1 * inv_h1, // +- width2 * inv_h2, // +- wuffs_base__pixel_config__width(&dst->pixcfg)); +- height = wuffs_base__u32__min_of_5( // +- height, // +- height0 * inv_v0, // +- height1 * inv_v1, // +- height2 * inv_v2, // +- wuffs_base__pixel_config__height(&dst->pixcfg)); ++ __m128i shuffle = _mm_set_epi8(+0x03, +0x03, +0x03, +0x03, // ++ +0x02, +0x02, +0x02, +0x02, // ++ +0x01, +0x01, +0x01, +0x01, // ++ +0x00, +0x00, +0x00, +0x00); ++ __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00, // ++ -0x01, +0x00, +0x00, +0x00); + +- if (((h0 * inv_h0) != max_incl_h) || // +- ((h1 * inv_h1) != max_incl_h) || // +- ((h2 * inv_h2) != max_incl_h) || // +- ((v0 * inv_v0) != max_incl_v) || // +- ((v1 * inv_v1) != max_incl_v) || // +- ((v2 * inv_v2) != max_incl_v) || // +- (src0.len < wuffs_base__pixel_swizzler__flattened_length( +- width, height, stride0, inv_h0, inv_v0)) || +- (src1.len < wuffs_base__pixel_swizzler__flattened_length( +- width, height, stride1, inv_h1, inv_v1)) || +- (src2.len < wuffs_base__pixel_swizzler__flattened_length( +- width, height, stride2, inv_h2, inv_v2))) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((h3 != 0u) || (v3 != 0u)) { +- if (((h3 * inv_h3) != max_incl_h) || // +- ((v3 * inv_v3) != max_incl_v) || // +- (src3.len < wuffs_base__pixel_swizzler__flattened_length( +- width, height, stride3, inv_h3, inv_v3))) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- } ++ while (n >= 4) { ++ __m128i x; ++ x = _mm_cvtsi32_si128((int)(wuffs_base__peek_u32le__no_bounds_check(s))); ++ x = _mm_shuffle_epi8(x, shuffle); ++ x = _mm_or_si128(x, or_ff); ++ _mm_storeu_si128((__m128i*)(void*)d, x); + +- if (wuffs_base__pixel_format__is_planar(&dst->pixcfg.private_impl.pixfmt)) { +- // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO. +- return wuffs_base__make_status( +- wuffs_base__error__unsupported_pixel_swizzler_option); ++ s += 4 * 1; ++ d += 4 * 4; ++ n -= 4; + } + +- switch (dst->pixcfg.private_impl.pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__Y: +- case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: +- case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: +- case WUFFS_BASE__PIXEL_FORMAT__BGR_565: +- case WUFFS_BASE__PIXEL_FORMAT__BGR: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +- case WUFFS_BASE__PIXEL_FORMAT__RGB: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +- break; ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); + +- default: +- // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO. +- return wuffs_base__make_status( +- wuffs_base__error__unsupported_pixel_swizzler_option); ++ s += 1 * 1; ++ d += 1 * 4; ++ n -= 1; + } + +- if ((width <= 0u) || (height <= 0u)) { +- return wuffs_base__make_status(NULL); +- } ++ return len; ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func conv3func = NULL; ++static uint64_t // ++wuffs_private_impl__swizzle_xxxx__y(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t len = (dst_len4 < src_len) ? dst_len4 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- if (is_rgb_or_cmyk) { +- conv3func = &wuffs_base__pixel_swizzler__swizzle_rgb__convert_3_general; +- } else { +- switch (dst->pixcfg.private_impl.pixfmt.repr) { +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__BGRX: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +- if (wuffs_base__cpu_arch__have_x86_avx2()) { +- conv3func = +- &wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx_x86_avx2; +- break; +- } +-#endif +- conv3func = &wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx; +- break; +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: +- case WUFFS_BASE__PIXEL_FORMAT__RGBX: +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +- if (wuffs_base__cpu_arch__have_x86_avx2()) { +- conv3func = +- &wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_rgbx_x86_avx2; +- break; +- } +-#endif +- conv3func = &wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_rgbx; +- break; +- default: +- conv3func = &wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_general; +- break; +- } ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); ++ ++ s += 1 * 1; ++ d += 1 * 4; ++ n -= 1; + } + +- void (*func)( +- wuffs_base__pixel_buffer * dst, // +- uint32_t width, // +- uint32_t height, // +- const uint8_t* src_ptr0, // +- const uint8_t* src_ptr1, // +- const uint8_t* src_ptr2, // +- uint32_t stride0, // +- uint32_t stride1, // +- uint32_t stride2, // +- uint32_t inv_h0, // +- uint32_t inv_h1, // +- uint32_t inv_h2, // +- uint32_t inv_v0, // +- uint32_t inv_v1, // +- uint32_t inv_v2, // +- uint32_t half_width_for_2to1, // +- uint32_t half_height_for_2to1, // +- uint8_t* scratch_buffer_2k_ptr, // +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func(*upfuncs)[4][4], +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_func conv3func) = +- &wuffs_base__pixel_swizzler__swizzle_ycc__general__box_filter; +- +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_func upfuncs[4][4]; +- memcpy(&upfuncs, &wuffs_base__pixel_swizzler__swizzle_ycc__upsample_funcs, +- sizeof upfuncs); ++ return len; ++} + +- if (triangle_filter_for_2to1 && +- (wuffs_base__pixel_swizzler__has_triangle_upsampler(inv_h0, inv_v0) || +- wuffs_base__pixel_swizzler__has_triangle_upsampler(inv_h1, inv_v1) || +- wuffs_base__pixel_swizzler__has_triangle_upsampler(inv_h2, inv_v2))) { +- func = &wuffs_base__pixel_swizzler__swizzle_ycc__general__triangle_filter; +- +- upfuncs[0][1] = +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h1v2_triangle; +- upfuncs[1][0] = +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v1_triangle; +- upfuncs[1][1] = +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v2_triangle; +- +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-#if defined(__GNUC__) && !defined(__clang__) +- // Don't use our AVX2 implementation for GCC (but do use it for clang). For +- // some unknown reason, GCC performs noticably better on the non-SIMD +- // version. Possibly because GCC's auto-vectorizer is smarter (just with +- // SSE2, not AVX2) than our hand-written code, but that's just a guess. +- // +- // See commits 51bc60ef9298cb2efc1b29a9681191f66d49820d and +- // cd769a0cdf1b5affee13f6089b995f3d39569cb4 for benchmark numbers. +- // +- // See also https://godbolt.org/z/MbhbPGEz4 for Debian Bullseye's clang 11 +- // versus gcc 10, where only gcc auto-vectorizes, although later clang +- // versions will also auto-vectorize. +-#else +- if (wuffs_base__cpu_arch__have_x86_avx2()) { +- upfuncs[1][1] = +- wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2; +- } +-#endif +-#endif +- } ++static uint64_t // ++wuffs_private_impl__swizzle_xxxx__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len4 = dst_len / 4; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- if ((h3 != 0u) || (v3 != 0u)) { +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_4_func conv4func = +- is_rgb_or_cmyk +- ? &wuffs_base__pixel_swizzler__swizzle_cmyk__convert_4_general +- : &wuffs_base__pixel_swizzler__swizzle_ycck__convert_4_general; +- wuffs_base__pixel_swizzler__swizzle_ycck__general__triangle_filter( // +- dst, width, height, // +- src0.ptr, src1.ptr, src2.ptr, src3.ptr, // +- stride0, stride1, stride2, stride3, // +- inv_h0, inv_h1, inv_h2, inv_h3, // +- inv_v0, inv_v1, inv_v2, inv_v3, // +- half_width_for_2to1, half_height_for_2to1, // +- scratch_buffer_2k.ptr, &upfuncs, conv4func); ++ while (n >= 1) { ++ wuffs_base__poke_u32le__no_bounds_check( ++ d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0])); + +- } else { +- (*func)( // +- dst, width, height, // +- src0.ptr, src1.ptr, src2.ptr, // +- stride0, stride1, stride2, // +- inv_h0, inv_h1, inv_h2, // +- inv_v0, inv_v1, inv_v2, // +- half_width_for_2to1, half_height_for_2to1, // +- scratch_buffer_2k.ptr, &upfuncs, conv3func); ++ s += 1 * 2; ++ d += 1 * 4; ++ n -= 1; + } + +- return wuffs_base__make_status(NULL); ++ return len; + } + + // -------- + +-// ‼ WUFFS MULTI-FILE SECTION +x86_avx2 +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx_x86_avx2( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- if ((x + 32u) > x_end) { +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx( // +- dst, x, x_end, y, up0, up1, up2); +- return; ++static uint64_t // ++wuffs_private_impl__swizzle_xxxxxxxx__index__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; + } ++ size_t dst_len8 = dst_len / 8; ++ size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- size_t dst_stride = dst->private_impl.planes[0].stride; +- uint8_t* dst_iter = dst->private_impl.planes[0].ptr + +- (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); +- +- // u0001 = u16x16 [0x0001 .. 0x0001] +- // u00FF = u16x16 [0x00FF .. 0x00FF] +- // uFF80 = u16x16 [0xFF80 .. 0xFF80] +- // uFFFF = u16x16 [0xFFFF .. 0xFFFF] +- const __m256i u0001 = _mm256_set1_epi16(+0x0001); +- const __m256i u00FF = _mm256_set1_epi16(+0x00FF); +- const __m256i uFF80 = _mm256_set1_epi16(-0x0080); +- const __m256i uFFFF = _mm256_set1_epi16(-0x0001); ++ while (n >= 1) { ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), wuffs_base__color_u32__as__color_u64( ++ wuffs_base__peek_u32le__no_bounds_check( ++ dst_palette_ptr + ((size_t)s[0] * 4)))); + +- // p8000_p0000 = u16x16 [0x8000 0x0000 .. 0x8000 0x0000] +- const __m256i p8000_p0000 = _mm256_set_epi16( // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000); ++ s += 1 * 1; ++ d += 1 * 8; ++ n -= 1; ++ } + +- // Per wuffs_base__color_ycc__as__color_u32, the formulae: +- // +- // R = Y + 1.40200 * Cr +- // G = Y - 0.34414 * Cb - 0.71414 * Cr +- // B = Y + 1.77200 * Cb +- // +- // When scaled by 1<<16: +- // +- // 0.34414 becomes 0x0581A = 22554. +- // 0.71414 becomes 0x0B6D2 = 46802. +- // 1.40200 becomes 0x166E9 = 91881. +- // 1.77200 becomes 0x1C5A2 = 116130. +- // +- // Separate the integer and fractional parts, since we work with signed +- // 16-bit SIMD lanes. The fractional parts range from -0.5 .. +0.5 (as +- // floating-point) which is from -0x8000 .. +0x8000 (as fixed-point). +- // +- // -0x3A5E = -0x20000 + 0x1C5A2 The B:Cb factor. +- // +0x66E9 = -0x10000 + 0x166E9 The R:Cr factor. +- // -0x581A = +0x00000 - 0x0581A The G:Cb factor. +- // +0x492E = +0x10000 - 0x0B6D2 The G:Cr factor. +- const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E); +- const __m256i p66E9 = _mm256_set1_epi16(+0x66E9); +- const __m256i m581A_p492E = _mm256_set_epi16( // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A); ++ return len; ++} + +- while (x < x_end) { +- // Load chroma values in even and odd columns (the high 8 bits of each +- // u16x16 element are zero) and then subtract 0x0080. +- // +- // cb_all = u8x32 [cb.00 cb.01 cb.02 cb.03 .. cb.1C cb.1D cb.1E cb.1F] +- // cb_eve = i16x16 [cb.00-0x80 cb.02-0x80 .. cb.1C-0x80 cb.1E-0x80 ] +- // cb_odd = i16x16 [cb.01-0x80 cb.03-0x80 .. cb.1D-0x80 cb.1F-0x80 ] +- // +- // Ditto for the cr_xxx Chroma-Red values. +- __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1); +- __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2); +- __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF)); +- __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF)); +- __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8)); +- __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8)); ++static uint64_t // ++wuffs_private_impl__swizzle_xxxxxxxx__index_binary_alpha__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ if (dst_palette_len != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return 0; ++ } ++ size_t dst_len8 = dst_len / 8; ++ size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // ---- ++ while (n >= 1) { ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr + ++ ((size_t)s[0] * 4)); ++ if (s0) { ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), wuffs_base__color_u32__as__color_u64(s0)); ++ } + +- // Calculate: +- // +- // B-Y = (+1.77200 * Cb) as floating-point +- // R-Y = (+1.40200 * Cr) as floating-point +- // +- // B-Y = ((0x2_0000 - 0x3A5E) * Cb) as fixed-point +- // R-Y = ((0x1_0000 + 0x66E9) * Cr) as fixed-point +- // +- // B-Y = ((-0x3A5E * Cb) + ("2.0" * Cb)) +- // R-Y = ((+0x66E9 * Cr) + ("1.0" * Cr)) ++ s += 1 * 1; ++ d += 1 * 8; ++ n -= 1; ++ } + +- // Multiply by m3A5E or p66E9, taking the high 16 bits. There's also a +- // doubling (add x to itself), adding-of-1 and halving (shift right by 1). +- // That makes multiply-and-take-high round to nearest (instead of down). +- __m256i tmp_by_eve = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001), +- 1); +- __m256i tmp_by_odd = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001), +- 1); +- __m256i tmp_ry_eve = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001), +- 1); +- __m256i tmp_ry_odd = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001), +- 1); ++ return len; ++} + +- // Add (2 * Cb) and (1 * Cr). +- __m256i by_eve = +- _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve)); +- __m256i by_odd = +- _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd)); +- __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve); +- __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd); ++static uint64_t // ++wuffs_private_impl__swizzle_xxxxxxxx__y(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t len = (dst_len8 < src_len) ? dst_len8 : src_len; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // ---- ++ while (n >= 1) { ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), 0xFFFF000000000000 | (0x010101010101 * (uint64_t)s[0])); + +- // Calculate: +- // +- // G-Y = (-0.34414 * Cb) + +- // (-0.71414 * Cr) as floating-point +- // +- // G-Y = ((+0x0_0000 - 0x581A) * Cb) + +- // ((-0x1_0000 + 0x492E) * Cr) as fixed-point +- // +- // G-Y = (-0x581A * Cb) + +- // (+0x492E * Cr) - ("1.0" * Cr) ++ s += 1 * 1; ++ d += 1 * 8; ++ n -= 1; ++ } + +- // Multiply-add to get ((-0x581A * Cb) + (+0x492E * Cr)). +- __m256i tmp0_gy_eve_lo = _mm256_madd_epi16( // +- _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E); +- __m256i tmp0_gy_eve_hi = _mm256_madd_epi16( // +- _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E); +- __m256i tmp0_gy_odd_lo = _mm256_madd_epi16( // +- _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E); +- __m256i tmp0_gy_odd_hi = _mm256_madd_epi16( // +- _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E); ++ return len; ++} + +- // Divide the i32x8 vectors by (1 << 16), rounding to nearest. +- __m256i tmp1_gy_eve_lo = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16); +- __m256i tmp1_gy_eve_hi = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16); +- __m256i tmp1_gy_odd_lo = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16); +- __m256i tmp1_gy_odd_hi = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16); ++static uint64_t // ++wuffs_private_impl__swizzle_xxxxxxxx__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len8 = dst_len / 8; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // Pack the ((-0x581A * Cb) + (+0x492E * Cr)) as i16x16 and subtract Cr. +- __m256i gy_eve = _mm256_sub_epi16( +- _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve); +- __m256i gy_odd = _mm256_sub_epi16( +- _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd); ++ while (n >= 1) { ++ uint64_t s0 = ++ ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(s + (0 * 2)))); ++ wuffs_base__poke_u64le__no_bounds_check( ++ d + (0 * 8), 0xFFFF000000000000 | (0x000100010001 * s0)); + +- // ---- ++ s += 1 * 2; ++ d += 1 * 8; ++ n -= 1; ++ } + +- // Add Y to (B-Y), (G-Y) and (R-Y) to produce B, G and R. +- // +- // For the resultant packed_x_xxx vectors, only elements 0 ..= 7 and 16 ..= +- // 23 of the 32-element vectors matter (since we'll unpacklo but not +- // unpackhi them). Let … denote 8 ignored consecutive u8 values and let % +- // denote 0xFF. We'll end this section with: +- // +- // packed_b_eve = u8x32 [b00 b02 .. b0C b0E … b10 b12 .. b1C b1E …] +- // packed_b_odd = u8x32 [b01 b03 .. b0D b0F … b11 b13 .. b1D b1F …] +- // packed_g_eve = u8x32 [g00 g02 .. g0C g0E … g10 g12 .. g1C g1E …] +- // packed_g_odd = u8x32 [g01 g03 .. g0D g0F … g11 g13 .. g1D g1F …] +- // packed_r_eve = u8x32 [r00 r02 .. r0C r0E … r10 r12 .. r1C r1E …] +- // packed_r_odd = u8x32 [r01 r03 .. r0D r0F … r11 r13 .. r1D r1F …] +- // uFFFF = u8x32 [ % % .. % % … % % .. % % …] ++ return len; ++} + +- __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0); +- __m256i yy_eve = _mm256_and_si256(yy_all, u00FF); +- __m256i yy_odd = _mm256_srli_epi16(yy_all, 8); ++// -------- + +- __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve); +- __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd); +- __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve); +- __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd); ++static uint64_t // ++wuffs_private_impl__swizzle_y__bgra_nonpremul__src(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len < src_len4) ? dst_len : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve); +- __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd); +- __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve); +- __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd); ++ while (n >= 1) { ++ uint32_t s0 = ++ wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul( ++ wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))); ++ d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0); + +- __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve); +- __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd); +- __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve); +- __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd); ++ s += 1 * 4; ++ d += 1 * 1; ++ n -= 1; ++ } + +- // ---- ++ return len; ++} + +- // Mix those values (unpacking in 8, 16 and then 32 bit units) to get the +- // desired BGRX/RGBX order. +- // +- // From here onwards, all of our __m256i registers are u8x32. ++static uint64_t // ++wuffs_private_impl__swizzle_y__bgra_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len < src_len4) ? dst_len : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // mix00 = [b00 g00 b02 g02 .. b0E g0E b10 g10 .. b1C g1C b1E g1E] +- // mix01 = [b01 g01 b03 g03 .. b0F g0F b11 g11 .. b1D g1D b1F g1F] +- // mix02 = [r00 % r02 % .. r0E % r10 % .. r1C % r1E %] +- // mix03 = [r01 % r03 % .. r0F % r11 % .. r1D % r1F %] +- // +- // See also § below. +- __m256i mix00 = _mm256_unpacklo_epi8(packed_b_eve, packed_g_eve); +- __m256i mix01 = _mm256_unpacklo_epi8(packed_b_odd, packed_g_odd); +- __m256i mix02 = _mm256_unpacklo_epi8(packed_r_eve, uFFFF); +- __m256i mix03 = _mm256_unpacklo_epi8(packed_r_odd, uFFFF); ++ while (n >= 1) { ++ uint32_t d0 = 0xFF000000 | (0x00010101 * ((uint32_t)(d[0]))); ++ uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray( ++ wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)); + +- // mix10 = [b00 g00 r00 % b02 g02 r02 % b04 g04 r04 % b06 g06 r06 % +- // b10 g10 r10 % b12 g12 r12 % b14 g14 r14 % b16 g16 r16 %] +- // mix11 = [b01 g01 r01 % b03 g03 r03 % b05 g05 r05 % b07 g07 r07 % +- // b11 g11 r11 % b13 g13 r13 % b15 g15 r15 % b17 g17 r17 %] +- // mix12 = [b08 g08 r08 % b0A g0A r0A % b0C g0C r0C % b0E g0E r0E % +- // b18 g18 r18 % b1A g1A r1A % b1C g1C r1C % b1E g1E r1E %] +- // mix13 = [b09 g09 r09 % b0B g0B r0B % b0D g0D r0D % b0F g0F r0F % +- // b19 g19 r19 % b1B g1B r1B % b1D g1D r1D % b1F g1F r1F %] +- __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02); +- __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03); +- __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02); +- __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03); ++ s += 1 * 4; ++ d += 1 * 1; ++ n -= 1; ++ } + +- // mix20 = [b00 g00 r00 % b01 g01 r01 % b02 g02 r02 % b03 g03 r03 % +- // b10 g10 r10 % b11 g11 r11 % b12 g12 r12 % b13 g13 r13 %] +- // mix21 = [b04 g04 r04 % b05 g05 r05 % b06 g06 r06 % b07 g07 r07 % +- // b14 g14 r14 % b15 g15 r15 % b16 g16 r16 % b17 g17 r17 %] +- // mix22 = [b08 g08 r08 % b09 g09 r09 % b0A g0A r0A % b0B g0B r0B % +- // b18 g18 r18 % b19 g19 r19 % b1A g1A r1A % b1B g1B r1B %] +- // mix23 = [b0C g0C r0C % b0D g0D r0D % b0E g0E r0E % b0F g0F r0F % +- // b1C g1C r1C % b1D g1D r1D % b1E g1E r1E % b1F g1F r1F %] +- __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11); +- __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11); +- __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13); +- __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13); ++ return len; ++} + +- // mix30 = [b00 g00 r00 % b01 g01 r01 % b02 g02 r02 % b03 g03 r03 % +- // b04 g04 r04 % b05 g05 r05 % b06 g06 r06 % b07 g07 r07 %] +- // mix31 = [b08 g08 r08 % b09 g09 r09 % b0A g0A r0A % b0B g0B r0B % +- // b0C g0C r0C % b0D g0D r0D % b0E g0E r0E % b0F g0F r0F %] +- // mix32 = [b10 g10 r10 % b11 g11 r11 % b12 g12 r12 % b13 g13 r13 % +- // b14 g14 r14 % b15 g15 r15 % b16 g16 r16 % b17 g17 r17 %] +- // mix33 = [b18 g18 r18 % b19 g19 r19 % b1A g1A r1A % b1B g1B r1B % +- // b1C g1C r1C % b1D g1D r1D % b1E g1E r1E % b1F g1F r1F %] +- __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20); +- __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20); +- __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31); +- __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31); ++static uint64_t // ++wuffs_private_impl__swizzle_y__bgrx(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t src_len4 = src_len / 4; ++ size_t len = (dst_len < src_len4) ? dst_len : src_len4; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- // Write out four u8x32 SIMD registers (128 bytes, 32 BGRX/RGBX pixels). +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33); ++ while (n >= 1) { ++ uint32_t s0 = ++ 0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)); ++ d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0); + +- // Advance by up to 32 pixels. The first iteration might be smaller than 32 +- // so that all of the remaining steps are exactly 32. +- uint32_t n = 32u - (31u & (x - x_end)); +- dst_iter += 4u * n; +- up0 += n; +- up1 += n; +- up2 += n; +- x += n; ++ s += 1 * 4; ++ d += 1 * 1; ++ n -= 1; + } ++ ++ return len; + } + +-// The rgbx flavor (below) is exactly the same as the bgrx flavor (above) +-// except for the lines marked with a § and that comments were stripped. +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static void // +-wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_rgbx_x86_avx2( +- wuffs_base__pixel_buffer* dst, +- uint32_t x, +- uint32_t x_end, +- uint32_t y, +- const uint8_t* up0, +- const uint8_t* up1, +- const uint8_t* up2) { +- if ((x + 32u) > x_end) { +- wuffs_base__pixel_swizzler__swizzle_ycc__convert_3_bgrx( // +- dst, x, x_end, y, up0, up1, up2); +- return; +- } ++static uint64_t // ++wuffs_private_impl__swizzle_y__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len < src_len2) ? dst_len : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- size_t dst_stride = dst->private_impl.planes[0].stride; +- uint8_t* dst_iter = dst->private_impl.planes[0].ptr + +- (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); ++ while (n >= 1) { ++ d[0] = s[0]; + +- const __m256i u0001 = _mm256_set1_epi16(+0x0001); +- const __m256i u00FF = _mm256_set1_epi16(+0x00FF); +- const __m256i uFF80 = _mm256_set1_epi16(-0x0080); +- const __m256i uFFFF = _mm256_set1_epi16(-0x0001); ++ s += 1 * 2; ++ d += 1 * 1; ++ n -= 1; ++ } + +- const __m256i p8000_p0000 = _mm256_set_epi16( // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000, // +- +0x0000, -0x8000, +0x0000, -0x8000); ++ return len; ++} + +- const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E); +- const __m256i p66E9 = _mm256_set1_epi16(+0x66E9); +- const __m256i m581A_p492E = _mm256_set_epi16( // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A, // +- +0x492E, -0x581A, +0x492E, -0x581A); ++static uint64_t // ++wuffs_private_impl__swizzle_y_16le__y_16be(uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- while (x < x_end) { +- __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1); +- __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2); +- __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF)); +- __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF)); +- __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8)); +- __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8)); ++ while (n >= 1) { ++ uint8_t s0 = s[0]; ++ uint8_t s1 = s[1]; ++ d[0] = s1; ++ d[1] = s0; + +- __m256i tmp_by_eve = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001), +- 1); +- __m256i tmp_by_odd = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001), +- 1); +- __m256i tmp_ry_eve = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001), +- 1); +- __m256i tmp_ry_odd = _mm256_srai_epi16( +- _mm256_add_epi16( +- _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001), +- 1); ++ s += 1 * 2; ++ d += 1 * 2; ++ n -= 1; ++ } + +- __m256i by_eve = +- _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve)); +- __m256i by_odd = +- _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd)); +- __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve); +- __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd); ++ return len; ++} + +- __m256i tmp0_gy_eve_lo = _mm256_madd_epi16( // +- _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E); +- __m256i tmp0_gy_eve_hi = _mm256_madd_epi16( // +- _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E); +- __m256i tmp0_gy_odd_lo = _mm256_madd_epi16( // +- _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E); +- __m256i tmp0_gy_odd_hi = _mm256_madd_epi16( // +- _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E); ++// -------- + +- __m256i tmp1_gy_eve_lo = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16); +- __m256i tmp1_gy_eve_hi = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16); +- __m256i tmp1_gy_odd_lo = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16); +- __m256i tmp1_gy_odd_hi = +- _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16); ++static uint64_t // ++wuffs_private_impl__swizzle_ya_nonpremul__ya_nonpremul__src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ const uint8_t* src_ptr, ++ size_t src_len) { ++ size_t dst_len2 = dst_len / 2; ++ size_t src_len2 = src_len / 2; ++ size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2; ++ uint8_t* d = dst_ptr; ++ const uint8_t* s = src_ptr; ++ size_t n = len; + +- __m256i gy_eve = _mm256_sub_epi16( +- _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve); +- __m256i gy_odd = _mm256_sub_epi16( +- _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd); ++ while (n >= 1) { ++ uint32_t d0 = ((uint32_t)(d[1]) << 24) | ((uint32_t)(d[0]) * 0x010101); ++ uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101); ++ uint32_t c0 = ++ wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0); ++ wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)(c0 >> 16)); + +- __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0); +- __m256i yy_eve = _mm256_and_si256(yy_all, u00FF); +- __m256i yy_odd = _mm256_srli_epi16(yy_all, 8); ++ s += 1 * 2; ++ d += 1 * 2; ++ n -= 1; ++ } + +- __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve); +- __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd); +- __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve); +- __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd); ++ return len; ++} + +- __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve); +- __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd); +- __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve); +- __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd); ++// -------- + +- __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve); +- __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd); +- __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve); +- __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd); ++static uint64_t // ++wuffs_private_impl__swizzle_transparent_black_src( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ uint64_t num_pixels, ++ uint32_t dst_pixfmt_bytes_per_pixel) { ++ uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel; ++ if (n > num_pixels) { ++ n = num_pixels; ++ } ++ memset(dst_ptr, 0, ((size_t)(n * dst_pixfmt_bytes_per_pixel))); ++ return n; ++} + +- // § Note the swapped B and R channels. +- __m256i mix00 = _mm256_unpacklo_epi8(packed_r_eve, packed_g_eve); +- __m256i mix01 = _mm256_unpacklo_epi8(packed_r_odd, packed_g_odd); +- __m256i mix02 = _mm256_unpacklo_epi8(packed_b_eve, uFFFF); +- __m256i mix03 = _mm256_unpacklo_epi8(packed_b_odd, uFFFF); ++static uint64_t // ++wuffs_private_impl__swizzle_transparent_black_src_over( ++ uint8_t* dst_ptr, ++ size_t dst_len, ++ uint8_t* dst_palette_ptr, ++ size_t dst_palette_len, ++ uint64_t num_pixels, ++ uint32_t dst_pixfmt_bytes_per_pixel) { ++ uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel; ++ if (n > num_pixels) { ++ n = num_pixels; ++ } ++ return n; ++} + +- __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02); +- __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03); +- __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02); +- __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03); ++// -------- + +- __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11); +- __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11); +- __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13); +- __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13); ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__y( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ return wuffs_private_impl__swizzle_copy_1_1; + +- __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20); +- __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20); +- __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31); +- __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_bgr_565__y; + +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32); +- _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_xxx__y; + +- uint32_t n = 32u - (31u & (x - x_end)); +- dst_iter += 4u * n; +- up0 += n; +- up1 += n; +- up2 += n; +- x += n; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_xxxx__y__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_xxxx__y; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_xxxxxxxx__y; + } ++ return NULL; + } + +-#if defined(__GNUC__) && !defined(__clang__) +-// No-op. +-#else +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") +-static const uint8_t* // +-wuffs_base__pixel_swizzler__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2( +- uint8_t* dst_ptr, +- const uint8_t* src_ptr_major, +- const uint8_t* src_ptr_minor, +- size_t src_len, +- uint32_t h1v2_bias_ignored, +- bool first_column, +- bool last_column) { +- uint8_t* dp = dst_ptr; +- const uint8_t* sp_major = src_ptr_major; +- const uint8_t* sp_minor = src_ptr_minor; +- +- if (first_column) { +- src_len--; +- if ((src_len <= 0u) && last_column) { +- uint32_t sv = (12u * ((uint32_t)(*sp_major++))) + // +- (4u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + 7u) >> 4u); +- return dst_ptr; +- } +- +- uint32_t sv_major_m1 = sp_major[-0]; // Clamp offset to zero. +- uint32_t sv_minor_m1 = sp_minor[-0]; // Clamp offset to zero. +- uint32_t sv_major_p1 = sp_major[+1]; +- uint32_t sv_minor_p1 = sp_minor[+1]; +- +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); +- if (src_len <= 0u) { +- return dst_ptr; +- } +- } +- +- if (last_column) { +- src_len--; +- } +- +- if (src_len < 32) { +- // This fallback is the same as the non-SIMD-capable code path. +- for (; src_len > 0u; src_len--) { +- uint32_t sv_major_m1 = sp_major[-1]; +- uint32_t sv_minor_m1 = sp_minor[-1]; +- uint32_t sv_major_p1 = sp_major[+1]; +- uint32_t sv_minor_p1 = sp_minor[+1]; +- +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); +- } +- +- } else { +- while (src_len > 0u) { +- // Load 1+32+1 samples (six u8x32 vectors) from the major (jxx) and minor +- // (nxx) rows. +- // +- // major_p0 = [j00 j01 j02 j03 .. j28 j29 j30 j31] // p0 = "plus 0" +- // minor_p0 = [n00 n01 n02 n03 .. n28 n29 n30 n31] // p0 = "plus 0" +- // major_m1 = [jm1 j00 j01 j02 .. j27 j28 j29 j30] // m1 = "minus 1" +- // minor_m1 = [nm1 n00 n01 n02 .. n27 n28 n29 n30] // m1 = "minus 1" +- // major_p1 = [j01 j02 j03 j04 .. j29 j30 j31 j32] // p1 = "plus 1" +- // minor_p1 = [n01 n02 n03 n04 .. n29 n30 n31 n32] // p1 = "plus 1" +- __m256i major_p0 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 0)); +- __m256i minor_p0 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 0)); +- __m256i major_m1 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major - 1)); +- __m256i minor_m1 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor - 1)); +- __m256i major_p1 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 1)); +- __m256i minor_p1 = +- _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 1)); +- +- // Unpack, staying with u8x32 vectors. +- // +- // step1_p0_lo = [j00 n00 j01 n01 .. j07 n07 j16 n16 j17 n17 .. j23 n23] +- // step1_p0_hi = [j08 n08 j09 n09 .. j15 n15 j24 n24 j25 n25 .. j31 n31] +- // step1_m1_lo = [jm1 nm1 j00 n00 .. j06 n06 j15 n15 j16 n16 .. j22 n22] +- // step1_m1_hi = [j07 n07 j08 n08 .. j14 n14 j23 n23 j24 n24 .. j30 n30] +- // step1_p1_lo = [j01 n01 j02 n02 .. j08 n08 j17 n17 j18 n18 .. j24 n24] +- // step1_p1_hi = [j09 n09 j10 n10 .. j16 n16 j25 n25 j26 n26 .. j32 n32] +- __m256i step1_p0_lo = _mm256_unpacklo_epi8(major_p0, minor_p0); +- __m256i step1_p0_hi = _mm256_unpackhi_epi8(major_p0, minor_p0); +- __m256i step1_m1_lo = _mm256_unpacklo_epi8(major_m1, minor_m1); +- __m256i step1_m1_hi = _mm256_unpackhi_epi8(major_m1, minor_m1); +- __m256i step1_p1_lo = _mm256_unpacklo_epi8(major_p1, minor_p1); +- __m256i step1_p1_hi = _mm256_unpackhi_epi8(major_p1, minor_p1); +- +- // Multiply-add to get u16x16 vectors. +- // +- // step2_p0_lo = [9*j00+3*n00 9*j01+3*n01 .. 9*j23+3*n23] +- // step2_p0_hi = [9*j08+3*n08 9*j09+3*n09 .. 9*j31+3*n31] +- // step2_m1_lo = [3*jm1+1*nm1 3*j00+1*n00 .. 3*j22+1*n22] +- // step2_m1_hi = [3*j07+1*n07 3*j08+1*n08 .. 3*j30+1*n30] +- // step2_p1_lo = [3*j01+1*n01 3*j02+1*n02 .. 3*j24+1*n24] +- // step2_p1_hi = [3*j09+1*n09 3*j10+1*n10 .. 3*j32+1*n32] +- const __m256i k0309 = _mm256_set1_epi16(0x0309); +- const __m256i k0103 = _mm256_set1_epi16(0x0103); +- __m256i step2_p0_lo = _mm256_maddubs_epi16(step1_p0_lo, k0309); +- __m256i step2_p0_hi = _mm256_maddubs_epi16(step1_p0_hi, k0309); +- __m256i step2_m1_lo = _mm256_maddubs_epi16(step1_m1_lo, k0103); +- __m256i step2_m1_hi = _mm256_maddubs_epi16(step1_m1_hi, k0103); +- __m256i step2_p1_lo = _mm256_maddubs_epi16(step1_p1_lo, k0103); +- __m256i step2_p1_hi = _mm256_maddubs_epi16(step1_p1_hi, k0103); +- +- // Compute the weighted sums of (p0, m1) and (p0, p1). For example: +- // +- // step3_m1_lo[00] = ((9*j00) + (3*n00) + (3*jm1) + (1*nm1)) as u16 +- // step3_p1_hi[15] = ((9*j31) + (3*n31) + (3*j32) + (1*n32)) as u16 +- __m256i step3_m1_lo = _mm256_add_epi16(step2_p0_lo, step2_m1_lo); +- __m256i step3_m1_hi = _mm256_add_epi16(step2_p0_hi, step2_m1_hi); +- __m256i step3_p1_lo = _mm256_add_epi16(step2_p0_lo, step2_p1_lo); +- __m256i step3_p1_hi = _mm256_add_epi16(step2_p0_hi, step2_p1_hi); ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__y_16be( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ return wuffs_private_impl__swizzle_y__y_16be; + +- // Bias by 8 (on the left) or 7 (on the right) and then divide by 16 +- // (which is 9+3+3+1) to get a weighted average. On the left (m1), shift +- // the u16 right value by 4. On the right (p1), shift right by 4 and then +- // shift left by 8 so that, when still in the u16x16 little-endian +- // interpretation, we have: +- // - m1_element = (etcetera + 8) >> 4 +- // - p1_element = ((etcetera + 7) >> 4) << 8 +- // +- // step4_m1_lo = [0x00?? 0x00?? ... 0x00?? 0x00??] +- // step4_p1_lo = [0x??00 0x??00 ... 0x??00 0x??00] +- // step4_m1_hi = [0x00?? 0x00?? ... 0x00?? 0x00??] +- // step4_p1_hi = [0x??00 0x??00 ... 0x??00 0x??00] +- __m256i step4_m1_lo = _mm256_srli_epi16( +- _mm256_add_epi16(step3_m1_lo, _mm256_set1_epi16(8)), 4); +- __m256i step4_p1_lo = _mm256_slli_epi16( +- _mm256_srli_epi16(_mm256_add_epi16(step3_p1_lo, _mm256_set1_epi16(7)), +- 4), +- 8); +- __m256i step4_m1_hi = _mm256_srli_epi16( +- _mm256_add_epi16(step3_m1_hi, _mm256_set1_epi16(8)), 4); +- __m256i step4_p1_hi = _mm256_slli_epi16( +- _mm256_srli_epi16(_mm256_add_epi16(step3_p1_hi, _mm256_set1_epi16(7)), +- 4), +- 8); ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: ++ return wuffs_private_impl__swizzle_y_16le__y_16be; + +- // Bitwise-or two "0x00"-rich u16x16 vectors to get a u8x32 vector. Do +- // that twice. Once for the low columns and once for the high columns. +- // +- // In terms of jxx (major row) or nxx (minor row) source samples: +- // - low columns means ( 0 .. 8; 16 .. 24). +- // - high columns means ( 8 .. 16; 24 .. 32). +- // +- // In terms of dxx destination samples (there are twice as many): +- // - low columns means ( 0 .. 16; 32 .. 48). +- // - high columns means (16 .. 32; 48 .. 64). +- // +- // step5_lo = [d00 d01 .. d14 d15 d32 d33 .. d46 d47] +- // step5_hi = [d16 d17 .. d30 d31 d48 d49 .. d62 d63] +- // +- // The d00, d02 ... d62 even elements come from (p0, m1) weighted sums. +- // The d01, d03 ... d63 odd elements come from (p0, p1) weighted sums. +- __m256i step5_lo = _mm256_or_si256(step4_m1_lo, step4_p1_lo); +- __m256i step5_hi = _mm256_or_si256(step4_m1_hi, step4_p1_hi); ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: ++ return wuffs_private_impl__swizzle_copy_2_2; + +- // Permute and store. +- // +- // step6_00_31 = [d00 d01 .. d14 d15 d16 d17 .. d30 d31] +- // step6_32_63 = [d32 d33 .. d46 d47 d48 d49 .. d62 d63] +- __m256i step6_00_31 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x20); +- __m256i step6_32_63 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x31); +- _mm256_storeu_si256((__m256i*)(void*)(dp + 0x00), step6_00_31); +- _mm256_storeu_si256((__m256i*)(void*)(dp + 0x20), step6_32_63); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_bgr_565__y_16be; + +- // Advance by up to 32 source samples (64 destination samples). The first +- // iteration might be smaller than 32 so that all of the remaining steps +- // are exactly 32. +- size_t n = 32u - (31u & (0u - src_len)); +- dp += 2u * n; +- sp_major += n; +- sp_minor += n; +- src_len -= n; +- } +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_xxx__y_16be; + +- if (last_column) { +- uint32_t sv_major_m1 = sp_major[-1]; +- uint32_t sv_minor_m1 = sp_minor[-1]; +- uint32_t sv_major_p1 = sp_major[+0]; // Clamp offset to zero. +- uint32_t sv_minor_p1 = sp_minor[+0]; // Clamp offset to zero. ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ return wuffs_private_impl__swizzle_xxxx__y_16be; + +- uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // +- (3u * ((uint32_t)(*sp_minor++))); +- *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); +- *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_xxxxxxxx__y_16be; + } +- +- return dst_ptr; ++ return NULL; + } +-#endif +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) +-// ‼ WUFFS MULTI-FILE SECTION -x86_avx2 + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ +- defined(WUFFS_CONFIG__MODULE__BASE__UTF8) ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__ya_nonpremul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_2_2; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_ya_nonpremul__ya_nonpremul__src_over; ++ } ++ return NULL; + +-// ---------------- Unicode and UTF-8 ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point) { +- if (code_point <= 0x7F) { +- if (dst.len >= 1) { +- dst.ptr[0] = (uint8_t)(code_point); +- return 1; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxx__ya_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxx__ya_nonpremul__src_over; ++ } ++ return NULL; + +- } else if (code_point <= 0x07FF) { +- if (dst.len >= 2) { +- dst.ptr[0] = (uint8_t)(0xC0 | ((code_point >> 6))); +- dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); +- return 2; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src_over; ++ } ++ return NULL; + +- } else if (code_point <= 0xFFFF) { +- if ((dst.len >= 3) && ((code_point < 0xD800) || (0xDFFF < code_point))) { +- dst.ptr[0] = (uint8_t)(0xE0 | ((code_point >> 12))); +- dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F)); +- dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); +- return 3; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src_over; ++ } ++ return NULL; + +- } else if (code_point <= 0x10FFFF) { +- if (dst.len >= 4) { +- dst.ptr[0] = (uint8_t)(0xF0 | ((code_point >> 18))); +- dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 12) & 0x3F)); +- dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F)); +- dst.ptr[3] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); +- return 4; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src_over; ++ } ++ return NULL; + } +- +- return 0; ++ return NULL; + } + +-// wuffs_base__utf_8__byte_length_minus_1 is the byte length (minus 1) of a +-// UTF-8 encoded code point, based on the encoding's initial byte. +-// - 0x00 is 1-byte UTF-8 (ASCII). +-// - 0x01 is the start of 2-byte UTF-8. +-// - 0x02 is the start of 3-byte UTF-8. +-// - 0x03 is the start of 4-byte UTF-8. +-// - 0x40 is a UTF-8 tail byte. +-// - 0x80 is invalid UTF-8. +-// +-// RFC 3629 (UTF-8) gives this grammar for valid UTF-8: +-// UTF8-1 = %x00-7F +-// UTF8-2 = %xC2-DF UTF8-tail +-// UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) / +-// %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail ) +-// UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) / +-// %xF4 %x80-8F 2( UTF8-tail ) +-// UTF8-tail = %x80-BF +-static const uint8_t wuffs_base__utf_8__byte_length_minus_1[256] = { +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x30 ..= 0x37. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. +- +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. +- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. +- +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x80 ..= 0x87. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x88 ..= 0x8F. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x90 ..= 0x97. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x98 ..= 0x9F. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA0 ..= 0xA7. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA8 ..= 0xAF. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB0 ..= 0xB7. +- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB8 ..= 0xBF. ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_nonpremul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_1_1; ++ } ++ return NULL; + +- 0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC0 ..= 0xC7. +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC8 ..= 0xCF. +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD0 ..= 0xD7. +- 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD8 ..= 0xDF. +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE0 ..= 0xE7. +- 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE8 ..= 0xEF. +- 0x03, 0x03, 0x03, 0x03, 0x03, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. +- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. +- // 0 1 2 3 4 5 6 7 +- // 8 9 A B C D E F +-}; ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ if (wuffs_private_impl__swizzle_squash_align4_bgr_565_8888( ++ dst_palette.ptr, dst_palette.len, src_palette.ptr, ++ src_palette.len, true) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_bgr_565__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_bgr_565__index_bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output // +-wuffs_base__utf_8__next(const uint8_t* s_ptr, size_t s_len) { +- if (s_len == 0) { +- return wuffs_base__make_utf_8__next__output(0, 0); +- } +- uint32_t c = s_ptr[0]; +- switch (wuffs_base__utf_8__byte_length_minus_1[c & 0xFF]) { +- case 0: +- return wuffs_base__make_utf_8__next__output(c, 1); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ if (wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over; ++ } ++ return NULL; + +- case 1: +- if (s_len < 2) { +- break; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; + } +- c = wuffs_base__peek_u16le__no_bounds_check(s_ptr); +- if ((c & 0xC000) != 0x8000) { +- break; ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over; + } +- c = (0x0007C0 & (c << 6)) | (0x00003F & (c >> 8)); +- return wuffs_base__make_utf_8__next__output(c, 2); ++ return NULL; + +- case 2: +- if (s_len < 3) { +- break; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; + } +- c = wuffs_base__peek_u24le__no_bounds_check(s_ptr); +- if ((c & 0xC0C000) != 0x808000) { +- break; ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxxxxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over; + } +- c = (0x00F000 & (c << 12)) | (0x000FC0 & (c >> 2)) | +- (0x00003F & (c >> 16)); +- if ((c <= 0x07FF) || ((0xD800 <= c) && (c <= 0xDFFF))) { +- break; ++ return NULL; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ if (wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over; + } +- return wuffs_base__make_utf_8__next__output(c, 3); ++ return NULL; + +- case 3: +- if (s_len < 4) { +- break; ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ if (wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ if (wuffs_private_impl__swizzle_swap_rgbx_bgrx( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over; + } +- c = wuffs_base__peek_u32le__no_bounds_check(s_ptr); +- if ((c & 0xC0C0C000) != 0x80808000) { +- break; ++ return NULL; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ if (wuffs_private_impl__swizzle_swap_rgbx_bgrx( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; + } +- c = (0x1C0000 & (c << 18)) | (0x03F000 & (c << 4)) | +- (0x000FC0 & (c >> 10)) | (0x00003F & (c >> 24)); +- if ((c <= 0xFFFF) || (0x110000 <= c)) { +- break; ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over; + } +- return wuffs_base__make_utf_8__next__output(c, 4); +- } ++ return NULL; + +- return wuffs_base__make_utf_8__next__output( +- WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1); +-} ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ if (wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ if (wuffs_private_impl__swizzle_swap_rgbx_bgrx( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ return wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output // +-wuffs_base__utf_8__next_from_end(const uint8_t* s_ptr, size_t s_len) { +- if (s_len == 0) { +- return wuffs_base__make_utf_8__next__output(0, 0); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ // TODO. ++ break; + } +- const uint8_t* ptr = &s_ptr[s_len - 1]; +- if (*ptr < 0x80) { +- return wuffs_base__make_utf_8__next__output(*ptr, 1); ++ return NULL; ++} + +- } else if (*ptr < 0xC0) { +- const uint8_t* too_far = &s_ptr[(s_len > 4) ? (s_len - 4) : 0]; +- uint32_t n = 1; +- while (ptr != too_far) { +- ptr--; +- n++; +- if (*ptr < 0x80) { +- break; +- } else if (*ptr < 0xC0) { +- continue; ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_binary( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; + } +- wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(ptr, n); +- if (o.byte_length != n) { +- break; ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_1_1; + } +- return o; +- } +- } +- +- return wuffs_base__make_utf_8__next__output( +- WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1); +-} ++ return NULL; + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__utf_8__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) { +- // TODO: possibly optimize the all-ASCII case (4 or 8 bytes at a time). +- // +- // TODO: possibly optimize this by manually inlining the +- // wuffs_base__utf_8__next calls. +- size_t original_len = s_len; +- while (s_len > 0) { +- wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(s_ptr, s_len); +- if ((o.code_point > 0x7F) && (o.byte_length == 1)) { +- break; +- } +- s_ptr += o.byte_length; +- s_len -= o.byte_length; +- } +- return original_len - s_len; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ if (wuffs_private_impl__swizzle_squash_align4_bgr_565_8888( ++ dst_palette.ptr, dst_palette.len, src_palette.ptr, ++ src_palette.len, false) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__index_binary_alpha__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__MAYBE_STATIC size_t // +-wuffs_base__ascii__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) { +- // TODO: possibly optimize this by checking 4 or 8 bytes at a time. +- const uint8_t* original_ptr = s_ptr; +- const uint8_t* p = s_ptr; +- const uint8_t* q = s_ptr + s_len; +- for (; (p != q) && ((*p & 0x80) == 0); p++) { +- } +- return (size_t)(p - original_ptr); +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over; ++ } ++ return NULL; + +-#endif // !defined(WUFFS_CONFIG__MODULES) || +- // defined(WUFFS_CONFIG__MODULE__BASE) || +- // defined(WUFFS_CONFIG__MODULE__BASE__UTF8) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over; ++ } ++ return NULL; + +-#ifdef __cplusplus +-} // extern "C" +-#endif ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: ++ if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette, ++ src_palette) != ++ WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxxxxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxxxxxxx__index_binary_alpha__src_over; ++ } ++ return NULL; + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ if (wuffs_private_impl__swizzle_swap_rgbx_bgrx( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over; ++ } ++ return NULL; + +-// ---------------- Status Codes Implementations ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ if (wuffs_private_impl__swizzle_swap_rgbx_bgrx( ++ dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr, ++ src_palette.len) != ++ (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) { ++ return NULL; ++ } ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_xxxx__index__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over; ++ } ++ return NULL; ++ } ++ return NULL; ++} + +-// ---------------- Private Consts ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgr_565( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_copy_2_2; + +-// ---------------- Private Initializer Prototypes ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ return wuffs_private_impl__swizzle_bgr__bgr_565; + +-// ---------------- Private Function Prototypes ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ return wuffs_private_impl__swizzle_bgrw__bgr_565; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_bgrw_4x16le__bgr_565; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up__choosy_default( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x); ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_rgb__bgr_565; + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up_arm_neon( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ return wuffs_private_impl__swizzle_rgbw__bgr_565; ++ } ++ return NULL; ++} + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up_x86_sse42( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgr( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_bgr_565__bgr; + +-// ---------------- VTables ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ return wuffs_private_impl__swizzle_copy_3_3; + +-const wuffs_base__hasher_u32__func_ptrs +-wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = { +- (uint32_t(*)(const void*))(&wuffs_adler32__hasher__checksum_u32), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_adler32__hasher__get_quirk), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_adler32__hasher__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- wuffs_base__slice_u8))(&wuffs_adler32__hasher__update), +- (uint32_t(*)(void*, +- wuffs_base__slice_u8))(&wuffs_adler32__hasher__update_u32), +-}; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_bgrw__bgr; + +-// ---------------- Initializer Implementations ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_bgrw_4x16le__bgr; + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_adler32__hasher__initialize( +- wuffs_adler32__hasher* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_swap_rgb_bgr; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42; ++ } + #endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } ++ return wuffs_private_impl__swizzle_bgrw__rgb; + } ++ return NULL; ++} + +- self->private_impl.choosy_up = &wuffs_adler32__hasher__up__choosy_default; ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_y__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_y__bgra_nonpremul__src_over; ++ } ++ return NULL; + +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = +- wuffs_base__hasher_u32__vtable_name; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = +- (const void*)(&wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32); +- return wuffs_base__make_status(NULL); +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-wuffs_adler32__hasher* +-wuffs_adler32__hasher__alloc(void) { +- wuffs_adler32__hasher* x = +- (wuffs_adler32__hasher*)(calloc(sizeof(wuffs_adler32__hasher), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_adler32__hasher__initialize( +- x, sizeof(wuffs_adler32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-size_t +-sizeof__wuffs_adler32__hasher(void) { +- return sizeof(wuffs_adler32__hasher); +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_4_4; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-// ---------------- Function Implementations ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-// -------- func adler32.hasher.get_quirk ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_adler32__hasher__get_quirk( +- const wuffs_adler32__hasher* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ // TODO. ++ break; + +- return 0u; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-// -------- func adler32.hasher.set_quirk ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_adler32__hasher__set_quirk( +- wuffs_adler32__hasher* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over; ++ } ++ return NULL; + +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ // TODO. ++ break; ++ } ++ return NULL; + } + +-// -------- func adler32.hasher.update ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul_4x16le( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_adler32__hasher__update( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +- if ( ! self->private_impl.f_started) { +- self->private_impl.f_started = true; +- self->private_impl.f_state = 1u; +- self->private_impl.choosy_up = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_adler32__hasher__up_arm_neon : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_adler32__hasher__up_x86_sse42 : +-#endif +- self->private_impl.choosy_up); +- } +- wuffs_adler32__hasher__up(self, a_x); +- return wuffs_base__make_empty_struct(); +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +-// -------- func adler32.hasher.update_u32 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_8_8; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_adler32__hasher__update_u32( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return 0; +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; +- } ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +- wuffs_adler32__hasher__update(self, a_x); +- return self->private_impl.f_state; +-} ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ // TODO. ++ break; + +-// -------- func adler32.hasher.up ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- return (*self->private_impl.choosy_up)(self, a_x); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src_over; ++ } ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src_over; ++ } ++ return NULL; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ // TODO. ++ break; ++ } ++ return NULL; + } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up__choosy_default( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s1 = 0; +- uint32_t v_s2 = 0; +- wuffs_base__slice_u8 v_remaining = {0}; +- wuffs_base__slice_u8 v_p = {0}; +- +- v_s1 = ((self->private_impl.f_state) & 0xFFFFu); +- v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); +- while (((uint64_t)(a_x.len)) > 0u) { +- v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); +- if (((uint64_t)(a_x.len)) > 5552u) { +- v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5552u); +- a_x = wuffs_base__slice_u8__subslice_j(a_x, 5552u); +- } +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8); +- while (v_p.ptr < i_end0_p) { +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- } +- v_p.len = 1; +- uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end1_p) { +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgra_premul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src_over; + } +- v_p.len = 0; +- } +- v_s1 %= 65521u; +- v_s2 %= 65521u; +- a_x = v_remaining; +- } +- self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func adler32.hasher.checksum_u32 +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_adler32__hasher__checksum_u32( +- const wuffs_adler32__hasher* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return self->private_impl.f_state; +-} +- +-// ‼ WUFFS MULTI-FILE SECTION +arm_neon +-// -------- func adler32.hasher.up_arm_neon ++ return NULL; + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up_arm_neon( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s1 = 0; +- uint32_t v_s2 = 0; +- wuffs_base__slice_u8 v_remaining = {0}; +- wuffs_base__slice_u8 v_p = {0}; +- uint8x16_t v_p__left = {0}; +- uint8x16_t v_p_right = {0}; +- uint32x4_t v_v1 = {0}; +- uint32x4_t v_v2 = {0}; +- uint16x8_t v_col0 = {0}; +- uint16x8_t v_col1 = {0}; +- uint16x8_t v_col2 = {0}; +- uint16x8_t v_col3 = {0}; +- uint32x2_t v_sum1 = {0}; +- uint32x2_t v_sum2 = {0}; +- uint32x2_t v_sum12 = {0}; +- uint32_t v_num_iterate_bytes = 0; +- uint64_t v_tail_index = 0; ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__bgra_premul__src_over; ++ } ++ return NULL; + +- v_s1 = ((self->private_impl.f_state) & 0xFFFFu); +- v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); +- while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { +- v_s1 += ((uint32_t)(a_x.ptr[0u])); +- v_s2 += v_s1; +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); +- } +- v_s1 %= 65521u; +- v_s2 %= 65521u; +- while (((uint64_t)(a_x.len)) > 0u) { +- v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); +- if (((uint64_t)(a_x.len)) > 5536u) { +- v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u); +- a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u); +- } +- v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u))); +- v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes)); +- v_v1 = vdupq_n_u32(0u); +- v_v2 = vdupq_n_u32(0u); +- v_col0 = vdupq_n_u16(0u); +- v_col1 = vdupq_n_u16(0u); +- v_col2 = vdupq_n_u16(0u); +- v_col3 = vdupq_n_u16(0u); +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 32; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32); +- while (v_p.ptr < i_end0_p) { +- v_p__left = vld1q_u8(v_p.ptr); +- v_p_right = vld1q_u8(v_p.ptr + 16u); +- v_v2 = vaddq_u32(v_v2, v_v1); +- v_v1 = vpadalq_u16(v_v1, vpadalq_u8(vpaddlq_u8(v_p__left), v_p_right)); +- v_col0 = vaddw_u8(v_col0, vget_low_u8(v_p__left)); +- v_col1 = vaddw_u8(v_col1, vget_high_u8(v_p__left)); +- v_col2 = vaddw_u8(v_col2, vget_low_u8(v_p_right)); +- v_col3 = vaddw_u8(v_col3, vget_high_u8(v_p_right)); +- v_p.ptr += 32; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over; + } +- v_p.len = 0; +- } +- v_v2 = vshlq_n_u32(v_v2, 5u); +- v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col0), ((uint16x4_t){32u, 31u, 30u, 29u})); +- v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col0), ((uint16x4_t){28u, 27u, 26u, 25u})); +- v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col1), ((uint16x4_t){24u, 23u, 22u, 21u})); +- v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col1), ((uint16x4_t){20u, 19u, 18u, 17u})); +- v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col2), ((uint16x4_t){16u, 15u, 14u, 13u})); +- v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col2), ((uint16x4_t){12u, 11u, 10u, 9u})); +- v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col3), ((uint16x4_t){8u, 7u, 6u, 5u})); +- v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col3), ((uint16x4_t){4u, 3u, 2u, 1u})); +- v_sum1 = vpadd_u32(vget_low_u32(v_v1), vget_high_u32(v_v1)); +- v_sum2 = vpadd_u32(vget_low_u32(v_v2), vget_high_u32(v_v2)); +- v_sum12 = vpadd_u32(v_sum1, v_sum2); +- v_s1 += vget_lane_u32(v_sum12, 0u); +- v_s2 += vget_lane_u32(v_sum12, 1u); +- v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u); +- if (v_tail_index < ((uint64_t)(a_x.len))) { +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- } +- v_p.len = 0; ++ return NULL; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src_over; + } +- } +- v_s1 %= 65521u; +- v_s2 %= 65521u; +- a_x = v_remaining; +- } +- self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-// ‼ WUFFS MULTI-FILE SECTION -arm_neon ++ return NULL; + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func adler32.hasher.up_x86_sse42 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_4_4; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over; ++ } ++ return NULL; + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_adler32__hasher__up_x86_sse42( +- wuffs_adler32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s1 = 0; +- uint32_t v_s2 = 0; +- wuffs_base__slice_u8 v_remaining = {0}; +- wuffs_base__slice_u8 v_p = {0}; +- __m128i v_zeroes = {0}; +- __m128i v_ones = {0}; +- __m128i v_weights__left = {0}; +- __m128i v_weights_right = {0}; +- __m128i v_q__left = {0}; +- __m128i v_q_right = {0}; +- __m128i v_v1 = {0}; +- __m128i v_v2 = {0}; +- __m128i v_v2j = {0}; +- __m128i v_v2k = {0}; +- uint32_t v_num_iterate_bytes = 0; +- uint64_t v_tail_index = 0; ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__rgba_premul__src_over; ++ } ++ return NULL; + +- v_zeroes = _mm_set1_epi16((int16_t)(0u)); +- v_ones = _mm_set1_epi16((int16_t)(1u)); +- v_weights__left = _mm_set_epi8((int8_t)(17u), (int8_t)(18u), (int8_t)(19u), (int8_t)(20u), (int8_t)(21u), (int8_t)(22u), (int8_t)(23u), (int8_t)(24u), (int8_t)(25u), (int8_t)(26u), (int8_t)(27u), (int8_t)(28u), (int8_t)(29u), (int8_t)(30u), (int8_t)(31u), (int8_t)(32u)); +- v_weights_right = _mm_set_epi8((int8_t)(1u), (int8_t)(2u), (int8_t)(3u), (int8_t)(4u), (int8_t)(5u), (int8_t)(6u), (int8_t)(7u), (int8_t)(8u), (int8_t)(9u), (int8_t)(10u), (int8_t)(11u), (int8_t)(12u), (int8_t)(13u), (int8_t)(14u), (int8_t)(15u), (int8_t)(16u)); +- v_s1 = ((self->private_impl.f_state) & 0xFFFFu); +- v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); +- while (((uint64_t)(a_x.len)) > 0u) { +- v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); +- if (((uint64_t)(a_x.len)) > 5536u) { +- v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u); +- a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u); +- } +- v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u))); +- v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes)); +- v_v1 = _mm_setzero_si128(); +- v_v2j = _mm_setzero_si128(); +- v_v2k = _mm_setzero_si128(); +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 32; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32); +- while (v_p.ptr < i_end0_p) { +- v_q__left = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr)); +- v_q_right = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u)); +- v_v2j = _mm_add_epi32(v_v2j, v_v1); +- v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q__left, v_zeroes)); +- v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q_right, v_zeroes)); +- v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q__left, v_weights__left))); +- v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q_right, v_weights_right))); +- v_p.ptr += 32; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over; + } +- v_p.len = 0; +- } +- v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(177u))); +- v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(78u))); +- v_s1 += ((uint32_t)(_mm_cvtsi128_si32(v_v1))); +- v_v2 = _mm_add_epi32(v_v2k, _mm_slli_epi32(v_v2j, (int32_t)(5u))); +- v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(177u))); +- v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(78u))); +- v_s2 += ((uint32_t)(_mm_cvtsi128_si32(v_v2))); +- v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u); +- if (v_tail_index < ((uint64_t)(a_x.len))) { +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s1 += ((uint32_t)(v_p.ptr[0u])); +- v_s2 += v_s1; +- v_p.ptr += 1; +- } +- v_p.len = 0; ++ return NULL; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over; + } +- } +- v_s1 %= 65521u; +- v_s2 %= 65521u; +- a_x = v_remaining; ++ return NULL; + } +- self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); +- return wuffs_base__make_empty_struct(); ++ return NULL; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__bgrx( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ return wuffs_private_impl__swizzle_y__bgrx; + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_bgr_565__bgrx; + +-// ---------------- Status Codes Implementations ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ return wuffs_private_impl__swizzle_xxx__xxxx; + +-const char wuffs_bmp__error__bad_header[] = "#bmp: bad header"; +-const char wuffs_bmp__error__bad_rle_compression[] = "#bmp: bad RLE compression"; +-const char wuffs_bmp__error__truncated_input[] = "#bmp: truncated input"; +-const char wuffs_bmp__error__unsupported_bmp_file[] = "#bmp: unsupported BMP file"; +-const char wuffs_bmp__note__internal_note_short_read[] = "@bmp: internal note: short read"; ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ return wuffs_private_impl__swizzle_bgrw__bgrx; + +-// ---------------- Private Consts ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_bgrw_4x16le__bgrx; + +-#define WUFFS_BMP__COMPRESSION_NONE 0 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ return wuffs_private_impl__swizzle_copy_4_4; + +-#define WUFFS_BMP__COMPRESSION_RLE8 1 ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_bgr__rgbx; + +-#define WUFFS_BMP__COMPRESSION_RLE4 2 ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ return wuffs_private_impl__swizzle_bgrw__rgbx; ++ } ++ return NULL; ++} + +-#define WUFFS_BMP__COMPRESSION_BITFIELDS 3 ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__rgb( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ return wuffs_private_impl__swizzle_bgr_565__rgb; + +-#define WUFFS_BMP__COMPRESSION_JPEG 4 ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ return wuffs_private_impl__swizzle_swap_rgb_bgr; + +-#define WUFFS_BMP__COMPRESSION_PNG 5 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_bgrw__rgb; + +-#define WUFFS_BMP__COMPRESSION_ALPHABITFIELDS 6 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ return wuffs_private_impl__swizzle_bgrw_4x16le__rgb; + +-#define WUFFS_BMP__COMPRESSION_LOW_BIT_DEPTH 256 ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ return wuffs_private_impl__swizzle_copy_3_3; + +-#define WUFFS_BMP__RLE_STATE_NEUTRAL 0 ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_bgrw__bgr; ++ } ++ return NULL; ++} + +-#define WUFFS_BMP__RLE_STATE_RUN 1 ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__rgba_nonpremul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-#define WUFFS_BMP__RLE_STATE_ESCAPE 2 ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-#define WUFFS_BMP__RLE_STATE_LITERAL 3 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-#define WUFFS_BMP__RLE_STATE_DELTA_X 4 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-#define WUFFS_BMP__RLE_STATE_DELTA_Y 5 ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over; ++ } ++ return NULL; + +-// ---------------- Private Initializer Prototypes ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ // TODO. ++ break; + +-// ---------------- Private Function Prototypes ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_image_config( +- wuffs_bmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_4_4; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_frame_config( +- wuffs_bmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_frame( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ // TODO. ++ break; ++ } ++ return NULL; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_none( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); ++static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func // ++wuffs_private_impl__pixel_swizzler__prepare__rgba_premul( ++ wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ switch (dst_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr_565__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr_565__rgba_premul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_rle( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__rgba_premul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_bitfields( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_low_bit_depth( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_tell_me_more( +- wuffs_bmp__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__read_palette( +- wuffs_bmp__decoder* self, +- wuffs_base__io_buffer* a_src); ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ if (wuffs_base__cpu_arch__have_x86_sse42()) { ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42; ++ } ++#endif ++ return wuffs_private_impl__swizzle_swap_rgbx_bgrx; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over; ++ } ++ return NULL; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__process_masks( +- wuffs_bmp__decoder* self); ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgr__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgr__bgra_premul__src_over; ++ } ++ return NULL; + +-// ---------------- VTables ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over; ++ } ++ return NULL; + +-const wuffs_base__image_decoder__func_ptrs +-wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_bmp__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_bmp__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_bmp__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_bmp__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_bmp__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_bmp__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_bmp__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_bmp__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_bmp__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bmp__decoder__workbuf_len), +-}; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ return wuffs_private_impl__swizzle_copy_4_4; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ return wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over; ++ } ++ return NULL; ++ } ++ return NULL; ++} + +-// ---------------- Initializer Implementations ++// -------- + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_bmp__decoder__initialize( +- wuffs_bmp__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status // ++wuffs_base__pixel_swizzler__prepare(wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_format dst_pixfmt, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__pixel_format src_pixfmt, ++ wuffs_base__slice_u8 src_palette, ++ wuffs_base__pixel_blend blend) { ++ if (!p) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++ p->private_impl.func = NULL; ++ p->private_impl.transparent_black_func = NULL; ++ p->private_impl.dst_pixfmt_bytes_per_pixel = 0; ++ p->private_impl.src_pixfmt_bytes_per_pixel = 0; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++ // ---- ++ ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST) ++ switch (dst_pixfmt.repr) { ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR_565) ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ break; + #endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR) ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ break; + #endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL_4X16LE) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_PREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGB) ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_NONPREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_PREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ break; ++#endif ++ default: ++ return wuffs_base__make_status( ++ wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist); + } ++#endif // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST) + +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); +-} ++ // ---- + +-wuffs_bmp__decoder* +-wuffs_bmp__decoder__alloc(void) { +- wuffs_bmp__decoder* x = +- (wuffs_bmp__decoder*)(calloc(sizeof(wuffs_bmp__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_bmp__decoder__initialize( +- x, sizeof(wuffs_bmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ wuffs_base__pixel_swizzler__func func = NULL; ++ wuffs_base__pixel_swizzler__transparent_black_func transparent_black_func = ++ NULL; ++ ++ uint32_t dst_pixfmt_bits_per_pixel = ++ wuffs_base__pixel_format__bits_per_pixel(&dst_pixfmt); ++ if ((dst_pixfmt_bits_per_pixel == 0) || ++ ((dst_pixfmt_bits_per_pixel & 7) != 0)) { ++ return wuffs_base__make_status( ++ wuffs_base__error__unsupported_pixel_swizzler_option); + } +- return x; +-} + +-size_t +-sizeof__wuffs_bmp__decoder(void) { +- return sizeof(wuffs_bmp__decoder); +-} ++ uint32_t src_pixfmt_bits_per_pixel = ++ wuffs_base__pixel_format__bits_per_pixel(&src_pixfmt); ++ if ((src_pixfmt_bits_per_pixel == 0) || ++ ((src_pixfmt_bits_per_pixel & 7) != 0)) { ++ return wuffs_base__make_status( ++ wuffs_base__error__unsupported_pixel_swizzler_option); ++ } + +-// ---------------- Function Implementations ++ // TODO: support many more formats. + +-// -------- func bmp.decoder.get_quirk ++ switch (blend) { ++ case WUFFS_BASE__PIXEL_BLEND__SRC: ++ transparent_black_func = ++ wuffs_private_impl__swizzle_transparent_black_src; ++ break; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bmp__decoder__get_quirk( +- const wuffs_bmp__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ case WUFFS_BASE__PIXEL_BLEND__SRC_OVER: ++ transparent_black_func = ++ wuffs_private_impl__swizzle_transparent_black_src_over; ++ break; + } + +- return 0u; +-} ++ switch (src_pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ func = wuffs_private_impl__pixel_swizzler__prepare__y( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; + +-// -------- func bmp.decoder.set_quirk ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: ++ func = wuffs_private_impl__pixel_swizzler__prepare__y_16be( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__set_quirk( +- wuffs_bmp__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: ++ func = wuffs_private_impl__pixel_swizzler__prepare__ya_nonpremul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ func = ++ wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_nonpremul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: ++ func = wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_binary( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgr_565( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgr( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul_4x16le( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgra_premul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ func = wuffs_private_impl__pixel_swizzler__prepare__bgrx( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ func = wuffs_private_impl__pixel_swizzler__prepare__rgb( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ func = wuffs_private_impl__pixel_swizzler__prepare__rgba_nonpremul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; ++ ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ func = wuffs_private_impl__pixel_swizzler__prepare__rgba_premul( ++ p, dst_pixfmt, dst_palette, src_palette, blend); ++ break; + } + +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ p->private_impl.func = func; ++ p->private_impl.transparent_black_func = transparent_black_func; ++ p->private_impl.dst_pixfmt_bytes_per_pixel = dst_pixfmt_bits_per_pixel / 8; ++ p->private_impl.src_pixfmt_bytes_per_pixel = src_pixfmt_bits_per_pixel / 8; ++ return wuffs_base__make_status( ++ func ? NULL : wuffs_base__error__unsupported_pixel_swizzler_option); + } + +-// -------- func bmp.decoder.decode_image_config +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__decode_image_config( +- wuffs_bmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( ++ const wuffs_base__pixel_swizzler* p, ++ uint32_t up_to_num_pixels, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r) { ++ if (p && p->private_impl.func) { ++ const uint8_t* iop_r = *ptr_iop_r; ++ uint64_t src_len = wuffs_base__u64__min( ++ ((uint64_t)up_to_num_pixels) * ++ ((uint64_t)p->private_impl.src_pixfmt_bytes_per_pixel), ++ ((uint64_t)(io2_r - iop_r))); ++ uint64_t n = ++ (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, ++ dst_palette.len, iop_r, (size_t)src_len); ++ *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel; ++ return n; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ return 0; ++} ++ ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ const uint8_t** ptr_iop_r, ++ const uint8_t* io2_r) { ++ if (p && p->private_impl.func) { ++ const uint8_t* iop_r = *ptr_iop_r; ++ uint64_t src_len = ((uint64_t)(io2_r - iop_r)); ++ uint64_t n = ++ (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, ++ dst_palette.len, iop_r, (size_t)src_len); ++ *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel; ++ return n; + } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ return 0; ++} ++ ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ wuffs_base__slice_u8 src) { ++ if (p && p->private_impl.func) { ++ return (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr, ++ dst_palette.len, src.ptr, src.len); + } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ return 0; ++} ++ ++WUFFS_BASE__MAYBE_STATIC uint64_t // ++wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__slice_u8 dst, ++ wuffs_base__slice_u8 dst_palette, ++ uint64_t num_pixels) { ++ if (p && p->private_impl.transparent_black_func) { ++ return (*p->private_impl.transparent_black_func)( ++ dst.ptr, dst.len, dst_palette.ptr, dst_palette.len, num_pixels, ++ p->private_impl.dst_pixfmt_bytes_per_pixel); + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ return 0; ++} + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++// -------- + +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2); + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2); + +- ok: +- self->private_impl.p_decode_image_config[0] = 0; +- goto exit; +- } ++#if defined(__GNUC__) && !defined(__clang__) ++// No-op. ++#else ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column, ++ bool last_column); ++#endif ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) + +- goto suspend; +- suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++// -------- + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; ++static inline uint32_t // ++wuffs_private_impl__u32__max_of_4(uint32_t a, ++ uint32_t b, ++ uint32_t c, ++ uint32_t d) { ++ return wuffs_base__u32__max( // ++ wuffs_base__u32__max(a, b), // ++ wuffs_base__u32__max(c, d)); + } + +-// -------- func bmp.decoder.do_decode_image_config ++static inline uint32_t // ++wuffs_private_impl__u32__min_of_5(uint32_t a, ++ uint32_t b, ++ uint32_t c, ++ uint32_t d, ++ uint32_t e) { ++ return wuffs_base__u32__min( // ++ wuffs_base__u32__min( // ++ wuffs_base__u32__min(a, b), // ++ wuffs_base__u32__min(c, d)), // ++ e); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_image_config( +- wuffs_bmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++// -------- + +- uint32_t v_magic = 0; +- uint32_t v_width = 0; +- uint32_t v_height = 0; +- uint32_t v_planes = 0; +- uint32_t v_dst_pixfmt = 0; +- uint32_t v_byte_width = 0; ++typedef void (*wuffs_private_impl__swizzle_ycc__convert_4_func)( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2, ++ const uint8_t* up3); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++static void // ++wuffs_private_impl__swizzle_cmyk__convert_4_general( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2, ++ const uint8_t* up3) { ++ for (; x < x_end; x++) { ++ // It's called CMYK but, but for Adobe CMYK JPEG images in practice, it's ++ // RGBW: 0xFFu means no ink instead of full ink. Note that a double ++ // inversion is a no-op, so inversions might be implicit in the code below. ++ uint32_t r = ((uint32_t)(*up0++)); ++ uint32_t g = ((uint32_t)(*up1++)); ++ uint32_t b = ((uint32_t)(*up2++)); ++ uint32_t w = ((uint32_t)(*up3++)); ++ r = ((r * w) + 0x7Fu) / 0xFFu; ++ g = ((g * w) + 0x7Fu) / 0xFFu; ++ b = ((b * w) + 0x7Fu) / 0xFFu; ++ wuffs_base__pixel_buffer__set_color_u32_at( ++ dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u)); + } ++} + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++static void // ++wuffs_private_impl__swizzle_ycck__convert_4_general( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2, ++ const uint8_t* up3) { ++ for (; x < x_end; x++) { ++ // We invert once again: 0xFFu means no ink instead of full ink. ++ uint32_t color = // ++ wuffs_base__color_ycc__as__color_u32( // ++ *up0++, *up1++, *up2++); ++ uint32_t r = 0xFFu - (0xFFu & (color >> 16u)); ++ uint32_t g = 0xFFu - (0xFFu & (color >> 8u)); ++ uint32_t b = 0xFFu - (0xFFu & (color >> 0u)); ++ uint32_t w = ((uint32_t)(*up3++)); ++ r = ((r * w) + 0x7Fu) / 0xFFu; ++ g = ((g * w) + 0x7Fu) / 0xFFu; ++ b = ((b * w) + 0x7Fu) / 0xFFu; ++ wuffs_base__pixel_buffer__set_color_u32_at( ++ dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u)); ++ } ++} + +- if ((self->private_impl.f_call_sequence != 0u) || (self->private_impl.f_io_redirect_fourcc == 1u)) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if (self->private_impl.f_io_redirect_fourcc != 0u) { +- status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); +- goto ok; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 8) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; +- } +- } +- v_magic = t_0; +- } +- if (v_magic != 19778u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } +- self->private_data.s_do_decode_image_config[0].scratch = 8u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++// -------- ++ ++typedef void (*wuffs_private_impl__swizzle_ycc__convert_3_func)( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2); ++ ++static void // ++wuffs_private_impl__swizzle_rgb__convert_3_general( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ for (; x < x_end; x++) { ++ uint32_t color = 0xFF000000u | // ++ (((uint32_t)(*up0++)) << 16u) | // ++ (((uint32_t)(*up1++)) << 8u) | // ++ (((uint32_t)(*up2++)) << 0u); ++ wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color); ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_general( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ for (; x < x_end; x++) { ++ uint32_t color = // ++ wuffs_base__color_ycc__as__color_u32( // ++ *up0++, *up1++, *up2++); ++ wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color); ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_bgrx(wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ size_t dst_stride = dst->private_impl.planes[0].stride; ++ uint8_t* dst_iter = dst->private_impl.planes[0].ptr + ++ (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); ++ ++ for (; x < x_end; x++) { ++ uint32_t color = // ++ wuffs_base__color_ycc__as__color_u32( // ++ *up0++, *up1++, *up2++); ++ wuffs_base__poke_u32le__no_bounds_check(dst_iter, color); ++ dst_iter += 4u; ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_rgbx(wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ size_t dst_stride = dst->private_impl.planes[0].stride; ++ uint8_t* dst_iter = dst->private_impl.planes[0].ptr + ++ (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); ++ ++ for (; x < x_end; x++) { ++ uint32_t color = // ++ wuffs_base__color_ycc__as__color_u32_abgr( // ++ *up0++, *up1++, *up2++); ++ wuffs_base__poke_u32le__no_bounds_check(dst_iter, color); ++ dst_iter += 4u; ++ } ++} ++ ++// -------- ++ ++// wuffs_private_impl__swizzle_ycc__upsample_func upsamples to a destination ++// slice at least 480 (YCCK) or 672 (YCC) bytes long and whose src_len ++// (multiplied by 1, 2, 3 or 4) is positive but no more than that. This 480 or ++// 672 length is just under 1/4 or 1/3 of the scratch_buffer_2k slice length. ++// Both (480 * 4) = 1920 and (672 * 3) = 2016 are less than 2048. ++// ++// 480 and 672 are nice round numbers because a JPEG MCU is 1, 2, 3 or 4 blocks ++// wide and each block is 8 pixels wide. We have: ++// 480 = 1 * 8 * 60, 672 = 1 * 8 * 84 ++// 480 = 2 * 8 * 30, 672 = 2 * 8 * 42 ++// 480 = 3 * 8 * 20, 672 = 3 * 8 * 28 ++// 480 = 4 * 8 * 15, 672 = 4 * 8 * 21 ++// ++// Box filters are equivalent to nearest neighbor upsampling. These ignore the ++// src_ptr_minor, h1v2_bias, first_column and last_column arguments. ++// ++// Triangle filters use a 3:1 ratio (in 1 dimension), or 9:3:3:1 (in 2 ++// dimensions), which is higher quality (less blocky) but also higher ++// computational effort. ++// ++// In theory, we could use triangle filters for any (inv_h, inv_v) combination. ++// In practice, matching libjpeg-turbo, we only implement it for the common ++// chroma subsampling ratios (YCC420, YCC422 or YCC440), corresponding to an ++// (inv_h, inv_v) pair of (2, 2), (2, 1) or (1, 2). ++typedef const uint8_t* (*wuffs_private_impl__swizzle_ycc__upsample_func)( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, // Nearest row. ++ const uint8_t* src_ptr_minor, // Adjacent row, alternating above or below. ++ size_t src_len, ++ uint32_t h1v2_bias, ++ bool first_column, ++ bool last_column); ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor_ignored, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column_ignored, ++ bool last_column_ignored) { ++ return src_ptr_major; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor_ignored, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column_ignored, ++ bool last_column_ignored) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp = src_ptr_major; ++ while (src_len--) { ++ uint8_t sv = *sp++; ++ *dp++ = sv; ++ *dp++ = sv; ++ } ++ return dst_ptr; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor_ignored, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column_ignored, ++ bool last_column_ignored) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp = src_ptr_major; ++ while (src_len--) { ++ uint8_t sv = *sp++; ++ *dp++ = sv; ++ *dp++ = sv; ++ *dp++ = sv; ++ } ++ return dst_ptr; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor_ignored, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column_ignored, ++ bool last_column_ignored) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp = src_ptr_major; ++ while (src_len--) { ++ uint8_t sv = *sp++; ++ *dp++ = sv; ++ *dp++ = sv; ++ *dp++ = sv; ++ *dp++ = sv; ++ } ++ return dst_ptr; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h1v2_triangle( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor, ++ size_t src_len, ++ uint32_t h1v2_bias, ++ bool first_column, ++ bool last_column) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp_major = src_ptr_major; ++ const uint8_t* sp_minor = src_ptr_minor; ++ while (src_len--) { ++ *dp++ = (uint8_t)(((3u * ((uint32_t)(*sp_major++))) + // ++ (1u * ((uint32_t)(*sp_minor++))) + // ++ h1v2_bias) >> ++ 2u); ++ } ++ return dst_ptr; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h2v1_triangle( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column, ++ bool last_column) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp = src_ptr_major; ++ ++ if (first_column) { ++ src_len--; ++ if ((src_len <= 0u) && last_column) { ++ uint8_t sv = *sp++; ++ *dp++ = sv; ++ *dp++ = sv; ++ return dst_ptr; + } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; +- } +- } +- self->private_impl.f_padding = t_1; ++ uint32_t svp1 = sp[+1]; ++ uint8_t sv = *sp++; ++ *dp++ = sv; ++ *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svp1 + 2u) >> 2u); ++ if (src_len <= 0u) { ++ return dst_ptr; + } +- if (self->private_impl.f_padding < 14u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; ++ } ++ ++ if (last_column) { ++ src_len--; ++ } ++ ++ for (; src_len > 0u; src_len--) { ++ uint32_t svm1 = sp[-1]; ++ uint32_t svp1 = sp[+1]; ++ uint32_t sv3 = 3u * (uint32_t)(*sp++); ++ *dp++ = (uint8_t)((sv3 + svm1 + 1u) >> 2u); ++ *dp++ = (uint8_t)((sv3 + svp1 + 2u) >> 2u); ++ } ++ ++ if (last_column) { ++ uint32_t svm1 = sp[-1]; ++ uint8_t sv = *sp++; ++ *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svm1 + 1u) >> 2u); ++ *dp++ = sv; ++ } ++ ++ return dst_ptr; ++} ++ ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column, ++ bool last_column) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp_major = src_ptr_major; ++ const uint8_t* sp_minor = src_ptr_minor; ++ ++ if (first_column) { ++ src_len--; ++ if ((src_len <= 0u) && last_column) { ++ uint32_t sv = (12u * ((uint32_t)(*sp_major++))) + // ++ (4u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + 7u) >> 4u); ++ return dst_ptr; + } +- self->private_impl.f_padding -= 14u; +- self->private_impl.f_io_redirect_pos = wuffs_base__u64__sat_add(((uint64_t)(self->private_impl.f_padding)), wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; +- if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; +- } +- } +- self->private_impl.f_bitmap_info_len = t_2; ++ ++ uint32_t sv_major_m1 = sp_major[-0]; // Clamp offset to zero. ++ uint32_t sv_minor_m1 = sp_minor[-0]; // Clamp offset to zero. ++ uint32_t sv_major_p1 = sp_major[+1]; ++ uint32_t sv_minor_p1 = sp_minor[+1]; ++ ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ if (src_len <= 0u) { ++ return dst_ptr; + } +- if (self->private_impl.f_padding < self->private_impl.f_bitmap_info_len) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; ++ } ++ ++ if (last_column) { ++ src_len--; ++ } ++ ++ for (; src_len > 0u; src_len--) { ++ uint32_t sv_major_m1 = sp_major[-1]; ++ uint32_t sv_minor_m1 = sp_minor[-1]; ++ uint32_t sv_major_p1 = sp_major[+1]; ++ uint32_t sv_minor_p1 = sp_minor[+1]; ++ ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ } ++ ++ if (last_column) { ++ uint32_t sv_major_m1 = sp_major[-1]; ++ uint32_t sv_minor_m1 = sp_minor[-1]; ++ uint32_t sv_major_p1 = sp_major[+0]; // Clamp offset to zero. ++ uint32_t sv_minor_p1 = sp_minor[+0]; // Clamp offset to zero. ++ ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ } ++ ++ return dst_ptr; ++} ++ ++// wuffs_private_impl__swizzle_ycc__upsample_funcs is indexed by inv_h and then ++// inv_v. ++static const wuffs_private_impl__swizzle_ycc__upsample_func ++ wuffs_private_impl__swizzle_ycc__upsample_funcs[4][4] = { ++ { ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box, ++ }, ++ { ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box, ++ }, ++ { ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box, ++ }, ++ { ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box, ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box, ++ }, ++}; ++ ++static inline uint32_t // ++wuffs_private_impl__swizzle_has_triangle_upsampler(uint32_t inv_h, ++ uint32_t inv_v) { ++ if (inv_h == 1u) { ++ return inv_v == 2u; ++ } else if (inv_h == 2u) { ++ return (inv_v == 1u) || (inv_v == 2u); ++ } ++ return false; ++} ++ ++// -------- ++ ++// All of the wuffs_private_impl__swizzle_ycc__etc functions have ++// preconditions. See all of the checks made in ++// wuffs_base__pixel_swizzler__swizzle_ycck before calling these functions. For ++// example, (width > 0) is a precondition, but there are many more. ++ ++static void // ++wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t width, ++ uint32_t y, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ const uint8_t* src_ptr3, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t stride3, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_h3, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t inv_v3, ++ uint32_t half_width_for_2to1, ++ uint32_t h1v2_bias, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc3, ++ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) { ++ const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0); ++ const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1); ++ const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2); ++ const uint8_t* src3 = src_ptr3 + ((y / inv_v3) * (size_t)stride3); ++ uint32_t total_src_len0 = 0u; ++ uint32_t total_src_len1 = 0u; ++ uint32_t total_src_len2 = 0u; ++ uint32_t total_src_len3 = 0u; ++ ++ uint32_t x = 0u; ++ while (x < width) { ++ bool first_column = x == 0u; ++ uint32_t end = x + 480u; ++ if (end > width) { ++ end = width; + } +- self->private_impl.f_padding -= self->private_impl.f_bitmap_info_len; +- if (self->private_impl.f_bitmap_info_len == 12u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; +- if (num_bits_3 == 8) { +- t_3 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)) << 56; +- } +- } +- self->private_impl.f_width = t_3; ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3; ++ total_src_len0 += src_len0; ++ total_src_len1 += src_len1; ++ total_src_len2 += src_len2; ++ total_src_len3 += src_len3; ++ ++ const uint8_t* src_ptr_x0 = src0 + (x / inv_h0); ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 480u), // ++ src_ptr_x0, // ++ src_ptr_x0, // ++ src_len0, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len0 >= half_width_for_2to1)); ++ ++ const uint8_t* src_ptr_x1 = src1 + (x / inv_h1); ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 480u), // ++ src_ptr_x1, // ++ src_ptr_x1, // ++ src_len1, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len1 >= half_width_for_2to1)); ++ ++ const uint8_t* src_ptr_x2 = src2 + (x / inv_h2); ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 480u), // ++ src_ptr_x2, // ++ src_ptr_x2, // ++ src_len2, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len2 >= half_width_for_2to1)); ++ ++ const uint8_t* src_ptr_x3 = src3 + (x / inv_h3); ++ const uint8_t* up3 = (*upfunc3)( // ++ scratch_buffer_2k_ptr + (3u * 480u), // ++ src_ptr_x3, // ++ src_ptr_x3, // ++ src_len3, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len3 >= half_width_for_2to1)); ++ ++ (*conv4func)(dst, x, end, y, up0, up1, up2, up3); ++ x = end; ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycck__general__triangle_filter( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ const uint8_t* src_ptr3, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t stride3, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_h3, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t inv_v3, ++ uint32_t half_width_for_2to1, ++ uint32_t half_height_for_2to1, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) { ++ if ((x_min_incl != 0) || (y_min_incl != 0)) { ++ return; ++ } ++ ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 = ++ (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 = ++ (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 = ++ (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc3 = ++ (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u]; ++ ++ // First row. ++ uint32_t h1v2_bias = 1u; ++ wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row( ++ dst, x_max_excl, 0u, // ++ src_ptr0, src_ptr1, src_ptr2, src_ptr3, // ++ stride0, stride1, stride2, stride3, // ++ inv_h0, inv_h1, inv_h2, inv_h3, // ++ inv_v0, inv_v1, inv_v2, inv_v3, // ++ half_width_for_2to1, // ++ h1v2_bias, // ++ scratch_buffer_2k_ptr, // ++ upfunc0, upfunc1, upfunc2, upfunc3, conv4func); ++ h1v2_bias = 2u; ++ ++ // Middle rows. ++ bool last_row = y_max_excl == 2u * half_height_for_2to1; ++ uint32_t middle_y_max_excl = last_row ? (y_max_excl - 1u) : y_max_excl; ++ uint32_t y; ++ for (y = 1u; y < middle_y_max_excl; y++) { ++ const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0); ++ const uint8_t* src0_minor = ++ (inv_v0 != 2u) ++ ? src0_major ++ : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0)); ++ const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1); ++ const uint8_t* src1_minor = ++ (inv_v1 != 2u) ++ ? src1_major ++ : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1)); ++ const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2); ++ const uint8_t* src2_minor = ++ (inv_v2 != 2u) ++ ? src2_major ++ : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2)); ++ const uint8_t* src3_major = src_ptr3 + ((y / inv_v3) * (size_t)stride3); ++ const uint8_t* src3_minor = ++ (inv_v3 != 2u) ++ ? src3_major ++ : ((y & 1u) ? (src3_major + stride3) : (src3_major - stride3)); ++ uint32_t total_src_len0 = 0u; ++ uint32_t total_src_len1 = 0u; ++ uint32_t total_src_len2 = 0u; ++ uint32_t total_src_len3 = 0u; ++ ++ uint32_t x = 0u; ++ while (x < x_max_excl) { ++ bool first_column = x == 0u; ++ uint32_t end = x + 480u; ++ if (end > x_max_excl) { ++ end = x_max_excl; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 8) { +- t_4 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; +- } +- } +- self->private_impl.f_height = t_4; ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3; ++ total_src_len0 += src_len0; ++ total_src_len1 += src_len1; ++ total_src_len2 += src_len2; ++ total_src_len3 += src_len3; ++ ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 480u), // ++ src0_major + (x / inv_h0), // ++ src0_minor + (x / inv_h0), // ++ src_len0, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len0 >= half_width_for_2to1)); ++ ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 480u), // ++ src1_major + (x / inv_h1), // ++ src1_minor + (x / inv_h1), // ++ src_len1, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len1 >= half_width_for_2to1)); ++ ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 480u), // ++ src2_major + (x / inv_h2), // ++ src2_minor + (x / inv_h2), // ++ src_len2, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len2 >= half_width_for_2to1)); ++ ++ const uint8_t* up3 = (*upfunc3)( // ++ scratch_buffer_2k_ptr + (3u * 480u), // ++ src3_major + (x / inv_h3), // ++ src3_minor + (x / inv_h3), // ++ src_len3, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len3 >= half_width_for_2to1)); ++ ++ (*conv4func)(dst, x, end, y, up0, up1, up2, up3); ++ x = end; ++ } ++ ++ h1v2_bias ^= 3u; ++ } ++ ++ // Last row. ++ if (middle_y_max_excl != y_max_excl) { ++ wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row( ++ dst, x_max_excl, middle_y_max_excl, // ++ src_ptr0, src_ptr1, src_ptr2, src_ptr3, // ++ stride0, stride1, stride2, stride3, // ++ inv_h0, inv_h1, inv_h2, inv_h3, // ++ inv_v0, inv_v1, inv_v2, inv_v3, // ++ half_width_for_2to1, // ++ h1v2_bias, // ++ scratch_buffer_2k_ptr, // ++ upfunc0, upfunc1, upfunc2, upfunc3, conv4func); ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t width, ++ uint32_t y, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t half_width_for_2to1, ++ uint32_t h1v2_bias, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1, ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2, ++ wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) { ++ const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0); ++ const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1); ++ const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2); ++ uint32_t total_src_len0 = 0u; ++ uint32_t total_src_len1 = 0u; ++ uint32_t total_src_len2 = 0u; ++ ++ uint32_t x = 0u; ++ while (x < width) { ++ bool first_column = x == 0u; ++ uint32_t end = x + 672u; ++ if (end > width) { ++ end = width; ++ } ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ total_src_len0 += src_len0; ++ total_src_len1 += src_len1; ++ total_src_len2 += src_len2; ++ ++ const uint8_t* src_ptr_x0 = src0 + (x / inv_h0); ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 672u), // ++ src_ptr_x0, // ++ src_ptr_x0, // ++ src_len0, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len0 >= half_width_for_2to1)); ++ ++ const uint8_t* src_ptr_x1 = src1 + (x / inv_h1); ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 672u), // ++ src_ptr_x1, // ++ src_ptr_x1, // ++ src_len1, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len1 >= half_width_for_2to1)); ++ ++ const uint8_t* src_ptr_x2 = src2 + (x / inv_h2); ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 672u), // ++ src_ptr_x2, // ++ src_ptr_x2, // ++ src_len2, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len2 >= half_width_for_2to1)); ++ ++ (*conv3func)(dst, x, end, y, up0, up1, up2); ++ x = end; ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__general__triangle_filter( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t half_width_for_2to1, ++ uint32_t half_height_for_2to1, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) { ++ if ((x_min_incl != 0) || (y_min_incl != 0)) { ++ return; ++ } ++ ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 = ++ (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 = ++ (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 = ++ (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; ++ ++ // First row. ++ uint32_t h1v2_bias = 1u; ++ wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row( ++ dst, x_max_excl, 0u, // ++ src_ptr0, src_ptr1, src_ptr2, // ++ stride0, stride1, stride2, // ++ inv_h0, inv_h1, inv_h2, // ++ inv_v0, inv_v1, inv_v2, // ++ half_width_for_2to1, // ++ h1v2_bias, // ++ scratch_buffer_2k_ptr, // ++ upfunc0, upfunc1, upfunc2, conv3func); ++ h1v2_bias = 2u; ++ ++ // Middle rows. ++ bool last_row = y_max_excl == 2u * half_height_for_2to1; ++ uint32_t middle_y_max_excl = last_row ? (y_max_excl - 1u) : y_max_excl; ++ uint32_t y; ++ for (y = 1u; y < middle_y_max_excl; y++) { ++ const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0); ++ const uint8_t* src0_minor = ++ (inv_v0 != 2u) ++ ? src0_major ++ : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0)); ++ const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1); ++ const uint8_t* src1_minor = ++ (inv_v1 != 2u) ++ ? src1_major ++ : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1)); ++ const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2); ++ const uint8_t* src2_minor = ++ (inv_v2 != 2u) ++ ? src2_major ++ : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2)); ++ uint32_t total_src_len0 = 0u; ++ uint32_t total_src_len1 = 0u; ++ uint32_t total_src_len2 = 0u; ++ ++ uint32_t x = 0u; ++ while (x < x_max_excl) { ++ bool first_column = x == 0u; ++ uint32_t end = x + 672u; ++ if (end > x_max_excl) { ++ end = x_max_excl; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- uint32_t t_5; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_5 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5; +- if (num_bits_5 == 8) { +- t_5 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_5 += 8u; +- *scratch |= ((uint64_t)(num_bits_5)) << 56; +- } +- } +- v_planes = t_5; ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ total_src_len0 += src_len0; ++ total_src_len1 += src_len1; ++ total_src_len2 += src_len2; ++ ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 672u), // ++ src0_major + (x / inv_h0), // ++ src0_minor + (x / inv_h0), // ++ src_len0, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len0 >= half_width_for_2to1)); ++ ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 672u), // ++ src1_major + (x / inv_h1), // ++ src1_minor + (x / inv_h1), // ++ src_len1, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len1 >= half_width_for_2to1)); ++ ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 672u), // ++ src2_major + (x / inv_h2), // ++ src2_minor + (x / inv_h2), // ++ src_len2, // ++ h1v2_bias, // ++ first_column, // ++ (total_src_len2 >= half_width_for_2to1)); ++ ++ (*conv3func)(dst, x, end, y, up0, up1, up2); ++ x = end; ++ } ++ ++ h1v2_bias ^= 3u; ++ } ++ ++ // Last row. ++ if (middle_y_max_excl != y_max_excl) { ++ wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row( ++ dst, x_max_excl, middle_y_max_excl, // ++ src_ptr0, src_ptr1, src_ptr2, // ++ stride0, stride1, stride2, // ++ inv_h0, inv_h1, inv_h2, // ++ inv_v0, inv_v1, inv_v2, // ++ half_width_for_2to1, // ++ h1v2_bias, // ++ scratch_buffer_2k_ptr, // ++ upfunc0, upfunc1, upfunc2, conv3func); ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycc__general__box_filter( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t half_width_for_2to1, ++ uint32_t half_height_for_2to1, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) { ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 = ++ (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 = ++ (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 = ++ (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; ++ ++ uint32_t y; ++ for (y = y_min_incl; y < y_max_excl; y++) { ++ const uint8_t* src0_major = ++ src_ptr0 + (((y - y_min_incl) / inv_v0) * (size_t)stride0); ++ const uint8_t* src1_major = ++ src_ptr1 + (((y - y_min_incl) / inv_v1) * (size_t)stride1); ++ const uint8_t* src2_major = ++ src_ptr2 + (((y - y_min_incl) / inv_v2) * (size_t)stride2); ++ ++ uint32_t x = x_min_incl; ++ while (x < x_max_excl) { ++ uint32_t end = x + 672u; ++ if (end > x_max_excl) { ++ end = x_max_excl; + } +- if (v_planes != 1u) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 672u), // ++ src0_major + ((x - x_min_incl) / inv_h0), // ++ src0_major + ((x - x_min_incl) / inv_h0), // ++ src_len0, // ++ 0u, false, false); ++ ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 672u), // ++ src1_major + ((x - x_min_incl) / inv_h1), // ++ src1_major + ((x - x_min_incl) / inv_h1), // ++ src_len1, // ++ 0u, false, false); ++ ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 672u), // ++ src2_major + ((x - x_min_incl) / inv_h2), // ++ src2_major + ((x - x_min_incl) / inv_h2), // ++ src_len2, // ++ 0u, false, false); ++ ++ (*conv3func)(dst, x, end, y, up0, up1, up2); ++ x = end; ++ } ++ } ++} ++ ++static void // ++wuffs_private_impl__swizzle_ycck__general__box_filter( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ const uint8_t* src_ptr0, ++ const uint8_t* src_ptr1, ++ const uint8_t* src_ptr2, ++ const uint8_t* src_ptr3, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t stride3, ++ uint32_t inv_h0, ++ uint32_t inv_h1, ++ uint32_t inv_h2, ++ uint32_t inv_h3, ++ uint32_t inv_v0, ++ uint32_t inv_v1, ++ uint32_t inv_v2, ++ uint32_t inv_v3, ++ uint32_t half_width_for_2to1, ++ uint32_t half_height_for_2to1, ++ uint8_t* scratch_buffer_2k_ptr, ++ wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) { ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 = ++ (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 = ++ (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 = ++ (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u]; ++ wuffs_private_impl__swizzle_ycc__upsample_func upfunc3 = ++ (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u]; ++ ++ uint32_t y; ++ for (y = y_min_incl; y < y_max_excl; y++) { ++ const uint8_t* src0_major = ++ src_ptr0 + (((y - y_min_incl) / inv_v0) * (size_t)stride0); ++ const uint8_t* src1_major = ++ src_ptr1 + (((y - y_min_incl) / inv_v1) * (size_t)stride1); ++ const uint8_t* src2_major = ++ src_ptr2 + (((y - y_min_incl) / inv_v2) * (size_t)stride2); ++ const uint8_t* src3_major = ++ src_ptr3 + (((y - y_min_incl) / inv_v3) * (size_t)stride3); ++ ++ uint32_t x = x_min_incl; ++ while (x < x_max_excl) { ++ uint32_t end = x + 480u; ++ if (end > x_max_excl) { ++ end = x_max_excl; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); +- uint32_t t_6; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6; +- if (num_bits_6 == 8) { +- t_6 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_6 += 8u; +- *scratch |= ((uint64_t)(num_bits_6)) << 56; +- } +- } +- self->private_impl.f_bits_per_pixel = t_6; +- } +- } else if (self->private_impl.f_bitmap_info_len == 16u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- uint32_t t_7; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; +- if (num_bits_7 == 24) { +- t_7 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_7 += 8u; +- *scratch |= ((uint64_t)(num_bits_7)) << 56; +- } +- } +- v_width = t_7; +- } +- if (v_width > 2147483647u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } else if (v_width > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_width = v_width; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); +- uint32_t t_8; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; +- if (num_bits_8 == 24) { +- t_8 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_8 += 8u; +- *scratch |= ((uint64_t)(num_bits_8)) << 56; +- } +- } +- v_height = t_8; +- } +- if (v_height > 2147483647u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } else if (v_height > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_height = v_height; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); +- uint32_t t_9; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_9 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9; +- if (num_bits_9 == 8) { +- t_9 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_9 += 8u; +- *scratch |= ((uint64_t)(num_bits_9)) << 56; +- } +- } +- v_planes = t_9; +- } +- if (v_planes != 1u) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); +- uint32_t t_10; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_10 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10; +- if (num_bits_10 == 8) { +- t_10 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_10 += 8u; +- *scratch |= ((uint64_t)(num_bits_10)) << 56; +- } +- } +- self->private_impl.f_bits_per_pixel = t_10; +- } +- } else { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); +- uint32_t t_11; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(25); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11; +- if (num_bits_11 == 24) { +- t_11 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_11 += 8u; +- *scratch |= ((uint64_t)(num_bits_11)) << 56; +- } +- } +- v_width = t_11; +- } +- if (v_width > 2147483647u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } else if (v_width > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_width = v_width; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26); +- uint32_t t_12; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_12 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12; +- if (num_bits_12 == 24) { +- t_12 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_12 += 8u; +- *scratch |= ((uint64_t)(num_bits_12)) << 56; +- } +- } +- v_height = t_12; +- } +- if (v_height == 2147483648u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } else if (v_height > 2147483648u) { +- v_height = ((uint32_t)(0u - v_height)); +- if (v_height > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_height = v_height; +- self->private_impl.f_top_down = true; +- } else if (v_height > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } else { +- self->private_impl.f_height = v_height; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28); +- uint32_t t_13; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_13 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_13 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_13; +- if (num_bits_13 == 8) { +- t_13 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_13 += 8u; +- *scratch |= ((uint64_t)(num_bits_13)) << 56; +- } ++ ++ uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0; ++ uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1; ++ uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2; ++ uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3; ++ ++ const uint8_t* up0 = (*upfunc0)( // ++ scratch_buffer_2k_ptr + (0u * 480u), // ++ src0_major + ((x - x_min_incl) / inv_h0), // ++ src0_major + ((x - x_min_incl) / inv_h0), // ++ src_len0, // ++ 0u, false, false); ++ ++ const uint8_t* up1 = (*upfunc1)( // ++ scratch_buffer_2k_ptr + (1u * 480u), // ++ src1_major + ((x - x_min_incl) / inv_h1), // ++ src1_major + ((x - x_min_incl) / inv_h1), // ++ src_len1, // ++ 0u, false, false); ++ ++ const uint8_t* up2 = (*upfunc2)( // ++ scratch_buffer_2k_ptr + (2u * 480u), // ++ src2_major + ((x - x_min_incl) / inv_h2), // ++ src2_major + ((x - x_min_incl) / inv_h2), // ++ src_len2, // ++ 0u, false, false); ++ ++ const uint8_t* up3 = (*upfunc3)( // ++ scratch_buffer_2k_ptr + (3u * 480u), // ++ src3_major + ((x - x_min_incl) / inv_h3), // ++ src3_major + ((x - x_min_incl) / inv_h3), // ++ src_len3, // ++ 0u, false, false); ++ ++ (*conv4func)(dst, x, end, y, up0, up1, up2, up3); ++ x = end; ++ } ++ } ++} ++ ++// -------- ++ ++// wuffs_private_impl__swizzle_flattened_length is like ++// wuffs_base__table__flattened_length but returns uint64_t (not size_t) and ++// also accounts for subsampling. ++static uint64_t // ++wuffs_private_impl__swizzle_flattened_length(uint32_t width, ++ uint32_t height, ++ uint32_t stride, ++ uint32_t inv_h, ++ uint32_t inv_v) { ++ uint64_t scaled_width = (((uint64_t)width) + (inv_h - 1u)) / inv_h; ++ uint64_t scaled_height = (((uint64_t)height) + (inv_v - 1u)) / inv_v; ++ if (scaled_height <= 0u) { ++ return 0u; ++ } ++ return ((scaled_height - 1u) * stride) + scaled_width; ++} ++ ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status // ++wuffs_base__pixel_swizzler__swizzle_ycck( ++ const wuffs_base__pixel_swizzler* p, ++ wuffs_base__pixel_buffer* dst, ++ wuffs_base__slice_u8 dst_palette, ++ uint32_t x_min_incl, ++ uint32_t x_max_excl, ++ uint32_t y_min_incl, ++ uint32_t y_max_excl, ++ wuffs_base__slice_u8 src0, ++ wuffs_base__slice_u8 src1, ++ wuffs_base__slice_u8 src2, ++ wuffs_base__slice_u8 src3, ++ uint32_t width0, ++ uint32_t width1, ++ uint32_t width2, ++ uint32_t width3, ++ uint32_t height0, ++ uint32_t height1, ++ uint32_t height2, ++ uint32_t height3, ++ uint32_t stride0, ++ uint32_t stride1, ++ uint32_t stride2, ++ uint32_t stride3, ++ uint8_t h0, ++ uint8_t h1, ++ uint8_t h2, ++ uint8_t h3, ++ uint8_t v0, ++ uint8_t v1, ++ uint8_t v2, ++ uint8_t v3, ++ bool is_rgb_or_cmyk, ++ bool triangle_filter_for_2to1, ++ wuffs_base__slice_u8 scratch_buffer_2k) { ++ if (!p) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } else if (!dst || // ++ (x_min_incl > x_max_excl) || // ++ (x_max_excl > 0xFFFFu) || // ++ (y_min_incl > y_max_excl) || // ++ (y_max_excl > 0xFFFFu) || // ++ (4u <= ((unsigned int)h0 - 1u)) || // ++ (4u <= ((unsigned int)h1 - 1u)) || // ++ (4u <= ((unsigned int)h2 - 1u)) || // ++ (4u <= ((unsigned int)v0 - 1u)) || // ++ (4u <= ((unsigned int)v1 - 1u)) || // ++ (4u <= ((unsigned int)v2 - 1u)) || // ++ (triangle_filter_for_2to1 && ((x_min_incl | y_min_incl) > 0u)) || ++ (scratch_buffer_2k.len < 2048u)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((h3 != 0u) || (v3 != 0u)) { ++ if ((4u <= ((unsigned int)h3 - 1u)) || // ++ (4u <= ((unsigned int)v3 - 1u))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ } ++ ++ uint32_t max_incl_h = wuffs_private_impl__u32__max_of_4(h0, h1, h2, h3); ++ uint32_t max_incl_v = wuffs_private_impl__u32__max_of_4(v0, v1, v2, v3); ++ ++ // Calculate the inverse h and v ratios. ++ // ++ // It also canonicalizes (h=2 and max_incl_h=4) as equivalent to (h=1 and ++ // max_incl_h=2). In both cases, the inv_h value is 2. ++ uint32_t inv_h0 = max_incl_h / h0; ++ uint32_t inv_h1 = max_incl_h / h1; ++ uint32_t inv_h2 = max_incl_h / h2; ++ uint32_t inv_h3 = h3 ? (max_incl_h / h3) : 0u; ++ uint32_t inv_v0 = max_incl_v / v0; ++ uint32_t inv_v1 = max_incl_v / v1; ++ uint32_t inv_v2 = max_incl_v / v2; ++ uint32_t inv_v3 = v3 ? (max_incl_v / v3) : 0u; ++ ++ if (x_min_incl != 0) { ++ if ((x_min_incl % inv_h0) || (x_min_incl % inv_h1) || ++ (x_min_incl % inv_h2) || (inv_h3 && (x_min_incl % inv_h3))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ } ++ if (y_min_incl != 0) { ++ if ((y_min_incl % inv_v0) || (y_min_incl % inv_v1) || ++ (y_min_incl % inv_v2) || (inv_v3 && (y_min_incl % inv_v3))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ } ++ ++ uint32_t half_width_for_2to1 = ((x_max_excl - x_min_incl) + 1u) / 2u; ++ if (inv_h0 == 2) { ++ half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width0); ++ } ++ if (inv_h1 == 2) { ++ half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width1); ++ } ++ if (inv_h2 == 2) { ++ half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width2); ++ } ++ if (inv_h3 == 2) { ++ half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width3); ++ } ++ ++ uint32_t half_height_for_2to1 = ((y_max_excl - y_min_incl) + 1u) / 2u; ++ if (inv_v0 == 2) { ++ half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height0); ++ } ++ if (inv_v1 == 2) { ++ half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height1); ++ } ++ if (inv_v2 == 2) { ++ half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height2); ++ } ++ if (inv_v3 == 2) { ++ half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height3); ++ } ++ ++ x_max_excl = wuffs_base__u32__min( // ++ wuffs_base__pixel_config__width(&dst->pixcfg), // ++ x_min_incl + wuffs_private_impl__u32__min_of_5( // ++ x_max_excl - x_min_incl, // ++ width0 * inv_h0, // ++ width1 * inv_h1, // ++ width2 * inv_h2, // ++ inv_h3 ? (width3 * inv_h3) : 0xFFFFFFFF)); ++ y_max_excl = wuffs_base__u32__min( // ++ wuffs_base__pixel_config__height(&dst->pixcfg), // ++ y_min_incl + wuffs_private_impl__u32__min_of_5( // ++ y_max_excl - y_min_incl, // ++ height0 * inv_v0, // ++ height1 * inv_v1, // ++ height2 * inv_v2, // ++ inv_v3 ? (height3 * inv_v3) : 0xFFFFFFFF)); ++ ++ if ((x_min_incl >= x_max_excl) || (y_min_incl >= y_max_excl)) { ++ return wuffs_base__make_status(NULL); ++ } ++ uint32_t width = x_max_excl - x_min_incl; ++ uint32_t height = y_max_excl - y_min_incl; ++ ++ if (((h0 * inv_h0) != max_incl_h) || // ++ ((h1 * inv_h1) != max_incl_h) || // ++ ((h2 * inv_h2) != max_incl_h) || // ++ ((v0 * inv_v0) != max_incl_v) || // ++ ((v1 * inv_v1) != max_incl_v) || // ++ ((v2 * inv_v2) != max_incl_v) || // ++ (src0.len < wuffs_private_impl__swizzle_flattened_length( ++ width, height, stride0, inv_h0, inv_v0)) || ++ (src1.len < wuffs_private_impl__swizzle_flattened_length( ++ width, height, stride1, inv_h1, inv_v1)) || ++ (src2.len < wuffs_private_impl__swizzle_flattened_length( ++ width, height, stride2, inv_h2, inv_v2))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((h3 != 0u) || (v3 != 0u)) { ++ if (((h3 * inv_h3) != max_incl_h) || // ++ ((v3 * inv_v3) != max_incl_v) || // ++ (src3.len < wuffs_private_impl__swizzle_flattened_length( ++ width, height, stride3, inv_h3, inv_v3))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ } ++ ++ if (wuffs_base__pixel_format__is_planar(&dst->pixcfg.private_impl.pixfmt)) { ++ // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO. ++ return wuffs_base__make_status( ++ wuffs_base__error__unsupported_pixel_swizzler_option); ++ } ++ ++ // ---- ++ ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST) ++ switch (dst->pixcfg.private_impl.pixfmt.repr) { ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR_565) ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR) ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL_4X16LE) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_PREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGB) ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_NONPREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ break; ++#endif ++#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_PREMUL) ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ break; ++#endif ++ default: ++ return wuffs_base__make_status( ++ wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist); ++ } ++#else // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST) ++ switch (dst->pixcfg.private_impl.pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__Y: ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__Y_16BE: ++ case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: ++ case WUFFS_BASE__PIXEL_FORMAT__BGR_565: ++ case WUFFS_BASE__PIXEL_FORMAT__BGR: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++ case WUFFS_BASE__PIXEL_FORMAT__RGB: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++ break; ++ ++ default: ++ // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO. ++ return wuffs_base__make_status( ++ wuffs_base__error__unsupported_pixel_swizzler_option); ++ } ++#endif // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST) ++ ++ // ---- ++ ++ wuffs_private_impl__swizzle_ycc__convert_3_func conv3func = NULL; ++ ++ if (is_rgb_or_cmyk) { ++ conv3func = &wuffs_private_impl__swizzle_rgb__convert_3_general; ++ } else { ++ switch (dst->pixcfg.private_impl.pixfmt.repr) { ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__BGRX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++ if (wuffs_base__cpu_arch__have_x86_avx2()) { ++ conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2; ++ break; + } +- v_planes = t_13; +- } +- if (v_planes != 1u) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30); +- uint32_t t_14; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_14 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(31); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_14 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_14; +- if (num_bits_14 == 8) { +- t_14 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_14 += 8u; +- *scratch |= ((uint64_t)(num_bits_14)) << 56; +- } ++#endif ++ conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_bgrx; ++ break; ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL: ++ case WUFFS_BASE__PIXEL_FORMAT__RGBX: ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++ if (wuffs_base__cpu_arch__have_x86_avx2()) { ++ conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2; ++ break; + } +- self->private_impl.f_bits_per_pixel = t_14; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32); +- uint32_t t_15; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_15 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_15 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_15; +- if (num_bits_15 == 24) { +- t_15 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_15 += 8u; +- *scratch |= ((uint64_t)(num_bits_15)) << 56; +- } +- } +- self->private_impl.f_compression = t_15; +- } +- if (self->private_impl.f_bits_per_pixel == 0u) { +- if (self->private_impl.f_compression == 4u) { +- self->private_impl.f_io_redirect_fourcc = 1246774599u; +- status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); +- goto ok; +- } else if (self->private_impl.f_compression == 5u) { +- self->private_impl.f_io_redirect_fourcc = 1347307296u; +- status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); +- goto ok; +- } +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- self->private_data.s_do_decode_image_config[0].scratch = 20u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(34); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- if (self->private_impl.f_bitmap_info_len == 40u) { +- if (self->private_impl.f_bits_per_pixel >= 16u) { +- if (self->private_impl.f_padding >= 16u) { +- self->private_impl.f_bitmap_info_len = 56u; +- self->private_impl.f_padding -= 16u; +- } else if (self->private_impl.f_padding >= 12u) { +- self->private_impl.f_bitmap_info_len = 52u; +- self->private_impl.f_padding -= 12u; +- } +- } +- } else if ((self->private_impl.f_bitmap_info_len != 52u) && +- (self->private_impl.f_bitmap_info_len != 56u) && +- (self->private_impl.f_bitmap_info_len != 64u) && +- (self->private_impl.f_bitmap_info_len != 108u) && +- (self->private_impl.f_bitmap_info_len != 124u)) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- if (self->private_impl.f_compression == 6u) { +- self->private_impl.f_compression = 3u; +- } +- if (self->private_impl.f_compression == 3u) { +- if (self->private_impl.f_bitmap_info_len >= 52u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(35); +- uint32_t t_16; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_16 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(36); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_16 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_16; +- if (num_bits_16 == 24) { +- t_16 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_16 += 8u; +- *scratch |= ((uint64_t)(num_bits_16)) << 56; +- } +- } +- self->private_impl.f_channel_masks[2u] = t_16; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(37); +- uint32_t t_17; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_17 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(38); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_17 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_17; +- if (num_bits_17 == 24) { +- t_17 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_17 += 8u; +- *scratch |= ((uint64_t)(num_bits_17)) << 56; +- } +- } +- self->private_impl.f_channel_masks[1u] = t_17; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(39); +- uint32_t t_18; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_18 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(40); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_18 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_18; +- if (num_bits_18 == 24) { +- t_18 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_18 += 8u; +- *scratch |= ((uint64_t)(num_bits_18)) << 56; +- } +- } +- self->private_impl.f_channel_masks[0u] = t_18; +- } +- if (self->private_impl.f_bitmap_info_len >= 56u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(41); +- uint32_t t_19; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_19 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(42); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_19 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_19; +- if (num_bits_19 == 24) { +- t_19 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_19 += 8u; +- *scratch |= ((uint64_t)(num_bits_19)) << 56; +- } +- } +- self->private_impl.f_channel_masks[3u] = t_19; +- } +- self->private_data.s_do_decode_image_config[0].scratch = ((uint32_t)(self->private_impl.f_bitmap_info_len - 56u)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(43); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- } +- if ((self->private_impl.f_channel_masks[0u] == 255u) && (self->private_impl.f_channel_masks[1u] == 65280u) && (self->private_impl.f_channel_masks[2u] == 16711680u)) { +- if (self->private_impl.f_bits_per_pixel == 24u) { +- self->private_impl.f_compression = 0u; +- } else if (self->private_impl.f_bits_per_pixel == 32u) { +- if ((self->private_impl.f_channel_masks[3u] == 0u) || (self->private_impl.f_channel_masks[3u] == 4278190080u)) { +- self->private_impl.f_compression = 0u; +- } +- } +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(44); +- status = wuffs_bmp__decoder__process_masks(self); +- if (status.repr) { +- goto suspend; +- } +- } +- } else if (self->private_impl.f_bitmap_info_len >= 40u) { +- self->private_data.s_do_decode_image_config[0].scratch = (self->private_impl.f_bitmap_info_len - 40u); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(45); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- } +- if (self->private_impl.f_compression != 3u) { +- if (self->private_impl.f_bits_per_pixel < 16u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(46); +- status = wuffs_bmp__decoder__read_palette(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } +- } +- if (self->private_impl.f_compression == 0u) { +- if ((self->private_impl.f_bits_per_pixel == 1u) || (self->private_impl.f_bits_per_pixel == 2u) || (self->private_impl.f_bits_per_pixel == 4u)) { +- self->private_impl.f_src_pixfmt = 2198077448u; +- self->private_impl.f_compression = 256u; +- } else if (self->private_impl.f_bits_per_pixel == 8u) { +- self->private_impl.f_src_pixfmt = 2198077448u; +- } else if (self->private_impl.f_bits_per_pixel == 16u) { +- self->private_impl.f_compression = 3u; +- self->private_impl.f_channel_masks[0u] = 31u; +- self->private_impl.f_channel_masks[1u] = 992u; +- self->private_impl.f_channel_masks[2u] = 31744u; +- self->private_impl.f_channel_masks[3u] = 0u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(47); +- status = wuffs_bmp__decoder__process_masks(self); +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_src_pixfmt = 2164308923u; +- } else if (self->private_impl.f_bits_per_pixel == 24u) { +- self->private_impl.f_src_pixfmt = 2147485832u; +- } else if (self->private_impl.f_bits_per_pixel == 32u) { +- if (self->private_impl.f_channel_masks[3u] == 0u) { +- self->private_impl.f_src_pixfmt = 2415954056u; +- } else { +- self->private_impl.f_src_pixfmt = 2164295816u; +- } +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- } else if (self->private_impl.f_compression == 1u) { +- if (self->private_impl.f_bits_per_pixel == 8u) { +- self->private_impl.f_src_pixfmt = 2198077448u; +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- } else if (self->private_impl.f_compression == 2u) { +- if (self->private_impl.f_bits_per_pixel == 4u) { +- self->private_impl.f_src_pixfmt = 2198077448u; +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- } else if (self->private_impl.f_compression == 3u) { +- if ((self->private_impl.f_bits_per_pixel == 16u) || (self->private_impl.f_bits_per_pixel == 32u)) { +- self->private_impl.f_src_pixfmt = 2164308923u; +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- } else { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- if (((self->private_impl.f_bitmap_info_len < 40u) || (self->private_impl.f_bitmap_info_len == 64u)) && +- (self->private_impl.f_bits_per_pixel != 1u) && +- (self->private_impl.f_bits_per_pixel != 4u) && +- (self->private_impl.f_bits_per_pixel != 8u) && +- (self->private_impl.f_bits_per_pixel != 24u)) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } +- if (self->private_impl.f_bits_per_pixel == 1u) { +- v_byte_width = ((self->private_impl.f_width >> 3u) + (((self->private_impl.f_width & 7u) + 7u) >> 3u)); +- self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); +- } else if (self->private_impl.f_bits_per_pixel == 2u) { +- v_byte_width = ((self->private_impl.f_width >> 2u) + (((self->private_impl.f_width & 3u) + 3u) >> 2u)); +- self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); +- } else if (self->private_impl.f_bits_per_pixel == 4u) { +- v_byte_width = ((self->private_impl.f_width >> 1u) + (self->private_impl.f_width & 1u)); +- self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); +- } else if (self->private_impl.f_bits_per_pixel == 8u) { +- self->private_impl.f_pad_per_row = ((4u - (self->private_impl.f_width & 3u)) & 3u); +- } else if (self->private_impl.f_bits_per_pixel == 16u) { +- self->private_impl.f_pad_per_row = ((self->private_impl.f_width & 1u) * 2u); +- } else if (self->private_impl.f_bits_per_pixel == 24u) { +- self->private_impl.f_pad_per_row = (self->private_impl.f_width & 3u); +- } else if (self->private_impl.f_bits_per_pixel == 32u) { +- self->private_impl.f_pad_per_row = 0u; +- } +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- if (a_dst != NULL) { +- v_dst_pixfmt = 2164295816u; +- if ((self->private_impl.f_channel_num_bits[0u] > 8u) || +- (self->private_impl.f_channel_num_bits[1u] > 8u) || +- (self->private_impl.f_channel_num_bits[2u] > 8u) || +- (self->private_impl.f_channel_num_bits[3u] > 8u)) { +- v_dst_pixfmt = 2164308923u; +- } +- wuffs_base__image_config__set( +- a_dst, +- v_dst_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- (self->private_impl.f_channel_masks[3u] == 0u)); ++#endif ++ conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_rgbx; ++ break; ++ default: ++ conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_general; ++ break; + } +- self->private_impl.f_call_sequence = 32u; +- +- ok: +- self->private_impl.p_do_decode_image_config[0] = 0; +- goto exit; + } + +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ void (*func3)(wuffs_base__pixel_buffer * dst, // ++ uint32_t x_min_incl, // ++ uint32_t x_max_excl, // ++ uint32_t y_min_incl, // ++ uint32_t y_max_excl, // ++ const uint8_t* src_ptr0, // ++ const uint8_t* src_ptr1, // ++ const uint8_t* src_ptr2, // ++ uint32_t stride0, // ++ uint32_t stride1, // ++ uint32_t stride2, // ++ uint32_t inv_h0, // ++ uint32_t inv_h1, // ++ uint32_t inv_h2, // ++ uint32_t inv_v0, // ++ uint32_t inv_v1, // ++ uint32_t inv_v2, // ++ uint32_t half_width_for_2to1, // ++ uint32_t half_height_for_2to1, // ++ uint8_t* scratch_buffer_2k_ptr, // ++ wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) = ++ &wuffs_private_impl__swizzle_ycc__general__box_filter; ++ ++ void (*func4)(wuffs_base__pixel_buffer * dst, // ++ uint32_t x_min_incl, // ++ uint32_t x_max_excl, // ++ uint32_t y_min_incl, // ++ uint32_t y_max_excl, // ++ const uint8_t* src_ptr0, // ++ const uint8_t* src_ptr1, // ++ const uint8_t* src_ptr2, // ++ const uint8_t* src_ptr3, // ++ uint32_t stride0, // ++ uint32_t stride1, // ++ uint32_t stride2, // ++ uint32_t stride3, // ++ uint32_t inv_h0, // ++ uint32_t inv_h1, // ++ uint32_t inv_h2, // ++ uint32_t inv_h3, // ++ uint32_t inv_v0, // ++ uint32_t inv_v1, // ++ uint32_t inv_v2, // ++ uint32_t inv_v3, // ++ uint32_t half_width_for_2to1, // ++ uint32_t half_height_for_2to1, // ++ uint8_t* scratch_buffer_2k_ptr, // ++ wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4], ++ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) = ++ &wuffs_private_impl__swizzle_ycck__general__box_filter; ++ ++ wuffs_private_impl__swizzle_ycc__upsample_func upfuncs[4][4]; ++ memcpy(&upfuncs, &wuffs_private_impl__swizzle_ycc__upsample_funcs, ++ sizeof upfuncs); + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (triangle_filter_for_2to1 && ++ (wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h0, inv_v0) || ++ wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h1, inv_v1) || ++ wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h2, inv_v2) || ++ wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h3, inv_v3))) { ++ func3 = &wuffs_private_impl__swizzle_ycc__general__triangle_filter; ++ func4 = &wuffs_private_impl__swizzle_ycck__general__triangle_filter; ++ ++ upfuncs[0][1] = wuffs_private_impl__swizzle_ycc__upsample_inv_h1v2_triangle; ++ upfuncs[1][0] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v1_triangle; ++ upfuncs[1][1] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle; ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++#if defined(__GNUC__) && !defined(__clang__) ++ // Don't use our AVX2 implementation for GCC (but do use it for clang). For ++ // some unknown reason, GCC performs noticably better on the non-SIMD ++ // version. Possibly because GCC's auto-vectorizer is smarter (just with ++ // SSE2, not AVX2) than our hand-written code, but that's just a guess. ++ // ++ // See commits 51bc60ef9298cb2efc1b29a9681191f66d49820d and ++ // cd769a0cdf1b5affee13f6089b995f3d39569cb4 for benchmark numbers. ++ // ++ // See also https://godbolt.org/z/MbhbPGEz4 for Debian Bullseye's clang 11 ++ // versus gcc 10, where only gcc auto-vectorizes, although later clang ++ // versions will also auto-vectorize. ++#else ++ if (wuffs_base__cpu_arch__have_x86_avx2()) { ++ upfuncs[1][1] = ++ wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2; ++ } ++#endif ++#endif + } + +- return status; +-} +- +-// -------- func bmp.decoder.decode_frame_config ++ if ((h3 != 0u) || (v3 != 0u)) { ++ wuffs_private_impl__swizzle_ycc__convert_4_func conv4func = ++ is_rgb_or_cmyk ? &wuffs_private_impl__swizzle_cmyk__convert_4_general ++ : &wuffs_private_impl__swizzle_ycck__convert_4_general; ++ (*func4)( // ++ dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl, // ++ src0.ptr, src1.ptr, src2.ptr, src3.ptr, // ++ stride0, stride1, stride2, stride3, // ++ inv_h0, inv_h1, inv_h2, inv_h3, // ++ inv_v0, inv_v1, inv_v2, inv_v3, // ++ half_width_for_2to1, half_height_for_2to1, // ++ scratch_buffer_2k.ptr, &upfuncs, conv4func); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__decode_frame_config( +- wuffs_bmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } else { ++ (*func3)( // ++ dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl, // ++ src0.ptr, src1.ptr, src2.ptr, // ++ stride0, stride1, stride2, // ++ inv_h0, inv_h1, inv_h2, // ++ inv_v0, inv_v1, inv_v2, // ++ half_width_for_2to1, half_height_for_2to1, // ++ scratch_buffer_2k.ptr, &upfuncs, conv3func); + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ return wuffs_base__make_status(NULL); ++} + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++// -------- + +- ok: +- self->private_impl.p_decode_frame_config[0] = 0; +- goto exit; ++// ‼ WUFFS MULTI-FILE SECTION +x86_avx2 ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ if ((x + 32u) > x_end) { ++ wuffs_private_impl__swizzle_ycc__convert_3_bgrx( // ++ dst, x, x_end, y, up0, up1, up2); ++ return; + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ size_t dst_stride = dst->private_impl.planes[0].stride; ++ uint8_t* dst_iter = dst->private_impl.planes[0].ptr + ++ (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} ++ // u0001 = u16x16 [0x0001 .. 0x0001] ++ // u00FF = u16x16 [0x00FF .. 0x00FF] ++ // uFF80 = u16x16 [0xFF80 .. 0xFF80] ++ // uFFFF = u16x16 [0xFFFF .. 0xFFFF] ++ const __m256i u0001 = _mm256_set1_epi16(+0x0001); ++ const __m256i u00FF = _mm256_set1_epi16(+0x00FF); ++ const __m256i uFF80 = _mm256_set1_epi16(-0x0080); ++ const __m256i uFFFF = _mm256_set1_epi16(-0x0001); + +-// -------- func bmp.decoder.do_decode_frame_config ++ // p8000_p0000 = u16x16 [0x8000 0x0000 .. 0x8000 0x0000] ++ const __m256i p8000_p0000 = _mm256_set_epi16( // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_frame_config( +- wuffs_bmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ // Per wuffs_base__color_ycc__as__color_u32, the formulae: ++ // ++ // R = Y + 1.40200 * Cr ++ // G = Y - 0.34414 * Cb - 0.71414 * Cr ++ // B = Y + 1.77200 * Cb ++ // ++ // When scaled by 1<<16: ++ // ++ // 0.34414 becomes 0x0581A = 22554. ++ // 0.71414 becomes 0x0B6D2 = 46802. ++ // 1.40200 becomes 0x166E9 = 91881. ++ // 1.77200 becomes 0x1C5A2 = 116130. ++ // ++ // Separate the integer and fractional parts, since we work with signed ++ // 16-bit SIMD lanes. The fractional parts range from -0.5 .. +0.5 (as ++ // floating-point) which is from -0x8000 .. +0x8000 (as fixed-point). ++ // ++ // -0x3A5E = -0x20000 + 0x1C5A2 The B:Cb factor. ++ // +0x66E9 = -0x10000 + 0x166E9 The R:Cr factor. ++ // -0x581A = +0x00000 - 0x0581A The G:Cb factor. ++ // +0x492E = +0x10000 - 0x0B6D2 The G:Cr factor. ++ const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E); ++ const __m256i p66E9 = _mm256_set1_epi16(+0x66E9); ++ const __m256i m581A_p492E = _mm256_set_epi16( // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ while (x < x_end) { ++ // Load chroma values in even and odd columns (the high 8 bits of each ++ // u16x16 element are zero) and then subtract 0x0080. ++ // ++ // cb_all = u8x32 [cb.00 cb.01 cb.02 cb.03 .. cb.1C cb.1D cb.1E cb.1F] ++ // cb_eve = i16x16 [cb.00-0x80 cb.02-0x80 .. cb.1C-0x80 cb.1E-0x80 ] ++ // cb_odd = i16x16 [cb.01-0x80 cb.03-0x80 .. cb.1D-0x80 cb.1F-0x80 ] ++ // ++ // Ditto for the cr_xxx Chroma-Red values. ++ __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1); ++ __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2); ++ __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF)); ++ __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF)); ++ __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8)); ++ __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8)); + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ // ---- + +- if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_bmp__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; +- } +- } else if (self->private_impl.f_call_sequence == 64u) { +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height), +- ((wuffs_base__flicks)(0u)), +- 0u, +- self->private_impl.f_frame_config_io_position, +- 0u, +- true, +- false, +- 4278190080u); +- } +- self->private_impl.f_call_sequence = 64u; ++ // Calculate: ++ // ++ // B-Y = (+1.77200 * Cb) as floating-point ++ // R-Y = (+1.40200 * Cr) as floating-point ++ // ++ // B-Y = ((0x2_0000 - 0x3A5E) * Cb) as fixed-point ++ // R-Y = ((0x1_0000 + 0x66E9) * Cr) as fixed-point ++ // ++ // B-Y = ((-0x3A5E * Cb) + ("2.0" * Cb)) ++ // R-Y = ((+0x66E9 * Cr) + ("1.0" * Cr)) + +- ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; +- goto exit; +- } ++ // Multiply by m3A5E or p66E9, taking the high 16 bits. There's also a ++ // doubling (add x to itself), adding-of-1 and halving (shift right by 1). ++ // That makes multiply-and-take-high round to nearest (instead of down). ++ __m256i tmp_by_eve = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001), ++ 1); ++ __m256i tmp_by_odd = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001), ++ 1); ++ __m256i tmp_ry_eve = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001), ++ 1); ++ __m256i tmp_ry_odd = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001), ++ 1); + +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ // Add (2 * Cb) and (1 * Cr). ++ __m256i by_eve = ++ _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve)); ++ __m256i by_odd = ++ _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd)); ++ __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve); ++ __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd); + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++ // ---- + +- return status; +-} ++ // Calculate: ++ // ++ // G-Y = (-0.34414 * Cb) + ++ // (-0.71414 * Cr) as floating-point ++ // ++ // G-Y = ((+0x0_0000 - 0x581A) * Cb) + ++ // ((-0x1_0000 + 0x492E) * Cr) as fixed-point ++ // ++ // G-Y = (-0x581A * Cb) + ++ // (+0x492E * Cr) - ("1.0" * Cr) + +-// -------- func bmp.decoder.decode_frame ++ // Multiply-add to get ((-0x581A * Cb) + (+0x492E * Cr)). ++ __m256i tmp0_gy_eve_lo = _mm256_madd_epi16( // ++ _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E); ++ __m256i tmp0_gy_eve_hi = _mm256_madd_epi16( // ++ _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E); ++ __m256i tmp0_gy_odd_lo = _mm256_madd_epi16( // ++ _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E); ++ __m256i tmp0_gy_odd_hi = _mm256_madd_epi16( // ++ _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__decode_frame( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ // Divide the i32x8 vectors by (1 << 16), rounding to nearest. ++ __m256i tmp1_gy_eve_lo = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16); ++ __m256i tmp1_gy_eve_hi = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16); ++ __m256i tmp1_gy_odd_lo = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16); ++ __m256i tmp1_gy_odd_hi = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ // Pack the ((-0x581A * Cb) + (+0x492E * Cr)) as i16x16 and subtract Cr. ++ __m256i gy_eve = _mm256_sub_epi16( ++ _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve); ++ __m256i gy_odd = _mm256_sub_epi16( ++ _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ // ---- + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++ // Add Y to (B-Y), (G-Y) and (R-Y) to produce B, G and R. ++ // ++ // For the resultant packed_x_xxx vectors, only elements 0 ..= 7 and 16 ..= ++ // 23 of the 32-element vectors matter (since we'll unpacklo but not ++ // unpackhi them). Let … denote 8 ignored consecutive u8 values and let % ++ // denote 0xFF. We'll end this section with: ++ // ++ // packed_b_eve = u8x32 [b00 b02 .. b0C b0E … b10 b12 .. b1C b1E …] ++ // packed_b_odd = u8x32 [b01 b03 .. b0D b0F … b11 b13 .. b1D b1F …] ++ // packed_g_eve = u8x32 [g00 g02 .. g0C g0E … g10 g12 .. g1C g1E …] ++ // packed_g_odd = u8x32 [g01 g03 .. g0D g0F … g11 g13 .. g1D g1F …] ++ // packed_r_eve = u8x32 [r00 r02 .. r0C r0E … r10 r12 .. r1C r1E …] ++ // packed_r_odd = u8x32 [r01 r03 .. r0D r0F … r11 r13 .. r1D r1F …] ++ // uFFFF = u8x32 [ % % .. % % … % % .. % % …] + +- ok: +- self->private_impl.p_decode_frame[0] = 0; +- goto exit; +- } ++ __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0); ++ __m256i yy_eve = _mm256_and_si256(yy_all, u00FF); ++ __m256i yy_odd = _mm256_srli_epi16(yy_all, 8); + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve); ++ __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd); ++ __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve); ++ __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd); + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} ++ __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve); ++ __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd); ++ __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve); ++ __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd); + +-// -------- func bmp.decoder.do_decode_frame ++ __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve); ++ __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd); ++ __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve); ++ __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_decode_frame( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ // ---- + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ // Mix those values (unpacking in 8, 16 and then 32 bit units) to get the ++ // desired BGRX/RGBX order. ++ // ++ // From here onwards, all of our __m256i registers are u8x32. + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ // mix00 = [b00 g00 b02 g02 .. b0E g0E b10 g10 .. b1C g1C b1E g1E] ++ // mix01 = [b01 g01 b03 g03 .. b0F g0F b11 g11 .. b1D g1D b1F g1F] ++ // mix02 = [r00 % r02 % .. r0E % r10 % .. r1C % r1E %] ++ // mix03 = [r01 % r03 % .. r0F % r11 % .. r1D % r1F %] ++ // ++ // See also § below. ++ __m256i mix00 = _mm256_unpacklo_epi8(packed_b_eve, packed_g_eve); ++ __m256i mix01 = _mm256_unpacklo_epi8(packed_b_odd, packed_g_odd); ++ __m256i mix02 = _mm256_unpacklo_epi8(packed_r_eve, uFFFF); ++ __m256i mix03 = _mm256_unpacklo_epi8(packed_r_odd, uFFFF); + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ // mix10 = [b00 g00 r00 % b02 g02 r02 % b04 g04 r04 % b06 g06 r06 % ++ // b10 g10 r10 % b12 g12 r12 % b14 g14 r14 % b16 g16 r16 %] ++ // mix11 = [b01 g01 r01 % b03 g03 r03 % b05 g05 r05 % b07 g07 r07 % ++ // b11 g11 r11 % b13 g13 r13 % b15 g15 r15 % b17 g17 r17 %] ++ // mix12 = [b08 g08 r08 % b0A g0A r0A % b0C g0C r0C % b0E g0E r0E % ++ // b18 g18 r18 % b1A g1A r1A % b1C g1C r1C % b1E g1E r1E %] ++ // mix13 = [b09 g09 r09 % b0B g0B r0B % b0D g0D r0D % b0F g0F r0F % ++ // b19 g19 r19 % b1B g1B r1B % b1D g1D r1D % b1F g1F r1F %] ++ __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02); ++ __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03); ++ __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02); ++ __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03); + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_bmp__decoder__do_decode_frame_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- self->private_data.s_do_decode_frame[0].scratch = self->private_impl.f_padding; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame[0].scratch; +- if ((self->private_impl.f_width > 0u) && (self->private_impl.f_height > 0u)) { +- self->private_impl.f_dst_x = 0u; +- if (self->private_impl.f_top_down) { +- self->private_impl.f_dst_y = 0u; +- self->private_impl.f_dst_y_inc = 1u; +- } else { +- self->private_impl.f_dst_y = ((uint32_t)(self->private_impl.f_height - 1u)); +- self->private_impl.f_dst_y_inc = 4294967295u; +- } +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)), +- wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), +- wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- while (true) { +- if (self->private_impl.f_compression == 0u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_bmp__decoder__swizzle_none(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } else if (self->private_impl.f_compression < 3u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_bmp__decoder__swizzle_rle(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } else if (self->private_impl.f_compression == 3u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_bmp__decoder__swizzle_bitfields(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } else { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_bmp__decoder__swizzle_low_bit_depth(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } else if (v_status.repr != wuffs_bmp__note__internal_note_short_read) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- } +- self->private_data.s_do_decode_frame[0].scratch = self->private_impl.f_pending_pad; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame[0].scratch; +- self->private_impl.f_pending_pad = 0u; +- } +- self->private_impl.f_call_sequence = 96u; ++ // mix20 = [b00 g00 r00 % b01 g01 r01 % b02 g02 r02 % b03 g03 r03 % ++ // b10 g10 r10 % b11 g11 r11 % b12 g12 r12 % b13 g13 r13 %] ++ // mix21 = [b04 g04 r04 % b05 g05 r05 % b06 g06 r06 % b07 g07 r07 % ++ // b14 g14 r14 % b15 g15 r15 % b16 g16 r16 % b17 g17 r17 %] ++ // mix22 = [b08 g08 r08 % b09 g09 r09 % b0A g0A r0A % b0B g0B r0B % ++ // b18 g18 r18 % b19 g19 r19 % b1A g1A r1A % b1B g1B r1B %] ++ // mix23 = [b0C g0C r0C % b0D g0D r0D % b0E g0E r0E % b0F g0F r0F % ++ // b1C g1C r1C % b1D g1D r1D % b1E g1E r1E % b1F g1F r1F %] ++ __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11); ++ __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11); ++ __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13); ++ __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13); + +- ok: +- self->private_impl.p_do_decode_frame[0] = 0; +- goto exit; +- } ++ // mix30 = [b00 g00 r00 % b01 g01 r01 % b02 g02 r02 % b03 g03 r03 % ++ // b04 g04 r04 % b05 g05 r05 % b06 g06 r06 % b07 g07 r07 %] ++ // mix31 = [b08 g08 r08 % b09 g09 r09 % b0A g0A r0A % b0B g0B r0B % ++ // b0C g0C r0C % b0D g0D r0D % b0E g0E r0E % b0F g0F r0F %] ++ // mix32 = [b10 g10 r10 % b11 g11 r11 % b12 g12 r12 % b13 g13 r13 % ++ // b14 g14 r14 % b15 g15 r15 % b16 g16 r16 % b17 g17 r17 %] ++ // mix33 = [b18 g18 r18 % b19 g19 r19 % b1A g1A r1A % b1B g1B r1B % ++ // b1C g1C r1C % b1D g1D r1D % b1E g1E r1E % b1F g1F r1F %] ++ __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20); ++ __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20); ++ __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31); ++ __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31); + +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ // Write out four u8x32 SIMD registers (128 bytes, 32 BGRX/RGBX pixels). ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33); + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ // Advance by up to 32 pixels. The first iteration might be smaller than 32 ++ // so that all of the remaining steps are exactly 32. ++ uint32_t n = 32u - (31u & (x - x_end)); ++ dst_iter += 4u * n; ++ up0 += n; ++ up1 += n; ++ up2 += n; ++ x += n; + } +- +- return status; + } + +-// -------- func bmp.decoder.swizzle_none ++// The rgbx flavor (below) is exactly the same as the bgrx flavor (above) ++// except for the lines marked with a § and that comments were stripped. ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static void // ++wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2( ++ wuffs_base__pixel_buffer* dst, ++ uint32_t x, ++ uint32_t x_end, ++ uint32_t y, ++ const uint8_t* up0, ++ const uint8_t* up1, ++ const uint8_t* up2) { ++ if ((x + 32u) > x_end) { ++ wuffs_private_impl__swizzle_ycc__convert_3_bgrx( // ++ dst, x, x_end, y, up0, up1, up2); ++ return; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_none( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ size_t dst_stride = dst->private_impl.planes[0].stride; ++ uint8_t* dst_iter = dst->private_impl.planes[0].ptr + ++ (dst_stride * ((size_t)y)) + (4u * ((size_t)x)); + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- uint32_t v_src_bytes_per_pixel = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_j = 0; +- uint64_t v_n = 0; ++ const __m256i u0001 = _mm256_set1_epi16(+0x0001); ++ const __m256i u00FF = _mm256_set1_epi16(+0x00FF); ++ const __m256i uFF80 = _mm256_set1_epi16(-0x0080); ++ const __m256i uFFFF = _mm256_set1_epi16(-0x0001); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ const __m256i p8000_p0000 = _mm256_set_epi16( // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000, // ++ +0x0000, -0x8000, +0x0000, -0x8000); + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- label__outer__continue:; +- while (true) { +- while (self->private_impl.f_pending_pad > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- self->private_impl.f_pending_pad -= 1u; +- iop_a_src += 1u; +- } +- while (true) { +- if (self->private_impl.f_dst_x == self->private_impl.f_width) { +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- if (self->private_impl.f_height > 0u) { +- self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; +- } +- goto label__outer__break; +- } else if (self->private_impl.f_pad_per_row != 0u) { +- self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; +- goto label__outer__continue; +- } +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); +- } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i >= ((uint64_t)(v_dst.len))) { +- if (self->private_impl.f_bits_per_pixel > 32u) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- v_src_bytes_per_pixel = (self->private_impl.f_bits_per_pixel / 8u); +- if (v_src_bytes_per_pixel == 0u) { +- status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); +- goto exit; +- } +- v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); +- v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); +- v_j = v_n; +- while (v_j >= 8u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 8u); +- } +- v_j -= 8u; +- } +- while (v_j > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 1u); +- } +- v_j -= 1u; +- } +- } else { +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( +- &self->private_impl.f_swizzler, +- wuffs_base__slice_u8__subslice_i(v_dst, v_i), +- v_dst_palette, +- &iop_a_src, +- io2_a_src); +- } +- if (v_n == 0u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- } +- } +- label__outer__break:; +- status = wuffs_base__make_status(NULL); +- goto ok; ++ const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E); ++ const __m256i p66E9 = _mm256_set1_epi16(+0x66E9); ++ const __m256i m581A_p492E = _mm256_set_epi16( // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A, // ++ +0x492E, -0x581A, +0x492E, -0x581A); + +- ok: +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++ while (x < x_end) { ++ __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1); ++ __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2); ++ __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF)); ++ __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF)); ++ __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8)); ++ __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8)); + +- return status; +-} ++ __m256i tmp_by_eve = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001), ++ 1); ++ __m256i tmp_by_odd = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001), ++ 1); ++ __m256i tmp_ry_eve = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001), ++ 1); ++ __m256i tmp_ry_odd = _mm256_srai_epi16( ++ _mm256_add_epi16( ++ _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001), ++ 1); + +-// -------- func bmp.decoder.swizzle_rle ++ __m256i by_eve = ++ _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve)); ++ __m256i by_odd = ++ _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd)); ++ __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve); ++ __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_rle( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ __m256i tmp0_gy_eve_lo = _mm256_madd_epi16( // ++ _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E); ++ __m256i tmp0_gy_eve_hi = _mm256_madd_epi16( // ++ _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E); ++ __m256i tmp0_gy_odd_lo = _mm256_madd_epi16( // ++ _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E); ++ __m256i tmp0_gy_odd_hi = _mm256_madd_epi16( // ++ _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E); + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_row = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_n = 0; +- uint32_t v_p0 = 0; +- uint8_t v_code = 0; +- uint8_t v_indexes[2] = {0}; +- uint32_t v_rle_state = 0; +- uint32_t v_chunk_bits = 0; +- uint32_t v_chunk_count = 0; ++ __m256i tmp1_gy_eve_lo = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16); ++ __m256i tmp1_gy_eve_hi = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16); ++ __m256i tmp1_gy_odd_lo = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16); ++ __m256i tmp1_gy_odd_hi = ++ _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ __m256i gy_eve = _mm256_sub_epi16( ++ _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve); ++ __m256i gy_odd = _mm256_sub_epi16( ++ _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd); + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- v_rle_state = self->private_impl.f_rle_state; +- label__outer__continue:; +- while (true) { +- v_row = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { +- v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); +- } +- label__middle__continue:; +- while (true) { +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i <= ((uint64_t)(v_row.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_row, v_i); +- } else { +- v_dst = wuffs_base__utility__empty_slice_u8(); +- } +- while (true) { +- while (true) { +- if (v_rle_state == 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- if (v_code == 0u) { +- v_rle_state = 2u; +- continue; +- } +- self->private_impl.f_rle_length = ((uint32_t)(v_code)); +- v_rle_state = 1u; +- continue; +- } else if (v_rle_state == 1u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- if (self->private_impl.f_bits_per_pixel == 8u) { +- v_p0 = 0u; +- while (v_p0 < self->private_impl.f_rle_length) { +- self->private_data.f_scratch[v_p0] = v_code; +- v_p0 += 1u; +- } +- } else { +- v_indexes[0u] = ((uint8_t)((v_code >> 4u))); +- v_indexes[1u] = (v_code & 15u); +- v_p0 = 0u; +- while (v_p0 < self->private_impl.f_rle_length) { +- self->private_data.f_scratch[(v_p0 + 0u)] = v_indexes[0u]; +- self->private_data.f_scratch[(v_p0 + 1u)] = v_indexes[1u]; +- v_p0 += 2u; +- } +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_rle_length)); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, self->private_impl.f_rle_length); +- v_rle_state = 0u; +- goto label__middle__continue; +- } else if (v_rle_state == 2u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- if (v_code < 2u) { +- if ((self->private_impl.f_dst_y >= self->private_impl.f_height) && (v_code == 0u)) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); +- goto exit; +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, 18446744073709551615u); +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- if (v_code > 0u) { +- goto label__outer__break; +- } +- v_rle_state = 0u; +- goto label__outer__continue; +- } else if (v_code == 2u) { +- v_rle_state = 4u; +- continue; +- } +- self->private_impl.f_rle_length = ((uint32_t)(v_code)); +- self->private_impl.f_rle_padded = ((self->private_impl.f_bits_per_pixel == 8u) && ((v_code & 1u) != 0u)); +- v_rle_state = 3u; +- continue; +- } else if (v_rle_state == 3u) { +- if (self->private_impl.f_bits_per_pixel == 8u) { +- v_n = wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( +- &self->private_impl.f_swizzler, +- self->private_impl.f_rle_length, +- v_dst, +- v_dst_palette, +- &iop_a_src, +- io2_a_src); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_rle_length, ((uint32_t)(v_n))); +- } else { +- v_chunk_count = ((self->private_impl.f_rle_length + 3u) / 4u); +- v_p0 = 0u; +- while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 2u)) { +- v_chunk_bits = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2u; +- self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u)))); +- self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u)))); +- self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u)))); +- self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u)))); +- v_p0 = ((v_p0 & 255u) + 4u); +- v_chunk_count -= 1u; +- } +- v_p0 = wuffs_base__u32__min(v_p0, self->private_impl.f_rle_length); +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0)); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, v_p0); +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_rle_length, v_p0); +- } +- if (self->private_impl.f_rle_length > 0u) { +- goto label__goto_suspend__break; +- } +- if (self->private_impl.f_rle_padded) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- iop_a_src += 1u; +- self->private_impl.f_rle_padded = false; +- } +- v_rle_state = 0u; +- goto label__middle__continue; +- } else if (v_rle_state == 4u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- self->private_impl.f_rle_delta_x = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- v_rle_state = 5u; +- continue; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { +- goto label__goto_suspend__break; +- } +- v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- if (self->private_impl.f_rle_delta_x > 0u) { +- wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, ((uint64_t)(self->private_impl.f_rle_delta_x))); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(self->private_impl.f_rle_delta_x))); +- self->private_impl.f_rle_delta_x = 0u; +- if (self->private_impl.f_dst_x > self->private_impl.f_width) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); +- goto exit; +- } +- } +- if (v_code > 0u) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_code -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- while (true) { +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); +- goto exit; +- } +- v_row = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { +- v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); +- } +- if (v_code <= 0u) { +- wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, ((uint64_t)(self->private_impl.f_dst_x))); +- break; +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u); +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_code -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } +- } +- v_rle_state = 0u; +- goto label__middle__continue; +- } +- } +- label__goto_suspend__break:; +- self->private_impl.f_rle_state = v_rle_state; +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- } +- label__outer__break:; +- while (self->private_impl.f_dst_y < self->private_impl.f_height) { +- v_row = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { +- v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u); +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- } +- status = wuffs_base__make_status(NULL); +- goto ok; ++ __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0); ++ __m256i yy_eve = _mm256_and_si256(yy_all, u00FF); ++ __m256i yy_odd = _mm256_srli_epi16(yy_all, 8); + +- ok: +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++ __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve); ++ __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd); ++ __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve); ++ __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd); + +- return status; +-} ++ __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve); ++ __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd); ++ __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve); ++ __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd); + +-// -------- func bmp.decoder.swizzle_bitfields ++ __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve); ++ __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd); ++ __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve); ++ __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_bitfields( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ // § Note the swapped B and R channels. ++ __m256i mix00 = _mm256_unpacklo_epi8(packed_r_eve, packed_g_eve); ++ __m256i mix01 = _mm256_unpacklo_epi8(packed_r_odd, packed_g_odd); ++ __m256i mix02 = _mm256_unpacklo_epi8(packed_b_eve, uFFFF); ++ __m256i mix03 = _mm256_unpacklo_epi8(packed_b_odd, uFFFF); + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_n = 0; +- uint32_t v_p0 = 0; +- uint32_t v_p1 = 0; +- uint32_t v_p1_temp = 0; +- uint32_t v_num_bits = 0; +- uint32_t v_c = 0; +- uint32_t v_c32 = 0; +- uint32_t v_channel = 0; ++ __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02); ++ __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03); ++ __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02); ++ __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11); ++ __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11); ++ __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13); ++ __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13); + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- label__outer__continue:; +- while (true) { +- while (self->private_impl.f_pending_pad > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- self->private_impl.f_pending_pad -= 1u; +- iop_a_src += 1u; +- } +- while (true) { +- if (self->private_impl.f_dst_x == self->private_impl.f_width) { +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- if (self->private_impl.f_height > 0u) { +- self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; +- } +- goto label__outer__break; +- } else if (self->private_impl.f_pad_per_row != 0u) { +- self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; +- goto label__outer__continue; +- } +- } +- v_p1_temp = ((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x)); +- v_p1 = wuffs_base__u32__min(v_p1_temp, 256u); +- v_p0 = 0u; +- while (v_p0 < v_p1) { +- if (self->private_impl.f_bits_per_pixel == 16u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- break; +- } +- v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2u; +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- break; +- } +- v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4u; +- } +- v_channel = 0u; +- while (v_channel < 4u) { +- if (self->private_impl.f_channel_num_bits[v_channel] == 0u) { +- self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = 255u; +- self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = 255u; +- } else { +- v_c = ((v_c32 & self->private_impl.f_channel_masks[v_channel]) >> self->private_impl.f_channel_shifts[v_channel]); +- v_num_bits = ((uint32_t)(self->private_impl.f_channel_num_bits[v_channel])); +- while (v_num_bits < 16u) { +- v_c |= ((uint32_t)(v_c << v_num_bits)); +- v_num_bits *= 2u; +- } +- v_c >>= (v_num_bits - 16u); +- self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = ((uint8_t)((v_c >> 0u))); +- self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = ((uint8_t)((v_c >> 8u))); +- } +- v_channel += 1u; +- } +- v_p0 += 1u; +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); +- } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i >= ((uint64_t)(v_dst.len))) { +- v_n = ((uint64_t)(v_p0)); +- } else { +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, (8u * v_p0))); +- } +- if (v_n == 0u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- } +- } +- label__outer__break:; +- status = wuffs_base__make_status(NULL); +- goto ok; ++ __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20); ++ __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20); ++ __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31); ++ __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31); + +- ok: +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32); ++ _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33); + +- return status; ++ uint32_t n = 32u - (31u & (x - x_end)); ++ dst_iter += 4u * n; ++ up0 += n; ++ up1 += n; ++ up2 += n; ++ x += n; ++ } + } + +-// -------- func bmp.decoder.swizzle_low_bit_depth ++#if defined(__GNUC__) && !defined(__clang__) ++// No-op. ++#else ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") ++static const uint8_t* // ++wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2( ++ uint8_t* dst_ptr, ++ const uint8_t* src_ptr_major, ++ const uint8_t* src_ptr_minor, ++ size_t src_len, ++ uint32_t h1v2_bias_ignored, ++ bool first_column, ++ bool last_column) { ++ uint8_t* dp = dst_ptr; ++ const uint8_t* sp_major = src_ptr_major; ++ const uint8_t* sp_minor = src_ptr_minor; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__swizzle_low_bit_depth( +- wuffs_bmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ if (first_column) { ++ src_len--; ++ if ((src_len <= 0u) && last_column) { ++ uint32_t sv = (12u * ((uint32_t)(*sp_major++))) + // ++ (4u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + 7u) >> 4u); ++ return dst_ptr; ++ } + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_n = 0; +- uint32_t v_p0 = 0; +- uint32_t v_chunk_bits = 0; +- uint32_t v_chunk_count = 0; +- uint32_t v_pixels_per_chunk = 0; ++ uint32_t sv_major_m1 = sp_major[-0]; // Clamp offset to zero. ++ uint32_t sv_minor_m1 = sp_minor[-0]; // Clamp offset to zero. ++ uint32_t sv_major_p1 = sp_major[+1]; ++ uint32_t sv_minor_p1 = sp_minor[+1]; + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ if (src_len <= 0u) { ++ return dst_ptr; ++ } + } + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- while (true) { +- if (self->private_impl.f_dst_x == self->private_impl.f_width) { +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- break; +- } +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); +- } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i >= ((uint64_t)(v_dst.len))) { +- if (self->private_impl.f_bits_per_pixel == 1u) { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u); +- v_pixels_per_chunk = 32u; +- } else if (self->private_impl.f_bits_per_pixel == 2u) { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u); +- v_pixels_per_chunk = 16u; +- } else { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u); +- v_pixels_per_chunk = 8u; +- } +- while ((v_chunk_count >= 64u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 256u)) { +- iop_a_src += 256u; +- self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 64u)))); +- v_chunk_count -= 64u; +- } +- while ((v_chunk_count >= 8u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 32u)) { +- iop_a_src += 32u; +- self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 8u)))); +- v_chunk_count -= 8u; +- } +- while (v_chunk_count > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- iop_a_src += 4u; +- self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 1u)))); +- v_chunk_count -= 1u; +- } +- continue; +- } +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i); +- v_p0 = 0u; +- if (self->private_impl.f_bits_per_pixel == 1u) { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u); +- v_chunk_count = wuffs_base__u32__min(v_chunk_count, 16u); +- while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { +- v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4u; +- self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((1u & (v_chunk_bits >> 31u)))); +- self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((1u & (v_chunk_bits >> 30u)))); +- self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((1u & (v_chunk_bits >> 29u)))); +- self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((1u & (v_chunk_bits >> 28u)))); +- self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((1u & (v_chunk_bits >> 27u)))); +- self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((1u & (v_chunk_bits >> 26u)))); +- self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((1u & (v_chunk_bits >> 25u)))); +- self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((1u & (v_chunk_bits >> 24u)))); +- self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((1u & (v_chunk_bits >> 23u)))); +- self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((1u & (v_chunk_bits >> 22u)))); +- self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((1u & (v_chunk_bits >> 21u)))); +- self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((1u & (v_chunk_bits >> 20u)))); +- self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((1u & (v_chunk_bits >> 19u)))); +- self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((1u & (v_chunk_bits >> 18u)))); +- self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((1u & (v_chunk_bits >> 17u)))); +- self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((1u & (v_chunk_bits >> 16u)))); +- self->private_data.f_scratch[(v_p0 + 16u)] = ((uint8_t)((1u & (v_chunk_bits >> 15u)))); +- self->private_data.f_scratch[(v_p0 + 17u)] = ((uint8_t)((1u & (v_chunk_bits >> 14u)))); +- self->private_data.f_scratch[(v_p0 + 18u)] = ((uint8_t)((1u & (v_chunk_bits >> 13u)))); +- self->private_data.f_scratch[(v_p0 + 19u)] = ((uint8_t)((1u & (v_chunk_bits >> 12u)))); +- self->private_data.f_scratch[(v_p0 + 20u)] = ((uint8_t)((1u & (v_chunk_bits >> 11u)))); +- self->private_data.f_scratch[(v_p0 + 21u)] = ((uint8_t)((1u & (v_chunk_bits >> 10u)))); +- self->private_data.f_scratch[(v_p0 + 22u)] = ((uint8_t)((1u & (v_chunk_bits >> 9u)))); +- self->private_data.f_scratch[(v_p0 + 23u)] = ((uint8_t)((1u & (v_chunk_bits >> 8u)))); +- self->private_data.f_scratch[(v_p0 + 24u)] = ((uint8_t)((1u & (v_chunk_bits >> 7u)))); +- self->private_data.f_scratch[(v_p0 + 25u)] = ((uint8_t)((1u & (v_chunk_bits >> 6u)))); +- self->private_data.f_scratch[(v_p0 + 26u)] = ((uint8_t)((1u & (v_chunk_bits >> 5u)))); +- self->private_data.f_scratch[(v_p0 + 27u)] = ((uint8_t)((1u & (v_chunk_bits >> 4u)))); +- self->private_data.f_scratch[(v_p0 + 28u)] = ((uint8_t)((1u & (v_chunk_bits >> 3u)))); +- self->private_data.f_scratch[(v_p0 + 29u)] = ((uint8_t)((1u & (v_chunk_bits >> 2u)))); +- self->private_data.f_scratch[(v_p0 + 30u)] = ((uint8_t)((1u & (v_chunk_bits >> 1u)))); +- self->private_data.f_scratch[(v_p0 + 31u)] = ((uint8_t)((1u & (v_chunk_bits >> 0u)))); +- v_p0 = ((v_p0 & 511u) + 32u); +- v_chunk_count -= 1u; +- } +- } else if (self->private_impl.f_bits_per_pixel == 2u) { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u); +- v_chunk_count = wuffs_base__u32__min(v_chunk_count, 32u); +- while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { +- v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4u; +- self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((3u & (v_chunk_bits >> 30u)))); +- self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((3u & (v_chunk_bits >> 28u)))); +- self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((3u & (v_chunk_bits >> 26u)))); +- self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((3u & (v_chunk_bits >> 24u)))); +- self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((3u & (v_chunk_bits >> 22u)))); +- self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((3u & (v_chunk_bits >> 20u)))); +- self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((3u & (v_chunk_bits >> 18u)))); +- self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((3u & (v_chunk_bits >> 16u)))); +- self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((3u & (v_chunk_bits >> 14u)))); +- self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((3u & (v_chunk_bits >> 12u)))); +- self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((3u & (v_chunk_bits >> 10u)))); +- self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((3u & (v_chunk_bits >> 8u)))); +- self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((3u & (v_chunk_bits >> 6u)))); +- self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((3u & (v_chunk_bits >> 4u)))); +- self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((3u & (v_chunk_bits >> 2u)))); +- self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((3u & (v_chunk_bits >> 0u)))); +- v_p0 = ((v_p0 & 511u) + 16u); +- v_chunk_count -= 1u; +- } +- } else { +- v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u); +- v_chunk_count = wuffs_base__u32__min(v_chunk_count, 64u); +- while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { +- v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4u; +- self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 28u)))); +- self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 24u)))); +- self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 20u)))); +- self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 16u)))); +- self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u)))); +- self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u)))); +- self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u)))); +- self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u)))); +- v_p0 = ((v_p0 & 511u) + 8u); +- v_chunk_count -= 1u; +- } +- } +- v_p0 = wuffs_base__u32__min(v_p0, wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x)); +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0)); +- if (v_n == 0u) { +- status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); +- goto ok; +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- } +- status = wuffs_base__make_status(NULL); +- goto ok; +- +- ok: +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func bmp.decoder.frame_dirty_rect +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_bmp__decoder__frame_dirty_rect( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); ++ if (last_column) { ++ src_len--; + } + +- return wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height); +-} ++ if (src_len < 32) { ++ // This fallback is the same as the non-SIMD-capable code path. ++ for (; src_len > 0u; src_len--) { ++ uint32_t sv_major_m1 = sp_major[-1]; ++ uint32_t sv_minor_m1 = sp_minor[-1]; ++ uint32_t sv_major_p1 = sp_major[+1]; ++ uint32_t sv_minor_p1 = sp_minor[+1]; + +-// -------- func bmp.decoder.num_animation_loops ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_bmp__decoder__num_animation_loops( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ } else { ++ while (src_len > 0u) { ++ // Load 1+32+1 samples (six u8x32 vectors) from the major (jxx) and minor ++ // (nxx) rows. ++ // ++ // major_p0 = [j00 j01 j02 j03 .. j28 j29 j30 j31] // p0 = "plus 0" ++ // minor_p0 = [n00 n01 n02 n03 .. n28 n29 n30 n31] // p0 = "plus 0" ++ // major_m1 = [jm1 j00 j01 j02 .. j27 j28 j29 j30] // m1 = "minus 1" ++ // minor_m1 = [nm1 n00 n01 n02 .. n27 n28 n29 n30] // m1 = "minus 1" ++ // major_p1 = [j01 j02 j03 j04 .. j29 j30 j31 j32] // p1 = "plus 1" ++ // minor_p1 = [n01 n02 n03 n04 .. n29 n30 n31 n32] // p1 = "plus 1" ++ __m256i major_p0 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 0)); ++ __m256i minor_p0 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 0)); ++ __m256i major_m1 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major - 1)); ++ __m256i minor_m1 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor - 1)); ++ __m256i major_p1 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 1)); ++ __m256i minor_p1 = ++ _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 1)); + +- return 0u; +-} ++ // Unpack, staying with u8x32 vectors. ++ // ++ // step1_p0_lo = [j00 n00 j01 n01 .. j07 n07 j16 n16 j17 n17 .. j23 n23] ++ // step1_p0_hi = [j08 n08 j09 n09 .. j15 n15 j24 n24 j25 n25 .. j31 n31] ++ // step1_m1_lo = [jm1 nm1 j00 n00 .. j06 n06 j15 n15 j16 n16 .. j22 n22] ++ // step1_m1_hi = [j07 n07 j08 n08 .. j14 n14 j23 n23 j24 n24 .. j30 n30] ++ // step1_p1_lo = [j01 n01 j02 n02 .. j08 n08 j17 n17 j18 n18 .. j24 n24] ++ // step1_p1_hi = [j09 n09 j10 n10 .. j16 n16 j25 n25 j26 n26 .. j32 n32] ++ __m256i step1_p0_lo = _mm256_unpacklo_epi8(major_p0, minor_p0); ++ __m256i step1_p0_hi = _mm256_unpackhi_epi8(major_p0, minor_p0); ++ __m256i step1_m1_lo = _mm256_unpacklo_epi8(major_m1, minor_m1); ++ __m256i step1_m1_hi = _mm256_unpackhi_epi8(major_m1, minor_m1); ++ __m256i step1_p1_lo = _mm256_unpacklo_epi8(major_p1, minor_p1); ++ __m256i step1_p1_hi = _mm256_unpackhi_epi8(major_p1, minor_p1); + +-// -------- func bmp.decoder.num_decoded_frame_configs ++ // Multiply-add to get u16x16 vectors. ++ // ++ // step2_p0_lo = [9*j00+3*n00 9*j01+3*n01 .. 9*j23+3*n23] ++ // step2_p0_hi = [9*j08+3*n08 9*j09+3*n09 .. 9*j31+3*n31] ++ // step2_m1_lo = [3*jm1+1*nm1 3*j00+1*n00 .. 3*j22+1*n22] ++ // step2_m1_hi = [3*j07+1*n07 3*j08+1*n08 .. 3*j30+1*n30] ++ // step2_p1_lo = [3*j01+1*n01 3*j02+1*n02 .. 3*j24+1*n24] ++ // step2_p1_hi = [3*j09+1*n09 3*j10+1*n10 .. 3*j32+1*n32] ++ const __m256i k0309 = _mm256_set1_epi16(0x0309); ++ const __m256i k0103 = _mm256_set1_epi16(0x0103); ++ __m256i step2_p0_lo = _mm256_maddubs_epi16(step1_p0_lo, k0309); ++ __m256i step2_p0_hi = _mm256_maddubs_epi16(step1_p0_hi, k0309); ++ __m256i step2_m1_lo = _mm256_maddubs_epi16(step1_m1_lo, k0103); ++ __m256i step2_m1_hi = _mm256_maddubs_epi16(step1_m1_hi, k0103); ++ __m256i step2_p1_lo = _mm256_maddubs_epi16(step1_p1_lo, k0103); ++ __m256i step2_p1_hi = _mm256_maddubs_epi16(step1_p1_hi, k0103); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bmp__decoder__num_decoded_frame_configs( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ // Compute the weighted sums of (p0, m1) and (p0, p1). For example: ++ // ++ // step3_m1_lo[00] = ((9*j00) + (3*n00) + (3*jm1) + (1*nm1)) as u16 ++ // step3_p1_hi[15] = ((9*j31) + (3*n31) + (3*j32) + (1*n32)) as u16 ++ __m256i step3_m1_lo = _mm256_add_epi16(step2_p0_lo, step2_m1_lo); ++ __m256i step3_m1_hi = _mm256_add_epi16(step2_p0_hi, step2_m1_hi); ++ __m256i step3_p1_lo = _mm256_add_epi16(step2_p0_lo, step2_p1_lo); ++ __m256i step3_p1_hi = _mm256_add_epi16(step2_p0_hi, step2_p1_hi); + +- if (self->private_impl.f_call_sequence > 32u) { +- return 1u; +- } +- return 0u; +-} ++ // Bias by 8 (on the left) or 7 (on the right) and then divide by 16 ++ // (which is 9+3+3+1) to get a weighted average. On the left (m1), shift ++ // the u16 right value by 4. On the right (p1), shift right by 4 and then ++ // shift left by 8 so that, when still in the u16x16 little-endian ++ // interpretation, we have: ++ // - m1_element = (etcetera + 8) >> 4 ++ // - p1_element = ((etcetera + 7) >> 4) << 8 ++ // ++ // step4_m1_lo = [0x00?? 0x00?? ... 0x00?? 0x00??] ++ // step4_p1_lo = [0x??00 0x??00 ... 0x??00 0x??00] ++ // step4_m1_hi = [0x00?? 0x00?? ... 0x00?? 0x00??] ++ // step4_p1_hi = [0x??00 0x??00 ... 0x??00 0x??00] ++ __m256i step4_m1_lo = _mm256_srli_epi16( ++ _mm256_add_epi16(step3_m1_lo, _mm256_set1_epi16(8)), 4); ++ __m256i step4_p1_lo = _mm256_slli_epi16( ++ _mm256_srli_epi16(_mm256_add_epi16(step3_p1_lo, _mm256_set1_epi16(7)), ++ 4), ++ 8); ++ __m256i step4_m1_hi = _mm256_srli_epi16( ++ _mm256_add_epi16(step3_m1_hi, _mm256_set1_epi16(8)), 4); ++ __m256i step4_p1_hi = _mm256_slli_epi16( ++ _mm256_srli_epi16(_mm256_add_epi16(step3_p1_hi, _mm256_set1_epi16(7)), ++ 4), ++ 8); + +-// -------- func bmp.decoder.num_decoded_frames ++ // Bitwise-or two "0x00"-rich u16x16 vectors to get a u8x32 vector. Do ++ // that twice. Once for the low columns and once for the high columns. ++ // ++ // In terms of jxx (major row) or nxx (minor row) source samples: ++ // - low columns means ( 0 .. 8; 16 .. 24). ++ // - high columns means ( 8 .. 16; 24 .. 32). ++ // ++ // In terms of dxx destination samples (there are twice as many): ++ // - low columns means ( 0 .. 16; 32 .. 48). ++ // - high columns means (16 .. 32; 48 .. 64). ++ // ++ // step5_lo = [d00 d01 .. d14 d15 d32 d33 .. d46 d47] ++ // step5_hi = [d16 d17 .. d30 d31 d48 d49 .. d62 d63] ++ // ++ // The d00, d02 ... d62 even elements come from (p0, m1) weighted sums. ++ // The d01, d03 ... d63 odd elements come from (p0, p1) weighted sums. ++ __m256i step5_lo = _mm256_or_si256(step4_m1_lo, step4_p1_lo); ++ __m256i step5_hi = _mm256_or_si256(step4_m1_hi, step4_p1_hi); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bmp__decoder__num_decoded_frames( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ // Permute and store. ++ // ++ // step6_00_31 = [d00 d01 .. d14 d15 d16 d17 .. d30 d31] ++ // step6_32_63 = [d32 d33 .. d46 d47 d48 d49 .. d62 d63] ++ __m256i step6_00_31 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x20); ++ __m256i step6_32_63 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x31); ++ _mm256_storeu_si256((__m256i*)(void*)(dp + 0x00), step6_00_31); ++ _mm256_storeu_si256((__m256i*)(void*)(dp + 0x20), step6_32_63); + +- if (self->private_impl.f_call_sequence > 64u) { +- return 1u; ++ // Advance by up to 32 source samples (64 destination samples). The first ++ // iteration might be smaller than 32 so that all of the remaining steps ++ // are exactly 32. ++ size_t n = 32u - (31u & (0u - src_len)); ++ dp += 2u * n; ++ sp_major += n; ++ sp_minor += n; ++ src_len -= n; ++ } + } +- return 0u; +-} + +-// -------- func bmp.decoder.restart_frame ++ if (last_column) { ++ uint32_t sv_major_m1 = sp_major[-1]; ++ uint32_t sv_minor_m1 = sp_minor[-1]; ++ uint32_t sv_major_p1 = sp_major[+0]; // Clamp offset to zero. ++ uint32_t sv_minor_p1 = sp_minor[+0]; // Clamp offset to zero. + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__restart_frame( +- wuffs_bmp__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ uint32_t sv = (9u * ((uint32_t)(*sp_major++))) + // ++ (3u * ((uint32_t)(*sp_minor++))); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u); ++ *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u); + } + +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } +- if (a_index != 0u) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- self->private_impl.f_call_sequence = 40u; +- self->private_impl.f_frame_config_io_position = a_io_position; +- return wuffs_base__make_status(NULL); ++ return dst_ptr; + } ++#endif ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++// ‼ WUFFS MULTI-FILE SECTION -x86_avx2 + +-// -------- func bmp.decoder.set_report_metadata +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_bmp__decoder__set_report_metadata( +- wuffs_bmp__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_base__make_empty_struct(); +-} ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV) + +-// -------- func bmp.decoder.tell_me_more ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \ ++ defined(WUFFS_CONFIG__MODULE__BASE__UTF8) + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bmp__decoder__tell_me_more( +- wuffs_bmp__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); ++// ---------------- Unicode and UTF-8 + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point) { ++ if (code_point <= 0x7F) { ++ if (dst.len >= 1) { ++ dst.ptr[0] = (uint8_t)(code_point); ++ return 1; ++ } + +- uint32_t coro_susp_point = self->private_impl.p_tell_me_more[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ } else if (code_point <= 0x07FF) { ++ if (dst.len >= 2) { ++ dst.ptr[0] = (uint8_t)(0xC0 | ((code_point >> 6))); ++ dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); ++ return 2; ++ } + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_bmp__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } else if (code_point <= 0xFFFF) { ++ if ((dst.len >= 3) && ((code_point < 0xD800) || (0xDFFF < code_point))) { ++ dst.ptr[0] = (uint8_t)(0xE0 | ((code_point >> 12))); ++ dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F)); ++ dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); ++ return 3; + } + +- ok: +- self->private_impl.p_tell_me_more[0] = 0; +- goto exit; ++ } else if (code_point <= 0x10FFFF) { ++ if (dst.len >= 4) { ++ dst.ptr[0] = (uint8_t)(0xF0 | ((code_point >> 18))); ++ dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 12) & 0x3F)); ++ dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F)); ++ dst.ptr[3] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F)); ++ return 4; ++ } + } + +- goto suspend; +- suspend: +- self->private_impl.p_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; ++ return 0; + } + +-// -------- func bmp.decoder.do_tell_me_more +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__do_tell_me_more( +- wuffs_bmp__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++// wuffs_base__utf_8__byte_length_minus_1 is the byte length (minus 1) of a ++// UTF-8 encoded code point, based on the encoding's initial byte. ++// - 0x00 is 1-byte UTF-8 (ASCII). ++// - 0x01 is the start of 2-byte UTF-8. ++// - 0x02 is the start of 3-byte UTF-8. ++// - 0x03 is the start of 4-byte UTF-8. ++// - 0x40 is a UTF-8 tail byte. ++// - 0x80 is invalid UTF-8. ++// ++// RFC 3629 (UTF-8) gives this grammar for valid UTF-8: ++// UTF8-1 = %x00-7F ++// UTF8-2 = %xC2-DF UTF8-tail ++// UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) / ++// %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail ) ++// UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) / ++// %xF4 %x80-8F 2( UTF8-tail ) ++// UTF8-tail = %x80-BF ++static const uint8_t wuffs_base__utf_8__byte_length_minus_1[256] = { ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x00 ..= 0x07. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x08 ..= 0x0F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 ..= 0x17. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 ..= 0x1F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 ..= 0x27. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 ..= 0x2F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x30 ..= 0x37. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x38 ..= 0x3F. + +- if (self->private_impl.f_io_redirect_fourcc <= 1u) { +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; +- } +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- 1u, +- self->private_impl.f_io_redirect_fourcc, +- 0u, +- self->private_impl.f_io_redirect_pos, +- 18446744073709551615u); +- } +- self->private_impl.f_io_redirect_fourcc = 1u; ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x40 ..= 0x47. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x48 ..= 0x4F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x50 ..= 0x57. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x58 ..= 0x5F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x60 ..= 0x67. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x68 ..= 0x6F. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x70 ..= 0x77. ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x78 ..= 0x7F. + +- goto ok; +- ok: +- goto exit; +- exit: +- return status; +-} ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x80 ..= 0x87. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x88 ..= 0x8F. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x90 ..= 0x97. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0x98 ..= 0x9F. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA0 ..= 0xA7. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xA8 ..= 0xAF. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB0 ..= 0xB7. ++ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // 0xB8 ..= 0xBF. + +-// -------- func bmp.decoder.history_retain_length ++ 0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC0 ..= 0xC7. ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xC8 ..= 0xCF. ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD0 ..= 0xD7. ++ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0xD8 ..= 0xDF. ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE0 ..= 0xE7. ++ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, // 0xE8 ..= 0xEF. ++ 0x03, 0x03, 0x03, 0x03, 0x03, 0x80, 0x80, 0x80, // 0xF0 ..= 0xF7. ++ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 0xF8 ..= 0xFF. ++ // 0 1 2 3 4 5 6 7 ++ // 8 9 A B C D E F ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bmp__decoder__history_retain_length( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output // ++wuffs_base__utf_8__next(const uint8_t* s_ptr, size_t s_len) { ++ if (s_len == 0) { ++ return wuffs_base__make_utf_8__next__output(0, 0); + } ++ uint32_t c = s_ptr[0]; ++ switch (wuffs_base__utf_8__byte_length_minus_1[c & 0xFF]) { ++ case 0: ++ return wuffs_base__make_utf_8__next__output(c, 1); + +- return 0u; +-} ++ case 1: ++ if (s_len < 2) { ++ break; ++ } ++ c = wuffs_base__peek_u16le__no_bounds_check(s_ptr); ++ if ((c & 0xC000) != 0x8000) { ++ break; ++ } ++ c = (0x0007C0 & (c << 6)) | (0x00003F & (c >> 8)); ++ return wuffs_base__make_utf_8__next__output(c, 2); + +-// -------- func bmp.decoder.workbuf_len ++ case 2: ++ if (s_len < 3) { ++ break; ++ } ++ c = wuffs_base__peek_u24le__no_bounds_check(s_ptr); ++ if ((c & 0xC0C000) != 0x808000) { ++ break; ++ } ++ c = (0x00F000 & (c << 12)) | (0x000FC0 & (c >> 2)) | ++ (0x00003F & (c >> 16)); ++ if ((c <= 0x07FF) || ((0xD800 <= c) && (c <= 0xDFFF))) { ++ break; ++ } ++ return wuffs_base__make_utf_8__next__output(c, 3); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_bmp__decoder__workbuf_len( +- const wuffs_bmp__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ case 3: ++ if (s_len < 4) { ++ break; ++ } ++ c = wuffs_base__peek_u32le__no_bounds_check(s_ptr); ++ if ((c & 0xC0C0C000) != 0x80808000) { ++ break; ++ } ++ c = (0x1C0000 & (c << 18)) | (0x03F000 & (c << 4)) | ++ (0x000FC0 & (c >> 10)) | (0x00003F & (c >> 24)); ++ if ((c <= 0xFFFF) || (0x110000 <= c)) { ++ break; ++ } ++ return wuffs_base__make_utf_8__next__output(c, 4); + } + +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ return wuffs_base__make_utf_8__next__output( ++ WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1); + } + +-// -------- func bmp.decoder.read_palette +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__read_palette( +- wuffs_bmp__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_i = 0; +- uint32_t v_argb = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_read_palette[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_read_palette[0].v_i; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output // ++wuffs_base__utf_8__next_from_end(const uint8_t* s_ptr, size_t s_len) { ++ if (s_len == 0) { ++ return wuffs_base__make_utf_8__next__output(0, 0); + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ const uint8_t* ptr = &s_ptr[s_len - 1]; ++ if (*ptr < 0x80) { ++ return wuffs_base__make_utf_8__next__output(*ptr, 1); + +- if (self->private_impl.f_bitmap_info_len == 12u) { +- while ((v_i < 256u) && (self->private_impl.f_padding >= 3u)) { +- self->private_impl.f_padding -= 3u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { +- t_0 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); +- iop_a_src += 3; +- } else { +- self->private_data.s_read_palette[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_read_palette[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 16) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; +- } +- } +- v_argb = t_0; +- } +- v_argb |= 4278190080u; +- self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); +- self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); +- self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); +- v_i += 1u; ++ } else if (*ptr < 0xC0) { ++ const uint8_t* too_far = &s_ptr[(s_len > 4) ? (s_len - 4) : 0]; ++ uint32_t n = 1; ++ while (ptr != too_far) { ++ ptr--; ++ n++; ++ if (*ptr < 0x80) { ++ break; ++ } else if (*ptr < 0xC0) { ++ continue; + } +- } else { +- while ((v_i < 256u) && (self->private_impl.f_padding >= 4u)) { +- self->private_impl.f_padding -= 4u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_read_palette[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_read_palette[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; +- } +- } +- v_argb = t_1; +- } +- v_argb |= 4278190080u; +- self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); +- self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); +- self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); +- v_i += 1u; ++ wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(ptr, n); ++ if (o.byte_length != n) { ++ break; + } ++ return o; + } +- while (v_i < 256u) { +- self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u; +- v_i += 1u; +- } +- +- goto ok; +- ok: +- self->private_impl.p_read_palette[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_read_palette[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_read_palette[0].v_i = v_i; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return status; ++ return wuffs_base__make_utf_8__next__output( ++ WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1); + } + +-// -------- func bmp.decoder.process_masks +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bmp__decoder__process_masks( +- wuffs_bmp__decoder* self) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_i = 0; +- uint32_t v_mask = 0; +- uint32_t v_n = 0; +- +- while (v_i < 4u) { +- v_mask = self->private_impl.f_channel_masks[v_i]; +- if (v_mask != 0u) { +- v_n = 0u; +- while ((v_mask & 1u) == 0u) { +- v_n += 1u; +- v_mask >>= 1u; +- } +- self->private_impl.f_channel_shifts[v_i] = ((uint8_t)((v_n & 31u))); +- v_n = 0u; +- while ((v_mask & 1u) == 1u) { +- v_n += 1u; +- v_mask >>= 1u; +- } +- if ((v_mask != 0u) || (v_n > 32u)) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; +- } +- self->private_impl.f_channel_num_bits[v_i] = ((uint8_t)(v_n)); +- } else if (v_i != 3u) { +- status = wuffs_base__make_status(wuffs_bmp__error__bad_header); +- goto exit; ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__utf_8__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) { ++ // TODO: possibly optimize the all-ASCII case (4 or 8 bytes at a time). ++ // ++ // TODO: possibly optimize this by manually inlining the ++ // wuffs_base__utf_8__next calls. ++ size_t original_len = s_len; ++ while (s_len > 0) { ++ wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(s_ptr, s_len); ++ if ((o.code_point > 0x7F) && (o.byte_length == 1)) { ++ break; + } +- v_i += 1u; ++ s_ptr += o.byte_length; ++ s_len -= o.byte_length; + } ++ return original_len - s_len; ++} + +- goto ok; +- ok: +- goto exit; +- exit: +- return status; ++WUFFS_BASE__MAYBE_STATIC size_t // ++wuffs_base__ascii__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) { ++ // TODO: possibly optimize this by checking 4 or 8 bytes at a time. ++ const uint8_t* original_ptr = s_ptr; ++ const uint8_t* p = s_ptr; ++ const uint8_t* q = s_ptr + s_len; ++ for (; (p != q) && ((*p & 0x80) == 0); p++) { ++ } ++ return (size_t)(p - original_ptr); + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) ++#endif // !defined(WUFFS_CONFIG__MODULES) || ++ // defined(WUFFS_CONFIG__MODULE__BASE) || ++ // defined(WUFFS_CONFIG__MODULE__BASE__UTF8) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) ++#ifdef __cplusplus ++} // extern "C" ++#endif + +-// ---------------- Status Codes Implementations ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) + +-const char wuffs_bzip2__error__bad_huffman_code_over_subscribed[] = "#bzip2: bad Huffman code (over-subscribed)"; +-const char wuffs_bzip2__error__bad_huffman_code_under_subscribed[] = "#bzip2: bad Huffman code (under-subscribed)"; +-const char wuffs_bzip2__error__bad_block_header[] = "#bzip2: bad block header"; +-const char wuffs_bzip2__error__bad_block_length[] = "#bzip2: bad block length"; +-const char wuffs_bzip2__error__bad_checksum[] = "#bzip2: bad checksum"; +-const char wuffs_bzip2__error__bad_header[] = "#bzip2: bad header"; +-const char wuffs_bzip2__error__bad_number_of_sections[] = "#bzip2: bad number of sections"; +-const char wuffs_bzip2__error__truncated_input[] = "#bzip2: truncated input"; +-const char wuffs_bzip2__error__unsupported_block_randomization[] = "#bzip2: unsupported block randomization"; +-const char wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state[] = "#bzip2: internal error: inconsistent Huffman decoder state"; ++// ---------------- Status Codes Implementations + + // ---------------- Private Consts + +-static const uint8_t +-WUFFS_BZIP2__CLAMP_TO_5[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 1, 2, 3, 4, 5, 5, 5, +-}; +- +-static const uint32_t +-WUFFS_BZIP2__REV_CRC32_TABLE[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 79764919, 159529838, 222504665, 319059676, 398814059, 445009330, 507990021, +- 638119352, 583659535, 797628118, 726387553, 890018660, 835552979, 1015980042, 944750013, +- 1276238704, 1221641927, 1167319070, 1095957929, 1595256236, 1540665371, 1452775106, 1381403509, +- 1780037320, 1859660671, 1671105958, 1733955601, 2031960084, 2111593891, 1889500026, 1952343757, +- 2552477408, 2632100695, 2443283854, 2506133561, 2334638140, 2414271883, 2191915858, 2254759653, +- 3190512472, 3135915759, 3081330742, 3009969537, 2905550212, 2850959411, 2762807018, 2691435357, +- 3560074640, 3505614887, 3719321342, 3648080713, 3342211916, 3287746299, 3467911202, 3396681109, +- 4063920168, 4143685023, 4223187782, 4286162673, 3779000052, 3858754371, 3904687514, 3967668269, +- 881225847, 809987520, 1023691545, 969234094, 662832811, 591600412, 771767749, 717299826, +- 311336399, 374308984, 453813921, 533576470, 25881363, 88864420, 134795389, 214552010, +- 2023205639, 2086057648, 1897238633, 1976864222, 1804852699, 1867694188, 1645340341, 1724971778, +- 1587496639, 1516133128, 1461550545, 1406951526, 1302016099, 1230646740, 1142491917, 1087903418, +- 2896545431, 2825181984, 2770861561, 2716262478, 3215044683, 3143675388, 3055782693, 3001194130, +- 2326604591, 2389456536, 2200899649, 2280525302, 2578013683, 2640855108, 2418763421, 2498394922, +- 3769900519, 3832873040, 3912640137, 3992402750, 4088425275, 4151408268, 4197601365, 4277358050, +- 3334271071, 3263032808, 3476998961, 3422541446, 3585640067, 3514407732, 3694837229, 3640369242, +- 1762451694, 1842216281, 1619975040, 1682949687, 2047383090, 2127137669, 1938468188, 2001449195, +- 1325665622, 1271206113, 1183200824, 1111960463, 1543535498, 1489069629, 1434599652, 1363369299, +- 622672798, 568075817, 748617968, 677256519, 907627842, 853037301, 1067152940, 995781531, +- 51762726, 131386257, 177728840, 240578815, 269590778, 349224269, 429104020, 491947555, +- 4046411278, 4126034873, 4172115296, 4234965207, 3794477266, 3874110821, 3953728444, 4016571915, +- 3609705398, 3555108353, 3735388376, 3664026991, 3290680682, 3236090077, 3449943556, 3378572211, +- 3174993278, 3120533705, 3032266256, 2961025959, 2923101090, 2868635157, 2813903052, 2742672763, +- 2604032198, 2683796849, 2461293480, 2524268063, 2284983834, 2364738477, 2175806836, 2238787779, +- 1569362073, 1498123566, 1409854455, 1355396672, 1317987909, 1246755826, 1192025387, 1137557660, +- 2072149281, 2135122070, 1912620623, 1992383480, 1753615357, 1816598090, 1627664531, 1707420964, +- 295390185, 358241886, 404320391, 483945776, 43990325, 106832002, 186451547, 266083308, +- 932423249, 861060070, 1041341759, 986742920, 613929101, 542559546, 756411363, 701822548, +- 3316196985, 3244833742, 3425377559, 3370778784, 3601682597, 3530312978, 3744426955, 3689838204, +- 3819031489, 3881883254, 3928223919, 4007849240, 4037393693, 4100235434, 4180117107, 4259748804, +- 2310601993, 2373574846, 2151335527, 2231098320, 2596047829, 2659030626, 2470359227, 2550115596, +- 2947551409, 2876312838, 2788305887, 2733848168, 3165939309, 3094707162, 3040238851, 2985771188, +-}; +- + // ---------------- Private Initializer Prototypes + + // ---------------- Private Function Prototypes + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__do_transform_io( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__prepare_block( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__read_code_lengths( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__build_huffman_tree( +- wuffs_bzip2__decoder* self, +- uint32_t a_which); +- + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_bzip2__decoder__build_huffman_table( +- wuffs_bzip2__decoder* self, +- uint32_t a_which); ++wuffs_adler32__hasher__up( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_bzip2__decoder__invert_bwt( +- wuffs_bzip2__decoder* self); ++wuffs_adler32__hasher__up__choosy_default( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x); + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_bzip2__decoder__flush_fast( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__flush_slow( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__decode_huffman_fast( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src); ++wuffs_adler32__hasher__up_arm_neon( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__decode_huffman_slow( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src); ++static wuffs_base__empty_struct ++wuffs_adler32__hasher__up_x86_sse42( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + + // ---------------- VTables + +-const wuffs_base__io_transformer__func_ptrs +-wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++const wuffs_base__hasher_u32__func_ptrs ++wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = { ++ (uint32_t(*)(const void*))(&wuffs_adler32__hasher__checksum_u32), + (uint64_t(*)(const void*, +- uint32_t))(&wuffs_bzip2__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_bzip2__decoder__history_retain_length), ++ uint32_t))(&wuffs_adler32__hasher__get_quirk), + (wuffs_base__status(*)(void*, + uint32_t, +- uint64_t))(&wuffs_bzip2__decoder__set_quirk), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_bzip2__decoder__transform_io), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bzip2__decoder__workbuf_len), ++ uint64_t))(&wuffs_adler32__hasher__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_adler32__hasher__update), ++ (uint32_t(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_adler32__hasher__update_u32), + }; + + // ---------------- Initializer Implementations + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_bzip2__decoder__initialize( +- wuffs_bzip2__decoder* self, ++wuffs_adler32__hasher__initialize( ++ wuffs_adler32__hasher* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ +@@ -30559,23 +30841,25 @@ wuffs_bzip2__decoder__initialize( + } + } + ++ self->private_impl.choosy_up = &wuffs_adler32__hasher__up__choosy_default; ++ + self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = +- wuffs_base__io_transformer__vtable_name; +- self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = +- (const void*)(&wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = ++ wuffs_base__hasher_u32__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = ++ (const void*)(&wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32); + return wuffs_base__make_status(NULL); + } + +-wuffs_bzip2__decoder* +-wuffs_bzip2__decoder__alloc(void) { +- wuffs_bzip2__decoder* x = +- (wuffs_bzip2__decoder*)(calloc(sizeof(wuffs_bzip2__decoder), 1)); ++wuffs_adler32__hasher* ++wuffs_adler32__hasher__alloc(void) { ++ wuffs_adler32__hasher* x = ++ (wuffs_adler32__hasher*)(calloc(1, sizeof(wuffs_adler32__hasher))); + if (!x) { + return NULL; + } +- if (wuffs_bzip2__decoder__initialize( +- x, sizeof(wuffs_bzip2__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ if (wuffs_adler32__hasher__initialize( ++ x, sizeof(wuffs_adler32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } +@@ -30583,18 +30867,18 @@ wuffs_bzip2__decoder__alloc(void) { + } + + size_t +-sizeof__wuffs_bzip2__decoder(void) { +- return sizeof(wuffs_bzip2__decoder); ++sizeof__wuffs_adler32__hasher(void) { ++ return sizeof(wuffs_adler32__hasher); + } + + // ---------------- Function Implementations + +-// -------- func bzip2.decoder.get_quirk ++// -------- func adler32.hasher.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bzip2__decoder__get_quirk( +- const wuffs_bzip2__decoder* self, ++wuffs_adler32__hasher__get_quirk( ++ const wuffs_adler32__hasher* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -30607,12 +30891,12 @@ wuffs_bzip2__decoder__get_quirk( + return 0u; + } + +-// -------- func bzip2.decoder.set_quirk ++// -------- func adler32.hasher.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bzip2__decoder__set_quirk( +- wuffs_bzip2__decoder* self, ++wuffs_adler32__hasher__set_quirk( ++ wuffs_adler32__hasher* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -30625,369 +30909,699 @@ wuffs_bzip2__decoder__set_quirk( + : wuffs_base__error__initialize_not_called); + } + +- if (a_key == 1u) { +- self->private_impl.f_ignore_checksum = (a_value > 0u); +- return wuffs_base__make_status(NULL); +- } + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func bzip2.decoder.history_retain_length ++// -------- func adler32.hasher.update + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_bzip2__decoder__history_retain_length( +- const wuffs_bzip2__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_adler32__hasher__update( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return 0; ++ return wuffs_base__make_empty_struct(); + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); + } + +- return 0u; ++ if ( ! self->private_impl.f_started) { ++ self->private_impl.f_started = true; ++ self->private_impl.f_state = 1u; ++ self->private_impl.choosy_up = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_adler32__hasher__up_arm_neon : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_adler32__hasher__up_x86_sse42 : ++#endif ++ self->private_impl.choosy_up); ++ } ++ wuffs_adler32__hasher__up(self, a_x); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func bzip2.decoder.workbuf_len ++// -------- func adler32.hasher.update_u32 + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_bzip2__decoder__workbuf_len( +- const wuffs_bzip2__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_adler32__hasher__update_u32( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ return 0; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return 0; + } + +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ wuffs_adler32__hasher__update(self, a_x); ++ return self->private_impl.f_state; + } + +-// -------- func bzip2.decoder.transform_io ++// -------- func adler32.hasher.up + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_bzip2__decoder__transform_io( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++static wuffs_base__empty_struct ++wuffs_adler32__hasher__up( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ return (*self->private_impl.choosy_up)(self, a_x); ++} + +- uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_adler32__hasher__up__choosy_default( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_s1 = 0; ++ uint32_t v_s2 = 0; ++ wuffs_base__slice_u8 v_remaining = {0}; ++ wuffs_base__slice_u8 v_p = {0}; + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_bzip2__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); +- v_status = t_0; ++ v_s1 = ((self->private_impl.f_state) & 0xFFFFu); ++ v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); ++ while (((uint64_t)(a_x.len)) > 0u) { ++ v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); ++ if (((uint64_t)(a_x.len)) > 5552u) { ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5552u); ++ a_x = wuffs_base__slice_u8__subslice_j(a_x, 5552u); ++ } ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 1; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8)); ++ while (v_p.ptr < i_end0_p) { ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; + } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__truncated_input); +- goto exit; ++ v_p.len = 1; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end1_p) { ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ v_p.len = 0; + } +- +- ok: +- self->private_impl.p_transform_io[0] = 0; +- goto exit; ++ v_s1 %= 65521u; ++ v_s2 %= 65521u; ++ a_x = v_remaining; + } ++ self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); ++ return wuffs_base__make_empty_struct(); ++} + +- goto suspend; +- suspend: +- self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++// -------- func adler32.hasher.checksum_u32 + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_adler32__hasher__checksum_u32( ++ const wuffs_adler32__hasher* self) { ++ if (!self) { ++ return 0; + } +- return status; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return self->private_impl.f_state; + } + +-// -------- func bzip2.decoder.do_transform_io ++// ‼ WUFFS MULTI-FILE SECTION +arm_neon ++// -------- func adler32.hasher.up_arm_neon + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__do_transform_io( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- uint32_t v_i = 0; +- uint64_t v_tag = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint32_t v_final_checksum_want = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++static wuffs_base__empty_struct ++wuffs_adler32__hasher__up_arm_neon( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_s1 = 0; ++ uint32_t v_s2 = 0; ++ wuffs_base__slice_u8 v_remaining = {0}; ++ wuffs_base__slice_u8 v_p = {0}; ++ uint8x16_t v_p__left = {0}; ++ uint8x16_t v_p_right = {0}; ++ uint32x4_t v_v1 = {0}; ++ uint32x4_t v_v2 = {0}; ++ uint16x8_t v_col0 = {0}; ++ uint16x8_t v_col1 = {0}; ++ uint16x8_t v_col2 = {0}; ++ uint16x8_t v_col3 = {0}; ++ uint32x2_t v_sum1 = {0}; ++ uint32x2_t v_sum2 = {0}; ++ uint32x2_t v_sum12 = {0}; ++ uint32_t v_num_iterate_bytes = 0; ++ uint64_t v_tail_index = 0; + +- uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_do_transform_io[0].v_i; +- v_tag = self->private_data.s_do_transform_io[0].v_tag; +- v_final_checksum_want = self->private_data.s_do_transform_io[0].v_final_checksum_want; ++ v_s1 = ((self->private_impl.f_state) & 0xFFFFu); ++ v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); ++ while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { ++ v_s1 += ((uint32_t)(a_x.ptr[0u])); ++ v_s2 += v_s1; ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c != 66u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); +- goto exit; ++ v_s1 %= 65521u; ++ v_s2 %= 65521u; ++ while (((uint64_t)(a_x.len)) > 0u) { ++ v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); ++ if (((uint64_t)(a_x.len)) > 5536u) { ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u); ++ a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u); + } ++ v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u))); ++ v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes)); ++ v_v1 = vdupq_n_u32(0u); ++ v_v2 = vdupq_n_u32(0u); ++ v_col0 = vdupq_n_u16(0u); ++ v_col1 = vdupq_n_u16(0u); ++ v_col2 = vdupq_n_u16(0u); ++ v_col3 = vdupq_n_u16(0u); + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 32; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32)); ++ while (v_p.ptr < i_end0_p) { ++ v_p__left = vld1q_u8(v_p.ptr); ++ v_p_right = vld1q_u8(v_p.ptr + 16u); ++ v_v2 = vaddq_u32(v_v2, v_v1); ++ v_v1 = vpadalq_u16(v_v1, vpadalq_u8(vpaddlq_u8(v_p__left), v_p_right)); ++ v_col0 = vaddw_u8(v_col0, vget_low_u8(v_p__left)); ++ v_col1 = vaddw_u8(v_col1, vget_high_u8(v_p__left)); ++ v_col2 = vaddw_u8(v_col2, vget_low_u8(v_p_right)); ++ v_col3 = vaddw_u8(v_col3, vget_high_u8(v_p_right)); ++ v_p.ptr += 32; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- if (v_c != 90u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); +- goto exit; ++ v_p.len = 0; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_v2 = vshlq_n_u32(v_v2, 5u); ++ v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col0), ((uint16x4_t){32u, 31u, 30u, 29u})); ++ v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col0), ((uint16x4_t){28u, 27u, 26u, 25u})); ++ v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col1), ((uint16x4_t){24u, 23u, 22u, 21u})); ++ v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col1), ((uint16x4_t){20u, 19u, 18u, 17u})); ++ v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col2), ((uint16x4_t){16u, 15u, 14u, 13u})); ++ v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col2), ((uint16x4_t){12u, 11u, 10u, 9u})); ++ v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col3), ((uint16x4_t){8u, 7u, 6u, 5u})); ++ v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col3), ((uint16x4_t){4u, 3u, 2u, 1u})); ++ v_sum1 = vpadd_u32(vget_low_u32(v_v1), vget_high_u32(v_v1)); ++ v_sum2 = vpadd_u32(vget_low_u32(v_v2), vget_high_u32(v_v2)); ++ v_sum12 = vpadd_u32(v_sum1, v_sum2); ++ v_s1 += vget_lane_u32(v_sum12, 0u); ++ v_s2 += vget_lane_u32(v_sum12, 1u); ++ v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u); ++ if (v_tail_index < ((uint64_t)(a_x.len))) { ++ { ++ wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 1; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end0_p) { ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; + } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; + } +- if (v_c != 104u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); +- goto exit; ++ v_s1 %= 65521u; ++ v_s2 %= 65521u; ++ a_x = v_remaining; ++ } ++ self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++// ‼ WUFFS MULTI-FILE SECTION -arm_neon ++ ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func adler32.hasher.up_x86_sse42 ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_adler32__hasher__up_x86_sse42( ++ wuffs_adler32__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_s1 = 0; ++ uint32_t v_s2 = 0; ++ wuffs_base__slice_u8 v_remaining = {0}; ++ wuffs_base__slice_u8 v_p = {0}; ++ __m128i v_zeroes = {0}; ++ __m128i v_ones = {0}; ++ __m128i v_weights__left = {0}; ++ __m128i v_weights_right = {0}; ++ __m128i v_q__left = {0}; ++ __m128i v_q_right = {0}; ++ __m128i v_v1 = {0}; ++ __m128i v_v2 = {0}; ++ __m128i v_v2j = {0}; ++ __m128i v_v2k = {0}; ++ uint32_t v_num_iterate_bytes = 0; ++ uint64_t v_tail_index = 0; ++ ++ v_zeroes = _mm_set1_epi16((int16_t)(0u)); ++ v_ones = _mm_set1_epi16((int16_t)(1u)); ++ v_weights__left = _mm_set_epi8((int8_t)(17u), (int8_t)(18u), (int8_t)(19u), (int8_t)(20u), (int8_t)(21u), (int8_t)(22u), (int8_t)(23u), (int8_t)(24u), (int8_t)(25u), (int8_t)(26u), (int8_t)(27u), (int8_t)(28u), (int8_t)(29u), (int8_t)(30u), (int8_t)(31u), (int8_t)(32u)); ++ v_weights_right = _mm_set_epi8((int8_t)(1u), (int8_t)(2u), (int8_t)(3u), (int8_t)(4u), (int8_t)(5u), (int8_t)(6u), (int8_t)(7u), (int8_t)(8u), (int8_t)(9u), (int8_t)(10u), (int8_t)(11u), (int8_t)(12u), (int8_t)(13u), (int8_t)(14u), (int8_t)(15u), (int8_t)(16u)); ++ v_s1 = ((self->private_impl.f_state) & 0xFFFFu); ++ v_s2 = ((self->private_impl.f_state) >> (32u - 16u)); ++ while (((uint64_t)(a_x.len)) > 0u) { ++ v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); ++ if (((uint64_t)(a_x.len)) > 5536u) { ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u); ++ a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u); + } ++ v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u))); ++ v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes)); ++ v_v1 = _mm_setzero_si128(); ++ v_v2j = _mm_setzero_si128(); ++ v_v2k = _mm_setzero_si128(); + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; +- } +- if ((v_c < 49u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); +- goto exit; +- } +- self->private_impl.f_max_incl_block_size = (((uint32_t)((v_c - 48u))) * 100000u); +- while (true) { +- v_tag = 0u; +- v_i = 0u; +- while (v_i < 48u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; +- } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- v_tag <<= 1u; +- v_tag |= ((uint64_t)((self->private_impl.f_bits >> 31u))); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- } +- if (v_tag == 25779555029136u) { +- break; +- } else if (v_tag != 54156738319193u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- status = wuffs_bzip2__decoder__prepare_block(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_block_size = 0u; +- self->private_impl.f_decode_huffman_finished = false; +- self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[(self->private_data.f_huffman_selectors[0u] & 7u)]; +- self->private_impl.f_decode_huffman_ticks = 50u; +- self->private_impl.f_decode_huffman_section = 0u; +- self->private_impl.f_decode_huffman_run_shift = 0u; +- while ( ! self->private_impl.f_decode_huffman_finished) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_bzip2__decoder__decode_huffman_fast(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; +- goto exit; +- } else if (self->private_impl.f_decode_huffman_finished) { +- break; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- status = wuffs_bzip2__decoder__decode_huffman_slow(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } +- wuffs_bzip2__decoder__invert_bwt(self); +- self->private_impl.f_block_checksum_have = 4294967295u; +- if (self->private_impl.f_original_pointer >= self->private_impl.f_block_size) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); +- goto exit; +- } +- self->private_impl.f_flush_pointer = (self->private_data.f_bwt[self->private_impl.f_original_pointer] >> 12u); +- self->private_impl.f_flush_repeat_count = 0u; +- self->private_impl.f_flush_prev = 0u; +- while (self->private_impl.f_block_size > 0u) { +- wuffs_bzip2__decoder__flush_fast(self, a_dst); +- if (self->private_impl.f_block_size <= 0u) { +- break; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- status = wuffs_bzip2__decoder__flush_slow(self, a_dst); +- if (status.repr) { +- goto suspend; +- } +- } +- self->private_impl.f_block_checksum_have ^= 4294967295u; +- if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_block_checksum_have != self->private_impl.f_block_checksum_want)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum); +- goto exit; ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 32; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32)); ++ while (v_p.ptr < i_end0_p) { ++ v_q__left = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr)); ++ v_q_right = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u)); ++ v_v2j = _mm_add_epi32(v_v2j, v_v1); ++ v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q__left, v_zeroes)); ++ v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q_right, v_zeroes)); ++ v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q__left, v_weights__left))); ++ v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q_right, v_weights_right))); ++ v_p.ptr += 32; + } +- self->private_impl.f_final_checksum_have = (self->private_impl.f_block_checksum_have ^ ((self->private_impl.f_final_checksum_have >> 31u) | ((uint32_t)(self->private_impl.f_final_checksum_have << 1u)))); ++ v_p.len = 0; + } +- v_final_checksum_want = 0u; +- v_i = 0u; +- while (v_i < 32u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; ++ v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(177u))); ++ v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(78u))); ++ v_s1 += ((uint32_t)(_mm_cvtsi128_si32(v_v1))); ++ v_v2 = _mm_add_epi32(v_v2k, _mm_slli_epi32(v_v2j, (int32_t)(5u))); ++ v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(177u))); ++ v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(78u))); ++ v_s2 += ((uint32_t)(_mm_cvtsi128_si32(v_v2))); ++ v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u); ++ if (v_tail_index < ((uint64_t)(a_x.len))) { ++ { ++ wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 1; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end0_p) { ++ v_s1 += ((uint32_t)(v_p.ptr[0u])); ++ v_s2 += v_s1; ++ v_p.ptr += 1; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; ++ v_p.len = 0; + } +- v_final_checksum_want <<= 1u; +- v_final_checksum_want |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; + } +- if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_final_checksum_have != v_final_checksum_want)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum); +- goto exit; +- } +- +- goto ok; +- ok: +- self->private_impl.p_do_transform_io[0] = 0; +- goto exit; ++ v_s1 %= 65521u; ++ v_s2 %= 65521u; ++ a_x = v_remaining; + } ++ self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u)); ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +- goto suspend; +- suspend: +- self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_transform_io[0].v_i = v_i; +- self->private_data.s_do_transform_io[0].v_tag = v_tag; +- self->private_data.s_do_transform_io[0].v_final_checksum_want = v_final_checksum_want; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) + +- return status; +-} ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) + +-// -------- func bzip2.decoder.prepare_block ++// ---------------- Status Codes Implementations + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__prepare_block( +- wuffs_bzip2__decoder* self, ++const char wuffs_bmp__error__bad_header[] = "#bmp: bad header"; ++const char wuffs_bmp__error__bad_rle_compression[] = "#bmp: bad RLE compression"; ++const char wuffs_bmp__error__truncated_input[] = "#bmp: truncated input"; ++const char wuffs_bmp__error__unsupported_bmp_file[] = "#bmp: unsupported BMP file"; ++const char wuffs_bmp__note__internal_note_short_read[] = "@bmp: internal note: short read"; ++ ++// ---------------- Private Consts ++ ++#define WUFFS_BMP__COMPRESSION_NONE 0u ++ ++#define WUFFS_BMP__COMPRESSION_RLE8 1u ++ ++#define WUFFS_BMP__COMPRESSION_RLE4 2u ++ ++#define WUFFS_BMP__COMPRESSION_BITFIELDS 3u ++ ++#define WUFFS_BMP__COMPRESSION_JPEG 4u ++ ++#define WUFFS_BMP__COMPRESSION_PNG 5u ++ ++#define WUFFS_BMP__COMPRESSION_ALPHABITFIELDS 6u ++ ++#define WUFFS_BMP__COMPRESSION_LOW_BIT_DEPTH 256u ++ ++#define WUFFS_BMP__RLE_STATE_NEUTRAL 0u ++ ++#define WUFFS_BMP__RLE_STATE_RUN 1u ++ ++#define WUFFS_BMP__RLE_STATE_ESCAPE 2u ++ ++#define WUFFS_BMP__RLE_STATE_LITERAL 3u ++ ++#define WUFFS_BMP__RLE_STATE_DELTA_X 4u ++ ++#define WUFFS_BMP__RLE_STATE_DELTA_Y 5u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__do_decode_image_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__do_decode_frame_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__do_decode_frame( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_none( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_rle( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_bitfields( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_low_bit_depth( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__do_tell_me_more( ++ wuffs_bmp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__read_palette( ++ wuffs_bmp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__process_masks( ++ wuffs_bmp__decoder* self); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_bmp__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_bmp__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_bmp__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_bmp__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_bmp__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_bmp__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_bmp__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_bmp__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bmp__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_bmp__decoder__initialize( ++ wuffs_bmp__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_bmp__decoder* ++wuffs_bmp__decoder__alloc(void) { ++ wuffs_bmp__decoder* x = ++ (wuffs_bmp__decoder*)(calloc(1, sizeof(wuffs_bmp__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_bmp__decoder__initialize( ++ x, sizeof(wuffs_bmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_bmp__decoder(void) { ++ return sizeof(wuffs_bmp__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func bmp.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_bmp__decoder__get_quirk( ++ const wuffs_bmp__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func bmp.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__set_quirk( ++ wuffs_bmp__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func bmp.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__decode_image_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint32_t v_i = 0; +- uint32_t v_j = 0; +- uint32_t v_selector = 0; +- uint32_t v_sel_ff = 0; +- uint8_t v_movee = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); + ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func bmp.decoder.do_decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__do_decode_image_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_magic = 0; ++ uint32_t v_width = 0; ++ uint32_t v_height = 0; ++ uint32_t v_planes = 0; ++ uint32_t v_n = 0; ++ uint32_t v_dst_pixfmt = 0; ++ uint32_t v_byte_width = 0; ++ + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -30999,797 +31613,1141 @@ wuffs_bzip2__decoder__prepare_block( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_prepare_block[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_prepare_block[0].v_i; +- v_selector = self->private_data.s_prepare_block[0].v_selector; +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- self->private_impl.f_block_checksum_want = 0u; +- v_i = 0u; +- while (v_i < 32u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if ((self->private_impl.f_call_sequence != 0u) || (self->private_impl.f_io_redirect_fourcc == 1u)) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if (self->private_impl.f_io_redirect_fourcc != 0u) { ++ status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); ++ goto ok; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- self->private_impl.f_block_checksum_want <<= 1u; +- self->private_impl.f_block_checksum_want |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- } +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 8) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; ++ v_magic = t_0; + } +- if ((self->private_impl.f_bits >> 31u) != 0u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__unsupported_block_randomization); ++ if (v_magic != 19778u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); + goto exit; + } +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- self->private_impl.f_original_pointer = 0u; +- v_i = 0u; +- while (v_i < 24u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ self->private_data.s_do_decode_image_config.scratch = 8u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; + } +- self->private_impl.f_original_pointer <<= 1u; +- self->private_impl.f_original_pointer |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; ++ self->private_impl.f_padding = t_1; + } +- v_i = 0u; +- while (v_i < 256u) { +- self->private_data.f_presence[v_i] = 0u; +- v_i += 1u; ++ if (self->private_impl.f_padding < 14u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; + } +- v_i = 0u; +- while (v_i < 256u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ self->private_impl.f_padding -= 14u; ++ self->private_impl.f_io_redirect_pos = wuffs_base__u64__sat_add(((uint64_t)(self->private_impl.f_padding)), wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- if ((self->private_impl.f_bits >> 31u) != 0u) { +- self->private_data.f_presence[v_i] = 1u; + } +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 16u; ++ self->private_impl.f_bitmap_info_len = t_2; + } +- self->private_data.f_scratch = 0u; +- v_i = 0u; +- while (v_i < 256u) { +- if (self->private_data.f_presence[v_i] == 0u) { +- v_i += 16u; +- continue; +- } +- while (true) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_impl.f_padding < self->private_impl.f_bitmap_info_len) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_padding -= self->private_impl.f_bitmap_info_len; ++ if (self->private_impl.f_bitmap_info_len == 12u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 8) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- self->private_data.f_scratch += (self->private_impl.f_bits >> 31u); +- self->private_data.f_presence[(v_i & 255u)] = ((uint8_t)((self->private_impl.f_bits >> 31u))); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- if ((v_i & 15u) == 0u) { +- break; + } ++ self->private_impl.f_width = t_3; + } +- } +- if ((self->private_data.f_scratch < 1u) || (256u < self->private_data.f_scratch)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; +- } +- self->private_impl.f_num_symbols = (self->private_data.f_scratch + 2u); +- self->private_data.f_scratch = 0u; +- v_i = 0u; +- while (v_i < 3u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 8) { ++ t_4 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; + } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; ++ self->private_impl.f_height = t_4; + } +- self->private_data.f_scratch <<= 1u; +- self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- } +- if ((self->private_data.f_scratch < 2u) || (6u < self->private_data.f_scratch)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; +- } +- self->private_impl.f_num_huffman_codes = self->private_data.f_scratch; +- self->private_data.f_scratch = 0u; +- v_i = 0u; +- while (v_i < 15u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ uint32_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_5 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5; ++ if (num_bits_5 == 8) { ++ t_5 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)) << 56; + } +- uint8_t t_6 = *iop_a_src++; +- v_c = t_6; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; ++ v_planes = t_5; + } +- self->private_data.f_scratch <<= 1u; +- self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- } +- if ((self->private_data.f_scratch < 1u) || (18001u < self->private_data.f_scratch)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; +- } +- self->private_impl.f_num_sections = self->private_data.f_scratch; +- v_i = 0u; +- while (v_i < self->private_impl.f_num_huffman_codes) { +- self->private_data.f_mtft[v_i] = ((uint8_t)(v_i)); +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < self->private_impl.f_num_sections) { +- v_selector = 0u; +- while (true) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (v_planes != 1u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ uint32_t t_6; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_7 = *iop_a_src++; +- v_c = t_7; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6; ++ if (num_bits_6 == 8) { ++ t_6 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_6 += 8u; ++ *scratch |= ((uint64_t)(num_bits_6)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- if ((self->private_impl.f_bits >> 31u) == 0u) { +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- break; + } +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_selector += 1u; +- if (v_selector >= self->private_impl.f_num_huffman_codes) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; ++ self->private_impl.f_bits_per_pixel = t_6; ++ } ++ } else if (self->private_impl.f_bitmap_info_len == 16u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ uint32_t t_7; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; ++ if (num_bits_7 == 24) { ++ t_7 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_7 += 8u; ++ *scratch |= ((uint64_t)(num_bits_7)) << 56; ++ } + } ++ v_width = t_7; + } +- if (v_selector == 0u) { +- self->private_data.f_huffman_selectors[v_i] = self->private_data.f_mtft[0u]; +- } else { +- v_sel_ff = (v_selector & 255u); +- v_movee = self->private_data.f_mtft[v_sel_ff]; +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_sel_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_sel_ff)); +- self->private_data.f_mtft[0u] = v_movee; +- self->private_data.f_huffman_selectors[v_i] = v_movee; ++ if (v_width > 2147483647u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } else if (v_width > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; + } +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < self->private_impl.f_num_huffman_codes) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ self->private_impl.f_width = v_width; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); ++ uint32_t t_8; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; ++ if (num_bits_8 == 24) { ++ t_8 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_8 += 8u; ++ *scratch |= ((uint64_t)(num_bits_8)) << 56; ++ } ++ } ++ v_height = t_8; + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_bzip2__decoder__read_code_lengths(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ if (v_height > 2147483647u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } else if (v_height > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; + } +- if (status.repr) { +- goto suspend; ++ self->private_impl.f_height = v_height; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); ++ uint32_t t_9; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_9 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9; ++ if (num_bits_9 == 8) { ++ t_9 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_9 += 8u; ++ *scratch |= ((uint64_t)(num_bits_9)) << 56; ++ } ++ } ++ v_planes = t_9; + } +- v_status = wuffs_bzip2__decoder__build_huffman_tree(self, v_i); +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; ++ if (v_planes != 1u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } +- wuffs_bzip2__decoder__build_huffman_table(self, v_i); +- v_i += 1u; +- } +- v_i = 0u; +- v_j = 0u; +- while (v_i < 256u) { +- if (self->private_data.f_presence[v_i] != 0u) { +- self->private_data.f_mtft[(v_j & 255u)] = ((uint8_t)(v_i)); +- v_j += 1u; +- } +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < 256u) { +- self->private_data.f_letter_counts[v_i] = 0u; +- v_i += 1u; +- } +- +- goto ok; +- ok: +- self->private_impl.p_prepare_block[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_prepare_block[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_prepare_block[0].v_i = v_i; +- self->private_data.s_prepare_block[0].v_selector = v_selector; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func bzip2.decoder.read_code_lengths +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__read_code_lengths( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- uint32_t v_i = 0; +- uint32_t v_code_length = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_read_code_lengths[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_read_code_lengths[0].v_i; +- v_code_length = self->private_data.s_read_code_lengths[0].v_code_length; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- self->private_impl.f_code_lengths_bitmask = 0u; +- v_i = 0u; +- while (v_i < 5u) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); ++ uint32_t t_10; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_10 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10; ++ if (num_bits_10 == 8) { ++ t_10 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_10 += 8u; ++ *scratch |= ((uint64_t)(num_bits_10)) << 56; + } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; ++ self->private_impl.f_bits_per_pixel = t_10; + } +- v_code_length <<= 1u; +- v_code_length |= (self->private_impl.f_bits >> 31u); +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < self->private_impl.f_num_symbols) { +- while (true) { +- if ((v_code_length < 1u) || (20u < v_code_length)) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); +- goto exit; +- } +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ } else { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); ++ uint32_t t_11; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(25); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11; ++ if (num_bits_11 == 24) { ++ t_11 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_11 += 8u; ++ *scratch |= ((uint64_t)(num_bits_11)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; + } +- if ((self->private_impl.f_bits >> 31u) == 0u) { +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- break; +- } +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ v_width = t_11; ++ } ++ if (v_width > 2147483647u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } else if (v_width > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_width = v_width; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26); ++ uint32_t t_12; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_12 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12; ++ if (num_bits_12 == 24) { ++ t_12 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_12 += 8u; ++ *scratch |= ((uint64_t)(num_bits_12)) << 56; + } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; + } +- if ((self->private_impl.f_bits >> 31u) == 0u) { +- v_code_length += 1u; ++ v_height = t_12; ++ } ++ if (v_height == 2147483648u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } else if (v_height > 2147483648u) { ++ v_height = ((uint32_t)(0u - v_height)); ++ if (v_height > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_height = v_height; ++ self->private_impl.f_top_down = true; ++ } else if (v_height > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } else { ++ self->private_impl.f_height = v_height; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28); ++ uint32_t t_13; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_13 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; + } else { +- v_code_length -= 1u; ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_13 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_13; ++ if (num_bits_13 == 8) { ++ t_13 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_13 += 8u; ++ *scratch |= ((uint64_t)(num_bits_13)) << 56; ++ } + } +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; ++ v_planes = t_13; + } +- self->private_impl.f_code_lengths_bitmask |= (((uint32_t)(1u)) << (v_code_length & 31u)); +- self->private_data.f_bwt[v_i] = v_code_length; +- v_i += 1u; +- } +- +- goto ok; +- ok: +- self->private_impl.p_read_code_lengths[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_read_code_lengths[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_read_code_lengths[0].v_i = v_i; +- self->private_data.s_read_code_lengths[0].v_code_length = v_code_length; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func bzip2.decoder.build_huffman_tree +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__build_huffman_tree( +- wuffs_bzip2__decoder* self, +- uint32_t a_which) { +- uint32_t v_code_length = 0; +- uint32_t v_symbol_index = 0; +- uint32_t v_num_branch_nodes = 0; +- uint32_t v_stack_height = 0; +- uint32_t v_stack_values[21] = {0}; +- uint32_t v_node_index = 0; +- uint16_t v_leaf_value = 0; +- +- self->private_data.f_huffman_trees[a_which][0u][0u] = 0u; +- self->private_data.f_huffman_trees[a_which][0u][1u] = 0u; +- v_num_branch_nodes = 1u; +- v_stack_height = 1u; +- v_stack_values[0u] = 0u; +- v_code_length = 1u; +- while (v_code_length <= 20u) { +- if ((self->private_impl.f_code_lengths_bitmask & (((uint32_t)(1u)) << v_code_length)) == 0u) { +- v_code_length += 1u; +- continue; +- } +- v_symbol_index = 0u; +- while (v_symbol_index < self->private_impl.f_num_symbols) { +- if (self->private_data.f_bwt[v_symbol_index] != v_code_length) { +- v_symbol_index += 1u; +- continue; ++ if (v_planes != 1u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; + } +- while (true) { +- if (v_stack_height <= 0u) { +- return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_over_subscribed); +- } else if (v_stack_height >= v_code_length) { +- break; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30); ++ uint32_t t_14; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_14 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(31); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_14 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_14; ++ if (num_bits_14 == 8) { ++ t_14 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_14 += 8u; ++ *scratch |= ((uint64_t)(num_bits_14)) << 56; ++ } + } +- v_node_index = v_stack_values[(v_stack_height - 1u)]; +- if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) { +- self->private_data.f_huffman_trees[a_which][v_node_index][0u] = ((uint16_t)(v_num_branch_nodes)); ++ self->private_impl.f_bits_per_pixel = t_14; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32); ++ uint32_t t_15; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_15 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- self->private_data.f_huffman_trees[a_which][v_node_index][1u] = ((uint16_t)(v_num_branch_nodes)); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_15 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_15; ++ if (num_bits_15 == 24) { ++ t_15 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_15 += 8u; ++ *scratch |= ((uint64_t)(num_bits_15)) << 56; ++ } + } +- if (v_num_branch_nodes >= 257u) { +- return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed); ++ self->private_impl.f_compression = t_15; ++ } ++ if (self->private_impl.f_bits_per_pixel == 0u) { ++ if (self->private_impl.f_compression == 4u) { ++ self->private_impl.f_io_redirect_fourcc = 1246774599u; ++ status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); ++ goto ok; ++ } else if (self->private_impl.f_compression == 5u) { ++ self->private_impl.f_io_redirect_fourcc = 1347307296u; ++ status = wuffs_base__make_status(wuffs_base__note__i_o_redirect); ++ goto ok; + } +- v_stack_values[v_stack_height] = v_num_branch_nodes; +- self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][0u] = 0u; +- self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][1u] = 0u; +- v_num_branch_nodes += 1u; +- v_stack_height += 1u; ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; + } +- v_node_index = v_stack_values[(v_stack_height - 1u)]; +- if (v_symbol_index < 2u) { +- v_leaf_value = ((uint16_t)((769u + v_symbol_index))); +- } else if ((v_symbol_index + 1u) < self->private_impl.f_num_symbols) { +- v_leaf_value = ((uint16_t)((511u + v_symbol_index))); +- } else { +- v_leaf_value = 768u; ++ self->private_data.s_do_decode_image_config.scratch = 20u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(34); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) { +- self->private_data.f_huffman_trees[a_which][v_node_index][0u] = v_leaf_value; +- } else { +- self->private_data.f_huffman_trees[a_which][v_node_index][1u] = v_leaf_value; +- v_stack_height -= 1u; +- while (v_stack_height > 0u) { +- v_node_index = v_stack_values[(v_stack_height - 1u)]; +- if (self->private_data.f_huffman_trees[a_which][v_node_index][1u] == 0u) { +- break; ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ if (self->private_impl.f_bitmap_info_len == 40u) { ++ if (self->private_impl.f_bits_per_pixel >= 16u) { ++ if (self->private_impl.f_padding >= 16u) { ++ self->private_impl.f_bitmap_info_len = 56u; ++ self->private_impl.f_padding -= 16u; ++ } else if (self->private_impl.f_padding >= 12u) { ++ self->private_impl.f_bitmap_info_len = 52u; ++ self->private_impl.f_padding -= 12u; + } +- v_stack_height -= 1u; + } ++ } else if ((self->private_impl.f_bitmap_info_len != 52u) && ++ (self->private_impl.f_bitmap_info_len != 56u) && ++ (self->private_impl.f_bitmap_info_len != 64u) && ++ (self->private_impl.f_bitmap_info_len != 108u) && ++ (self->private_impl.f_bitmap_info_len != 124u)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ if (self->private_impl.f_compression == 6u) { ++ self->private_impl.f_compression = 3u; ++ } ++ if (self->private_impl.f_compression == 3u) { ++ if (self->private_impl.f_bitmap_info_len >= 52u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(35); ++ uint32_t t_16; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_16 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(36); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_16 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_16; ++ if (num_bits_16 == 24) { ++ t_16 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_16 += 8u; ++ *scratch |= ((uint64_t)(num_bits_16)) << 56; ++ } ++ } ++ self->private_impl.f_channel_masks[2u] = t_16; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(37); ++ uint32_t t_17; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_17 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(38); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_17 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_17; ++ if (num_bits_17 == 24) { ++ t_17 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_17 += 8u; ++ *scratch |= ((uint64_t)(num_bits_17)) << 56; ++ } ++ } ++ self->private_impl.f_channel_masks[1u] = t_17; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(39); ++ uint32_t t_18; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_18 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(40); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_18 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_18; ++ if (num_bits_18 == 24) { ++ t_18 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_18 += 8u; ++ *scratch |= ((uint64_t)(num_bits_18)) << 56; ++ } ++ } ++ self->private_impl.f_channel_masks[0u] = t_18; ++ } ++ if (self->private_impl.f_bitmap_info_len >= 56u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(41); ++ uint32_t t_19; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_19 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(42); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_19 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_19; ++ if (num_bits_19 == 24) { ++ t_19 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_19 += 8u; ++ *scratch |= ((uint64_t)(num_bits_19)) << 56; ++ } ++ } ++ self->private_impl.f_channel_masks[3u] = t_19; ++ } ++ self->private_data.s_do_decode_image_config.scratch = ((uint32_t)(self->private_impl.f_bitmap_info_len - 56u)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(43); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ } ++ if ((self->private_impl.f_channel_masks[0u] == 255u) && (self->private_impl.f_channel_masks[1u] == 65280u) && (self->private_impl.f_channel_masks[2u] == 16711680u)) { ++ if (self->private_impl.f_bits_per_pixel == 24u) { ++ self->private_impl.f_compression = 0u; ++ } else if (self->private_impl.f_bits_per_pixel == 32u) { ++ if ((self->private_impl.f_channel_masks[3u] == 0u) || (self->private_impl.f_channel_masks[3u] == 4278190080u)) { ++ self->private_impl.f_compression = 0u; ++ } ++ } ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(44); ++ status = wuffs_bmp__decoder__process_masks(self); ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ } else if (self->private_impl.f_bitmap_info_len >= 40u) { ++ v_n = (self->private_impl.f_bitmap_info_len - 40u); ++ self->private_data.s_do_decode_image_config.scratch = v_n; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(45); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; + } +- v_symbol_index += 1u; + } +- v_code_length += 1u; ++ if (self->private_impl.f_compression != 3u) { ++ if (self->private_impl.f_bits_per_pixel < 16u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(46); ++ status = wuffs_bmp__decoder__read_palette(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ } ++ if (self->private_impl.f_compression == 0u) { ++ if ((self->private_impl.f_bits_per_pixel == 1u) || (self->private_impl.f_bits_per_pixel == 2u) || (self->private_impl.f_bits_per_pixel == 4u)) { ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ self->private_impl.f_compression = 256u; ++ } else if (self->private_impl.f_bits_per_pixel == 8u) { ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ } else if (self->private_impl.f_bits_per_pixel == 16u) { ++ self->private_impl.f_compression = 3u; ++ self->private_impl.f_channel_masks[0u] = 31u; ++ self->private_impl.f_channel_masks[1u] = 992u; ++ self->private_impl.f_channel_masks[2u] = 31744u; ++ self->private_impl.f_channel_masks[3u] = 0u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(47); ++ status = wuffs_bmp__decoder__process_masks(self); ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ } else if (self->private_impl.f_bits_per_pixel == 24u) { ++ self->private_impl.f_src_pixfmt = 2147485832u; ++ } else if (self->private_impl.f_bits_per_pixel == 32u) { ++ if (self->private_impl.f_channel_masks[3u] == 0u) { ++ self->private_impl.f_src_pixfmt = 2415954056u; ++ } else { ++ self->private_impl.f_src_pixfmt = 2164295816u; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ } else if (self->private_impl.f_compression == 1u) { ++ if (self->private_impl.f_bits_per_pixel == 8u) { ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ } else if (self->private_impl.f_compression == 2u) { ++ if (self->private_impl.f_bits_per_pixel == 4u) { ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ } else if (self->private_impl.f_compression == 3u) { ++ if ((self->private_impl.f_bits_per_pixel == 16u) || (self->private_impl.f_bits_per_pixel == 32u)) { ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); ++ goto exit; ++ } ++ if (((self->private_impl.f_bitmap_info_len < 40u) || (self->private_impl.f_bitmap_info_len == 64u)) && ++ (self->private_impl.f_bits_per_pixel != 1u) && ++ (self->private_impl.f_bits_per_pixel != 4u) && ++ (self->private_impl.f_bits_per_pixel != 8u) && ++ (self->private_impl.f_bits_per_pixel != 24u)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } ++ if (self->private_impl.f_bits_per_pixel == 1u) { ++ v_byte_width = ((self->private_impl.f_width >> 3u) + (((self->private_impl.f_width & 7u) + 7u) >> 3u)); ++ self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); ++ } else if (self->private_impl.f_bits_per_pixel == 2u) { ++ v_byte_width = ((self->private_impl.f_width >> 2u) + (((self->private_impl.f_width & 3u) + 3u) >> 2u)); ++ self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); ++ } else if (self->private_impl.f_bits_per_pixel == 4u) { ++ v_byte_width = ((self->private_impl.f_width >> 1u) + (self->private_impl.f_width & 1u)); ++ self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u); ++ } else if (self->private_impl.f_bits_per_pixel == 8u) { ++ self->private_impl.f_pad_per_row = ((4u - (self->private_impl.f_width & 3u)) & 3u); ++ } else if (self->private_impl.f_bits_per_pixel == 16u) { ++ self->private_impl.f_pad_per_row = ((self->private_impl.f_width & 1u) * 2u); ++ } else if (self->private_impl.f_bits_per_pixel == 24u) { ++ self->private_impl.f_pad_per_row = (self->private_impl.f_width & 3u); ++ } else if (self->private_impl.f_bits_per_pixel == 32u) { ++ self->private_impl.f_pad_per_row = 0u; ++ } ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ v_dst_pixfmt = 2164295816u; ++ if ((self->private_impl.f_channel_num_bits[0u] > 8u) || ++ (self->private_impl.f_channel_num_bits[1u] > 8u) || ++ (self->private_impl.f_channel_num_bits[2u] > 8u) || ++ (self->private_impl.f_channel_num_bits[3u] > 8u)) { ++ v_dst_pixfmt = 2164308923u; ++ } else if (((self->private_impl.f_src_pixfmt == 2198077448u) || (self->private_impl.f_src_pixfmt == 2147485832u) || (self->private_impl.f_src_pixfmt == 2415954056u)) || ((self->private_impl.f_src_pixfmt == 2164308923u) && (self->private_impl.f_channel_masks[3u] == 0u))) { ++ v_dst_pixfmt = 2415954056u; ++ } ++ wuffs_base__image_config__set( ++ a_dst, ++ v_dst_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ (self->private_impl.f_channel_masks[3u] == 0u)); ++ } ++ self->private_impl.f_call_sequence = 32u; ++ ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; + } +- if (v_stack_height != 0u) { +- return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- return wuffs_base__make_status(NULL); ++ ++ return status; + } + +-// -------- func bzip2.decoder.build_huffman_table ++// -------- func bmp.decoder.decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_bzip2__decoder__build_huffman_table( +- wuffs_bzip2__decoder* self, +- uint32_t a_which) { +- uint32_t v_i = 0; +- uint32_t v_bits = 0; +- uint16_t v_n_bits = 0; +- uint16_t v_child = 0; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__decode_frame_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- while (v_i < 256u) { +- v_bits = (v_i << 24u); +- v_n_bits = 0u; +- v_child = 0u; +- while ((v_child < 257u) && (v_n_bits < 8u)) { +- v_child = self->private_data.f_huffman_trees[a_which][v_child][(v_bits >> 31u)]; +- v_bits <<= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_n_bits += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- self->private_data.f_huffman_tables[a_which][v_i] = ((uint16_t)((v_child | (v_n_bits << 12u)))); +- v_i += 1u; ++ ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; + } +- return wuffs_base__make_empty_struct(); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; + } + +-// -------- func bzip2.decoder.invert_bwt ++// -------- func bmp.decoder.do_decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_bzip2__decoder__invert_bwt( +- wuffs_bzip2__decoder* self) { +- uint32_t v_i = 0; +- uint32_t v_letter = 0; +- uint32_t v_sum = 0; +- uint32_t v_old_sum = 0; ++static wuffs_base__status ++wuffs_bmp__decoder__do_decode_frame_config( ++ wuffs_bmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- v_sum = 0u; +- v_i = 0u; +- while (v_i < 256u) { +- v_old_sum = v_sum; +- v_sum += self->private_data.f_letter_counts[v_i]; +- self->private_data.f_letter_counts[v_i] = v_old_sum; +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < self->private_impl.f_block_size) { +- v_letter = (self->private_data.f_bwt[v_i] & 255u); +- self->private_data.f_bwt[(self->private_data.f_letter_counts[v_letter] & 1048575u)] |= (v_i << 12u); +- self->private_data.f_letter_counts[v_letter] += 1u; +- v_i += 1u; ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func bzip2.decoder.flush_fast +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_bzip2__decoder__flush_fast( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst) { +- uint32_t v_flush_pointer = 0; +- uint32_t v_flush_repeat_count = 0; +- uint8_t v_flush_prev = 0; +- uint32_t v_block_checksum_have = 0; +- uint32_t v_block_size = 0; +- uint32_t v_entry = 0; +- uint8_t v_curr = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- v_flush_pointer = self->private_impl.f_flush_pointer; +- v_flush_repeat_count = self->private_impl.f_flush_repeat_count; +- v_flush_prev = self->private_impl.f_flush_prev; +- v_block_checksum_have = self->private_impl.f_block_checksum_have; +- v_block_size = self->private_impl.f_block_size; +- while ((v_block_size > 0u) && (((uint64_t)(io2_a_dst - iop_a_dst)) >= 255u)) { +- if (v_flush_repeat_count < 4u) { +- v_entry = self->private_data.f_bwt[v_flush_pointer]; +- v_curr = ((uint8_t)(v_entry)); +- v_flush_pointer = (v_entry >> 12u); +- if (v_curr == v_flush_prev) { +- v_flush_repeat_count += 1u; +- } else { +- v_flush_repeat_count = 1u; ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_curr)] ^ ((uint32_t)(v_block_checksum_have << 8u))); +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_curr), iop_a_dst += 1); +- v_flush_prev = v_curr; +- v_block_size -= 1u; +- } else { +- v_entry = self->private_data.f_bwt[v_flush_pointer]; +- v_curr = ((uint8_t)(v_entry)); +- v_flush_pointer = (v_entry >> 12u); +- v_flush_repeat_count = ((uint32_t)(v_curr)); +- while (v_flush_repeat_count > 0u) { +- v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_flush_prev)] ^ ((uint32_t)(v_block_checksum_have << 8u))); +- if (((uint64_t)(io2_a_dst - iop_a_dst)) > 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_flush_prev), iop_a_dst += 1); +- } +- v_flush_repeat_count -= 1u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_bmp__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- v_flush_repeat_count = 0u; +- v_flush_prev = v_curr; +- v_block_size -= 1u; ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ self->private_impl.f_frame_config_io_position, ++ 0u, ++ true, ++ false, ++ 4278190080u); ++ } ++ self->private_impl.f_call_sequence = 64u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; + } +- self->private_impl.f_flush_pointer = v_flush_pointer; +- self->private_impl.f_flush_repeat_count = v_flush_repeat_count; +- self->private_impl.f_flush_prev = v_flush_prev; +- self->private_impl.f_block_checksum_have = v_block_checksum_have; +- if (v_block_size <= 900000u) { +- self->private_impl.f_block_size = v_block_size; +- } +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return wuffs_base__make_empty_struct(); ++ return status; + } + +-// -------- func bzip2.decoder.flush_slow ++// -------- func bmp.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_bzip2__decoder__flush_slow( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_dst) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__decode_frame( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_flush_pointer = 0; +- uint32_t v_flush_repeat_count = 0; +- uint8_t v_flush_prev = 0; +- uint32_t v_block_checksum_have = 0; +- uint32_t v_block_size = 0; +- uint32_t v_entry = 0; +- uint8_t v_curr = 0; +- +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_flush_slow[0]; +- if (coro_susp_point) { +- v_flush_pointer = self->private_data.s_flush_slow[0].v_flush_pointer; +- v_flush_repeat_count = self->private_data.s_flush_slow[0].v_flush_repeat_count; +- v_flush_prev = self->private_data.s_flush_slow[0].v_flush_prev; +- v_block_checksum_have = self->private_data.s_flush_slow[0].v_block_checksum_have; +- v_block_size = self->private_data.s_flush_slow[0].v_block_size; +- v_curr = self->private_data.s_flush_slow[0].v_curr; +- } ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- v_flush_pointer = self->private_impl.f_flush_pointer; +- v_flush_repeat_count = self->private_impl.f_flush_repeat_count; +- v_flush_prev = self->private_impl.f_flush_prev; +- v_block_checksum_have = self->private_impl.f_block_checksum_have; +- v_block_size = self->private_impl.f_block_size; +- while ((v_block_size > 0u) && ! (self->private_impl.p_flush_slow[0] != 0)) { +- if (v_flush_repeat_count < 4u) { +- v_entry = self->private_data.f_bwt[v_flush_pointer]; +- v_curr = ((uint8_t)(v_entry)); +- v_flush_pointer = (v_entry >> 12u); +- if (v_curr == v_flush_prev) { +- v_flush_repeat_count += 1u; +- } else { +- v_flush_repeat_count = 1u; +- } +- v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_curr)] ^ ((uint32_t)(v_block_checksum_have << 8u))); +- self->private_data.s_flush_slow[0].scratch = v_curr; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (iop_a_dst == io2_a_dst) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- goto suspend; +- } +- *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow[0].scratch)); +- v_flush_prev = v_curr; +- v_block_size -= 1u; +- } else { +- v_entry = self->private_data.f_bwt[v_flush_pointer]; +- v_curr = ((uint8_t)(v_entry)); +- v_flush_pointer = (v_entry >> 12u); +- v_flush_repeat_count = ((uint32_t)(v_curr)); +- while (v_flush_repeat_count > 0u) { +- v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_flush_prev)] ^ ((uint32_t)(v_block_checksum_have << 8u))); +- self->private_data.s_flush_slow[0].scratch = v_flush_prev; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (iop_a_dst == io2_a_dst) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- goto suspend; +- } +- *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow[0].scratch)); +- v_flush_repeat_count -= 1u; +- } +- v_flush_repeat_count = 0u; +- v_flush_prev = v_curr; +- v_block_size -= 1u; ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; + } +- } +- self->private_impl.f_flush_pointer = v_flush_pointer; +- self->private_impl.f_flush_repeat_count = v_flush_repeat_count; +- self->private_impl.f_flush_prev = v_flush_prev; +- self->private_impl.f_block_checksum_have = v_block_checksum_have; +- if (v_block_size <= 900000u) { +- self->private_impl.f_block_size = v_block_size; ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + +- goto ok; + ok: +- self->private_impl.p_flush_slow[0] = 0; ++ self->private_impl.p_decode_frame = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_flush_slow[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_flush_slow[0].v_flush_pointer = v_flush_pointer; +- self->private_data.s_flush_slow[0].v_flush_repeat_count = v_flush_repeat_count; +- self->private_data.s_flush_slow[0].v_flush_prev = v_flush_prev; +- self->private_data.s_flush_slow[0].v_block_checksum_have = v_block_checksum_have; +- self->private_data.s_flush_slow[0].v_block_size = v_block_size; +- self->private_data.s_flush_slow[0].v_curr = v_curr; ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; + + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- + return status; + } + +-// -------- func bzip2.decoder.decode_huffman_fast ++// -------- func bmp.decoder.do_decode_frame + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_bzip2__decoder__decode_huffman_fast( +- wuffs_bzip2__decoder* self, +- wuffs_base__io_buffer* a_src) { ++wuffs_bmp__decoder__do_decode_frame( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_block_size = 0; +- uint8_t v_which = 0; +- uint32_t v_ticks = 0; +- uint32_t v_section = 0; +- uint32_t v_run_shift = 0; +- uint16_t v_table_entry = 0; +- uint16_t v_child = 0; +- uint32_t v_child_ff = 0; +- uint32_t v_i = 0; +- uint32_t v_j = 0; +- uint32_t v_output = 0; +- uint32_t v_run = 0; +- uint32_t v_mtft0 = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -31802,90 +32760,132 @@ wuffs_bzip2__decoder__decode_huffman_fast( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- v_bits = self->private_impl.f_bits; +- v_n_bits = self->private_impl.f_n_bits; +- v_block_size = self->private_impl.f_block_size; +- v_which = self->private_impl.f_decode_huffman_which; +- v_ticks = self->private_impl.f_decode_huffman_ticks; +- v_section = self->private_impl.f_decode_huffman_section; +- v_run_shift = self->private_impl.f_decode_huffman_run_shift; +- while (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { +- if (v_ticks > 0u) { +- v_ticks -= 1u; +- } else { +- v_ticks = 49u; +- v_section += 1u; +- if (v_section >= self->private_impl.f_num_sections) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections); +- goto exit; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_which = WUFFS_BZIP2__CLAMP_TO_5[(self->private_data.f_huffman_selectors[(v_section & 32767u)] & 7u)]; +- } +- v_bits |= (wuffs_base__peek_u32be__no_bounds_check(iop_a_src) >> v_n_bits); +- iop_a_src += ((31u - v_n_bits) >> 3u); +- v_n_bits |= 24u; +- v_table_entry = self->private_data.f_huffman_tables[v_which][(v_bits >> 24u)]; +- v_bits <<= (v_table_entry >> 12u); +- v_n_bits -= ((uint32_t)((v_table_entry >> 12u))); +- v_child = (v_table_entry & 1023u); +- while (v_child < 257u) { +- v_child = self->private_data.f_huffman_trees[v_which][v_child][(v_bits >> 31u)]; +- v_bits <<= 1u; +- if (v_n_bits <= 0u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_bmp__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- v_n_bits -= 1u; +- } +- if (v_child < 768u) { +- v_child_ff = ((uint32_t)((v_child & 255u))); +- v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff])); +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff)); +- self->private_data.f_mtft[0u] = ((uint8_t)(v_output)); +- self->private_data.f_letter_counts[v_output] += 1u; +- self->private_data.f_bwt[v_block_size] = v_output; +- if (v_block_size >= self->private_impl.f_max_incl_block_size) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); +- goto exit; ++ if (status.repr) { ++ goto suspend; + } +- v_block_size += 1u; +- v_run_shift = 0u; +- continue; +- } else if (v_child == 768u) { +- self->private_impl.f_decode_huffman_finished = true; +- break; +- } +- if (v_run_shift >= 23u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); +- goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } +- v_run = ((((uint32_t)(v_child)) & 3u) << v_run_shift); +- v_run_shift += 1u; +- v_i = v_block_size; +- v_j = (v_run + v_block_size); +- if (v_j > self->private_impl.f_max_incl_block_size) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); +- goto exit; ++ self->private_data.s_do_decode_frame.scratch = self->private_impl.f_padding; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_block_size = v_j; +- v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u])); +- self->private_data.f_letter_counts[v_mtft0] += v_run; +- while (v_i < v_j) { +- self->private_data.f_bwt[v_i] = v_mtft0; +- v_i += 1u; ++ iop_a_src += self->private_data.s_do_decode_frame.scratch; ++ if ((self->private_impl.f_width > 0u) && (self->private_impl.f_height > 0u)) { ++ self->private_impl.f_dst_x = 0u; ++ if (self->private_impl.f_top_down) { ++ self->private_impl.f_dst_y = 0u; ++ self->private_impl.f_dst_y_inc = 1u; ++ } else { ++ self->private_impl.f_dst_y = ((uint32_t)(self->private_impl.f_height - 1u)); ++ self->private_impl.f_dst_y_inc = 4294967295u; ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), ++ wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ while (true) { ++ if (self->private_impl.f_compression == 0u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_bmp__decoder__swizzle_none(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } else if (self->private_impl.f_compression < 3u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_bmp__decoder__swizzle_rle(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } else if (self->private_impl.f_compression == 3u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_bmp__decoder__swizzle_bitfields(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } else { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_bmp__decoder__swizzle_low_bit_depth(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if (v_status.repr != wuffs_bmp__note__internal_note_short_read) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ } ++ self->private_data.s_do_decode_frame.scratch = self->private_impl.f_pending_pad; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame.scratch; ++ self->private_impl.f_pending_pad = 0u; + } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; + } +- self->private_impl.f_bits = v_bits; +- self->private_impl.f_n_bits = v_n_bits; +- self->private_impl.f_block_size = v_block_size; +- self->private_impl.f_decode_huffman_which = v_which; +- self->private_impl.f_decode_huffman_ticks = v_ticks; +- self->private_impl.f_decode_huffman_section = v_section; +- self->private_impl.f_decode_huffman_run_shift = v_run_shift; +- status = wuffs_base__make_status(NULL); +- goto ok; + +- ok: ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ + goto exit; + exit: + if (a_src && a_src->data.ptr) { +@@ -31895,24 +32895,27 @@ wuffs_bzip2__decoder__decode_huffman_fast( + return status; + } + +-// -------- func bzip2.decoder.decode_huffman_slow ++// -------- func bmp.decoder.swizzle_none + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_bzip2__decoder__decode_huffman_slow( +- wuffs_bzip2__decoder* self, ++wuffs_bmp__decoder__swizzle_none( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint32_t v_node_index = 0; +- uint16_t v_child = 0; +- uint32_t v_child_ff = 0; +- uint32_t v_i = 0; +- uint32_t v_j = 0; +- uint32_t v_output = 0; +- uint32_t v_run = 0; +- uint32_t v_mtft0 = 0; ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ uint32_t v_src_bytes_per_pixel = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_j = 0; ++ uint64_t v_n = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -31925,99 +32928,90 @@ wuffs_bzip2__decoder__decode_huffman_slow( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow[0]; +- if (coro_susp_point) { +- v_node_index = self->private_data.s_decode_huffman_slow[0].v_node_index; ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while ( ! (self->private_impl.p_decode_huffman_slow[0] != 0)) { +- if (self->private_impl.f_decode_huffman_ticks > 0u) { +- self->private_impl.f_decode_huffman_ticks -= 1u; +- } else { +- self->private_impl.f_decode_huffman_ticks = 49u; +- self->private_impl.f_decode_huffman_section += 1u; +- if (self->private_impl.f_decode_huffman_section >= self->private_impl.f_num_sections) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections); +- goto exit; +- } +- self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[(self->private_data.f_huffman_selectors[(self->private_impl.f_decode_huffman_section & 32767u)] & 7u)]; ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ label__outer__continue:; ++ while (true) { ++ while (self->private_impl.f_pending_pad > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; + } +- v_node_index = 0u; +- while (true) { +- if (self->private_impl.f_n_bits <= 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- self->private_impl.f_bits = (((uint32_t)(v_c)) << 24u); +- self->private_impl.f_n_bits = 8u; +- } +- v_child = self->private_data.f_huffman_trees[self->private_impl.f_decode_huffman_which][v_node_index][(self->private_impl.f_bits >> 31u)]; +- self->private_impl.f_bits <<= 1u; +- self->private_impl.f_n_bits -= 1u; +- if (v_child < 257u) { +- v_node_index = ((uint32_t)(v_child)); +- continue; +- } else if (v_child < 768u) { +- v_child_ff = ((uint32_t)((v_child & 255u))); +- v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff])); +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff)); +- self->private_data.f_mtft[0u] = ((uint8_t)(v_output)); +- self->private_data.f_letter_counts[v_output] += 1u; +- self->private_data.f_bwt[self->private_impl.f_block_size] = v_output; +- if (self->private_impl.f_block_size >= self->private_impl.f_max_incl_block_size) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); +- goto exit; ++ self->private_impl.f_pending_pad -= 1u; ++ iop_a_src += 1u; ++ } ++ while (true) { ++ if (self->private_impl.f_dst_x == self->private_impl.f_width) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ if (self->private_impl.f_height > 0u) { ++ self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; + } +- self->private_impl.f_block_size += 1u; +- self->private_impl.f_decode_huffman_run_shift = 0u; +- break; +- } else if (v_child == 768u) { +- self->private_impl.f_decode_huffman_finished = true; + goto label__outer__break; ++ } else if (self->private_impl.f_pad_per_row != 0u) { ++ self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; ++ goto label__outer__continue; + } +- if (self->private_impl.f_decode_huffman_run_shift >= 23u) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); ++ } ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i >= ((uint64_t)(v_dst.len))) { ++ if (self->private_impl.f_bits_per_pixel > 32u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } +- v_run = ((((uint32_t)(v_child)) & 3u) << self->private_impl.f_decode_huffman_run_shift); +- self->private_impl.f_decode_huffman_run_shift += 1u; +- v_i = self->private_impl.f_block_size; +- v_j = (v_run + self->private_impl.f_block_size); +- if (v_j > self->private_impl.f_max_incl_block_size) { +- status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); ++ v_src_bytes_per_pixel = (self->private_impl.f_bits_per_pixel / 8u); ++ if (v_src_bytes_per_pixel == 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file); + goto exit; + } +- self->private_impl.f_block_size = v_j; +- v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u])); +- self->private_data.f_letter_counts[v_mtft0] += v_run; +- while (v_i < v_j) { +- self->private_data.f_bwt[v_i] = v_mtft0; +- v_i += 1u; ++ v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); ++ v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); ++ v_j = v_n; ++ while (v_j >= 8u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 8u); ++ } ++ v_j -= 8u; + } +- break; ++ while (v_j > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 1u); ++ } ++ v_j -= 1u; ++ } ++ } else { ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( ++ &self->private_impl.f_swizzler, ++ wuffs_base__slice_u8__subslice_i(v_dst, v_i), ++ v_dst_palette, ++ &iop_a_src, ++ io2_a_src); ++ } ++ if (v_n == 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; + } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); + } +- label__outer__break:; +- +- goto ok; +- ok: +- self->private_impl.p_decode_huffman_slow[0] = 0; +- goto exit; + } ++ label__outer__break:; ++ status = wuffs_base__make_status(NULL); ++ goto ok; + +- goto suspend; +- suspend: +- self->private_impl.p_decode_huffman_slow[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_huffman_slow[0].v_node_index = v_node_index; +- ++ ok: + goto exit; + exit: + if (a_src && a_src->data.ptr) { +@@ -32027,256 +33021,33 @@ wuffs_bzip2__decoder__decode_huffman_slow( + return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_cbor__error__bad_input[] = "#cbor: bad input"; +-const char wuffs_cbor__error__unsupported_recursion_depth[] = "#cbor: unsupported recursion depth"; +-const char wuffs_cbor__error__internal_error_inconsistent_i_o[] = "#cbor: internal error: inconsistent I/O"; +-const char wuffs_cbor__error__internal_error_inconsistent_token_length[] = "#cbor: internal error: inconsistent token length"; +- +-// ---------------- Private Consts +- +-static const uint32_t +-WUFFS_CBOR__LITERALS[4] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 8388612, 8388616, 8388610, 8388609, +-}; +- +-static const uint8_t +-WUFFS_CBOR__TOKEN_LENGTHS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 1, 1, 1, 1, +- 2, 3, 5, 9, 0, 0, 0, 1, +-}; +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-// ---------------- VTables +- +-const wuffs_base__token_decoder__func_ptrs +-wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__token_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_cbor__decoder__decode_tokens), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_cbor__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_cbor__decoder__history_retain_length), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_cbor__decoder__set_quirk), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_cbor__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_cbor__decoder__initialize( +- wuffs_cbor__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } +- +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } +- } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name = +- wuffs_base__token_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers = +- (const void*)(&wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_cbor__decoder* +-wuffs_cbor__decoder__alloc(void) { +- wuffs_cbor__decoder* x = +- (wuffs_cbor__decoder*)(calloc(sizeof(wuffs_cbor__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_cbor__decoder__initialize( +- x, sizeof(wuffs_cbor__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} +- +-size_t +-sizeof__wuffs_cbor__decoder(void) { +- return sizeof(wuffs_cbor__decoder); +-} +- +-// ---------------- Function Implementations +- +-// -------- func cbor.decoder.get_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_cbor__decoder__get_quirk( +- const wuffs_cbor__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func cbor.decoder.set_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_cbor__decoder__set_quirk( +- wuffs_cbor__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +-} +- +-// -------- func cbor.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_cbor__decoder__history_retain_length( +- const wuffs_cbor__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func cbor.decoder.workbuf_len +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_cbor__decoder__workbuf_len( +- const wuffs_cbor__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- +- return wuffs_base__utility__empty_range_ii_u64(); +-} +- +-// -------- func cbor.decoder.decode_tokens ++// -------- func bmp.decoder.swizzle_rle + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_cbor__decoder__decode_tokens( +- wuffs_cbor__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_rle( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint64_t v_string_length = 0; +- uint64_t v_n64 = 0; +- uint32_t v_depth = 0; +- uint32_t v_stack_byte = 0; +- uint32_t v_stack_bit = 0; +- uint32_t v_stack_val = 0; +- uint32_t v_token_length = 0; +- uint32_t v_vminor = 0; +- uint32_t v_vminor_alt = 0; +- uint32_t v_continued = 0; +- uint8_t v_c = 0; +- uint8_t v_c_major = 0; +- uint8_t v_c_minor = 0; +- bool v_tagged = false; +- uint8_t v_indefinite_string_major_type = 0; ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_row = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_n = 0; ++ uint32_t v_p0 = 0; ++ uint8_t v_code = 0; ++ uint8_t v_indexes[2] = {0}; ++ uint32_t v_rle_state = 0; ++ uint32_t v_chunk_bits = 0; ++ uint32_t v_chunk_count = 0; + +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -32288,1231 +33059,590 @@ wuffs_cbor__decoder__decode_tokens( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_tokens[0]; +- if (coro_susp_point) { +- v_string_length = self->private_data.s_decode_tokens[0].v_string_length; +- v_depth = self->private_data.s_decode_tokens[0].v_depth; +- v_tagged = self->private_data.s_decode_tokens[0].v_tagged; +- v_indefinite_string_major_type = self->private_data.s_decode_tokens[0].v_indefinite_string_major_type; ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if (self->private_impl.f_end_of_data) { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_rle_state = self->private_impl.f_rle_state; ++ label__outer__continue:; ++ while (true) { ++ v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { ++ v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); + } +- label__outer__continue:; ++ label__middle__continue:; + while (true) { ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i <= ((uint64_t)(v_row.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_row, v_i); ++ } else { ++ v_dst = wuffs_base__utility__empty_slice_u8(); ++ } + while (true) { +- do { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- goto label__outer__continue; ++ if (v_rle_state == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; + } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ if (v_code == 0u) { ++ v_rle_state = 2u; ++ continue; ++ } ++ self->private_impl.f_rle_length = ((uint32_t)(v_code)); ++ v_rle_state = 1u; ++ continue; ++ } else if (v_rle_state == 1u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; ++ } ++ v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ if (self->private_impl.f_bits_per_pixel == 8u) { ++ v_p0 = 0u; ++ while (v_p0 < self->private_impl.f_rle_length) { ++ self->private_data.f_scratch[v_p0] = v_code; ++ v_p0 += 1u; ++ } ++ } else { ++ v_indexes[0u] = ((uint8_t)(((uint8_t)(v_code >> 4u)))); ++ v_indexes[1u] = ((uint8_t)(v_code & 15u)); ++ v_p0 = 0u; ++ while (v_p0 < self->private_impl.f_rle_length) { ++ self->private_data.f_scratch[(v_p0 + 0u)] = v_indexes[0u]; ++ self->private_data.f_scratch[(v_p0 + 1u)] = v_indexes[1u]; ++ v_p0 += 2u; ++ } ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_rle_length)); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, self->private_impl.f_rle_length); ++ v_rle_state = 0u; ++ goto label__middle__continue; ++ } else if (v_rle_state == 2u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; ++ } ++ v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ if (v_code < 2u) { ++ if ((self->private_impl.f_dst_y >= self->private_impl.f_height) && (v_code == 0u)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); + goto exit; + } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, 18446744073709551615u); ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ if (v_code > 0u) { ++ goto label__outer__break; ++ } ++ v_rle_state = 0u; + goto label__outer__continue; ++ } else if (v_code == 2u) { ++ v_rle_state = 4u; ++ continue; + } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if ((v_indefinite_string_major_type != 0u) && (v_indefinite_string_major_type != (v_c >> 5u))) { +- if (v_c != 255u) { +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); +- goto exit; ++ self->private_impl.f_rle_length = ((uint32_t)(v_code)); ++ self->private_impl.f_rle_padded = ((self->private_impl.f_bits_per_pixel == 8u) && (((uint8_t)(v_code & 1u)) != 0u)); ++ v_rle_state = 3u; ++ continue; ++ } else if (v_rle_state == 3u) { ++ if (self->private_impl.f_bits_per_pixel == 8u) { ++ v_n = wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader( ++ &self->private_impl.f_swizzler, ++ self->private_impl.f_rle_length, ++ v_dst, ++ v_dst_palette, ++ &iop_a_src, ++ io2_a_src); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_rle_length, ((uint32_t)(v_n))); ++ } else { ++ v_chunk_count = ((self->private_impl.f_rle_length + 3u) / 4u); ++ v_p0 = 0u; ++ while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 2u)) { ++ v_chunk_bits = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2u; ++ self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u)))); ++ self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u)))); ++ self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u)))); ++ self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u)))); ++ v_p0 = ((v_p0 & 255u) + 4u); ++ v_chunk_count -= 1u; + } +- v_vminor = 4194560u; +- if (v_indefinite_string_major_type == 3u) { +- v_vminor |= 19u; ++ v_p0 = wuffs_base__u32__min(v_p0, self->private_impl.f_rle_length); ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0)); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, v_p0); ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_rle_length, v_p0); ++ } ++ if (self->private_impl.f_rle_length > 0u) { ++ break; ++ } ++ if (self->private_impl.f_rle_padded) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; + } +- v_indefinite_string_major_type = 0u; + iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; ++ self->private_impl.f_rle_padded = false; ++ } ++ v_rle_state = 0u; ++ goto label__middle__continue; ++ } else if (v_rle_state == 4u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; + } ++ self->private_impl.f_rle_delta_x = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); + iop_a_src += 1u; +- v_c_major = ((uint8_t)((v_c >> 5u))); +- v_c_minor = (v_c & 31u); +- if (v_c_minor < 24u) { +- v_string_length = ((uint64_t)(v_c_minor)); +- } else { +- while (true) { +- if (v_c_minor == 24u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 1u) { +- v_string_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); +- iop_a_src += 1u; +- break; +- } +- } else if (v_c_minor == 25u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 2u) { +- v_string_length = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2u; +- break; +- } +- } else if (v_c_minor == 26u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { +- v_string_length = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4u; +- break; +- } +- } else if (v_c_minor == 27u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 8u) { +- v_string_length = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); +- iop_a_src += 8u; +- break; +- } +- } else { +- v_string_length = 0u; +- break; +- } +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- goto label__outer__continue; +- } +- status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); +- goto exit; +- } ++ v_rle_state = 5u; ++ continue; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) { ++ break; ++ } ++ v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ if (self->private_impl.f_rle_delta_x > 0u) { ++ wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, ((uint64_t)(self->private_impl.f_rle_delta_x))); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(self->private_impl.f_rle_delta_x))); ++ self->private_impl.f_rle_delta_x = 0u; ++ if (self->private_impl.f_dst_x > self->private_impl.f_width) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); ++ goto exit; + } +- if (v_c_major == 0u) { +- if (v_c_minor < 26u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((14680064u | ((uint32_t)((v_string_length & 65535u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor < 28u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((14680064u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- *iop_a_dst++ = wuffs_base__make_token( +- (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } +- } else if (v_c_major == 1u) { +- if (v_c_minor < 26u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length & 65535u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor < 28u) { +- if (v_string_length < 9223372036854775808u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length >> 46u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- *iop_a_dst++ = wuffs_base__make_token( +- (~((18446744073709551615u - v_string_length) & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } else { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | +- (((uint64_t)(16777216u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- goto label__goto_parsed_a_leaf_value__break; +- } +- } else if (v_c_major == 2u) { +- if (v_c_minor < 28u) { +- if (v_string_length == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } else if (v_c_minor == 31u) { +- if (v_indefinite_string_major_type != 0u) { +- break; +- } +- v_indefinite_string_major_type = 2u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__outer__continue; +- } else { +- break; +- } +- while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- continue; +- } +- v_n64 = wuffs_base__u64__min(v_string_length, ((uint64_t)(io2_a_src - iop_a_src))); +- v_token_length = ((uint32_t)((v_n64 & 65535u))); +- if (v_n64 > 65535u) { +- v_token_length = 65535u; +- } else if (v_token_length <= 0u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- continue; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) { +- status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length); +- goto exit; +- } +- v_string_length -= ((uint64_t)(v_token_length)); +- v_continued = 0u; +- if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) { +- v_continued = 1u; +- } +- iop_a_src += v_token_length; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194816u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (v_string_length > 0u) { +- continue; +- } else if (v_indefinite_string_major_type > 0u) { +- goto label__outer__continue; +- } +- goto label__goto_parsed_a_leaf_value__break; +- } +- } else if (v_c_major == 3u) { +- if (v_c_minor < 28u) { +- if (v_string_length == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } else if (v_c_minor == 31u) { +- if (v_indefinite_string_major_type != 0u) { +- break; +- } +- v_indefinite_string_major_type = 3u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__outer__continue; +- } else { +- break; +- } +- while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- continue; +- } +- v_n64 = wuffs_base__u64__min(v_string_length, 65535u); +- v_n64 = ((uint64_t)(wuffs_base__utf_8__longest_valid_prefix(iop_a_src, +- ((size_t)(wuffs_base__u64__min(((uint64_t)(io2_a_src - iop_a_src)), v_n64)))))); +- v_token_length = ((uint32_t)((v_n64 & 65535u))); +- if (v_token_length <= 0u) { +- if ((a_src && a_src->meta.closed) || (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); +- continue; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) { +- status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length); +- goto exit; +- } +- v_string_length -= ((uint64_t)(v_token_length)); +- v_continued = 0u; +- if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) { +- v_continued = 1u; +- } +- iop_a_src += v_token_length; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (v_string_length > 0u) { +- continue; +- } else if (v_indefinite_string_major_type > 0u) { +- goto label__outer__continue; +- } +- goto label__goto_parsed_a_leaf_value__break; +- } +- } else if (v_c_major == 4u) { +- if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) { +- break; +- } else if (v_depth >= 1024u) { +- v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])); +- while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) { +- iop_a_src--; +- v_token_length -= 1u; +- } +- status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth); +- goto exit; +- } +- v_vminor = 2105361u; +- v_vminor_alt = 2101282u; +- if (v_depth > 0u) { +- v_stack_byte = ((v_depth - 1u) / 16u); +- v_stack_bit = (((v_depth - 1u) & 15u) * 2u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- v_vminor = 2105377u; +- v_vminor_alt = 2105378u; +- } else { +- v_vminor = 2105409u; +- v_vminor_alt = 2113570u; +- } +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (v_c_minor == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } +- v_stack_byte = (v_depth / 16u); +- v_stack_bit = ((v_depth & 15u) * 2u); +- self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(3u)) << v_stack_bit)); +- self->private_data.f_container_num_remaining[v_depth] = v_string_length; +- v_depth += 1u; +- v_tagged = false; +- goto label__outer__continue; +- } else if (v_c_major == 5u) { +- if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) { +- break; +- } else if (v_depth >= 1024u) { +- v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])); +- while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) { +- iop_a_src--; +- v_token_length -= 1u; +- } +- status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth); ++ } ++ if (v_code > 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_code -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ while (true) { ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression); + goto exit; + } +- v_vminor = 2113553u; +- v_vminor_alt = 2101314u; +- if (v_depth > 0u) { +- v_stack_byte = ((v_depth - 1u) / 16u); +- v_stack_bit = (((v_depth - 1u) & 15u) * 2u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- v_vminor = 2113569u; +- v_vminor_alt = 2105410u; +- } else { +- v_vminor = 2113601u; +- v_vminor_alt = 2113602u; +- } +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (v_c_minor == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; ++ v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { ++ v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); + } +- v_stack_byte = (v_depth / 16u); +- v_stack_bit = ((v_depth & 15u) * 2u); +- self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(3u)) << v_stack_bit); +- self->private_data.f_container_num_remaining[v_depth] = v_string_length; +- v_depth += 1u; +- v_tagged = false; +- goto label__outer__continue; +- } else if (v_c_major == 6u) { +- if (v_c_minor >= 28u) { ++ if (v_code <= 0u) { ++ wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, ((uint64_t)(self->private_impl.f_dst_x))); + break; + } +- if (v_string_length < 262144u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | +- (((uint64_t)((4194304u | ((uint32_t)(v_string_length))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } else { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | +- (((uint64_t)((4194304u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- *iop_a_dst++ = wuffs_base__make_token( +- (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- v_tagged = true; +- goto label__outer__continue; +- } else if (v_c_major == 7u) { +- if (v_c_minor < 20u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | +- (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor < 24u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(WUFFS_CBOR__LITERALS[(v_c_minor & 3u)])) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor == 24u) { +- if (v_string_length < 24u) { +- if ( ! (iop_a_src > io1_a_src)) { +- status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- iop_a_src--; +- break; +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | +- (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor < 28u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(10490113u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } else if (v_c_minor == 31u) { +- if (v_tagged || (v_depth <= 0u)) { +- break; +- } +- v_depth -= 1u; +- if (self->private_data.f_container_num_remaining[v_depth] != 0u) { +- break; +- } +- v_stack_byte = (v_depth / 16u); +- v_stack_bit = ((v_depth & 15u) * 2u); +- v_stack_val = (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit)); +- if (v_stack_val == 1u) { +- break; +- } +- if (v_stack_val != 3u) { +- v_vminor_alt = 2097186u; +- } else { +- v_vminor_alt = 2097218u; +- } +- if (v_depth <= 0u) { +- v_vminor_alt |= 4096u; +- } else { +- v_stack_byte = ((v_depth - 1u) / 16u); +- v_stack_bit = (((v_depth - 1u) & 15u) * 2u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- v_vminor_alt |= 8192u; +- } else { +- v_vminor_alt |= 16384u; +- } +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__goto_parsed_a_leaf_value__break; +- } +- } +- } while (0); +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- status = wuffs_base__make_status(wuffs_cbor__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- label__goto_parsed_a_leaf_value__break:; +- v_tagged = false; +- while (v_depth > 0u) { +- v_stack_byte = ((v_depth - 1u) / 16u); +- v_stack_bit = (((v_depth - 1u) & 15u) * 2u); +- self->private_data.f_stack[v_stack_byte] ^= (((uint32_t)(1u)) << (v_stack_bit + 1u)); +- if (1u == (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit))) { +- goto label__outer__continue; +- } +- if (self->private_data.f_container_num_remaining[(v_depth - 1u)] <= 0u) { +- goto label__outer__continue; +- } +- self->private_data.f_container_num_remaining[(v_depth - 1u)] -= 1u; +- if (self->private_data.f_container_num_remaining[(v_depth - 1u)] > 0u) { +- goto label__outer__continue; +- } +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- continue; +- } +- v_depth -= 1u; +- v_stack_byte = (v_depth / 16u); +- v_stack_bit = ((v_depth & 15u) * 2u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- v_vminor_alt = 2097186u; +- } else { +- v_vminor_alt = 2097218u; +- } +- if (v_depth <= 0u) { +- v_vminor_alt |= 4096u; +- } else { +- v_stack_byte = ((v_depth - 1u) / 16u); +- v_stack_bit = (((v_depth - 1u) & 15u) * 2u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- v_vminor_alt |= 8192u; +- } else { +- v_vminor_alt |= 16384u; ++ wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_code -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif + } + } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_rle_state = 0u; ++ goto label__middle__continue; + } +- break; ++ self->private_impl.f_rle_state = v_rle_state; ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; + } +- self->private_impl.f_end_of_data = true; +- +- ok: +- self->private_impl.p_decode_tokens[0] = 0; +- goto exit; + } ++ label__outer__break:; ++ while (self->private_impl.f_dst_y < self->private_impl.f_height) { ++ v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) { ++ v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row); ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u); ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; + +- goto suspend; +- suspend: +- self->private_impl.p_decode_tokens[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; +- self->private_data.s_decode_tokens[0].v_string_length = v_string_length; +- self->private_data.s_decode_tokens[0].v_depth = v_depth; +- self->private_data.s_decode_tokens[0].v_tagged = v_tagged; +- self->private_data.s_decode_tokens[0].v_indefinite_string_major_type = v_indefinite_string_major_type; +- ++ ok: + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } + return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) ++// -------- func bmp.decoder.swizzle_bitfields + +-// ---------------- Status Codes Implementations ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_bitfields( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// ---------------- Private Consts ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_n = 0; ++ uint32_t v_p0 = 0; ++ uint32_t v_p1 = 0; ++ uint32_t v_p1_temp = 0; ++ uint32_t v_num_bits = 0; ++ uint32_t v_c = 0; ++ uint32_t v_c32 = 0; ++ uint32_t v_channel = 0; + +-static const uint32_t +-WUFFS_CRC32__IEEE_TABLE[16][256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- { +- 0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, +- 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, +- 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, +- 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, +- 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, +- 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, +- 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, +- 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, +- 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, +- 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, +- 1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223, +- 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, +- 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, +- 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, +- 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, +- 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, +- 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, +- 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, +- 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, +- 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, +- 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, +- 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161, +- 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, +- 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, +- 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, +- 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, +- 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, +- 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, +- 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, +- 2932959818, 3654703836, 1088359270, 936918000, 2847714899, 3736837829, 1202900863, 817233897, +- 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, +- 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117, +- }, { +- 0, 421212481, 842424962, 724390851, 1684849924, 2105013317, 1448781702, 1329698503, +- 3369699848, 3519200073, 4210026634, 3824474571, 2897563404, 3048111693, 2659397006, 2274893007, +- 1254232657, 1406739216, 2029285587, 1643069842, 783210325, 934667796, 479770071, 92505238, +- 2182846553, 2600511768, 2955803355, 2838940570, 3866582365, 4285295644, 3561045983, 3445231262, +- 2508465314, 2359236067, 2813478432, 3198777185, 4058571174, 3908292839, 3286139684, 3670389349, +- 1566420650, 1145479147, 1869335592, 1987116393, 959540142, 539646703, 185010476, 303839341, +- 3745920755, 3327985586, 3983561841, 4100678960, 3140154359, 2721170102, 2300350837, 2416418868, +- 396344571, 243568058, 631889529, 1018359608, 1945336319, 1793607870, 1103436669, 1490954812, +- 4034481925, 3915546180, 3259968903, 3679722694, 2484439553, 2366552896, 2787371139, 3208174018, +- 950060301, 565965900, 177645455, 328046286, 1556873225, 1171730760, 1861902987, 2011255754, +- 3132841300, 2745199637, 2290958294, 2442530455, 3738671184, 3352078609, 3974232786, 4126854035, +- 1919080284, 1803150877, 1079293406, 1498383519, 370020952, 253043481, 607678682, 1025720731, +- 1711106983, 2095471334, 1472923941, 1322268772, 26324643, 411738082, 866634785, 717028704, +- 2904875439, 3024081134, 2668790573, 2248782444, 3376948395, 3495106026, 4219356713, 3798300520, +- 792689142, 908347575, 487136116, 68299317, 1263779058, 1380486579, 2036719216, 1618931505, +- 3890672638, 4278043327, 3587215740, 3435896893, 2206873338, 2593195963, 2981909624, 2829542713, +- 998479947, 580430090, 162921161, 279890824, 1609522511, 1190423566, 1842954189, 1958874764, +- 4082766403, 3930137346, 3245109441, 3631694208, 2536953671, 2385372678, 2768287173, 3155920004, +- 1900120602, 1750776667, 1131931800, 1517083097, 355290910, 204897887, 656092572, 1040194781, +- 3113746450, 2692952403, 2343461520, 2461357009, 3723805974, 3304059991, 4022511508, 4141455061, +- 2919742697, 3072101800, 2620513899, 2234183466, 3396041197, 3547351212, 4166851439, 3779471918, +- 1725839073, 2143618976, 1424512099, 1307796770, 45282277, 464110244, 813994343, 698327078, +- 3838160568, 4259225593, 3606301754, 3488152955, 2158586812, 2578602749, 2996767038, 2877569151, +- 740041904, 889656817, 506086962, 120682355, 1215357364, 1366020341, 2051441462, 1667084919, +- 3422213966, 3538019855, 4190942668, 3772220557, 2945847882, 3062702859, 2644537544, 2226864521, +- 52649286, 439905287, 823476164, 672009861, 1733269570, 2119477507, 1434057408, 1281543041, +- 2167981343, 2552493150, 3004082077, 2853541596, 3847487515, 4233048410, 3613549209, 3464057816, +- 1239502615, 1358593622, 2077699477, 1657543892, 764250643, 882293586, 532408465, 111204816, +- 1585378284, 1197851309, 1816695150, 1968414767, 974272232, 587794345, 136598634, 289367339, +- 2527558116, 2411481253, 2760973158, 3179948583, 4073438432, 3956313505, 3237863010, 3655790371, +- 347922877, 229101820, 646611775, 1066513022, 1892689081, 1774917112, 1122387515, 1543337850, +- 3697634229, 3313392372, 3998419255, 4148705398, 3087642289, 2702352368, 2319436851, 2468674930, +- }, { +- 0, 29518391, 59036782, 38190681, 118073564, 114017003, 76381362, 89069189, +- 236147128, 265370511, 228034006, 206958561, 152762724, 148411219, 178138378, 190596925, +- 472294256, 501532999, 530741022, 509615401, 456068012, 451764635, 413917122, 426358261, +- 305525448, 334993663, 296822438, 275991697, 356276756, 352202787, 381193850, 393929805, +- 944588512, 965684439, 1003065998, 973863097, 1061482044, 1049003019, 1019230802, 1023561829, +- 912136024, 933002607, 903529270, 874031361, 827834244, 815125939, 852716522, 856752605, +- 611050896, 631869351, 669987326, 640506825, 593644876, 580921211, 551983394, 556069653, +- 712553512, 733666847, 704405574, 675154545, 762387700, 749958851, 787859610, 792175277, +- 1889177024, 1901651959, 1931368878, 1927033753, 2006131996, 1985040171, 1947726194, 1976933189, +- 2122964088, 2135668303, 2098006038, 2093965857, 2038461604, 2017599123, 2047123658, 2076625661, +- 1824272048, 1836991623, 1866005214, 1861914857, 1807058540, 1786244187, 1748062722, 1777547317, +- 1655668488, 1668093247, 1630251878, 1625932113, 1705433044, 1684323811, 1713505210, 1742760333, +- 1222101792, 1226154263, 1263738702, 1251046777, 1339974652, 1310460363, 1281013650, 1301863845, +- 1187289752, 1191637167, 1161842422, 1149379777, 1103966788, 1074747507, 1112139306, 1133218845, +- 1425107024, 1429406311, 1467333694, 1454888457, 1408811148, 1379576507, 1350309090, 1371438805, +- 1524775400, 1528845279, 1499917702, 1487177649, 1575719220, 1546255107, 1584350554, 1605185389, +- 3778354048, 3774312887, 3803303918, 3816007129, 3862737756, 3892238699, 3854067506, 3833203973, +- 4012263992, 4007927823, 3970080342, 3982554209, 3895452388, 3924658387, 3953866378, 3932773565, +- 4245928176, 4241609415, 4271336606, 4283762345, 4196012076, 4225268251, 4187931714, 4166823541, +- 4076923208, 4072833919, 4035198246, 4047918865, 4094247316, 4123732899, 4153251322, 4132437965, +- 3648544096, 3636082519, 3673983246, 3678331705, 3732010428, 3753090955, 3723829714, 3694611429, +- 3614117080, 3601426159, 3572488374, 3576541825, 3496125444, 3516976691, 3555094634, 3525581405, +- 3311336976, 3298595879, 3336186494, 3340255305, 3260503756, 3281337595, 3251864226, 3222399125, +- 3410866088, 3398419871, 3368647622, 3372945905, 3427010420, 3448139075, 3485520666, 3456284973, +- 2444203584, 2423127159, 2452308526, 2481530905, 2527477404, 2539934891, 2502093554, 2497740997, +- 2679949304, 2659102159, 2620920726, 2650438049, 2562027300, 2574714131, 2603727690, 2599670141, +- 2374579504, 2353749767, 2383274334, 2412743529, 2323684844, 2336421851, 2298759554, 2294686645, +- 2207933576, 2186809023, 2149495014, 2178734801, 2224278612, 2236720739, 2266437690, 2262135309, +- 2850214048, 2820717207, 2858812622, 2879680249, 2934667388, 2938704459, 2909776914, 2897069605, +- 2817622296, 2788420399, 2759153014, 2780249921, 2700618180, 2704950259, 2742877610, 2730399645, +- 3049550800, 3020298727, 3057690558, 3078802825, 2999835404, 3004150075, 2974355298, 2961925461, +- 3151438440, 3121956959, 3092510214, 3113327665, 3168701108, 3172786307, 3210370778, 3197646061, +- }, { +- 0, 3099354981, 2852767883, 313896942, 2405603159, 937357362, 627793884, 2648127673, +- 3316918511, 2097696650, 1874714724, 3607201537, 1255587768, 4067088605, 3772741427, 1482887254, +- 1343838111, 3903140090, 4195393300, 1118632049, 3749429448, 1741137837, 1970407491, 3452858150, +- 2511175536, 756094997, 1067759611, 2266550430, 449832999, 2725482306, 2965774508, 142231497, +- 2687676222, 412010587, 171665333, 2995192016, 793786473, 2548850444, 2237264098, 1038456711, +- 1703315409, 3711623348, 3482275674, 1999841343, 3940814982, 1381529571, 1089329165, 4166106984, +- 4029413537, 1217896388, 1512189994, 3802027855, 2135519222, 3354724499, 3577784189, 1845280792, +- 899665998, 2367928107, 2677414085, 657096608, 3137160985, 37822588, 284462994, 2823350519, +- 2601801789, 598228824, 824021174, 2309093331, 343330666, 2898962447, 3195996129, 113467524, +- 1587572946, 3860600759, 4104763481, 1276501820, 3519211397, 1769898208, 2076913422, 3279374443, +- 3406630818, 1941006535, 1627703081, 3652755532, 1148164341, 4241751952, 3999682686, 1457141531, +- 247015245, 3053797416, 2763059142, 470583459, 2178658330, 963106687, 735213713, 2473467892, +- 992409347, 2207944806, 2435792776, 697522413, 3024379988, 217581361, 508405983, 2800865210, +- 4271038444, 1177467017, 1419450215, 3962007554, 1911572667, 3377213406, 3690561584, 1665525589, +- 1799331996, 3548628985, 3241568279, 2039091058, 3831314379, 1558270126, 1314193216, 4142438437, +- 2928380019, 372764438, 75645176, 3158189981, 568925988, 2572515393, 2346768303, 861712586, +- 3982079547, 1441124702, 1196457648, 4293663189, 1648042348, 3666298377, 3358779879, 1888390786, +- 686661332, 2421291441, 2196002399, 978858298, 2811169155, 523464422, 226935048, 3040519789, +- 3175145892, 100435649, 390670639, 2952089162, 841119475, 2325614998, 2553003640, 546822429, +- 2029308235, 3225988654, 3539796416, 1782671013, 4153826844, 1328167289, 1570739863, 3844338162, +- 1298864389, 4124540512, 3882013070, 1608431339, 3255406162, 2058742071, 1744848601, 3501990332, +- 2296328682, 811816591, 584513889, 2590678532, 129869501, 3204563416, 2914283062, 352848211, +- 494030490, 2781751807, 3078325777, 264757620, 2450577869, 715964072, 941166918, 2158327331, +- 3636881013, 1618608400, 1926213374, 3396585883, 1470427426, 4011365959, 4255988137, 1158766284, +- 1984818694, 3471935843, 3695453837, 1693991400, 4180638033, 1100160564, 1395044826, 3952793279, +- 3019491049, 189112716, 435162722, 2706139399, 1016811966, 2217162459, 2526189877, 774831696, +- 643086745, 2666061564, 2354934034, 887166583, 2838900430, 294275499, 54519365, 3145957664, +- 3823145334, 1532818963, 1240029693, 4048895640, 1820460577, 3560857924, 3331051178, 2117577167, +- 3598663992, 1858283101, 2088143283, 3301633750, 1495127663, 3785470218, 4078182116, 1269332353, +- 332098007, 2876706482, 3116540252, 25085497, 2628386432, 605395429, 916469259, 2384220526, +- 2254837415, 1054503362, 745528876, 2496903497, 151290352, 2981684885, 2735556987, 464596510, +- 1137851976, 4218313005, 3923506883, 1365741990, 3434129695, 1946996346, 1723425172, 3724871409, +- }, { +- 0, 1029712304, 2059424608, 1201699536, 4118849216, 3370159984, 2403399072, 2988497936, +- 812665793, 219177585, 1253054625, 2010132753, 3320900865, 4170237105, 3207642721, 2186319825, +- 1625331586, 1568718386, 438355170, 658566482, 2506109250, 2818578674, 4020265506, 3535817618, +- 1351670851, 1844508147, 709922595, 389064339, 2769320579, 2557498163, 3754961379, 3803185235, +- 3250663172, 4238411444, 3137436772, 2254525908, 876710340, 153198708, 1317132964, 1944187668, +- 4054934725, 3436268917, 2339452837, 3054575125, 70369797, 961670069, 2129760613, 1133623509, +- 2703341702, 2621542710, 3689016294, 3867263574, 1419845190, 1774270454, 778128678, 318858390, +- 2438067015, 2888948471, 3952189479, 3606153623, 1691440519, 1504803895, 504432359, 594620247, +- 1492342857, 1704161785, 573770537, 525542041, 2910060169, 2417219385, 3618876905, 3939730521, +- 1753420680, 1440954936, 306397416, 790849880, 2634265928, 2690882808, 3888375336, 3668168600, +- 940822475, 91481723, 1121164459, 2142483739, 3448989963, 4042473659, 3075684971, 2318603227, +- 140739594, 889433530, 1923340138, 1338244826, 4259521226, 3229813626, 2267247018, 3124975642, +- 2570221389, 2756861693, 3824297005, 3734113693, 1823658381, 1372780605, 376603373, 722643805, +- 2839690380, 2485261628, 3548540908, 4007806556, 1556257356, 1638052860, 637716780, 459464860, +- 4191346895, 3300051327, 2199040943, 3195181599, 206718479, 825388991, 1989285231, 1274166495, +- 3382881038, 4106388158, 3009607790, 2382549470, 1008864718, 21111934, 1189240494, 2072147742, +- 2984685714, 2357631266, 3408323570, 4131834434, 1147541074, 2030452706, 1051084082, 63335554, +- 2174155603, 3170292451, 4216760371, 3325460867, 1947622803, 1232499747, 248909555, 867575619, +- 3506841360, 3966111392, 2881909872, 2527485376, 612794832, 434546784, 1581699760, 1663499008, +- 3782634705, 3692447073, 2612412337, 2799048193, 351717905, 697754529, 1849071985, 1398190273, +- 1881644950, 1296545318, 182963446, 931652934, 2242328918, 3100053734, 4284967478, 3255255942, +- 1079497815, 2100821479, 983009079, 133672583, 3050795671, 2293717799, 3474399735, 4067887175, +- 281479188, 765927844, 1778867060, 1466397380, 3846680276, 3626469220, 2676489652, 2733102084, +- 548881365, 500656741, 1517752501, 1729575173, 3577210133, 3898068133, 2952246901, 2459410373, +- 3910527195, 3564487019, 2480257979, 2931134987, 479546907, 569730987, 1716854139, 1530213579, +- 3647316762, 3825568426, 2745561210, 2663766474, 753206746, 293940330, 1445287610, 1799716618, +- 2314567513, 3029685993, 4080348217, 3461678473, 2088098201, 1091956777, 112560889, 1003856713, +- 3112514712, 2229607720, 3276105720, 4263857736, 1275433560, 1902492648, 918929720, 195422344, +- 685033439, 364179055, 1377080511, 1869921551, 3713294623, 3761522863, 2811507327, 2599689167, +- 413436958, 633644462, 1650777982, 1594160846, 3978570462, 3494118254, 2548332990, 2860797966, +- 1211387997, 1968470509, 854852413, 261368461, 3182753437, 2161434413, 3346310653, 4195650637, +- 2017729436, 1160000044, 42223868, 1071931724, 2378480988, 2963576044, 4144295484, 3395602316, +- }, { +- 0, 3411858341, 1304994059, 2257875630, 2609988118, 1355649459, 3596215069, 486879416, +- 3964895853, 655315400, 2711298918, 1791488195, 2009251963, 3164476382, 973758832, 4048990933, +- 64357019, 3364540734, 1310630800, 2235723829, 2554806413, 1394316072, 3582976390, 517157411, +- 4018503926, 618222419, 2722963965, 1762783832, 1947517664, 3209171269, 970744811, 4068520014, +- 128714038, 3438335635, 1248109629, 2167961496, 2621261600, 1466012805, 3522553387, 447296910, +- 3959392091, 547575038, 2788632144, 1835791861, 1886307661, 3140622056, 1034314822, 4143626211, +- 75106221, 3475428360, 1236444838, 2196665603, 2682996155, 1421317662, 3525567664, 427767573, +- 3895035328, 594892389, 2782995659, 1857943406, 1941489622, 3101955187, 1047553757, 4113347960, +- 257428076, 3288652233, 1116777319, 2311878850, 2496219258, 1603640287, 3640781169, 308099796, +- 3809183745, 676813732, 2932025610, 1704983215, 2023410199, 3016104370, 894593820, 4262377657, +- 210634999, 3352484690, 1095150076, 2316991065, 2535410401, 1547934020, 3671583722, 294336591, +- 3772615322, 729897279, 2903845777, 1716123700, 2068629644, 2953845545, 914647431, 4258839074, +- 150212442, 3282623743, 1161604689, 2388688372, 2472889676, 1480171241, 3735940167, 368132066, +- 3836185911, 805002898, 2842635324, 1647574937, 2134298401, 3026852996, 855535146, 4188192143, +- 186781121, 3229539940, 1189784778, 2377547631, 2427670487, 1542429810, 3715886812, 371670393, +- 3882979244, 741170185, 2864262823, 1642462466, 2095107514, 3082559007, 824732849, 4201955092, +- 514856152, 3589064573, 1400419795, 2552522358, 2233554638, 1316849003, 3370776517, 62202976, +- 4075001525, 968836368, 3207280574, 1954014235, 1769133219, 2720925446, 616199592, 4024870413, +- 493229635, 3594175974, 1353627464, 2616354029, 2264355925, 1303087088, 3409966430, 6498043, +- 4046820398, 979978123, 3170710821, 2007099008, 1789187640, 2717386141, 661419827, 3962610838, +- 421269998, 3527459403, 1423225061, 2676515648, 2190300152, 1238466653, 3477467891, 68755798, +- 4115633027, 1041448998, 3095868040, 1943789869, 1860096405, 2776760880, 588673182, 3897205563, +- 449450869, 3516317904, 1459794558, 2623431131, 2170245475, 1242006214, 3432247400, 131015629, +- 4137259288, 1036337853, 3142660115, 1879958454, 1829294862, 2790523051, 549483013, 3952910752, +- 300424884, 3669282065, 1545650111, 2541513754, 2323209378, 1092980487, 3350330793, 216870412, +- 4256931033, 921128828, 2960342482, 2066738807, 1714085583, 2910195050, 736264132, 3770592353, +- 306060335, 3647131530, 1610005796, 2494197377, 2309971513, 1123257756, 3295149874, 255536279, +- 4268596802, 892423655, 3013951305, 2029645036, 1711070292, 2929725425, 674528607, 3815288570, +- 373562242, 3709388839, 1535949449, 2429577516, 2379569556, 1183418929, 3223189663, 188820282, +- 4195850735, 827017802, 3084859620, 2089020225, 1636228089, 2866415708, 743340786, 3876759895, +- 361896217, 3738094268, 1482340370, 2466671543, 2382584591, 1163888810, 3284924932, 144124321, +- 4190215028, 849168593, 3020503679, 2136336858, 1649465698, 2836138695, 798521449, 3838094284, +- }, { +- 0, 2792819636, 2543784233, 837294749, 4098827283, 1379413927, 1674589498, 3316072078, +- 871321191, 2509784531, 2758827854, 34034938, 3349178996, 1641505216, 1346337629, 4131942633, +- 1742642382, 3249117050, 4030828007, 1446413907, 2475800797, 904311657, 68069876, 2725880384, +- 1412551337, 4064729373, 3283010432, 1708771380, 2692675258, 101317902, 937551763, 2442587175, +- 3485284764, 1774858792, 1478633653, 4266992385, 1005723023, 2642744891, 2892827814, 169477906, +- 4233263099, 1512406095, 1808623314, 3451546982, 136139752, 2926205020, 2676114113, 972376437, +- 2825102674, 236236518, 1073525883, 2576072655, 1546420545, 4200303349, 3417542760, 1841601500, +- 2609703733, 1039917185, 202635804, 2858742184, 1875103526, 3384067218, 4166835727, 1579931067, +- 1141601657, 3799809741, 3549717584, 1977839588, 2957267306, 372464350, 668680259, 2175552503, +- 2011446046, 3516084394, 3766168119, 1175200131, 2209029901, 635180217, 338955812, 2990736784, +- 601221559, 2242044419, 3024812190, 306049834, 3617246628, 1911408144, 1074125965, 3866285881, +- 272279504, 3058543716, 2275784441, 567459149, 3832906691, 1107462263, 1944752874, 3583875422, +- 2343980261, 767641425, 472473036, 3126744696, 2147051766, 3649987394, 3899029983, 1309766251, +- 3092841090, 506333494, 801510315, 2310084639, 1276520081, 3932237093, 3683203000, 2113813516, +- 3966292011, 1243601823, 2079834370, 3716205238, 405271608, 3192979340, 2411259153, 701492901, +- 3750207052, 2045810168, 1209569125, 4000285905, 734575199, 2378150379, 3159862134, 438345922, +- 2283203314, 778166598, 529136603, 3120492655, 2086260449, 3660498261, 3955679176, 1303499900, +- 3153699989, 495890209, 744928700, 2316418568, 1337360518, 3921775410, 3626602927, 2120129051, +- 4022892092, 1237286280, 2018993941, 3726666913, 461853231, 3186645403, 2350400262, 711936178, +- 3693557851, 2052076527, 1270360434, 3989775046, 677911624, 2384402428, 3220639073, 427820757, +- 1202443118, 3789347034, 3493118535, 1984154099, 3018127229, 362020041, 612099668, 2181885408, +- 1950653705, 3526596285, 3822816288, 1168934804, 2148251930, 645706414, 395618355, 2984485767, +- 544559008, 2248295444, 3085590153, 295523645, 3560598451, 1917673479, 1134918298, 3855773998, +- 328860103, 3052210803, 2214924526, 577903450, 3889505748, 1101147744, 1883911421, 3594338121, +- 3424493451, 1785369663, 1535282850, 4260726038, 944946072, 2653270060, 2949491377, 163225861, +- 4294103532, 1501944408, 1752023237, 3457862513, 196998655, 2915761739, 2619532502, 978710370, +- 2881684293, 229902577, 1012666988, 2586515928, 1603020630, 4193987810, 3356702335, 1852063179, +- 2553040162, 1046169238, 263412747, 2848217023, 1818454321, 3390333573, 4227627032, 1569420204, +- 60859927, 2782375331, 2487203646, 843627658, 4159668740, 1368951216, 1617990445, 3322386585, +- 810543216, 2520310724, 2815490393, 27783917, 3288386659, 1652017111, 1402985802, 4125677310, +- 1685994201, 3255382381, 4091620336, 1435902020, 2419138250, 910562686, 128847843, 2715354199, +- 1469150398, 4058414858, 3222168983, 1719234083, 2749255853, 94984985, 876691844, 2453031472, +- }, { +- 0, 3433693342, 1109723005, 2391738339, 2219446010, 1222643300, 3329165703, 180685081, +- 3555007413, 525277995, 2445286600, 1567235158, 1471092047, 2600801745, 361370162, 3642757804, +- 2092642603, 2953916853, 1050555990, 4063508168, 4176560081, 878395215, 3134470316, 1987983410, +- 2942184094, 1676945920, 3984272867, 567356797, 722740324, 3887998202, 1764827929, 2778407815, +- 4185285206, 903635656, 3142804779, 2012833205, 2101111980, 2979425330, 1058630609, 4088621903, +- 714308067, 3862526333, 1756790430, 2753330688, 2933487385, 1651734407, 3975966820, 542535930, +- 2244825981, 1231508451, 3353891840, 188896414, 25648519, 3442302233, 1134713594, 2399689316, +- 1445480648, 2592229462, 336416693, 3634843435, 3529655858, 516441772, 2420588879, 1559052753, +- 698204909, 3845636723, 1807271312, 2803025166, 2916600855, 1635634313, 4025666410, 593021940, +- 4202223960, 919787974, 3093159461, 1962401467, 2117261218, 2996361020, 1008193759, 4038971457, +- 1428616134, 2576151384, 386135227, 3685348389, 3513580860, 499580322, 2471098945, 1608776415, +- 2260985971, 1248454893, 3303468814, 139259792, 42591881, 3458459159, 1085071860, 2349261162, +- 3505103035, 474062885, 2463016902, 1583654744, 1419882049, 2550902495, 377792828, 3660491170, +- 51297038, 3483679632, 1093385331, 2374089965, 2269427188, 1273935210, 3311514249, 164344343, +- 2890961296, 1627033870, 4000683757, 585078387, 672833386, 3836780532, 1782552599, 2794821769, +- 2142603813, 3005188795, 1032883544, 4047146438, 4227826911, 928351297, 3118105506, 1970307900, +- 1396409818, 2677114180, 287212199, 3719594553, 3614542624, 467372990, 2505346141, 1509854403, +- 2162073199, 1282711281, 3271268626, 240228748, 76845205, 3359543307, 1186043880, 2317064054, +- 796964081, 3811226735, 1839575948, 2702160658, 2882189835, 1734392469, 3924802934, 625327592, +- 4234522436, 818917338, 3191908409, 1927981223, 2016387518, 3028656416, 973776579, 4137723485, +- 2857232268, 1726474002, 3899187441, 616751215, 772270454, 3803048424, 1814228491, 2693328533, +- 2041117753, 3036871847, 999160644, 4146592730, 4259508931, 826864221, 3217552830, 1936586016, +- 3606501031, 442291769, 2496909786, 1484378436, 1388107869, 2652297411, 278519584, 3694387134, +- 85183762, 3384397196, 1194773103, 2342308593, 2170143720, 1307820918, 3279733909, 265733131, +- 2057717559, 3054258089, 948125770, 4096344276, 4276898253, 843467091, 3167309488, 1885556270, +- 2839764098, 1709792284, 3949353983, 667704161, 755585656, 3785577190, 1865176325, 2743489947, +- 102594076, 3401021058, 1144549729, 2291298815, 2186770662, 1325234296, 3228729243, 215514885, +- 3589828009, 424832311, 2547870420, 1534552650, 1370645331, 2635621325, 328688686, 3745342640, +- 2211456353, 1333405183, 3254067740, 224338562, 127544219, 3408931589, 1170156774, 2299866232, +- 1345666772, 2627681866, 303053225, 3736746295, 3565105198, 416624816, 2522494803, 1525692365, +- 4285207626, 868291796, 3176010551, 1910772649, 2065767088, 3079346734, 956571085, 4121828691, +- 747507711, 3760459617, 1856702594, 2717976604, 2831417605, 1684930971, 3940615800, 642451174, +- }, +- { +- 0, 393942083, 787884166, 965557445, 1575768332, 1251427663, 1931114890, 1684106697, +- 3151536664, 2896410203, 2502855326, 2186649309, 3862229780, 4048545623, 3368213394, 3753496529, +- 2898281073, 3149616690, 2184604407, 2504883892, 4046197629, 3864463166, 3755621371, 3366006712, +- 387506281, 6550570, 971950319, 781573292, 1257550181, 1569695014, 1677892067, 1937345952, +- 2196865699, 2508887776, 2886183461, 3145514598, 3743273903, 3362179052, 4058774313, 3868258154, +- 958996667, 777139448, 400492605, 10755198, 1690661303, 1941857780, 1244879153, 1565019506, +- 775012562, 961205393, 13101140, 398261271, 1943900638, 1688634781, 1563146584, 1246801179, +- 2515100362, 2190636681, 3139390028, 2892258831, 3355784134, 3749586821, 3874691904, 4052225795, +- 3734110983, 3387496260, 4033096577, 3877584834, 2206093835, 2483373640, 2911402637, 3136515790, +- 1699389727, 1915860316, 1270647193, 1556585946, 950464531, 803071056, 374397077, 19647702, +- 1917993334, 1697207605, 1554278896, 1272937907, 800985210, 952435769, 21510396, 372452543, +- 3381322606, 3740399405, 3883715560, 4027047851, 2489758306, 2199758369, 3130039012, 2917895847, +- 1550025124, 1259902439, 1922410786, 1710144865, 26202280, 385139947, 796522542, 939715693, +- 3887801276, 4039129087, 3377269562, 3728088953, 3126293168, 2905368307, 2493602358, 2212122229, +- 4037264341, 3889747862, 3730172755, 3375300368, 2907673305, 3124004506, 2209987167, 2495786524, +- 1266377165, 1543533966, 1703758155, 1928748296, 379007169, 32253058, 945887303, 790236164, +- 1716846671, 1898845196, 1218652361, 1608006794, 1002000707, 750929152, 357530053, 36990342, +- 3717046871, 3405166100, 4084959953, 3825245842, 2153902939, 2535122712, 2929187805, 3119304606, +- 3398779454, 3723384445, 3831720632, 4078468859, 2541294386, 2147616625, 3113171892, 2935238647, +- 1900929062, 1714877541, 1606142112, 1220599011, 748794154, 1004184937, 39295404, 355241455, +- 3835986668, 4091516591, 3394415210, 3710500393, 3108557792, 2922629027, 2545875814, 2160455461, +- 1601970420, 1208431799, 1904871538, 1727077425, 43020792, 367748539, 744905086, 991776061, +- 1214562461, 1595921630, 1720903707, 1911159896, 361271697, 49513938, 998160663, 738569556, +- 4089209477, 3838277318, 3712633347, 3392233024, 2924491657, 3106613194, 2158369551, 2547846988, +- 3100050248, 2948339467, 2519804878, 2169126797, 3844821572, 4065347079, 3420289730, 3701894785, +- 52404560, 342144275, 770279894, 982687125, 1593045084, 1233708063, 1879431386, 1736363161, +- 336019769, 58479994, 988899775, 764050940, 1240141877, 1586496630, 1729968307, 1885744368, +- 2950685473, 3097818978, 2166999975, 2522013668, 4063474221, 3846743662, 3703937707, 3418263272, +- 976650731, 760059304, 348170605, 62635310, 1742393575, 1889649828, 1227683937, 1582820386, +- 2179867635, 2526361520, 2937588597, 3093503798, 3691148031, 3413731004, 4076100217, 3851374138, +- 2532754330, 2173556697, 3087067932, 2944139103, 3407516310, 3697379029, 3857496592, 4070026835, +- 758014338, 978679233, 64506116, 346250567, 1891774606, 1740186829, 1580472328, 1229917259, +- }, { +- 0, 4022496062, 83218493, 3946298115, 166436986, 3861498692, 220098631, 3806075769, +- 332873972, 4229245898, 388141257, 4175494135, 440197262, 4127099824, 516501683, 4044053389, +- 665747944, 3362581206, 593187285, 3432594155, 776282514, 3246869164, 716239279, 3312622225, +- 880394524, 3686509090, 814485793, 3746462239, 1033003366, 3528460888, 963096923, 3601193573, +- 1331495888, 2694801646, 1269355501, 2758457555, 1186374570, 2843003028, 1111716759, 2910918825, +- 1552565028, 3007850522, 1484755737, 3082680359, 1432478558, 3131279456, 1368666979, 3193329757, +- 1760789048, 2268195078, 1812353541, 2210675003, 1628971586, 2396670332, 1710092927, 2318375233, +- 2066006732, 2498144754, 2144408305, 2417195471, 1926193846, 2634877320, 1983558283, 2583222709, +- 2662991776, 1903717534, 2588923805, 1972223139, 2538711002, 2022952164, 2477029351, 2087066841, +- 2372749140, 1655647338, 2308478825, 1717238871, 2223433518, 1799654416, 2155034387, 1873894445, +- 3105130056, 1456926070, 3185661557, 1378041163, 2969511474, 1597852940, 3020617231, 1539874097, +- 2864957116, 1157737858, 2922780289, 1106542015, 2737333958, 1290407416, 2816325371, 1210047941, +- 3521578096, 1042640718, 3574781005, 986759027, 3624707082, 936300340, 3707335735, 859512585, +- 3257943172, 770846650, 3334837433, 688390023, 3420185854, 605654976, 3475911875, 552361981, +- 4132013464, 428600998, 4072428965, 494812827, 4288816610, 274747100, 4216845791, 345349857, +- 3852387692, 173846098, 3781891409, 245988975, 3967116566, 62328360, 3900749099, 121822741, +- 3859089665, 164061759, 3807435068, 221426178, 4025395579, 2933317, 3944446278, 81334904, +- 4124199413, 437265099, 4045904328, 518386422, 4231653775, 335250097, 4174133682, 386814604, +- 3249244393, 778691543, 3311294676, 714879978, 3359647891, 662848429, 3434477742, 595039120, +- 3531393053, 1035903779, 3599308832, 961245982, 3684132967, 877986649, 3747788890, 815846244, +- 2841119441, 1184522735, 2913852140, 1114616274, 2696129195, 1332855189, 2756082326, 1266946472, +- 3129952805, 1431118107, 3195705880, 1371074854, 3009735263, 1554415969, 3079748194, 1481855324, +- 2398522169, 1630855175, 2315475716, 1707159610, 2266835779, 1759461501, 2213084030, 1814728768, +- 2636237773, 1927520499, 2580814832, 1981182158, 2496293815, 2064121993, 2420095882, 2147340468, +- 2025787041, 2541577631, 2085281436, 2475210146, 1901375195, 2660681189, 1973518054, 2590184920, +- 1801997909, 2225743211, 1872600680, 2153772374, 1652813359, 2369881361, 1719025170, 2310296876, +- 1594986313, 2966676599, 1541693300, 3022402634, 1459236659, 3107472397, 1376780046, 3184366640, +- 1288097725, 2734990467, 1211309952, 2817619134, 1160605639, 2867791097, 1104723962, 2920993988, +- 937561457, 3626001999, 857201996, 3704993394, 1040821515, 3519792693, 989625654, 3577615880, +- 607473029, 3421972155, 549494200, 3473077894, 769584639, 3256649409, 690699714, 3337180924, +- 273452185, 4287555495, 347692196, 4219156378, 430386403, 4133832669, 491977950, 4069562336, +- 60542061, 3965298515, 124656720, 3903616878, 175139863, 3853649705, 243645482, 3779581716, +- }, { +- 0, 3247366080, 1483520449, 2581751297, 2967040898, 1901571138, 3904227907, 691737987, +- 3133399365, 2068659845, 3803142276, 589399876, 169513671, 3415493895, 1383475974, 2482566342, +- 2935407819, 1870142219, 4137319690, 924099274, 506443593, 3751897225, 1178799752, 2278412616, +- 339027342, 3585866318, 1280941135, 2379694991, 2766951948, 1700956620, 4236308429, 1024339981, +- 2258407383, 1192382487, 3740284438, 528411094, 910556245, 4157285269, 1848198548, 2946996820, +- 1012887186, 4258378066, 1681119059, 2780629139, 2357599504, 1292419792, 3572147409, 358906641, +- 678054684, 3924071644, 1879503581, 2978491677, 2561882270, 1497229150, 3235873119, 22109855, +- 2460592729, 1395094937, 3401913240, 189516888, 577821147, 3825075739, 2048679962, 3146956762, +- 3595049455, 398902831, 2384764974, 1336573934, 1720805997, 2803873197, 1056822188, 4285729900, +- 1821112490, 2902796138, 887570795, 4117339819, 3696397096, 500978920, 2218668777, 1169222953, +- 2025774372, 3106931428, 550659301, 3780950821, 3362238118, 166293862, 2416645991, 1367722151, +- 3262987361, 66315169, 2584839584, 1537170016, 1923370979, 3005911075, 717813282, 3947244002, +- 1356109368, 2438613496, 146288633, 3375820857, 3759007162, 562248314, 3093388411, 2045739963, +- 3927406461, 731490493, 2994458300, 1945440636, 1523451135, 2604718911, 44219710, 3274466046, +- 4263662323, 1068272947, 2790189874, 1740649714, 1325080945, 2406874801, 379033776, 3608758128, +- 1155642294, 2238671990, 479005303, 3708016055, 4097359924, 901128180, 2891217397, 1843045941, +- 2011248031, 3060787807, 797805662, 3993195422, 3342353949, 112630237, 2673147868, 1591353372, +- 3441611994, 212601626, 2504944923, 1421914843, 2113644376, 3161815192, 630660761, 3826893145, +- 3642224980, 412692116, 2172340373, 1089836885, 1775141590, 2822790422, 832715543, 4029474007, +- 1674842129, 2723860433, 1001957840, 4197873168, 3540870035, 310623315, 2338445906, 1257178514, +- 4051548744, 821257608, 2836464521, 1755307081, 1101318602, 2150241802, 432566283, 3628511179, +- 1270766349, 2318435533, 332587724, 3529260300, 4217841807, 988411727, 2735444302, 1652903566, +- 1602977411, 2651169091, 132630338, 3328776322, 4015131905, 786223809, 3074340032, 1991273216, +- 3846741958, 616972294, 3173262855, 2091579847, 1435626564, 2485072772, 234706309, 3430124101, +- 2712218736, 1613231024, 4190475697, 944458353, 292577266, 3506339890, 1226630707, 2291284467, +- 459984181, 3672380149, 1124496628, 2189994804, 2880683703, 1782407543, 4091479926, 844224694, +- 257943739, 3469817723, 1462980986, 2529005242, 3213269817, 2114471161, 3890881272, 644152632, +- 3046902270, 1947391550, 3991973951, 746483711, 88439420, 3301680572, 1563018173, 2628197501, +- 657826727, 3871046759, 2136545894, 3201811878, 2548879397, 1449267173, 3481299428, 235845156, +- 2650161890, 1551408418, 3315268387, 68429027, 758067552, 3970035360, 1967360161, 3033356129, +- 2311284588, 1213053100, 3517963949, 270598509, 958010606, 4170500910, 1635167535, 2700636911, +- 855672361, 4069415401, 1802256360, 2866995240, 2212099499, 1113008747, 3686091882, 440112042, +- }, { +- 0, 2611301487, 3963330207, 2006897392, 50740095, 2560849680, 4013794784, 1956178319, +- 101480190, 2645113489, 3929532513, 1905435662, 84561281, 2662269422, 3912356638, 1922342769, +- 202960380, 2545787283, 3760419683, 2072395532, 253679235, 2495322860, 3810871324, 2021655667, +- 169122562, 2444351341, 3861841309, 2106214898, 152215677, 2461527058, 3844685538, 2123133581, +- 405920760, 2207553431, 4094313831, 1873742088, 456646791, 2157096168, 4144791064, 1823027831, +- 507358470, 2241388905, 4060492697, 1772322806, 490444409, 2258557462, 4043311334, 1789215881, +- 338245124, 2408348267, 4161972379, 1672996084, 388959611, 2357870868, 4212429796, 1622269835, +- 304431354, 2306870421, 4263435877, 1706791434, 287538053, 2324051946, 4246267162, 1723705717, +- 811841520, 2881944479, 3696765295, 1207788800, 862293135, 2831204576, 3747484176, 1157324415, +- 913293582, 2915732833, 3662962577, 1106318334, 896137841, 2932651550, 3646055662, 1123494017, +- 1014716940, 2816349795, 3493905555, 1273334012, 1065181555, 2765630748, 3544645612, 1222882179, +- 980888818, 2714919069, 3595350637, 1307180546, 963712909, 2731826146, 3578431762, 1324336509, +- 676490248, 3019317351, 3295277719, 1607253752, 726947703, 2968591128, 3345992168, 1556776327, +- 777919222, 3053147801, 3261432937, 1505806342, 760750473, 3070062054, 3244539670, 1522987897, +- 608862708, 3220163995, 3362856811, 1406423812, 659339915, 3169449700, 3413582868, 1355966587, +- 575076106, 3118709605, 3464325525, 1440228858, 557894773, 3135602714, 3447411434, 1457397381, +- 1623683040, 4217512847, 2365387135, 391757072, 1673614495, 4167309552, 2415577600, 341804655, +- 1724586270, 4251866481, 2331019137, 290835438, 1707942497, 4268256782, 2314648830, 307490961, +- 1826587164, 4152020595, 2162433155, 457265388, 1876539747, 4101829900, 2212636668, 407333779, +- 1792275682, 4051089549, 2263378557, 491595282, 1775619997, 4067460082, 2246988034, 508239213, +- 2029433880, 3813931127, 2496473735, 258500328, 2079362919, 3763716872, 2546668024, 208559511, +- 2130363110, 3848244873, 2462145657, 157552662, 2113730969, 3864638966, 2445764358, 174205801, +- 1961777636, 4014675339, 2564147067, 57707284, 2011718299, 3964481268, 2614361092, 7778411, +- 1927425818, 3913769845, 2665066885, 92077546, 1910772837, 3930150922, 2648673018, 108709525, +- 1352980496, 3405878399, 3164554895, 658115296, 1403183983, 3355946752, 3214507504, 607924639, +- 1453895406, 3440239233, 3130208369, 557218846, 1437504913, 3456883198, 3113552654, 573589345, +- 1555838444, 3340335491, 2961681267, 723707676, 1606028947, 3290383100, 3011612684, 673504355, +- 1521500946, 3239382909, 3062619533, 758026722, 1505130605, 3256038402, 3045975794, 774417053, +- 1217725416, 3543158663, 2762906999, 1057739032, 1267939479, 3493229816, 2812847624, 1007544935, +- 1318679830, 3577493881, 2728586121, 956803046, 1302285929, 3594125830, 2711933174, 973184153, +- 1150152212, 3743982203, 2830528651, 856898788, 1200346475, 3694041348, 2880457716, 806684571, +- 1115789546, 3643069573, 2931426933, 891243034, 1099408277, 3659722746, 2914794762, 907637093, +- }, { +- 0, 3717650821, 1616688459, 3184159950, 3233376918, 489665299, 2699419613, 2104690264, +- 1510200173, 2274691816, 979330598, 3888758691, 2595928571, 1194090622, 4209380528, 661706037, +- 3020400346, 1771143007, 3562738577, 164481556, 1958661196, 2837976521, 350386439, 3379863682, +- 3993269687, 865250354, 2388181244, 1406015865, 784146209, 4079732388, 1323412074, 2474079215, +- 3011398645, 1860735600, 3542286014, 246687547, 1942430051, 2924607718, 328963112, 3456978349, +- 3917322392, 887832861, 2300653011, 1421341782, 700772878, 4099025803, 1234716485, 2483986112, +- 125431087, 3673109674, 1730500708, 3132326369, 3351283641, 441867836, 2812031730, 2047535991, +- 1568292418, 2163009479, 1025936137, 3769651852, 2646824148, 1079348561, 4255113631, 537475098, +- 3180171691, 1612400686, 3721471200, 4717925, 2100624189, 2694980280, 493375094, 3237910515, +- 3884860102, 974691139, 2278750093, 1514417672, 657926224, 4204917205, 1198234907, 2600289438, +- 160053105, 3558665972, 1775665722, 3024116671, 3375586791, 346391650, 2842683564, 1962488105, +- 1401545756, 2384412057, 869618007, 3997403346, 2469432970, 1319524111, 4083956673, 788193860, +- 250862174, 3546612699, 1856990997, 3006903952, 3461001416, 333211981, 2920678787, 1937824774, +- 1425017139, 2305216694, 883735672, 3912918525, 2487837605, 1239398944, 4095071982, 696455019, +- 3136584836, 1734518017, 3668494799, 121507914, 2051872274, 2816200599, 437363545, 3347544796, +- 3774328809, 1029797484, 2158697122, 1564328743, 542033279, 4258798842, 1074950196, 2642717105, +- 2691310871, 2113731730, 3224801372, 497043929, 1624461185, 3175454212, 9435850, 3709412175, +- 4201248378, 671035391, 2587181873, 1201904308, 986750188, 3880142185, 1519135143, 2266689570, +- 342721485, 3388693064, 1949382278, 2846355203, 3570723163, 155332830, 3028835344, 1763607957, +- 1315852448, 2482538789, 775087595, 4087626862, 2396469814, 1396827059, 4002123645, 857560824, +- 320106210, 3464673127, 1934154665, 2933785132, 3551331444, 238804465, 3018961215, 1852270778, +- 1226292623, 2491507722, 692783300, 4108177729, 2309936921, 1412959900, 3924976210, 879016919, +- 2803091512, 2055541181, 3343875443, 450471158, 1739236014, 3124525867, 133568485, 3663777376, +- 4245691221, 545702608, 2639048222, 1088059291, 1034514883, 3762268230, 1576387720, 2153979149, +- 501724348, 3228659001, 2109407735, 2687359090, 3713981994, 13109167, 3171052385, 1620357860, +- 1206151121, 2591211092, 666423962, 4197321503, 2271022407, 1523307714, 3875649548, 982999433, +- 2850034278, 1953942499, 3384583981, 338329256, 1767471344, 3033506165, 151375291, 3566408766, +- 4091789579, 779425934, 2478797888, 1311354309, 861580189, 4006375960, 1392910038, 2391852883, +- 2929327945, 1930372812, 3469036034, 324244359, 1847629279, 3015068762, 243015828, 3555391761, +- 4103744548, 688715169, 2496043375, 1229996266, 874727090, 3920994103, 1417671673, 2313759356, +- 446585235, 3339223062, 2059594968, 2807313757, 3660002053, 129100416, 3128657486, 1743609803, +- 1084066558, 2634765179, 549535669, 4250396208, 2149900392, 1571961325, 3765982499, 1039043750, +- }, { +- 0, 2635063670, 3782132909, 2086741467, 430739227, 2225303149, 4173482934, 1707977408, +- 861478454, 2924937024, 3526875803, 1329085421, 720736557, 3086643291, 3415954816, 1452586230, +- 1722956908, 4223524122, 2279405761, 450042295, 2132718455, 3792785921, 2658170842, 58693292, +- 1441473114, 3370435372, 3028674295, 696911745, 1279765825, 3511176247, 2905172460, 807831706, +- 3445913816, 1349228974, 738901109, 2969918723, 3569940419, 1237784245, 900084590, 2829701656, +- 4265436910, 1664255896, 525574723, 2187084597, 3885099509, 2057177219, 117386584, 2616249390, +- 2882946228, 920233410, 1253605401, 3619119471, 2994391983, 796207833, 1393823490, 3457937012, +- 2559531650, 92322804, 2044829231, 3840835417, 2166609305, 472659183, 1615663412, 4249022530, +- 1102706673, 3702920839, 2698457948, 1037619754, 1477802218, 3306854812, 3111894087, 611605809, +- 1927342535, 4025419953, 2475568490, 243387420, 1800169180, 4131620778, 2317525617, 388842247, +- 655084445, 3120835307, 3328511792, 1533734470, 1051149446, 2745738736, 3754524715, 1120297309, +- 340972971, 2304586973, 4114354438, 1748234352, 234773168, 2431761350, 3968900637, 1906278251, +- 2363330345, 299003487, 1840466820, 4038896370, 2507210802, 142532932, 1948239007, 3910149609, +- 3213136159, 579563625, 1592415666, 3286611140, 2787646980, 992477042, 1195825833, 3662232543, +- 3933188933, 2002801203, 184645608, 2517538462, 4089658462, 1858919720, 313391347, 2409765253, +- 3644239219, 1144605701, 945318366, 2773977256, 3231326824, 1570095902, 569697989, 3170568115, +- 2205413346, 511446676, 1646078799, 4279421497, 2598330617, 131105167, 2075239508, 3871229218, +- 2955604436, 757403810, 1363424633, 3427521551, 2844163791, 881434553, 1223211618, 3588709140, +- 3854685070, 2026779384, 78583587, 2577462869, 4235025557, 1633861091, 486774840, 2148301134, +- 3600338360, 1268198606, 938871061, 2868504675, 3476308643, 1379640277, 777684494, 3008718712, +- 1310168890, 3541595724, 2943964055, 846639841, 1471879201, 3400857943, 3067468940, 735723002, +- 2102298892, 3762382970, 2619362721, 19901655, 1692534295, 4193118049, 2240594618, 411247564, +- 681945942, 3047836192, 3385552891, 1422167693, 822682701, 2886124859, 3496468704, 1298661782, +- 469546336, 2264093718, 4203901389, 1738379451, 38812283, 2673859341, 3812556502, 2117148576, +- 3268024339, 1606809957, 598006974, 3198893512, 3680933640, 1181316734, 973624229, 2802299603, +- 4052944421, 1822222163, 285065864, 2381456382, 3896478014, 1966106696, 156323219, 2489232613, +- 2759337087, 964150537, 1159127250, 3625517476, 3184831332, 551242258, 1555722185, 3249901247, +- 2535537225, 170842943, 1984954084, 3946848146, 2391651666, 327308324, 1877176831, 4075589769, +- 263086283, 2460058045, 4005602406, 1942963472, 369291216, 2332888742, 4151061373, 1784924683, +- 1022852861, 2717425547, 3717839440, 1083595558, 626782694, 3092517008, 3291821387, 1497027645, +- 1763466407, 4094934481, 2289211402, 360544636, 1890636732, 3988730570, 2447251217, 215086695, +- 1514488465, 3343557607, 3140191804, 639919946, 1139395978, 3739626748, 2726758695, 1065936977, +- }, { +- 0, 3120290792, 2827399569, 293431929, 2323408227, 864534155, 586863858, 2600537882, +- 3481914503, 1987188591, 1729068310, 3740575486, 1173727716, 4228805132, 3983743093, 1418249117, +- 1147313999, 4254680231, 3974377182, 1428157750, 3458136620, 2011505092, 1721256893, 3747844181, +- 2347455432, 839944224, 594403929, 2593536433, 26687147, 3094146371, 2836498234, 283794642, +- 2294627998, 826205558, 541298447, 2578994407, 45702141, 3141697557, 2856315500, 331624836, +- 1196225049, 4273416689, 4023010184, 1446090848, 3442513786, 1959480466, 1706436331, 3696098563, +- 3433538001, 1968994873, 1679888448, 3722103720, 1188807858, 4280295258, 3999102243, 1470541515, +- 53374294, 3134568126, 2879970503, 307431215, 2303854645, 816436189, 567589284, 2553242188, +- 3405478781, 1929420949, 1652411116, 3682996484, 1082596894, 4185703926, 3892424591, 1375368295, +- 91404282, 3163122706, 2918450795, 336584067, 2400113305, 922028401, 663249672, 2658384096, +- 2392450098, 929185754, 639587747, 2682555979, 82149713, 3172883129, 2892181696, 362343208, +- 1091578037, 4176212829, 3918960932, 1349337804, 3412872662, 1922537022, 1676344391, 3658557359, +- 1111377379, 4224032267, 3937989746, 1396912026, 3359776896, 1908013928, 1623494929, 3644803833, +- 2377615716, 877417100, 623982837, 2630542109, 130804743, 3190831087, 2941083030, 381060734, +- 106748588, 3215393092, 2933549885, 388083925, 2350956495, 903570471, 614862430, 2640172470, +- 3386185259, 1882115523, 1632872378, 3634920530, 1135178568, 4199721120, 3945775833, 1389631793, +- 1317531835, 4152109907, 3858841898, 1610259138, 3304822232, 2097172016, 1820140617, 3582394273, +- 2165193788, 955639764, 696815021, 2423477829, 192043359, 2995356343, 2750736590, 437203750, +- 182808564, 3005133852, 2724453989, 462947725, 2157513367, 962777471, 673168134, 2447663342, +- 3312231283, 2090301595, 1844056802, 3557935370, 1326499344, 4142603768, 3885397889, 1584245865, +- 3326266917, 2142836173, 1858371508, 3611272284, 1279175494, 4123357358, 3837270743, 1564721471, +- 164299426, 2955991370, 2706223923, 414607579, 2209834945, 978107433, 724686416, 2462715320, +- 2183156074, 1004243586, 715579643, 2472360723, 140260361, 2980573153, 2698675608, 421617264, +- 1302961645, 4099032581, 3845074044, 1557460884, 3352688782, 2116952934, 1867729183, 3601371895, +- 2222754758, 1032278062, 754596439, 2499928511, 234942117, 3086693709, 2793824052, 528319708, +- 1274365761, 4061043881, 3816027856, 1518873912, 3246989858, 2020800970, 1762628531, 3505670235, +- 3223196809, 2045103969, 1754834200, 3512958704, 1247965674, 4086934018, 3806642299, 1528765331, +- 261609486, 3060532198, 2802936223, 518697591, 2246819181, 1007707781, 762121468, 2492913428, +- 213497176, 3041029808, 2755593417, 499441441, 2261110843, 1061030867, 776167850, 2545465922, +- 3274734047, 2060165687, 1807140942, 3528266662, 1229724860, 4038575956, 3788156205, 1479636677, +- 1222322711, 4045468159, 3764231046, 1504067694, 3265744756, 2069664924, 1780612837, 3554288909, +- 2270357136, 1051278712, 802445057, 2519698665, 221152243, 3033880603, 2779263586, 475261322, +- }, { +- 0, 2926088593, 2275419491, 701019378, 3560000647, 2052709654, 1402038756, 4261017717, +- 1930665807, 3715829470, 4105419308, 1524313021, 2804077512, 155861593, 545453739, 2397726522, +- 3861331614, 1213181711, 1636244477, 3488582252, 840331801, 2625561480, 3048626042, 467584747, +- 2503254481, 995897408, 311723186, 3170637091, 1090907478, 4016929991, 3332753461, 1758288292, +- 390036349, 3109546732, 2426363422, 1056427919, 3272488954, 1835443819, 1152258713, 3938878216, +- 1680663602, 3393484195, 3817652561, 1306808512, 2954733749, 510998820, 935169494, 2580880455, +- 4044899811, 1601229938, 1991794816, 3637571857, 623446372, 2336332021, 2726898695, 216120726, +- 2181814956, 744704829, 95158223, 2881711710, 1446680107, 4166125498, 3516576584, 2146575065, +- 780072698, 2148951915, 2849952665, 129384968, 4199529085, 1411853292, 2112855838, 3548843663, +- 1567451573, 4077254692, 3670887638, 1957027143, 2304517426, 657765539, 251396177, 2694091200, +- 3361327204, 1714510325, 1341779207, 3784408214, 476611811, 2986349938, 2613617024, 899690513, +- 3142211371, 354600634, 1021997640, 2458051545, 1870338988, 3239283261, 3906682575, 1186180958, +- 960597383, 2536053782, 3202459876, 277428597, 3983589632, 1125666961, 1792074851, 3300423154, +- 1246892744, 3829039961, 3455203243, 1671079482, 2657312335, 806080478, 432241452, 3081497277, +- 3748049689, 1896751752, 1489409658, 4138600427, 190316446, 2772397583, 2365053693, 580864876, +- 2893360214, 35503559, 735381813, 2243795108, 2017747153, 3593269568, 4293150130, 1368183843, +- 1560145396, 4069882981, 3680356503, 1966430470, 2295112051, 648294626, 258769936, 2701399425, +- 804156091, 2173100842, 2823706584, 103204425, 4225711676, 1438101421, 2088704863, 3524758222, +- 3134903146, 347226875, 1031468553, 2467456920, 1860935661, 3229814396, 3914054286, 1193487135, +- 3385412645, 1738661300, 1315531078, 3758225623, 502792354, 3012596019, 2589468097, 875607120, +- 1271043721, 3853125400, 3429020650, 1644831355, 2683558414, 832261023, 408158061, 3057348348, +- 953223622, 2528745559, 3211865253, 286899508, 3974120769, 1116263632, 1799381026, 3307794867, +- 2917509143, 59586950, 709201268, 2217549029, 2043995280, 3619452161, 4269064691, 1344032866, +- 3740677976, 1889445577, 1498812987, 4148069290, 180845535, 2762992206, 2372361916, 588238637, +- 1921194766, 3706423967, 4112727661, 1531686908, 2796705673, 148555288, 554857194, 2407195515, +- 26248257, 2952271312, 2251333922, 676868275, 3584149702, 2076793175, 1375858085, 4234771508, +- 2493785488, 986493953, 319029491, 3178008930, 1083533591, 4009621638, 3342158964, 1767759333, +- 3887577823, 1239362382, 1612160956, 3464433197, 864482904, 2649647049, 3022443323, 441336490, +- 1706844275, 3419730402, 3793503504, 1282724993, 2978819316, 535149925, 908921239, 2554697734, +- 380632892, 3100077741, 2433735263, 1063734222, 3265180603, 1828069930, 1161729752, 3948283721, +- 2207997677, 770953084, 71007118, 2857626143, 1470763626, 4190274555, 3490330377, 2120394392, +- 4035494306, 1591758899, 1999168705, 3644880208, 616140069, 2328960180, 2736367686, 225524183, +- }, +-}; ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-static const uint8_t +-WUFFS_CRC32__IEEE_X86_SSE42_K1K2[16] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 212, 43, 68, 84, 1, 0, 0, 0, +- 150, 21, 228, 198, 1, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_CRC32__IEEE_X86_SSE42_K3K4[16] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 208, 151, 25, 117, 1, 0, 0, 0, +- 158, 0, 170, 204, 0, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ[16] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 36, 97, 205, 99, 1, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_CRC32__IEEE_X86_SSE42_PXMU[16] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 65, 6, 113, 219, 1, 0, 0, 0, +- 65, 22, 1, 247, 1, 0, 0, 0, +-}; +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x); ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ label__outer__continue:; ++ while (true) { ++ while (self->private_impl.f_pending_pad > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; ++ } ++ self->private_impl.f_pending_pad -= 1u; ++ iop_a_src += 1u; ++ } ++ while (true) { ++ if (self->private_impl.f_dst_x == self->private_impl.f_width) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ if (self->private_impl.f_height > 0u) { ++ self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; ++ } ++ goto label__outer__break; ++ } else if (self->private_impl.f_pad_per_row != 0u) { ++ self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row; ++ goto label__outer__continue; ++ } ++ } ++ v_p1_temp = ((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x)); ++ v_p1 = wuffs_base__u32__min(v_p1_temp, 256u); ++ v_p0 = 0u; ++ while (v_p0 < v_p1) { ++ if (self->private_impl.f_bits_per_pixel == 16u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ break; ++ } ++ v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2u; ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ break; ++ } ++ v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4u; ++ } ++ v_channel = 0u; ++ while (v_channel < 4u) { ++ if (self->private_impl.f_channel_num_bits[v_channel] == 0u) { ++ self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = 255u; ++ self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = 255u; ++ } else { ++ v_c = ((v_c32 & self->private_impl.f_channel_masks[v_channel]) >> self->private_impl.f_channel_shifts[v_channel]); ++ v_num_bits = ((uint32_t)(self->private_impl.f_channel_num_bits[v_channel])); ++ while (v_num_bits < 16u) { ++ v_c |= ((uint32_t)(v_c << v_num_bits)); ++ v_num_bits *= 2u; ++ } ++ v_c >>= (v_num_bits - 16u); ++ self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = ((uint8_t)((v_c >> 0u))); ++ self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = ((uint8_t)((v_c >> 8u))); ++ } ++ v_channel += 1u; ++ } ++ v_p0 += 1u; ++ } ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i >= ((uint64_t)(v_dst.len))) { ++ v_n = ((uint64_t)(v_p0)); ++ } else { ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, (8u * v_p0))); ++ } ++ if (v_n == 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ } ++ } ++ label__outer__break:; ++ status = wuffs_base__make_status(NULL); ++ goto ok; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up__choosy_default( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x); ++ ok: ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_arm_crc32( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) ++ return status; ++} + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_x86_avx2( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) ++// -------- func bmp.decoder.swizzle_low_bit_depth + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_x86_sse42( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- +-// ---------------- VTables +- +-const wuffs_base__hasher_u32__func_ptrs +-wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32 = { +- (uint32_t(*)(const void*))(&wuffs_crc32__ieee_hasher__checksum_u32), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_crc32__ieee_hasher__get_quirk), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_crc32__ieee_hasher__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update), +- (uint32_t(*)(void*, +- wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update_u32), +-}; ++static wuffs_base__status ++wuffs_bmp__decoder__swizzle_low_bit_depth( ++ wuffs_bmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// ---------------- Initializer Implementations ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_n = 0; ++ uint32_t v_p0 = 0; ++ uint32_t v_chunk_bits = 0; ++ uint32_t v_chunk_count = 0; ++ uint32_t v_pixels_per_chunk = 0; + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_crc32__ieee_hasher__initialize( +- wuffs_crc32__ieee_hasher* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ while (true) { ++ if (self->private_impl.f_dst_x == self->private_impl.f_width) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ break; ++ } + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i >= ((uint64_t)(v_dst.len))) { ++ if (self->private_impl.f_bits_per_pixel == 1u) { ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u); ++ v_pixels_per_chunk = 32u; ++ } else if (self->private_impl.f_bits_per_pixel == 2u) { ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u); ++ v_pixels_per_chunk = 16u; ++ } else { ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u); ++ v_pixels_per_chunk = 8u; ++ } ++ while ((v_chunk_count >= 64u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 256u)) { ++ iop_a_src += 256u; ++ self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 64u)))); ++ v_chunk_count -= 64u; ++ } ++ while ((v_chunk_count >= 8u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 32u)) { ++ iop_a_src += 32u; ++ self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 8u)))); ++ v_chunk_count -= 8u; ++ } ++ while (v_chunk_count > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; ++ } ++ iop_a_src += 4u; ++ self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 1u)))); ++ v_chunk_count -= 1u; ++ } ++ continue; ++ } ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i); ++ v_p0 = 0u; ++ if (self->private_impl.f_bits_per_pixel == 1u) { ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u); ++ v_chunk_count = wuffs_base__u32__min(v_chunk_count, 16u); ++ while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { ++ v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4u; ++ self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((1u & (v_chunk_bits >> 31u)))); ++ self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((1u & (v_chunk_bits >> 30u)))); ++ self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((1u & (v_chunk_bits >> 29u)))); ++ self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((1u & (v_chunk_bits >> 28u)))); ++ self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((1u & (v_chunk_bits >> 27u)))); ++ self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((1u & (v_chunk_bits >> 26u)))); ++ self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((1u & (v_chunk_bits >> 25u)))); ++ self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((1u & (v_chunk_bits >> 24u)))); ++ self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((1u & (v_chunk_bits >> 23u)))); ++ self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((1u & (v_chunk_bits >> 22u)))); ++ self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((1u & (v_chunk_bits >> 21u)))); ++ self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((1u & (v_chunk_bits >> 20u)))); ++ self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((1u & (v_chunk_bits >> 19u)))); ++ self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((1u & (v_chunk_bits >> 18u)))); ++ self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((1u & (v_chunk_bits >> 17u)))); ++ self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((1u & (v_chunk_bits >> 16u)))); ++ self->private_data.f_scratch[(v_p0 + 16u)] = ((uint8_t)((1u & (v_chunk_bits >> 15u)))); ++ self->private_data.f_scratch[(v_p0 + 17u)] = ((uint8_t)((1u & (v_chunk_bits >> 14u)))); ++ self->private_data.f_scratch[(v_p0 + 18u)] = ((uint8_t)((1u & (v_chunk_bits >> 13u)))); ++ self->private_data.f_scratch[(v_p0 + 19u)] = ((uint8_t)((1u & (v_chunk_bits >> 12u)))); ++ self->private_data.f_scratch[(v_p0 + 20u)] = ((uint8_t)((1u & (v_chunk_bits >> 11u)))); ++ self->private_data.f_scratch[(v_p0 + 21u)] = ((uint8_t)((1u & (v_chunk_bits >> 10u)))); ++ self->private_data.f_scratch[(v_p0 + 22u)] = ((uint8_t)((1u & (v_chunk_bits >> 9u)))); ++ self->private_data.f_scratch[(v_p0 + 23u)] = ((uint8_t)((1u & (v_chunk_bits >> 8u)))); ++ self->private_data.f_scratch[(v_p0 + 24u)] = ((uint8_t)((1u & (v_chunk_bits >> 7u)))); ++ self->private_data.f_scratch[(v_p0 + 25u)] = ((uint8_t)((1u & (v_chunk_bits >> 6u)))); ++ self->private_data.f_scratch[(v_p0 + 26u)] = ((uint8_t)((1u & (v_chunk_bits >> 5u)))); ++ self->private_data.f_scratch[(v_p0 + 27u)] = ((uint8_t)((1u & (v_chunk_bits >> 4u)))); ++ self->private_data.f_scratch[(v_p0 + 28u)] = ((uint8_t)((1u & (v_chunk_bits >> 3u)))); ++ self->private_data.f_scratch[(v_p0 + 29u)] = ((uint8_t)((1u & (v_chunk_bits >> 2u)))); ++ self->private_data.f_scratch[(v_p0 + 30u)] = ((uint8_t)((1u & (v_chunk_bits >> 1u)))); ++ self->private_data.f_scratch[(v_p0 + 31u)] = ((uint8_t)((1u & (v_chunk_bits >> 0u)))); ++ v_p0 = ((v_p0 & 511u) + 32u); ++ v_chunk_count -= 1u; ++ } ++ } else if (self->private_impl.f_bits_per_pixel == 2u) { ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u); ++ v_chunk_count = wuffs_base__u32__min(v_chunk_count, 32u); ++ while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { ++ v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4u; ++ self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((3u & (v_chunk_bits >> 30u)))); ++ self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((3u & (v_chunk_bits >> 28u)))); ++ self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((3u & (v_chunk_bits >> 26u)))); ++ self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((3u & (v_chunk_bits >> 24u)))); ++ self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((3u & (v_chunk_bits >> 22u)))); ++ self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((3u & (v_chunk_bits >> 20u)))); ++ self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((3u & (v_chunk_bits >> 18u)))); ++ self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((3u & (v_chunk_bits >> 16u)))); ++ self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((3u & (v_chunk_bits >> 14u)))); ++ self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((3u & (v_chunk_bits >> 12u)))); ++ self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((3u & (v_chunk_bits >> 10u)))); ++ self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((3u & (v_chunk_bits >> 8u)))); ++ self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((3u & (v_chunk_bits >> 6u)))); ++ self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((3u & (v_chunk_bits >> 4u)))); ++ self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((3u & (v_chunk_bits >> 2u)))); ++ self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((3u & (v_chunk_bits >> 0u)))); ++ v_p0 = ((v_p0 & 511u) + 16u); ++ v_chunk_count -= 1u; ++ } + } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u); ++ v_chunk_count = wuffs_base__u32__min(v_chunk_count, 64u); ++ while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { ++ v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4u; ++ self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 28u)))); ++ self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 24u)))); ++ self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 20u)))); ++ self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 16u)))); ++ self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u)))); ++ self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u)))); ++ self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u)))); ++ self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u)))); ++ v_p0 = ((v_p0 & 511u) + 8u); ++ v_chunk_count -= 1u; ++ } ++ } ++ v_p0 = wuffs_base__u32__min(v_p0, wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x)); ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0)); ++ if (v_n == 0u) { ++ status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read); ++ goto ok; + } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); + } ++ status = wuffs_base__make_status(NULL); ++ goto ok; + +- self->private_impl.choosy_up = &wuffs_crc32__ieee_hasher__up__choosy_default; ++ ok: ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = +- wuffs_base__hasher_u32__vtable_name; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = +- (const void*)(&wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32); +- return wuffs_base__make_status(NULL); ++ return status; + } + +-wuffs_crc32__ieee_hasher* +-wuffs_crc32__ieee_hasher__alloc(void) { +- wuffs_crc32__ieee_hasher* x = +- (wuffs_crc32__ieee_hasher*)(calloc(sizeof(wuffs_crc32__ieee_hasher), 1)); +- if (!x) { +- return NULL; ++// -------- func bmp.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_bmp__decoder__frame_dirty_rect( ++ const wuffs_bmp__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); + } +- if (wuffs_crc32__ieee_hasher__initialize( +- x, sizeof(wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); + } +- return x; +-} + +-size_t +-sizeof__wuffs_crc32__ieee_hasher(void) { +- return sizeof(wuffs_crc32__ieee_hasher); ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); + } + +-// ---------------- Function Implementations +- +-// -------- func crc32.ieee_hasher.get_quirk ++// -------- func bmp.decoder.num_animation_loops + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_crc32__ieee_hasher__get_quirk( +- const wuffs_crc32__ieee_hasher* self, +- uint32_t a_key) { ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_bmp__decoder__num_animation_loops( ++ const wuffs_bmp__decoder* self) { + if (!self) { + return 0; + } +@@ -33524,709 +33654,531 @@ wuffs_crc32__ieee_hasher__get_quirk( + return 0u; + } + +-// -------- func crc32.ieee_hasher.set_quirk ++// -------- func bmp.decoder.num_decoded_frame_configs + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_crc32__ieee_hasher__set_quirk( +- wuffs_crc32__ieee_hasher* self, +- uint32_t a_key, +- uint64_t a_value) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_bmp__decoder__num_decoded_frame_configs( ++ const wuffs_bmp__decoder* self) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return 0; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; + } + +-// -------- func crc32.ieee_hasher.update ++// -------- func bmp.decoder.num_decoded_frames + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__update( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_bmp__decoder__num_decoded_frames( ++ const wuffs_bmp__decoder* self) { + if (!self) { +- return wuffs_base__make_empty_struct(); ++ return 0; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- if (self->private_impl.f_state == 0u) { +- self->private_impl.choosy_up = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) +- wuffs_base__cpu_arch__have_arm_crc32() ? &wuffs_crc32__ieee_hasher__up_arm_crc32 : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +- wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_crc32__ieee_hasher__up_x86_avx2 : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc32__ieee_hasher__up_x86_sse42 : +-#endif +- self->private_impl.choosy_up); ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; + } +- wuffs_crc32__ieee_hasher__up(self, a_x); +- return wuffs_base__make_empty_struct(); ++ return 0u; + } + +-// -------- func crc32.ieee_hasher.update_u32 ++// -------- func bmp.decoder.restart_frame + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_crc32__ieee_hasher__update_u32( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__restart_frame( ++ wuffs_bmp__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { + if (!self) { +- return 0; ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- wuffs_crc32__ieee_hasher__update(self, a_x); +- return self->private_impl.f_state; ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if (a_index != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ self->private_impl.f_frame_config_io_position = a_io_position; ++ return wuffs_base__make_status(NULL); + } + +-// -------- func crc32.ieee_hasher.up ++// -------- func bmp.decoder.set_report_metadata + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { +- return (*self->private_impl.choosy_up)(self, a_x); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_bmp__decoder__set_report_metadata( ++ wuffs_bmp__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); + } + ++// -------- func bmp.decoder.tell_me_more ++ + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up__choosy_default( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s = 0; +- wuffs_base__slice_u8 v_p = {0}; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_bmp__decoder__tell_me_more( ++ wuffs_bmp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- v_s = (4294967295u ^ self->private_impl.f_state); +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 16; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32); +- while (v_p.ptr < i_end0_p) { +- v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | +- (((uint32_t)(v_p.ptr[1u])) << 8u) | +- (((uint32_t)(v_p.ptr[2u])) << 16u) | +- (((uint32_t)(v_p.ptr[3u])) << 24u)); +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ +- WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ +- WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ +- WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ +- WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ +- WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ +- WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ +- WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ +- WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ +- WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ +- WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ +- WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ +- WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ +- WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ +- WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ +- WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); +- v_p.ptr += 16; +- v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | +- (((uint32_t)(v_p.ptr[1u])) << 8u) | +- (((uint32_t)(v_p.ptr[2u])) << 16u) | +- (((uint32_t)(v_p.ptr[3u])) << 24u)); +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ +- WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ +- WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ +- WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ +- WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ +- WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ +- WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ +- WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ +- WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ +- WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ +- WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ +- WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ +- WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ +- WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ +- WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ +- WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); +- v_p.ptr += 16; +- } +- v_p.len = 16; +- uint8_t* i_end1_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16); +- while (v_p.ptr < i_end1_p) { +- v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | +- (((uint32_t)(v_p.ptr[1u])) << 8u) | +- (((uint32_t)(v_p.ptr[2u])) << 16u) | +- (((uint32_t)(v_p.ptr[3u])) << 24u)); +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ +- WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ +- WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ +- WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ +- WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ +- WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ +- WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ +- WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ +- WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ +- WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ +- WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ +- WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ +- WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ +- WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ +- WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ +- WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); +- v_p.ptr += 16; +- } +- v_p.len = 1; +- uint8_t* i_end2_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end2_p) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ v_p.ptr[0u])] ^ (v_s >> 8u)); +- v_p.ptr += 1; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_tell_me_more; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_bmp__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- v_p.len = 0; ++ ++ ok: ++ self->private_impl.p_tell_me_more = 0; ++ goto exit; + } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; + } + +-// -------- func crc32.ieee_hasher.checksum_u32 ++// -------- func bmp.decoder.do_tell_me_more + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_crc32__ieee_hasher__checksum_u32( +- const wuffs_crc32__ieee_hasher* self) { +- if (!self) { +- return 0; ++static wuffs_base__status ++wuffs_bmp__decoder__do_tell_me_more( ++ wuffs_bmp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ if (self->private_impl.f_io_redirect_fourcc <= 1u) { ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ 1u, ++ self->private_impl.f_io_redirect_fourcc, ++ 0u, ++ self->private_impl.f_io_redirect_pos, ++ 18446744073709551615u); + } ++ self->private_impl.f_io_redirect_fourcc = 1u; + +- return self->private_impl.f_state; ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ return status; + } + +-// ‼ WUFFS MULTI-FILE SECTION +arm_crc32 +-// -------- func crc32.ieee_hasher.up_arm_crc32 ++// -------- func bmp.decoder.workbuf_len + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_arm_crc32( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { +- wuffs_base__slice_u8 v_p = {0}; +- uint32_t v_s = 0; +- +- v_s = (4294967295u ^ self->private_impl.f_state); +- while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { +- v_s = __crc32b(v_s, a_x.ptr[0u]); +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_bmp__decoder__workbuf_len( ++ const wuffs_bmp__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 8; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 128) * 128); +- while (v_p.ptr < i_end0_p) { +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- } +- v_p.len = 8; +- uint8_t* i_end1_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8); +- while (v_p.ptr < i_end1_p) { +- v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); +- v_p.ptr += 8; +- } +- v_p.len = 1; +- uint8_t* i_end2_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end2_p) { +- v_s = __crc32b(v_s, v_p.ptr[0u]); +- v_p.ptr += 1; +- } +- v_p.len = 0; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32) +-// ‼ WUFFS MULTI-FILE SECTION -arm_crc32 + +-// ‼ WUFFS MULTI-FILE SECTION +x86_avx2 +-// -------- func crc32.ieee_hasher.up_x86_avx2 ++// -------- func bmp.decoder.read_palette + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_x86_avx2( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s = 0; +- wuffs_base__slice_u8 v_p = {0}; +- __m128i v_k = {0}; +- __m128i v_x0 = {0}; +- __m128i v_x1 = {0}; +- __m128i v_x2 = {0}; +- __m128i v_x3 = {0}; +- __m128i v_y0 = {0}; +- __m128i v_y1 = {0}; +- __m128i v_y2 = {0}; +- __m128i v_y3 = {0}; +- uint64_t v_tail_index = 0; ++static wuffs_base__status ++wuffs_bmp__decoder__read_palette( ++ wuffs_bmp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- v_s = (4294967295u ^ self->private_impl.f_state); +- while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ a_x.ptr[0u])] ^ (v_s >> 8u)); +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); ++ uint32_t v_i = 0; ++ uint32_t v_argb = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (((uint64_t)(a_x.len)) < 64u) { +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ v_p.ptr[0u])] ^ (v_s >> 8u)); +- v_p.ptr += 1; ++ ++ uint32_t coro_susp_point = self->private_impl.p_read_palette; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_read_palette.v_i; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_bitmap_info_len == 12u) { ++ while ((v_i < 256u) && (self->private_impl.f_padding >= 3u)) { ++ self->private_impl.f_padding -= 3u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { ++ t_0 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); ++ iop_a_src += 3; ++ } else { ++ self->private_data.s_read_palette.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_read_palette.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 16) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_argb = t_0; ++ } ++ v_argb |= 4278190080u; ++ self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); ++ self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); ++ self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); ++ v_i += 1u; ++ } ++ } else { ++ while ((v_i < 256u) && (self->private_impl.f_padding >= 4u)) { ++ self->private_impl.f_padding -= 4u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_read_palette.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_read_palette.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_argb = t_1; ++ } ++ v_argb |= 4278190080u; ++ self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); ++ self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); ++ self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); ++ v_i += 1u; + } +- v_p.len = 0; + } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); +- } +- v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)); +- v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); +- v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)); +- v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)); +- v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s))); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K1K2)); +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, 64u); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 64; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64); +- while (v_p.ptr < i_end0_p) { +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_y1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u)); +- v_y2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(0u)); +- v_y3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(17u)); +- v_x2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(17u)); +- v_x3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(_mm_xor_si128(v_x0, v_y0), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 0u))); +- v_x1 = _mm_xor_si128(_mm_xor_si128(v_x1, v_y1), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u))); +- v_x2 = _mm_xor_si128(_mm_xor_si128(v_x2, v_y2), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 32u))); +- v_x3 = _mm_xor_si128(_mm_xor_si128(v_x3, v_y3), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 48u))); +- v_p.ptr += 64; ++ while (v_i < 256u) { ++ self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u; ++ v_i += 1u; + } +- v_p.len = 0; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_read_palette = 0; ++ goto exit; + } +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K3K4)); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x2); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x3); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_x1 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(16u)); +- v_x2 = _mm_set_epi32((int32_t)(0u), (int32_t)(4294967295u), (int32_t)(0u), (int32_t)(4294967295u)); +- v_x0 = _mm_srli_si128(v_x0, (int32_t)(8u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ)); +- v_x1 = _mm_srli_si128(v_x0, (int32_t)(4u)); +- v_x0 = _mm_and_si128(v_x0, v_x2); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_PXMU)); +- v_x1 = _mm_and_si128(v_x0, v_x2); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(16u)); +- v_x1 = _mm_and_si128(v_x1, v_x2); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_s = ((uint32_t)(_mm_extract_epi32(v_x0, (int32_t)(1u)))); +- v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551552u); +- if (v_tail_index < ((uint64_t)(a_x.len))) { +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ v_p.ptr[0u])] ^ (v_s >> 8u)); +- v_p.ptr += 1; +- } +- v_p.len = 0; +- } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_read_palette = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_read_palette.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); ++ ++ return status; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) +-// ‼ WUFFS MULTI-FILE SECTION -x86_avx2 + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func crc32.ieee_hasher.up_x86_sse42 ++// -------- func bmp.decoder.process_masks + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_crc32__ieee_hasher__up_x86_sse42( +- wuffs_crc32__ieee_hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_s = 0; +- wuffs_base__slice_u8 v_p = {0}; +- __m128i v_k = {0}; +- __m128i v_x0 = {0}; +- __m128i v_x1 = {0}; +- __m128i v_x2 = {0}; +- __m128i v_x3 = {0}; +- __m128i v_y0 = {0}; +- __m128i v_y1 = {0}; +- __m128i v_y2 = {0}; +- __m128i v_y3 = {0}; +- uint64_t v_tail_index = 0; ++static wuffs_base__status ++wuffs_bmp__decoder__process_masks( ++ wuffs_bmp__decoder* self) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- v_s = (4294967295u ^ self->private_impl.f_state); +- while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ a_x.ptr[0u])] ^ (v_s >> 8u)); +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); +- } +- if (((uint64_t)(a_x.len)) < 64u) { +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ v_p.ptr[0u])] ^ (v_s >> 8u)); +- v_p.ptr += 1; ++ uint32_t v_i = 0; ++ uint32_t v_mask = 0; ++ uint32_t v_n = 0; ++ ++ while (v_i < 4u) { ++ v_mask = self->private_impl.f_channel_masks[v_i]; ++ if (v_mask != 0u) { ++ v_n = 0u; ++ while ((v_mask & 1u) == 0u) { ++ v_n += 1u; ++ v_mask >>= 1u; + } +- v_p.len = 0; +- } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); +- } +- v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)); +- v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); +- v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)); +- v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)); +- v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s))); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K1K2)); +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, 64u); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 64; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64); +- while (v_p.ptr < i_end0_p) { +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_y1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u)); +- v_y2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(0u)); +- v_y3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(17u)); +- v_x2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(17u)); +- v_x3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(_mm_xor_si128(v_x0, v_y0), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 0u))); +- v_x1 = _mm_xor_si128(_mm_xor_si128(v_x1, v_y1), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u))); +- v_x2 = _mm_xor_si128(_mm_xor_si128(v_x2, v_y2), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 32u))); +- v_x3 = _mm_xor_si128(_mm_xor_si128(v_x3, v_y3), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 48u))); +- v_p.ptr += 64; +- } +- v_p.len = 0; +- } +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K3K4)); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x2); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u)); +- v_x0 = _mm_xor_si128(v_x0, v_x3); +- v_x0 = _mm_xor_si128(v_x0, v_y0); +- v_x1 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(16u)); +- v_x2 = _mm_set_epi32((int32_t)(0u), (int32_t)(4294967295u), (int32_t)(0u), (int32_t)(4294967295u)); +- v_x0 = _mm_srli_si128(v_x0, (int32_t)(8u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ)); +- v_x1 = _mm_srli_si128(v_x0, (int32_t)(4u)); +- v_x0 = _mm_and_si128(v_x0, v_x2); +- v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_PXMU)); +- v_x1 = _mm_and_si128(v_x0, v_x2); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(16u)); +- v_x1 = _mm_and_si128(v_x1, v_x2); +- v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u)); +- v_x0 = _mm_xor_si128(v_x0, v_x1); +- v_s = ((uint32_t)(_mm_extract_epi32(v_x0, (int32_t)(1u)))); +- v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551552u); +- if (v_tail_index < ((uint64_t)(a_x.len))) { +- { +- wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index); +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 1; +- uint8_t* i_end0_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end0_p) { +- v_s = (WUFFS_CRC32__IEEE_TABLE[0u][(((uint8_t)(v_s)) ^ v_p.ptr[0u])] ^ (v_s >> 8u)); +- v_p.ptr += 1; ++ self->private_impl.f_channel_shifts[v_i] = ((uint8_t)((v_n & 31u))); ++ v_n = 0u; ++ while ((v_mask & 1u) == 1u) { ++ v_n += 1u; ++ v_mask >>= 1u; + } +- v_p.len = 0; ++ if ((v_mask != 0u) || (v_n > 32u)) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_channel_num_bits[v_i] = ((uint8_t)(v_n)); ++ } else if (v_i != 3u) { ++ status = wuffs_base__make_status(wuffs_bmp__error__bad_header); ++ goto exit; + } ++ v_i += 1u; + } +- self->private_impl.f_state = (4294967295u ^ v_s); +- return wuffs_base__make_empty_struct(); ++ ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ return status; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) + + // ---------------- Status Codes Implementations + +-const char wuffs_deflate__error__bad_huffman_code_over_subscribed[] = "#deflate: bad Huffman code (over-subscribed)"; +-const char wuffs_deflate__error__bad_huffman_code_under_subscribed[] = "#deflate: bad Huffman code (under-subscribed)"; +-const char wuffs_deflate__error__bad_huffman_code_length_count[] = "#deflate: bad Huffman code length count"; +-const char wuffs_deflate__error__bad_huffman_code_length_repetition[] = "#deflate: bad Huffman code length repetition"; +-const char wuffs_deflate__error__bad_huffman_code[] = "#deflate: bad Huffman code"; +-const char wuffs_deflate__error__bad_huffman_minimum_code_length[] = "#deflate: bad Huffman minimum code length"; +-const char wuffs_deflate__error__bad_block[] = "#deflate: bad block"; +-const char wuffs_deflate__error__bad_distance[] = "#deflate: bad distance"; +-const char wuffs_deflate__error__bad_distance_code_count[] = "#deflate: bad distance code count"; +-const char wuffs_deflate__error__bad_literal_length_code_count[] = "#deflate: bad literal/length code count"; +-const char wuffs_deflate__error__inconsistent_stored_block_length[] = "#deflate: inconsistent stored block length"; +-const char wuffs_deflate__error__missing_end_of_block_code[] = "#deflate: missing end-of-block code"; +-const char wuffs_deflate__error__no_huffman_codes[] = "#deflate: no Huffman codes"; +-const char wuffs_deflate__error__truncated_input[] = "#deflate: truncated input"; +-const char wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state[] = "#deflate: internal error: inconsistent Huffman decoder state"; +-const char wuffs_deflate__error__internal_error_inconsistent_i_o[] = "#deflate: internal error: inconsistent I/O"; +-const char wuffs_deflate__error__internal_error_inconsistent_distance[] = "#deflate: internal error: inconsistent distance"; +-const char wuffs_deflate__error__internal_error_inconsistent_n_bits[] = "#deflate: internal error: inconsistent n_bits"; ++const char wuffs_bzip2__error__bad_huffman_code_over_subscribed[] = "#bzip2: bad Huffman code (over-subscribed)"; ++const char wuffs_bzip2__error__bad_huffman_code_under_subscribed[] = "#bzip2: bad Huffman code (under-subscribed)"; ++const char wuffs_bzip2__error__bad_block_header[] = "#bzip2: bad block header"; ++const char wuffs_bzip2__error__bad_block_length[] = "#bzip2: bad block length"; ++const char wuffs_bzip2__error__bad_checksum[] = "#bzip2: bad checksum"; ++const char wuffs_bzip2__error__bad_header[] = "#bzip2: bad header"; ++const char wuffs_bzip2__error__bad_number_of_sections[] = "#bzip2: bad number of sections"; ++const char wuffs_bzip2__error__truncated_input[] = "#bzip2: truncated input"; ++const char wuffs_bzip2__error__unsupported_block_randomization[] = "#bzip2: unsupported block randomization"; ++const char wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state[] = "#bzip2: internal error: inconsistent Huffman decoder state"; + + // ---------------- Private Consts + + static const uint8_t +-WUFFS_DEFLATE__CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 16, 17, 18, 0, 8, 7, 9, 6, +- 10, 5, 11, 4, 12, 3, 13, 2, +- 14, 1, 15, +-}; +- +-static const uint8_t +-WUFFS_DEFLATE__REVERSE8[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 128, 64, 192, 32, 160, 96, 224, +- 16, 144, 80, 208, 48, 176, 112, 240, +- 8, 136, 72, 200, 40, 168, 104, 232, +- 24, 152, 88, 216, 56, 184, 120, 248, +- 4, 132, 68, 196, 36, 164, 100, 228, +- 20, 148, 84, 212, 52, 180, 116, 244, +- 12, 140, 76, 204, 44, 172, 108, 236, +- 28, 156, 92, 220, 60, 188, 124, 252, +- 2, 130, 66, 194, 34, 162, 98, 226, +- 18, 146, 82, 210, 50, 178, 114, 242, +- 10, 138, 74, 202, 42, 170, 106, 234, +- 26, 154, 90, 218, 58, 186, 122, 250, +- 6, 134, 70, 198, 38, 166, 102, 230, +- 22, 150, 86, 214, 54, 182, 118, 246, +- 14, 142, 78, 206, 46, 174, 110, 238, +- 30, 158, 94, 222, 62, 190, 126, 254, +- 1, 129, 65, 193, 33, 161, 97, 225, +- 17, 145, 81, 209, 49, 177, 113, 241, +- 9, 137, 73, 201, 41, 169, 105, 233, +- 25, 153, 89, 217, 57, 185, 121, 249, +- 5, 133, 69, 197, 37, 165, 101, 229, +- 21, 149, 85, 213, 53, 181, 117, 245, +- 13, 141, 77, 205, 45, 173, 109, 237, +- 29, 157, 93, 221, 61, 189, 125, 253, +- 3, 131, 67, 195, 35, 163, 99, 227, +- 19, 147, 83, 211, 51, 179, 115, 243, +- 11, 139, 75, 203, 43, 171, 107, 235, +- 27, 155, 91, 219, 59, 187, 123, 251, +- 7, 135, 71, 199, 39, 167, 103, 231, +- 23, 151, 87, 215, 55, 183, 119, 247, +- 15, 143, 79, 207, 47, 175, 111, 239, +- 31, 159, 95, 223, 63, 191, 127, 255, +-}; +- +-static const uint32_t +-WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1073741824, 1073742080, 1073742336, 1073742592, 1073742848, 1073743104, 1073743360, 1073743616, +- 1073743888, 1073744400, 1073744912, 1073745424, 1073745952, 1073746976, 1073748000, 1073749024, +- 1073750064, 1073752112, 1073754160, 1073756208, 1073758272, 1073762368, 1073766464, 1073770560, +- 1073774672, 1073782864, 1073791056, 1073799248, 1073807104, 134217728, 134217728, 134217728, ++WUFFS_BZIP2__CLAMP_TO_5[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 1u, 2u, 3u, 4u, 5u, 5u, 5u, + }; + + static const uint32_t +-WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1073741824, 1073742080, 1073742336, 1073742592, 1073742864, 1073743376, 1073743904, 1073744928, +- 1073745968, 1073748016, 1073750080, 1073754176, 1073758288, 1073766480, 1073774688, 1073791072, +- 1073807472, 1073840240, 1073873024, 1073938560, 1074004112, 1074135184, 1074266272, 1074528416, +- 1074790576, 1075314864, 1075839168, 1076887744, 1077936336, 1080033488, 134217728, 134217728, ++WUFFS_BZIP2__REV_CRC32_TABLE[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 79764919u, 159529838u, 222504665u, 319059676u, 398814059u, 445009330u, 507990021u, ++ 638119352u, 583659535u, 797628118u, 726387553u, 890018660u, 835552979u, 1015980042u, 944750013u, ++ 1276238704u, 1221641927u, 1167319070u, 1095957929u, 1595256236u, 1540665371u, 1452775106u, 1381403509u, ++ 1780037320u, 1859660671u, 1671105958u, 1733955601u, 2031960084u, 2111593891u, 1889500026u, 1952343757u, ++ 2552477408u, 2632100695u, 2443283854u, 2506133561u, 2334638140u, 2414271883u, 2191915858u, 2254759653u, ++ 3190512472u, 3135915759u, 3081330742u, 3009969537u, 2905550212u, 2850959411u, 2762807018u, 2691435357u, ++ 3560074640u, 3505614887u, 3719321342u, 3648080713u, 3342211916u, 3287746299u, 3467911202u, 3396681109u, ++ 4063920168u, 4143685023u, 4223187782u, 4286162673u, 3779000052u, 3858754371u, 3904687514u, 3967668269u, ++ 881225847u, 809987520u, 1023691545u, 969234094u, 662832811u, 591600412u, 771767749u, 717299826u, ++ 311336399u, 374308984u, 453813921u, 533576470u, 25881363u, 88864420u, 134795389u, 214552010u, ++ 2023205639u, 2086057648u, 1897238633u, 1976864222u, 1804852699u, 1867694188u, 1645340341u, 1724971778u, ++ 1587496639u, 1516133128u, 1461550545u, 1406951526u, 1302016099u, 1230646740u, 1142491917u, 1087903418u, ++ 2896545431u, 2825181984u, 2770861561u, 2716262478u, 3215044683u, 3143675388u, 3055782693u, 3001194130u, ++ 2326604591u, 2389456536u, 2200899649u, 2280525302u, 2578013683u, 2640855108u, 2418763421u, 2498394922u, ++ 3769900519u, 3832873040u, 3912640137u, 3992402750u, 4088425275u, 4151408268u, 4197601365u, 4277358050u, ++ 3334271071u, 3263032808u, 3476998961u, 3422541446u, 3585640067u, 3514407732u, 3694837229u, 3640369242u, ++ 1762451694u, 1842216281u, 1619975040u, 1682949687u, 2047383090u, 2127137669u, 1938468188u, 2001449195u, ++ 1325665622u, 1271206113u, 1183200824u, 1111960463u, 1543535498u, 1489069629u, 1434599652u, 1363369299u, ++ 622672798u, 568075817u, 748617968u, 677256519u, 907627842u, 853037301u, 1067152940u, 995781531u, ++ 51762726u, 131386257u, 177728840u, 240578815u, 269590778u, 349224269u, 429104020u, 491947555u, ++ 4046411278u, 4126034873u, 4172115296u, 4234965207u, 3794477266u, 3874110821u, 3953728444u, 4016571915u, ++ 3609705398u, 3555108353u, 3735388376u, 3664026991u, 3290680682u, 3236090077u, 3449943556u, 3378572211u, ++ 3174993278u, 3120533705u, 3032266256u, 2961025959u, 2923101090u, 2868635157u, 2813903052u, 2742672763u, ++ 2604032198u, 2683796849u, 2461293480u, 2524268063u, 2284983834u, 2364738477u, 2175806836u, 2238787779u, ++ 1569362073u, 1498123566u, 1409854455u, 1355396672u, 1317987909u, 1246755826u, 1192025387u, 1137557660u, ++ 2072149281u, 2135122070u, 1912620623u, 1992383480u, 1753615357u, 1816598090u, 1627664531u, 1707420964u, ++ 295390185u, 358241886u, 404320391u, 483945776u, 43990325u, 106832002u, 186451547u, 266083308u, ++ 932423249u, 861060070u, 1041341759u, 986742920u, 613929101u, 542559546u, 756411363u, 701822548u, ++ 3316196985u, 3244833742u, 3425377559u, 3370778784u, 3601682597u, 3530312978u, 3744426955u, 3689838204u, ++ 3819031489u, 3881883254u, 3928223919u, 4007849240u, 4037393693u, 4100235434u, 4180117107u, 4259748804u, ++ 2310601993u, 2373574846u, 2151335527u, 2231098320u, 2596047829u, 2659030626u, 2470359227u, 2550115596u, ++ 2947551409u, 2876312838u, 2788305887u, 2733848168u, 3165939309u, 3094707162u, 3040238851u, 2985771188u, + }; + +-#define WUFFS_DEFLATE__HUFFS_TABLE_SIZE 1024 +- +-#define WUFFS_DEFLATE__HUFFS_TABLE_MASK 1023 +- + // ---------------- Private Initializer Prototypes + + // ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__do_transform_io( +- wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__do_transform_io( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_blocks( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__prepare_block( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_uncompressed( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__read_code_lengths( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__init_fixed_huffman( +- wuffs_deflate__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__init_dynamic_huffman( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_src); ++wuffs_bzip2__decoder__build_huffman_tree( ++ wuffs_bzip2__decoder* self, ++ uint32_t a_which); + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__init_huff( +- wuffs_deflate__decoder* self, +- uint32_t a_which, +- uint32_t a_n_codes0, +- uint32_t a_n_codes1, +- uint32_t a_base_symbol); ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__build_huffman_table( ++ wuffs_bzip2__decoder* self, ++ uint32_t a_which); + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_bmi2( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__invert_bwt( ++ wuffs_bzip2__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast32( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src); ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__flush_fast( ++ wuffs_bzip2__decoder* self, ++ wuffs_base__io_buffer* a_dst); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast64( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src); ++wuffs_bzip2__decoder__flush_slow( ++ wuffs_bzip2__decoder* self, ++ wuffs_base__io_buffer* a_dst); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__decode_huffman_fast( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_slow( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__decode_huffman_slow( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src); + + // ---------------- VTables + + const wuffs_base__io_transformer__func_ptrs +-wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_bzip2__decoder__dst_history_retain_length), + (uint64_t(*)(const void*, +- uint32_t))(&wuffs_deflate__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_deflate__decoder__history_retain_length), ++ uint32_t))(&wuffs_bzip2__decoder__get_quirk), + (wuffs_base__status(*)(void*, + uint32_t, +- uint64_t))(&wuffs_deflate__decoder__set_quirk), ++ uint64_t))(&wuffs_bzip2__decoder__set_quirk), + (wuffs_base__status(*)(void*, + wuffs_base__io_buffer*, + wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_deflate__decoder__transform_io), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_deflate__decoder__workbuf_len), ++ wuffs_base__slice_u8))(&wuffs_bzip2__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bzip2__decoder__workbuf_len), + }; + + // ---------------- Initializer Implementations + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_deflate__decoder__initialize( +- wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__initialize( ++ wuffs_bzip2__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ +@@ -34263,25 +34215,23 @@ wuffs_deflate__decoder__initialize( + } + } + +- self->private_impl.choosy_decode_huffman_fast64 = &wuffs_deflate__decoder__decode_huffman_fast64__choosy_default; +- + self->private_impl.magic = WUFFS_BASE__MAGIC; + self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = + wuffs_base__io_transformer__vtable_name; + self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = +- (const void*)(&wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ (const void*)(&wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer); + return wuffs_base__make_status(NULL); + } + +-wuffs_deflate__decoder* +-wuffs_deflate__decoder__alloc(void) { +- wuffs_deflate__decoder* x = +- (wuffs_deflate__decoder*)(calloc(sizeof(wuffs_deflate__decoder), 1)); ++wuffs_bzip2__decoder* ++wuffs_bzip2__decoder__alloc(void) { ++ wuffs_bzip2__decoder* x = ++ (wuffs_bzip2__decoder*)(calloc(1, sizeof(wuffs_bzip2__decoder))); + if (!x) { + return NULL; + } +- if (wuffs_deflate__decoder__initialize( +- x, sizeof(wuffs_deflate__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ if (wuffs_bzip2__decoder__initialize( ++ x, sizeof(wuffs_bzip2__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } +@@ -34289,59 +34239,18 @@ wuffs_deflate__decoder__alloc(void) { + } + + size_t +-sizeof__wuffs_deflate__decoder(void) { +- return sizeof(wuffs_deflate__decoder); ++sizeof__wuffs_bzip2__decoder(void) { ++ return sizeof(wuffs_bzip2__decoder); + } + + // ---------------- Function Implementations + +-// -------- func deflate.decoder.add_history +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_deflate__decoder__add_history( +- wuffs_deflate__decoder* self, +- wuffs_base__slice_u8 a_hist) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); +- } +- +- wuffs_base__slice_u8 v_s = {0}; +- uint64_t v_n_copied = 0; +- uint32_t v_already_full = 0; +- +- v_s = a_hist; +- if (((uint64_t)(v_s.len)) >= 32768u) { +- v_s = wuffs_base__slice_u8__suffix(v_s, 32768u); +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s); +- self->private_impl.f_history_index = 32768u; +- } else { +- v_n_copied = wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, (self->private_impl.f_history_index & 32767u), 32768), v_s); +- if (v_n_copied < ((uint64_t)(v_s.len))) { +- v_s = wuffs_base__slice_u8__subslice_i(v_s, v_n_copied); +- v_n_copied = wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s); +- self->private_impl.f_history_index = (((uint32_t)((v_n_copied & 32767u))) + 32768u); +- } else { +- v_already_full = 0u; +- if (self->private_impl.f_history_index >= 32768u) { +- v_already_full = 32768u; +- } +- self->private_impl.f_history_index = ((self->private_impl.f_history_index & 32767u) + ((uint32_t)((v_n_copied & 32767u))) + v_already_full); +- } +- } +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, 32768, 33025), wuffs_base__make_slice_u8(self->private_data.f_history, 33025)); +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func deflate.decoder.get_quirk ++// -------- func bzip2.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_deflate__decoder__get_quirk( +- const wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__get_quirk( ++ const wuffs_bzip2__decoder* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -34351,15 +34260,18 @@ wuffs_deflate__decoder__get_quirk( + return 0; + } + ++ if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } + return 0u; + } + +-// -------- func deflate.decoder.set_quirk ++// -------- func bzip2.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_deflate__decoder__set_quirk( +- wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__set_quirk( ++ wuffs_bzip2__decoder* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -34372,32 +34284,36 @@ wuffs_deflate__decoder__set_quirk( + : wuffs_base__error__initialize_not_called); + } + ++ if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func deflate.decoder.history_retain_length ++// -------- func bzip2.decoder.dst_history_retain_length + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_deflate__decoder__history_retain_length( +- const wuffs_deflate__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_bzip2__decoder__dst_history_retain_length( ++ const wuffs_bzip2__decoder* self) { + if (!self) { +- return 0; ++ return wuffs_base__utility__make_optional_u63(false, 0u); + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ return wuffs_base__utility__make_optional_u63(false, 0u); + } + +- return 0u; ++ return wuffs_base__utility__make_optional_u63(true, 0u); + } + +-// -------- func deflate.decoder.workbuf_len ++// -------- func bzip2.decoder.workbuf_len + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_deflate__decoder__workbuf_len( +- const wuffs_deflate__decoder* self) { ++wuffs_bzip2__decoder__workbuf_len( ++ const wuffs_bzip2__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } +@@ -34406,15 +34322,15 @@ wuffs_deflate__decoder__workbuf_len( + return wuffs_base__utility__empty_range_ii_u64(); + } + +- return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); + } + +-// -------- func deflate.decoder.transform_io ++// -------- func bzip2.decoder.transform_io + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_deflate__decoder__transform_io( +- wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__transform_io( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { +@@ -34441,17 +34357,17 @@ wuffs_deflate__decoder__transform_io( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_deflate__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ wuffs_base__status t_0 = wuffs_bzip2__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_deflate__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_bzip2__error__truncated_input); + goto exit; + } + status = v_status; +@@ -34459,13 +34375,13 @@ wuffs_deflate__decoder__transform_io( + } + + ok: +- self->private_impl.p_transform_io[0] = 0; ++ self->private_impl.p_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; +@@ -34476,103 +34392,22 @@ wuffs_deflate__decoder__transform_io( + return status; + } + +-// -------- func deflate.decoder.do_transform_io ++// -------- func bzip2.decoder.do_transform_io + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__do_transform_io( +- wuffs_deflate__decoder* self, ++wuffs_bzip2__decoder__do_transform_io( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint64_t v_mark = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } +- +- uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- self->private_impl.choosy_decode_huffman_fast64 = ( +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_bmi2() ? &wuffs_deflate__decoder__decode_huffman_bmi2 : +-#endif +- self->private_impl.choosy_decode_huffman_fast64); +- while (true) { +- v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); +- { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- wuffs_base__status t_0 = wuffs_deflate__decoder__decode_blocks(self, a_dst, a_src); +- v_status = t_0; +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- } +- if ( ! wuffs_base__status__is_suspension(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_transformed_history_count, wuffs_base__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)))); +- wuffs_deflate__decoder__add_history(self, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } +- +- ok: +- self->private_impl.p_do_transform_io[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func deflate.decoder.decode_blocks +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_blocks( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_final = 0; +- uint32_t v_b0 = 0; +- uint32_t v_type = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_i = 0; ++ uint64_t v_tag = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_final_checksum_want = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -34585,125 +34420,206 @@ wuffs_deflate__decoder__decode_blocks( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_blocks[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; + if (coro_susp_point) { +- v_final = self->private_data.s_decode_blocks[0].v_final; ++ v_i = self->private_data.s_do_transform_io.v_i; ++ v_tag = self->private_data.s_do_transform_io.v_tag; ++ v_final_checksum_want = self->private_data.s_do_transform_io.v_final_checksum_want; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- label__outer__continue:; +- while (v_final == 0u) { +- while (self->private_impl.f_n_bits < 3u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 66u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (v_c8 != 90u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (v_c8 != 104u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if ((v_c8 < 49u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_max_incl_block_size = (((uint32_t)(((uint8_t)(v_c8 - 48u)))) * 100000u); ++ while (true) { ++ v_tag = 0u; ++ v_i = 0u; ++ while (v_i < 48u) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; + } +- uint32_t t_0 = *iop_a_src++; +- v_b0 = t_0; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- self->private_impl.f_bits |= (v_b0 << (self->private_impl.f_n_bits & 3u)); +- self->private_impl.f_n_bits = ((self->private_impl.f_n_bits & 3u) + 8u); ++ v_tag <<= 1u; ++ v_tag |= ((uint64_t)((self->private_impl.f_bits >> 31u))); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; + } +- v_final = (self->private_impl.f_bits & 1u); +- v_type = ((self->private_impl.f_bits >> 1u) & 3u); +- self->private_impl.f_bits >>= 3u; +- self->private_impl.f_n_bits -= 3u; +- if (v_type == 0u) { ++ if (v_tag == 25779555029136u) { ++ break; ++ } else if (v_tag != 54156738319193u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ status = wuffs_bzip2__decoder__prepare_block(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_block_size = 0u; ++ self->private_impl.f_decode_huffman_finished = false; ++ self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[((uint8_t)(self->private_data.f_huffman_selectors[0u] & 7u))]; ++ self->private_impl.f_decode_huffman_ticks = 50u; ++ self->private_impl.f_decode_huffman_section = 0u; ++ self->private_impl.f_decode_huffman_run_shift = 0u; ++ while ( ! self->private_impl.f_decode_huffman_finished) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_deflate__decoder__decode_uncompressed(self, a_dst, a_src); ++ v_status = wuffs_bzip2__decoder__decode_huffman_fast(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- if (status.repr) { +- goto suspend; +- } +- continue; +- } else if (v_type == 1u) { +- v_status = wuffs_deflate__decoder__init_fixed_huffman(self); +- if ( ! wuffs_base__status__is_ok(&v_status)) { ++ if (wuffs_base__status__is_error(&v_status)) { + status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; ++ goto exit; ++ } else if (self->private_impl.f_decode_huffman_finished) { ++ break; + } +- } else if (v_type == 2u) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_deflate__decoder__init_dynamic_huffman(self, a_src); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ status = wuffs_bzip2__decoder__decode_huffman_slow(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_block); ++ } ++ wuffs_bzip2__decoder__invert_bwt(self); ++ self->private_impl.f_block_checksum_have = 4294967295u; ++ if (self->private_impl.f_original_pointer >= self->private_impl.f_block_size) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } +- self->private_impl.f_end_of_block = false; +- while (true) { +- if (sizeof(void*) == 4u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_deflate__decoder__decode_huffman_fast32(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } else { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_status = wuffs_deflate__decoder__decode_huffman_fast64(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; +- goto exit; +- } +- if (self->private_impl.f_end_of_block) { +- goto label__outer__continue; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- status = wuffs_deflate__decoder__decode_huffman_slow(self, a_dst, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ self->private_impl.f_flush_pointer = (self->private_data.f_bwt[self->private_impl.f_original_pointer] >> 12u); ++ self->private_impl.f_flush_repeat_count = 0u; ++ self->private_impl.f_flush_prev = 0u; ++ while (self->private_impl.f_block_size > 0u) { ++ wuffs_bzip2__decoder__flush_fast(self, a_dst); ++ if (self->private_impl.f_block_size <= 0u) { ++ break; + } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_bzip2__decoder__flush_slow(self, a_dst); + if (status.repr) { + goto suspend; + } +- if (self->private_impl.f_end_of_block) { +- goto label__outer__continue; ++ } ++ self->private_impl.f_block_checksum_have ^= 4294967295u; ++ if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_block_checksum_have != self->private_impl.f_block_checksum_want)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum); ++ goto exit; ++ } ++ self->private_impl.f_final_checksum_have = (self->private_impl.f_block_checksum_have ^ ((self->private_impl.f_final_checksum_have >> 31u) | ((uint32_t)(self->private_impl.f_final_checksum_have << 1u)))); ++ } ++ v_final_checksum_want = 0u; ++ v_i = 0u; ++ while (v_i < 32u) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; + } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } ++ v_final_checksum_want <<= 1u; ++ v_final_checksum_want |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; ++ } ++ if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_final_checksum_have != v_final_checksum_want)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum); ++ goto exit; + } + ++ goto ok; + ok: +- self->private_impl.p_decode_blocks[0] = 0; ++ self->private_impl.p_do_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_blocks[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_blocks[0].v_final = v_final; ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_transform_io.v_i = v_i; ++ self->private_data.s_do_transform_io.v_tag = v_tag; ++ self->private_data.s_do_transform_io.v_final_checksum_want = v_final_checksum_want; + + goto exit; + exit: +@@ -34714,32 +34630,23 @@ wuffs_deflate__decoder__decode_blocks( + return status; + } + +-// -------- func deflate.decoder.decode_uncompressed ++// -------- func bzip2.decoder.prepare_block + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_uncompressed( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__prepare_block( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_length = 0; +- uint32_t v_n_copied = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ uint32_t v_selector = 0; ++ uint32_t v_sel_ff = 0; ++ uint8_t v_movee = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -34751,387 +34658,287 @@ wuffs_deflate__decoder__decode_uncompressed( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_uncompressed[0]; ++ uint32_t coro_susp_point = self->private_impl.p_prepare_block; + if (coro_susp_point) { +- v_length = self->private_data.s_decode_uncompressed[0].v_length; ++ v_i = self->private_data.s_prepare_block.v_i; ++ v_selector = self->private_data.s_prepare_block.v_selector; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } +- self->private_impl.f_n_bits = 0u; +- self->private_impl.f_bits = 0u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_uncompressed[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { ++ self->private_impl.f_block_checksum_want = 0u; ++ v_i = 0u; ++ while (v_i < 32u) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_uncompressed[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- v_length = t_0; +- } +- if ((((v_length) & 0xFFFFu) + ((v_length) >> (32u - 16u))) != 65535u) { +- status = wuffs_base__make_status(wuffs_deflate__error__inconsistent_stored_block_length); +- goto exit; +- } +- v_length = ((v_length) & 0xFFFFu); +- while (true) { +- v_n_copied = wuffs_base__io_writer__limited_copy_u32_from_reader( +- &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src); +- if (v_length <= v_n_copied) { +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- v_length -= v_n_copied; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- } else { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- } ++ self->private_impl.f_block_checksum_want <<= 1u; ++ self->private_impl.f_block_checksum_want |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; + } +- +- ok: +- self->private_impl.p_decode_uncompressed[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_uncompressed[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_uncompressed[0].v_length = v_length; +- +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func deflate.decoder.init_fixed_huffman +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__init_fixed_huffman( +- wuffs_deflate__decoder* self) { +- uint32_t v_i = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- while (v_i < 144u) { +- self->private_data.f_code_lengths[v_i] = 8u; +- v_i += 1u; +- } +- while (v_i < 256u) { +- self->private_data.f_code_lengths[v_i] = 9u; +- v_i += 1u; +- } +- while (v_i < 280u) { +- self->private_data.f_code_lengths[v_i] = 7u; +- v_i += 1u; +- } +- while (v_i < 288u) { +- self->private_data.f_code_lengths[v_i] = 8u; +- v_i += 1u; +- } +- while (v_i < 320u) { +- self->private_data.f_code_lengths[v_i] = 5u; +- v_i += 1u; +- } +- v_status = wuffs_deflate__decoder__init_huff(self, +- 0u, +- 0u, +- 288u, +- 257u); +- if (wuffs_base__status__is_error(&v_status)) { +- return v_status; +- } +- v_status = wuffs_deflate__decoder__init_huff(self, +- 1u, +- 288u, +- 320u, +- 0u); +- if (wuffs_base__status__is_error(&v_status)) { +- return v_status; +- } +- return wuffs_base__make_status(NULL); +-} +- +-// -------- func deflate.decoder.init_dynamic_huffman +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__init_dynamic_huffman( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_b0 = 0; +- uint32_t v_n_lit = 0; +- uint32_t v_n_dist = 0; +- uint32_t v_n_clen = 0; +- uint32_t v_i = 0; +- uint32_t v_b1 = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint32_t v_mask = 0; +- uint32_t v_table_entry = 0; +- uint32_t v_table_entry_n_bits = 0; +- uint32_t v_b2 = 0; +- uint32_t v_n_extra_bits = 0; +- uint8_t v_rep_symbol = 0; +- uint32_t v_rep_count = 0; +- uint32_t v_b3 = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_init_dynamic_huffman[0]; +- if (coro_susp_point) { +- v_bits = self->private_data.s_init_dynamic_huffman[0].v_bits; +- v_n_bits = self->private_data.s_init_dynamic_huffman[0].v_n_bits; +- v_n_lit = self->private_data.s_init_dynamic_huffman[0].v_n_lit; +- v_n_dist = self->private_data.s_init_dynamic_huffman[0].v_n_dist; +- v_n_clen = self->private_data.s_init_dynamic_huffman[0].v_n_clen; +- v_i = self->private_data.s_init_dynamic_huffman[0].v_i; +- v_mask = self->private_data.s_init_dynamic_huffman[0].v_mask; +- v_n_extra_bits = self->private_data.s_init_dynamic_huffman[0].v_n_extra_bits; +- v_rep_symbol = self->private_data.s_init_dynamic_huffman[0].v_rep_symbol; +- v_rep_count = self->private_data.s_init_dynamic_huffman[0].v_rep_count; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- v_bits = self->private_impl.f_bits; +- v_n_bits = self->private_impl.f_n_bits; +- while (v_n_bits < 14u) { ++ if (self->private_impl.f_n_bits <= 0u) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_0 = *iop_a_src++; +- v_b0 = t_0; ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; + } +- v_bits |= (v_b0 << v_n_bits); +- v_n_bits += 8u; +- } +- v_n_lit = (((v_bits) & 0x1Fu) + 257u); +- if (v_n_lit > 286u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_literal_length_code_count); +- goto exit; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- v_bits >>= 5u; +- v_n_dist = (((v_bits) & 0x1Fu) + 1u); +- if (v_n_dist > 30u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_distance_code_count); ++ if ((self->private_impl.f_bits >> 31u) != 0u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__unsupported_block_randomization); + goto exit; + } +- v_bits >>= 5u; +- v_n_clen = (((v_bits) & 0xFu) + 4u); +- v_bits >>= 4u; +- v_n_bits -= 14u; ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ self->private_impl.f_original_pointer = 0u; + v_i = 0u; +- while (v_i < v_n_clen) { +- while (v_n_bits < 3u) { ++ while (v_i < 24u) { ++ if (self->private_impl.f_n_bits <= 0u) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_1 = *iop_a_src++; +- v_b1 = t_1; ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; + } +- v_bits |= (v_b1 << v_n_bits); +- v_n_bits += 8u; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = ((uint8_t)((v_bits & 7u))); +- v_bits >>= 3u; +- v_n_bits -= 3u; ++ self->private_impl.f_original_pointer <<= 1u; ++ self->private_impl.f_original_pointer |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; + v_i += 1u; + } +- while (v_i < 19u) { +- self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = 0u; ++ v_i = 0u; ++ while (v_i < 256u) { ++ self->private_data.f_presence[v_i] = 0u; + v_i += 1u; + } +- v_status = wuffs_deflate__decoder__init_huff(self, +- 0u, +- 0u, +- 19u, +- 4095u); +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; +- goto exit; +- } +- v_mask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); + v_i = 0u; +- while (v_i < (v_n_lit + v_n_dist)) { +- while (true) { +- v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_mask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- if (v_n_bits >= v_table_entry_n_bits) { +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- break; +- } ++ while (v_i < 256u) { ++ if (self->private_impl.f_n_bits <= 0u) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_2 = *iop_a_src++; +- v_b2 = t_2; ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; + } +- v_bits |= (v_b2 << v_n_bits); +- v_n_bits += 8u; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- if ((v_table_entry >> 24u) != 128u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; ++ if ((self->private_impl.f_bits >> 31u) != 0u) { ++ self->private_data.f_presence[v_i] = 1u; + } +- v_table_entry = ((v_table_entry >> 8u) & 255u); +- if (v_table_entry < 16u) { +- self->private_data.f_code_lengths[v_i] = ((uint8_t)(v_table_entry)); +- v_i += 1u; ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 16u; ++ } ++ self->private_data.f_scratch = 0u; ++ v_i = 0u; ++ while (v_i < 256u) { ++ if (self->private_data.f_presence[v_i] == 0u) { ++ v_i += 16u; + continue; + } +- v_n_extra_bits = 0u; +- v_rep_symbol = 0u; +- v_rep_count = 0u; +- if (v_table_entry == 16u) { +- v_n_extra_bits = 2u; +- if (v_i <= 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_repetition); +- goto exit; ++ while (true) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; ++ } ++ self->private_data.f_scratch += (self->private_impl.f_bits >> 31u); ++ self->private_data.f_presence[(v_i & 255u)] = ((uint8_t)((self->private_impl.f_bits >> 31u))); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; ++ if ((v_i & 15u) == 0u) { ++ break; + } +- v_rep_symbol = (self->private_data.f_code_lengths[(v_i - 1u)] & 15u); +- v_rep_count = 3u; +- } else if (v_table_entry == 17u) { +- v_n_extra_bits = 3u; +- v_rep_symbol = 0u; +- v_rep_count = 3u; +- } else if (v_table_entry == 18u) { +- v_n_extra_bits = 7u; +- v_rep_symbol = 0u; +- v_rep_count = 11u; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; + } +- while (v_n_bits < v_n_extra_bits) { ++ } ++ if ((self->private_data.f_scratch < 1u) || (256u < self->private_data.f_scratch)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); ++ goto exit; ++ } ++ self->private_impl.f_num_symbols = (self->private_data.f_scratch + 2u); ++ self->private_data.f_scratch = 0u; ++ v_i = 0u; ++ while (v_i < 3u) { ++ if (self->private_impl.f_n_bits <= 0u) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_3 = *iop_a_src++; +- v_b3 = t_3; ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; + } +- v_bits |= (v_b3 << v_n_bits); +- v_n_bits += 8u; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- v_rep_count += ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_n_extra_bits)); +- v_bits >>= v_n_extra_bits; +- v_n_bits -= v_n_extra_bits; +- while (v_rep_count > 0u) { +- if (v_i >= (v_n_lit + v_n_dist)) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count); +- goto exit; ++ self->private_data.f_scratch <<= 1u; ++ self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; ++ } ++ if ((self->private_data.f_scratch < 2u) || (6u < self->private_data.f_scratch)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); ++ goto exit; ++ } ++ self->private_impl.f_num_huffman_codes = self->private_data.f_scratch; ++ self->private_data.f_scratch = 0u; ++ v_i = 0u; ++ while (v_i < 15u) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; + } +- self->private_data.f_code_lengths[v_i] = v_rep_symbol; +- v_i += 1u; +- v_rep_count -= 1u; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } ++ self->private_data.f_scratch <<= 1u; ++ self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; + } +- if (v_i != (v_n_lit + v_n_dist)) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count); ++ if ((self->private_data.f_scratch < 1u) || (18001u < self->private_data.f_scratch)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); + goto exit; + } +- if (self->private_data.f_code_lengths[256u] == 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__missing_end_of_block_code); +- goto exit; ++ self->private_impl.f_num_sections = self->private_data.f_scratch; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_huffman_codes) { ++ self->private_data.f_mtft[v_i] = ((uint8_t)(v_i)); ++ v_i += 1u; + } +- v_status = wuffs_deflate__decoder__init_huff(self, +- 0u, +- 0u, +- v_n_lit, +- 257u); +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; +- goto exit; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_sections) { ++ v_selector = 0u; ++ while (true) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_7 = *iop_a_src++; ++ v_c8 = t_7; ++ } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; ++ } ++ if ((self->private_impl.f_bits >> 31u) == 0u) { ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ break; ++ } ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_selector += 1u; ++ if (v_selector >= self->private_impl.f_num_huffman_codes) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); ++ goto exit; ++ } ++ } ++ if (v_selector == 0u) { ++ self->private_data.f_huffman_selectors[v_i] = self->private_data.f_mtft[0u]; ++ } else { ++ v_sel_ff = (v_selector & 255u); ++ v_movee = self->private_data.f_mtft[v_sel_ff]; ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_sel_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_sel_ff)); ++ self->private_data.f_mtft[0u] = v_movee; ++ self->private_data.f_huffman_selectors[v_i] = v_movee; ++ } ++ v_i += 1u; + } +- v_status = wuffs_deflate__decoder__init_huff(self, +- 1u, +- v_n_lit, +- (v_n_lit + v_n_dist), +- 0u); +- if (wuffs_base__status__is_error(&v_status)) { +- status = v_status; +- goto exit; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_huffman_codes) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_bzip2__decoder__read_code_lengths(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ v_status = wuffs_bzip2__decoder__build_huffman_tree(self, v_i); ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; ++ } ++ wuffs_bzip2__decoder__build_huffman_table(self, v_i); ++ v_i += 1u; ++ } ++ v_i = 0u; ++ v_j = 0u; ++ while (v_i < 256u) { ++ if (self->private_data.f_presence[v_i] != 0u) { ++ self->private_data.f_mtft[(v_j & 255u)] = ((uint8_t)(v_i)); ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 256u) { ++ self->private_data.f_letter_counts[v_i] = 0u; ++ v_i += 1u; + } +- self->private_impl.f_bits = v_bits; +- self->private_impl.f_n_bits = v_n_bits; + + goto ok; + ok: +- self->private_impl.p_init_dynamic_huffman[0] = 0; ++ self->private_impl.p_prepare_block = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_init_dynamic_huffman[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_init_dynamic_huffman[0].v_bits = v_bits; +- self->private_data.s_init_dynamic_huffman[0].v_n_bits = v_n_bits; +- self->private_data.s_init_dynamic_huffman[0].v_n_lit = v_n_lit; +- self->private_data.s_init_dynamic_huffman[0].v_n_dist = v_n_dist; +- self->private_data.s_init_dynamic_huffman[0].v_n_clen = v_n_clen; +- self->private_data.s_init_dynamic_huffman[0].v_i = v_i; +- self->private_data.s_init_dynamic_huffman[0].v_mask = v_mask; +- self->private_data.s_init_dynamic_huffman[0].v_n_extra_bits = v_n_extra_bits; +- self->private_data.s_init_dynamic_huffman[0].v_rep_symbol = v_rep_symbol; +- self->private_data.s_init_dynamic_huffman[0].v_rep_count = v_rep_count; ++ self->private_impl.p_prepare_block = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_prepare_block.v_i = v_i; ++ self->private_data.s_prepare_block.v_selector = v_selector; + + goto exit; + exit: +@@ -35142,285 +34949,295 @@ wuffs_deflate__decoder__init_dynamic_huffman( + return status; + } + +-// -------- func deflate.decoder.init_huff ++// -------- func bzip2.decoder.read_code_lengths + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__init_huff( +- wuffs_deflate__decoder* self, +- uint32_t a_which, +- uint32_t a_n_codes0, +- uint32_t a_n_codes1, +- uint32_t a_base_symbol) { +- uint16_t v_counts[16] = {0}; ++wuffs_bzip2__decoder__read_code_lengths( ++ wuffs_bzip2__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; + uint32_t v_i = 0; +- uint32_t v_remaining = 0; +- uint16_t v_offsets[16] = {0}; +- uint32_t v_n_symbols = 0; +- uint32_t v_count = 0; +- uint16_t v_symbols[320] = {0}; +- uint32_t v_min_cl = 0; +- uint32_t v_max_cl = 0; +- uint32_t v_initial_high_bits = 0; +- uint32_t v_prev_cl = 0; +- uint32_t v_prev_redirect_key = 0; +- uint32_t v_top = 0; +- uint32_t v_next_top = 0; +- uint32_t v_code = 0; +- uint32_t v_key = 0; +- uint32_t v_value = 0; +- uint32_t v_cl = 0; +- uint32_t v_redirect_key = 0; +- uint32_t v_j = 0; +- uint32_t v_reversed_key = 0; +- uint32_t v_symbol = 0; +- uint32_t v_high_bits = 0; +- uint32_t v_delta = 0; ++ uint32_t v_code_length = 0; + +- v_i = a_n_codes0; +- while (v_i < a_n_codes1) { +- if (v_counts[(self->private_data.f_code_lengths[v_i] & 15u)] >= 320u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_counts[(self->private_data.f_code_lengths[v_i] & 15u)] += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- v_i += 1u; +- } +- if ((((uint32_t)(v_counts[0u])) + a_n_codes0) == a_n_codes1) { +- return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- v_remaining = 1u; +- v_i = 1u; +- while (v_i <= 15u) { +- if (v_remaining > 1073741824u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- v_remaining <<= 1u; +- if (v_remaining < ((uint32_t)(v_counts[v_i]))) { +- return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_over_subscribed); +- } +- v_remaining -= ((uint32_t)(v_counts[v_i])); +- v_i += 1u; ++ ++ uint32_t coro_susp_point = self->private_impl.p_read_code_lengths; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_read_code_lengths.v_i; ++ v_code_length = self->private_data.s_read_code_lengths.v_code_length; + } +- if (v_remaining != 0u) { +- if ((a_which == 1u) && (v_counts[1u] == 1u) && ((((uint32_t)(v_counts[0u])) + a_n_codes0 + 1u) == a_n_codes1)) { +- v_i = 0u; +- while (v_i <= 29u) { +- if (self->private_data.f_code_lengths[(a_n_codes0 + v_i)] == 1u) { +- self->private_impl.f_n_huffs_bits[1u] = 1u; +- self->private_data.f_huffs[1u][0u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[v_i] | 1u); +- self->private_data.f_huffs[1u][1u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[31u] | 1u); +- return wuffs_base__make_status(NULL); ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_code_lengths_bitmask = 0u; ++ v_i = 0u; ++ while (v_i < 5u) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- v_i += 1u; ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } ++ v_code_length <<= 1u; ++ v_code_length |= (self->private_impl.f_bits >> 31u); ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ v_i += 1u; + } +- return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_under_subscribed); +- } +- v_i = 1u; +- while (v_i <= 15u) { +- v_offsets[v_i] = ((uint16_t)(v_n_symbols)); +- v_count = ((uint32_t)(v_counts[v_i])); +- if (v_n_symbols > (320u - v_count)) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- v_n_symbols = (v_n_symbols + v_count); +- v_i += 1u; +- } +- if (v_n_symbols > 288u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- v_i = a_n_codes0; +- while (v_i < a_n_codes1) { +- if (v_i < a_n_codes0) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- if (self->private_data.f_code_lengths[v_i] != 0u) { +- if (v_offsets[(self->private_data.f_code_lengths[v_i] & 15u)] >= 320u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_symbols) { ++ while (true) { ++ if ((v_code_length < 1u) || (20u < v_code_length)) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header); ++ goto exit; ++ } ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; ++ } ++ if ((self->private_impl.f_bits >> 31u) == 0u) { ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ break; ++ } ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; ++ } ++ if ((self->private_impl.f_bits >> 31u) == 0u) { ++ v_code_length += 1u; ++ } else { ++ v_code_length -= 1u; ++ } ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; + } +- v_symbols[v_offsets[(self->private_data.f_code_lengths[v_i] & 15u)]] = ((uint16_t)((v_i - a_n_codes0))); +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_offsets[(self->private_data.f_code_lengths[v_i] & 15u)] += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } +- v_i += 1u; +- } +- v_min_cl = 1u; +- while (true) { +- if (v_counts[v_min_cl] != 0u) { +- break; +- } +- if (v_min_cl >= 9u) { +- return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_minimum_code_length); +- } +- v_min_cl += 1u; +- } +- v_max_cl = 15u; +- while (true) { +- if (v_counts[v_max_cl] != 0u) { +- break; +- } +- if (v_max_cl <= 1u) { +- return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes); ++ self->private_impl.f_code_lengths_bitmask |= (((uint32_t)(1u)) << (v_code_length & 31u)); ++ self->private_data.f_bwt[v_i] = v_code_length; ++ v_i += 1u; + } +- v_max_cl -= 1u; +- } +- if (v_max_cl <= 9u) { +- self->private_impl.f_n_huffs_bits[a_which] = v_max_cl; +- } else { +- self->private_impl.f_n_huffs_bits[a_which] = 9u; +- } +- v_i = 0u; +- if ((v_n_symbols != ((uint32_t)(v_offsets[v_max_cl]))) || (v_n_symbols != ((uint32_t)(v_offsets[15u])))) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- if ((a_n_codes0 + ((uint32_t)(v_symbols[0u]))) >= 320u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ ++ goto ok; ++ ok: ++ self->private_impl.p_read_code_lengths = 0; ++ goto exit; + } +- v_initial_high_bits = 512u; +- if (v_max_cl < 9u) { +- v_initial_high_bits = (((uint32_t)(1u)) << v_max_cl); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_read_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_read_code_lengths.v_i = v_i; ++ self->private_data.s_read_code_lengths.v_code_length = v_code_length; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_prev_cl = ((uint32_t)((self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[0u])))] & 15u))); +- v_prev_redirect_key = 4294967295u; +- v_top = 0u; +- v_next_top = 512u; +- v_code = 0u; +- v_key = 0u; +- v_value = 0u; +- while (true) { +- if ((a_n_codes0 + ((uint32_t)(v_symbols[v_i]))) >= 320u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ ++ return status; ++} ++ ++// -------- func bzip2.decoder.build_huffman_tree ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bzip2__decoder__build_huffman_tree( ++ wuffs_bzip2__decoder* self, ++ uint32_t a_which) { ++ uint32_t v_code_length = 0; ++ uint32_t v_symbol_index = 0; ++ uint32_t v_num_branch_nodes = 0; ++ uint32_t v_stack_height = 0; ++ uint32_t v_stack_values[21] = {0}; ++ uint32_t v_node_index = 0; ++ uint16_t v_leaf_value = 0; ++ ++ self->private_data.f_huffman_trees[a_which][0u][0u] = 0u; ++ self->private_data.f_huffman_trees[a_which][0u][1u] = 0u; ++ v_num_branch_nodes = 1u; ++ v_stack_height = 1u; ++ v_stack_values[0u] = 0u; ++ v_code_length = 1u; ++ while (v_code_length <= 20u) { ++ if ((self->private_impl.f_code_lengths_bitmask & (((uint32_t)(1u)) << v_code_length)) == 0u) { ++ v_code_length += 1u; ++ continue; + } +- v_cl = ((uint32_t)((self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[v_i])))] & 15u))); +- if (v_cl > v_prev_cl) { +- v_code <<= (v_cl - v_prev_cl); +- if (v_code >= 32768u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ v_symbol_index = 0u; ++ while (v_symbol_index < self->private_impl.f_num_symbols) { ++ if (self->private_data.f_bwt[v_symbol_index] != v_code_length) { ++ v_symbol_index += 1u; ++ continue; + } +- } +- v_prev_cl = v_cl; +- v_key = v_code; +- if (v_cl > 9u) { +- v_cl -= 9u; +- v_redirect_key = ((v_key >> v_cl) & 511u); +- v_key = ((v_key) & WUFFS_BASE__LOW_BITS_MASK__U32(v_cl)); +- if (v_prev_redirect_key != v_redirect_key) { +- v_prev_redirect_key = v_redirect_key; +- v_remaining = (((uint32_t)(1u)) << v_cl); +- v_j = v_prev_cl; +- while (v_j <= 15u) { +- if (v_remaining <= ((uint32_t)(v_counts[v_j]))) { +- break; +- } +- v_remaining -= ((uint32_t)(v_counts[v_j])); +- if (v_remaining > 1073741824u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- v_remaining <<= 1u; +- v_j += 1u; ++ while (true) { ++ if (v_stack_height <= 0u) { ++ return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_over_subscribed); ++ } else if (v_stack_height >= v_code_length) { ++ break; + } +- if ((v_j <= 9u) || (15u < v_j)) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ v_node_index = v_stack_values[(v_stack_height - 1u)]; ++ if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) { ++ self->private_data.f_huffman_trees[a_which][v_node_index][0u] = ((uint16_t)(v_num_branch_nodes)); ++ } else { ++ self->private_data.f_huffman_trees[a_which][v_node_index][1u] = ((uint16_t)(v_num_branch_nodes)); + } +- v_j -= 9u; +- v_initial_high_bits = (((uint32_t)(1u)) << v_j); +- v_top = v_next_top; +- if ((v_top + (((uint32_t)(1u)) << v_j)) > 1024u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ if (v_num_branch_nodes >= 257u) { ++ return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed); + } +- v_next_top = (v_top + (((uint32_t)(1u)) << v_j)); +- v_redirect_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_redirect_key >> 1u)])) | ((v_redirect_key & 1u) << 8u)); +- self->private_data.f_huffs[a_which][v_redirect_key] = (268435465u | (v_top << 8u) | (v_j << 4u)); ++ v_stack_values[v_stack_height] = v_num_branch_nodes; ++ self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][0u] = 0u; ++ self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][1u] = 0u; ++ v_num_branch_nodes += 1u; ++ v_stack_height += 1u; + } ++ v_node_index = v_stack_values[(v_stack_height - 1u)]; ++ if (v_symbol_index < 2u) { ++ v_leaf_value = ((uint16_t)((769u + v_symbol_index))); ++ } else if ((v_symbol_index + 1u) < self->private_impl.f_num_symbols) { ++ v_leaf_value = ((uint16_t)((511u + v_symbol_index))); ++ } else { ++ v_leaf_value = 768u; ++ } ++ if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) { ++ self->private_data.f_huffman_trees[a_which][v_node_index][0u] = v_leaf_value; ++ } else { ++ self->private_data.f_huffman_trees[a_which][v_node_index][1u] = v_leaf_value; ++ v_stack_height -= 1u; ++ while (v_stack_height > 0u) { ++ v_node_index = v_stack_values[(v_stack_height - 1u)]; ++ if (self->private_data.f_huffman_trees[a_which][v_node_index][1u] == 0u) { ++ break; ++ } ++ v_stack_height -= 1u; ++ } ++ } ++ v_symbol_index += 1u; + } +- if ((v_key >= 512u) || (v_counts[v_prev_cl] <= 0u)) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } ++ v_code_length += 1u; ++ } ++ if (v_stack_height != 0u) { ++ return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed); ++ } ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func bzip2.decoder.build_huffman_table ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__build_huffman_table( ++ wuffs_bzip2__decoder* self, ++ uint32_t a_which) { ++ uint32_t v_i = 0; ++ uint32_t v_bits = 0; ++ uint16_t v_n_bits = 0; ++ uint16_t v_child = 0; ++ ++ while (v_i < 256u) { ++ v_bits = (v_i << 24u); ++ v_n_bits = 0u; ++ v_child = 0u; ++ while ((v_child < 257u) && (v_n_bits < 8u)) { ++ v_child = self->private_data.f_huffman_trees[a_which][v_child][(v_bits >> 31u)]; ++ v_bits <<= 1u; + #if defined(__GNUC__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wconversion" + #endif +- v_counts[v_prev_cl] -= 1u; ++ v_n_bits += 1u; + #if defined(__GNUC__) + #pragma GCC diagnostic pop + #endif +- v_reversed_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_key >> 1u)])) | ((v_key & 1u) << 8u)); +- v_reversed_key >>= (9u - v_cl); +- v_symbol = ((uint32_t)(v_symbols[v_i])); +- if (v_symbol == 256u) { +- v_value = (536870912u | v_cl); +- } else if ((v_symbol < 256u) && (a_which == 0u)) { +- v_value = (2147483648u | (v_symbol << 8u) | v_cl); +- } else if (v_symbol >= a_base_symbol) { +- v_symbol -= a_base_symbol; +- if (a_which == 0u) { +- v_value = (WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl); +- } else { +- v_value = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl); +- } +- } else { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- v_high_bits = v_initial_high_bits; +- v_delta = (((uint32_t)(1u)) << v_cl); +- while (v_high_bits >= v_delta) { +- v_high_bits -= v_delta; +- if ((v_top + ((v_high_bits | v_reversed_key) & 511u)) >= 1024u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } +- self->private_data.f_huffs[a_which][(v_top + ((v_high_bits | v_reversed_key) & 511u))] = v_value; + } ++ self->private_data.f_huffman_tables[a_which][v_i] = ((uint16_t)(((uint16_t)(v_child | ((uint16_t)(v_n_bits << 12u)))))); + v_i += 1u; +- if (v_i >= v_n_symbols) { +- break; +- } +- v_code += 1u; +- if (v_code >= 32768u) { +- return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- } + } +- return wuffs_base__make_status(NULL); ++ return wuffs_base__make_empty_struct(); + } + +-// ‼ WUFFS MULTI-FILE SECTION +x86_bmi2 +-// -------- func deflate.decoder.decode_huffman_bmi2 ++// -------- func bzip2.decoder.invert_bwt + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("bmi2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_bmi2( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__invert_bwt( ++ wuffs_bzip2__decoder* self) { ++ uint32_t v_i = 0; ++ uint32_t v_letter = 0; ++ uint32_t v_sum = 0; ++ uint32_t v_old_sum = 0; + +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_table_entry = 0; +- uint32_t v_table_entry_n_bits = 0; +- uint64_t v_lmask = 0; +- uint64_t v_dmask = 0; +- uint32_t v_redir_top = 0; +- uint32_t v_redir_mask = 0; +- uint32_t v_length = 0; +- uint32_t v_dist_minus_1 = 0; +- uint32_t v_hlen = 0; +- uint32_t v_hdist = 0; +- uint32_t v_hdist_adjustment = 0; ++ v_sum = 0u; ++ v_i = 0u; ++ while (v_i < 256u) { ++ v_old_sum = v_sum; ++ v_sum += self->private_data.f_letter_counts[v_i]; ++ self->private_data.f_letter_counts[v_i] = v_old_sum; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < self->private_impl.f_block_size) { ++ v_letter = (self->private_data.f_bwt[v_i] & 255u); ++ self->private_data.f_bwt[(self->private_data.f_letter_counts[v_letter] & 1048575u)] |= (v_i << 12u); ++ self->private_data.f_letter_counts[v_letter] += 1u; ++ v_i += 1u; ++ } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func bzip2.decoder.flush_fast ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_bzip2__decoder__flush_fast( ++ wuffs_bzip2__decoder* self, ++ wuffs_base__io_buffer* a_dst) { ++ uint32_t v_flush_pointer = 0; ++ uint32_t v_flush_repeat_count = 0; ++ uint8_t v_flush_prev = 0; ++ uint32_t v_block_checksum_have = 0; ++ uint32_t v_block_size = 0; ++ uint32_t v_entry = 0; ++ uint8_t v_curr = 0; + + uint8_t* iop_a_dst = NULL; + uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -35435,217 +35252,204 @@ wuffs_deflate__decoder__decode_huffman_bmi2( + io2_a_dst = iop_a_dst; + } + } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } + +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } +- v_bits = ((uint64_t)(self->private_impl.f_bits)); +- v_n_bits = self->private_impl.f_n_bits; +- v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); +- v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); +- if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { +- status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); +- goto exit; ++ v_flush_pointer = self->private_impl.f_flush_pointer; ++ v_flush_repeat_count = self->private_impl.f_flush_repeat_count; ++ v_flush_prev = self->private_impl.f_flush_prev; ++ v_block_checksum_have = self->private_impl.f_block_checksum_have; ++ v_block_size = self->private_impl.f_block_size; ++ while ((v_block_size > 0u) && (((uint64_t)(io2_a_dst - iop_a_dst)) >= 255u)) { ++ if (v_flush_repeat_count < 4u) { ++ v_entry = self->private_data.f_bwt[v_flush_pointer]; ++ v_curr = ((uint8_t)(v_entry)); ++ v_flush_pointer = (v_entry >> 12u); ++ if (v_curr == v_flush_prev) { ++ v_flush_repeat_count += 1u; ++ } else { ++ v_flush_repeat_count = 1u; ++ } ++ v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[((uint8_t)(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_curr))] ^ ((uint32_t)(v_block_checksum_have << 8u))); ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_curr), iop_a_dst += 1); ++ v_flush_prev = v_curr; ++ v_block_size -= 1u; ++ } else { ++ v_entry = self->private_data.f_bwt[v_flush_pointer]; ++ v_curr = ((uint8_t)(v_entry)); ++ v_flush_pointer = (v_entry >> 12u); ++ v_flush_repeat_count = ((uint32_t)(v_curr)); ++ while (v_flush_repeat_count > 0u) { ++ v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[((uint8_t)(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_flush_prev))] ^ ((uint32_t)(v_block_checksum_have << 8u))); ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) > 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_flush_prev), iop_a_dst += 1); ++ } ++ v_flush_repeat_count -= 1u; ++ } ++ v_flush_repeat_count = 0u; ++ v_flush_prev = v_curr; ++ v_block_size -= 1u; ++ } + } +- v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); +- label__loop__continue:; +- while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) { +- v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u))); +- iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- v_length = (((v_table_entry >> 8u) & 255u) + 3u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_table_entry_n_bits > 0u) { +- v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 28u) == 1u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- if ((v_table_entry >> 24u) != 64u) { +- if ((v_table_entry >> 24u) == 8u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; ++ self->private_impl.f_flush_pointer = v_flush_pointer; ++ self->private_impl.f_flush_repeat_count = v_flush_repeat_count; ++ self->private_impl.f_flush_prev = v_flush_prev; ++ self->private_impl.f_block_checksum_have = v_block_checksum_have; ++ if (v_block_size <= 900000u) { ++ self->private_impl.f_block_size = v_block_size; ++ } ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func bzip2.decoder.flush_slow ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_bzip2__decoder__flush_slow( ++ wuffs_bzip2__decoder* self, ++ wuffs_base__io_buffer* a_dst) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_flush_pointer = 0; ++ uint32_t v_flush_repeat_count = 0; ++ uint8_t v_flush_prev = 0; ++ uint32_t v_block_checksum_have = 0; ++ uint32_t v_block_size = 0; ++ uint32_t v_entry = 0; ++ uint8_t v_curr = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; + } +- v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- do { +- if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { +- v_hlen = 0u; +- v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); +- if (v_length > v_hdist) { +- v_length -= v_hdist; +- v_hlen = v_hdist; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_flush_slow; ++ if (coro_susp_point) { ++ v_flush_pointer = self->private_data.s_flush_slow.v_flush_pointer; ++ v_flush_repeat_count = self->private_data.s_flush_slow.v_flush_repeat_count; ++ v_flush_prev = self->private_data.s_flush_slow.v_flush_prev; ++ v_block_checksum_have = self->private_data.s_flush_slow.v_block_checksum_have; ++ v_block_size = self->private_data.s_flush_slow.v_block_size; ++ v_curr = self->private_data.s_flush_slow.v_curr; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ v_flush_pointer = self->private_impl.f_flush_pointer; ++ v_flush_repeat_count = self->private_impl.f_flush_repeat_count; ++ v_flush_prev = self->private_impl.f_flush_prev; ++ v_block_checksum_have = self->private_impl.f_block_checksum_have; ++ v_block_size = self->private_impl.f_block_size; ++ while ((v_block_size > 0u) && ! (self->private_impl.p_flush_slow != 0)) { ++ if (v_flush_repeat_count < 4u) { ++ v_entry = self->private_data.f_bwt[v_flush_pointer]; ++ v_curr = ((uint8_t)(v_entry)); ++ v_flush_pointer = (v_entry >> 12u); ++ if (v_curr == v_flush_prev) { ++ v_flush_repeat_count += 1u; + } else { +- v_hlen = v_length; +- v_length = 0u; +- } +- v_hdist += v_hdist_adjustment; +- if (self->private_impl.f_history_index < v_hdist) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); +- goto exit; +- } +- wuffs_base__io_writer__limited_copy_u32_from_slice( +- &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); +- if (v_length == 0u) { +- goto label__loop__continue; ++ v_flush_repeat_count = 1u; + } +- if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); +- goto exit; ++ v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[((uint8_t)(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_curr))] ^ ((uint32_t)(v_block_checksum_have << 8u))); ++ self->private_data.s_flush_slow.scratch = v_curr; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (iop_a_dst == io2_a_dst) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ goto suspend; + } +- } +- if ((v_dist_minus_1 + 1u) >= 8u) { +- wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } else if ((v_dist_minus_1 + 1u) == 1u) { +- wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow.scratch)); ++ v_flush_prev = v_curr; ++ v_block_size -= 1u; + } else { +- wuffs_base__io_writer__limited_copy_u32_from_history_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ v_entry = self->private_data.f_bwt[v_flush_pointer]; ++ v_curr = ((uint8_t)(v_entry)); ++ v_flush_pointer = (v_entry >> 12u); ++ v_flush_repeat_count = ((uint32_t)(v_curr)); ++ while (v_flush_repeat_count > 0u) { ++ v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[((uint8_t)(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_flush_prev))] ^ ((uint32_t)(v_block_checksum_have << 8u))); ++ self->private_data.s_flush_slow.scratch = v_flush_prev; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (iop_a_dst == io2_a_dst) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ goto suspend; ++ } ++ *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow.scratch)); ++ v_flush_repeat_count -= 1u; ++ } ++ v_flush_repeat_count = 0u; ++ v_flush_prev = v_curr; ++ v_block_size -= 1u; + } +- } while (0); +- } +- if (v_n_bits > 63u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } +- while (v_n_bits >= 8u) { +- v_n_bits -= 8u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); +- goto exit; + } +- } +- self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u)))); +- self->private_impl.f_n_bits = v_n_bits; +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ self->private_impl.f_flush_pointer = v_flush_pointer; ++ self->private_impl.f_flush_repeat_count = v_flush_repeat_count; ++ self->private_impl.f_flush_prev = v_flush_prev; ++ self->private_impl.f_block_checksum_have = v_block_checksum_have; ++ if (v_block_size <= 900000u) { ++ self->private_impl.f_block_size = v_block_size; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_flush_slow = 0; + goto exit; + } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_flush_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_flush_slow.v_flush_pointer = v_flush_pointer; ++ self->private_data.s_flush_slow.v_flush_repeat_count = v_flush_repeat_count; ++ self->private_data.s_flush_slow.v_flush_prev = v_flush_prev; ++ self->private_data.s_flush_slow.v_block_checksum_have = v_block_checksum_have; ++ self->private_data.s_flush_slow.v_block_size = v_block_size; ++ self->private_data.s_flush_slow.v_curr = v_curr; ++ + goto exit; + exit: + if (a_dst && a_dst->data.ptr) { + a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } + + return status; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_bmi2 + +-// -------- func deflate.decoder.decode_huffman_fast32 ++// -------- func bzip2.decoder.decode_huffman_fast + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast32( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__decode_huffman_fast( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + uint32_t v_bits = 0; + uint32_t v_n_bits = 0; +- uint32_t v_table_entry = 0; +- uint32_t v_table_entry_n_bits = 0; +- uint32_t v_lmask = 0; +- uint32_t v_dmask = 0; +- uint32_t v_redir_top = 0; +- uint32_t v_redir_mask = 0; +- uint32_t v_length = 0; +- uint32_t v_dist_minus_1 = 0; +- uint32_t v_hlen = 0; +- uint32_t v_hdist = 0; +- uint32_t v_hdist_adjustment = 0; ++ uint32_t v_block_size = 0; ++ uint8_t v_which = 0; ++ uint32_t v_ticks = 0; ++ uint32_t v_section = 0; ++ uint32_t v_run_shift = 0; ++ uint16_t v_table_entry = 0; ++ uint16_t v_child = 0; ++ uint32_t v_child_ff = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ uint32_t v_output = 0; ++ uint32_t v_run = 0; ++ uint32_t v_mtft0 = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -35657,205 +35461,92 @@ wuffs_deflate__decoder__decode_huffman_fast32( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } + v_bits = self->private_impl.f_bits; + v_n_bits = self->private_impl.f_n_bits; +- v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); +- v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); +- if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { +- status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); +- goto exit; +- } +- v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); +- label__loop__continue:; +- while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 12u)) { +- if (v_n_bits < 15u) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; ++ v_block_size = self->private_impl.f_block_size; ++ v_which = self->private_impl.f_decode_huffman_which; ++ v_ticks = self->private_impl.f_decode_huffman_ticks; ++ v_section = self->private_impl.f_decode_huffman_section; ++ v_run_shift = self->private_impl.f_decode_huffman_run_shift; ++ while (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { ++ if (v_ticks > 0u) { ++ v_ticks -= 1u; + } else { +- } +- v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- if (v_n_bits < 15u) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- } else { +- } +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ v_ticks = 49u; ++ v_section += 1u; ++ if (v_section >= self->private_impl.f_num_sections) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections); + goto exit; + } +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- v_length = (((v_table_entry >> 8u) & 255u) + 3u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_table_entry_n_bits > 0u) { +- if (v_n_bits < 15u) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- } else { +- } +- v_length = (((v_length + 253u + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } else { +- } +- if (v_n_bits < 15u) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- } else { ++ v_which = WUFFS_BZIP2__CLAMP_TO_5[((uint8_t)(self->private_data.f_huffman_selectors[(v_section & 32767u)] & 7u))]; + } +- v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 28u) == 1u) { +- if (v_n_bits < 15u) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- } else { ++ v_bits |= (wuffs_base__peek_u32be__no_bounds_check(iop_a_src) >> v_n_bits); ++ iop_a_src += ((31u - v_n_bits) >> 3u); ++ v_n_bits |= 24u; ++ v_table_entry = self->private_data.f_huffman_tables[v_which][(v_bits >> 24u)]; ++ v_bits <<= ((uint16_t)(v_table_entry >> 12u)); ++ v_n_bits -= ((uint32_t)(((uint16_t)(v_table_entry >> 12u)))); ++ v_child = ((uint16_t)(v_table_entry & 1023u)); ++ while (v_child < 257u) { ++ v_child = self->private_data.f_huffman_trees[v_which][v_child][(v_bits >> 31u)]; ++ v_bits <<= 1u; ++ if (v_n_bits <= 0u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } else { ++ v_n_bits -= 1u; + } +- if ((v_table_entry >> 24u) != 64u) { +- if ((v_table_entry >> 24u) == 8u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ if (v_child < 768u) { ++ v_child_ff = ((uint32_t)(((uint16_t)(v_child & 255u)))); ++ v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff])); ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff)); ++ self->private_data.f_mtft[0u] = ((uint8_t)(v_output)); ++ self->private_data.f_letter_counts[v_output] += 1u; ++ self->private_data.f_bwt[v_block_size] = v_output; ++ if (v_block_size >= self->private_impl.f_max_incl_block_size) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; ++ v_block_size += 1u; ++ v_run_shift = 0u; ++ continue; ++ } else if (v_child == 768u) { ++ self->private_impl.f_decode_huffman_finished = true; ++ break; + } +- v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_n_bits < v_table_entry_n_bits) { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; ++ if (v_run_shift >= 23u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); ++ goto exit; + } +- v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- do { +- if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { +- v_hlen = 0u; +- v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); +- if (v_length > v_hdist) { +- v_length -= v_hdist; +- v_hlen = v_hdist; +- } else { +- v_hlen = v_length; +- v_length = 0u; +- } +- v_hdist += v_hdist_adjustment; +- if (self->private_impl.f_history_index < v_hdist) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); +- goto exit; +- } +- wuffs_base__io_writer__limited_copy_u32_from_slice( +- &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); +- if (v_length == 0u) { +- goto label__loop__continue; +- } +- if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); +- goto exit; +- } +- } +- if ((v_dist_minus_1 + 1u) >= 8u) { +- wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } else { +- wuffs_base__io_writer__limited_copy_u32_from_history_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } +- } while (0); +- } +- while (v_n_bits >= 8u) { +- v_n_bits -= 8u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); ++ v_run = ((((uint32_t)(v_child)) & 3u) << v_run_shift); ++ v_run_shift += 1u; ++ v_i = v_block_size; ++ v_j = (v_run + v_block_size); ++ if (v_j > self->private_impl.f_max_incl_block_size) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } ++ v_block_size = v_j; ++ v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u])); ++ self->private_data.f_letter_counts[v_mtft0] += v_run; ++ while (v_i < v_j) { ++ self->private_data.f_bwt[v_i] = v_mtft0; ++ v_i += 1u; ++ } + } +- self->private_impl.f_bits = (v_bits & ((((uint32_t)(1u)) << v_n_bits) - 1u)); ++ self->private_impl.f_bits = v_bits; + self->private_impl.f_n_bits = v_n_bits; +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } ++ self->private_impl.f_block_size = v_block_size; ++ self->private_impl.f_decode_huffman_which = v_which; ++ self->private_impl.f_decode_huffman_ticks = v_ticks; ++ self->private_impl.f_decode_huffman_section = v_section; ++ self->private_impl.f_decode_huffman_run_shift = v_run_shift; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ ++ ok: + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -35863,52 +35554,25 @@ wuffs_deflate__decoder__decode_huffman_fast32( + return status; + } + +-// -------- func deflate.decoder.decode_huffman_fast64 ++// -------- func bzip2.decoder.decode_huffman_slow + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast64( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_bzip2__decoder__decode_huffman_slow( ++ wuffs_bzip2__decoder* self, + wuffs_base__io_buffer* a_src) { +- return (*self->private_impl.choosy_decode_huffman_fast64)(self, a_dst, a_src); +-} ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_table_entry = 0; +- uint32_t v_table_entry_n_bits = 0; +- uint64_t v_lmask = 0; +- uint64_t v_dmask = 0; +- uint32_t v_redir_top = 0; +- uint32_t v_redir_mask = 0; +- uint32_t v_length = 0; +- uint32_t v_dist_minus_1 = 0; +- uint32_t v_hlen = 0; +- uint32_t v_hdist = 0; +- uint32_t v_hdist_adjustment = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_node_index = 0; ++ uint16_t v_child = 0; ++ uint32_t v_child_ff = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ uint32_t v_output = 0; ++ uint32_t v_run = 0; ++ uint32_t v_mtft0 = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -35920,160 +35584,101 @@ wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } +- v_bits = ((uint64_t)(self->private_impl.f_bits)); +- v_n_bits = self->private_impl.f_n_bits; +- v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); +- v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); +- if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { +- status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); +- goto exit; ++ uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow; ++ if (coro_susp_point) { ++ v_node_index = self->private_data.s_decode_huffman_slow.v_node_index; + } +- v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); +- label__loop__continue:; +- while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) { +- v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u))); +- iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 31u) != 0u) { +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while ( ! (self->private_impl.p_decode_huffman_slow != 0)) { ++ if (self->private_impl.f_decode_huffman_ticks > 0u) { ++ self->private_impl.f_decode_huffman_ticks -= 1u; + } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- v_length = (((v_table_entry >> 8u) & 255u) + 3u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_table_entry_n_bits > 0u) { +- v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- if ((v_table_entry >> 28u) == 1u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- if ((v_table_entry >> 24u) != 64u) { +- if ((v_table_entry >> 24u) == 8u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; ++ self->private_impl.f_decode_huffman_ticks = 49u; ++ self->private_impl.f_decode_huffman_section += 1u; ++ if (self->private_impl.f_decode_huffman_section >= self->private_impl.f_num_sections) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections); ++ goto exit; ++ } ++ self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[((uint8_t)(self->private_data.f_huffman_selectors[(self->private_impl.f_decode_huffman_section & 32767u)] & 7u))]; + } +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- do { +- if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { +- v_hlen = 0u; +- v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); +- if (v_length > v_hdist) { +- v_length -= v_hdist; +- v_hlen = v_hdist; +- } else { +- v_hlen = v_length; +- v_length = 0u; ++ v_node_index = 0u; ++ while (true) { ++ if (self->private_impl.f_n_bits <= 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u); ++ self->private_impl.f_n_bits = 8u; + } +- v_hdist += v_hdist_adjustment; +- if (self->private_impl.f_history_index < v_hdist) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); +- goto exit; ++ v_child = self->private_data.f_huffman_trees[self->private_impl.f_decode_huffman_which][v_node_index][(self->private_impl.f_bits >> 31u)]; ++ self->private_impl.f_bits <<= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ if (v_child < 257u) { ++ v_node_index = ((uint32_t)(v_child)); ++ continue; ++ } else if (v_child < 768u) { ++ v_child_ff = ((uint32_t)(((uint16_t)(v_child & 255u)))); ++ v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff])); ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff)); ++ self->private_data.f_mtft[0u] = ((uint8_t)(v_output)); ++ self->private_data.f_letter_counts[v_output] += 1u; ++ self->private_data.f_bwt[self->private_impl.f_block_size] = v_output; ++ if (self->private_impl.f_block_size >= self->private_impl.f_max_incl_block_size) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); ++ goto exit; ++ } ++ self->private_impl.f_block_size += 1u; ++ self->private_impl.f_decode_huffman_run_shift = 0u; ++ break; ++ } else if (v_child == 768u) { ++ self->private_impl.f_decode_huffman_finished = true; ++ goto label__outer__break; + } +- wuffs_base__io_writer__limited_copy_u32_from_slice( +- &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); +- if (v_length == 0u) { +- goto label__loop__continue; ++ if (self->private_impl.f_decode_huffman_run_shift >= 23u) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); ++ goto exit; + } +- if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); ++ v_run = ((((uint32_t)(v_child)) & 3u) << self->private_impl.f_decode_huffman_run_shift); ++ self->private_impl.f_decode_huffman_run_shift += 1u; ++ v_i = self->private_impl.f_block_size; ++ v_j = (v_run + self->private_impl.f_block_size); ++ if (v_j > self->private_impl.f_max_incl_block_size) { ++ status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length); + goto exit; + } ++ self->private_impl.f_block_size = v_j; ++ v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u])); ++ self->private_data.f_letter_counts[v_mtft0] += v_run; ++ while (v_i < v_j) { ++ self->private_data.f_bwt[v_i] = v_mtft0; ++ v_i += 1u; ++ } ++ break; + } +- if ((v_dist_minus_1 + 1u) >= 8u) { +- wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } else if ((v_dist_minus_1 + 1u) == 1u) { +- wuffs_base__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } else { +- wuffs_base__io_writer__limited_copy_u32_from_history_fast( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- } +- } while (0); +- } +- if (v_n_bits > 63u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } +- while (v_n_bits >= 8u) { +- v_n_bits -= 8u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); +- goto exit; + } +- } +- self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u)))); +- self->private_impl.f_n_bits = v_n_bits; +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ label__outer__break:; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_huffman_slow = 0; + goto exit; + } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_huffman_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_huffman_slow.v_node_index = v_node_index; ++ + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -36081,40 +35686,229 @@ wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( + return status; + } + +-// -------- func deflate.decoder.decode_huffman_slow ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_cbor__error__bad_input[] = "#cbor: bad input"; ++const char wuffs_cbor__error__unsupported_recursion_depth[] = "#cbor: unsupported recursion depth"; ++const char wuffs_cbor__error__internal_error_inconsistent_i_o[] = "#cbor: internal error: inconsistent I/O"; ++const char wuffs_cbor__error__internal_error_inconsistent_token_length[] = "#cbor: internal error: inconsistent token length"; ++ ++// ---------------- Private Consts ++ ++static const uint32_t ++WUFFS_CBOR__LITERALS[4] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 8388612u, 8388616u, 8388610u, 8388609u, ++}; ++ ++static const uint8_t ++WUFFS_CBOR__TOKEN_LENGTHS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, ++ 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, ++ 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, ++ 2u, 3u, 5u, 9u, 0u, 0u, 0u, 1u, ++}; ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++// ---------------- VTables ++ ++const wuffs_base__token_decoder__func_ptrs ++wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__token_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_cbor__decoder__decode_tokens), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_cbor__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_cbor__decoder__set_quirk), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_cbor__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_cbor__decoder__initialize( ++ wuffs_cbor__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name = ++ wuffs_base__token_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers = ++ (const void*)(&wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_cbor__decoder* ++wuffs_cbor__decoder__alloc(void) { ++ wuffs_cbor__decoder* x = ++ (wuffs_cbor__decoder*)(calloc(1, sizeof(wuffs_cbor__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_cbor__decoder__initialize( ++ x, sizeof(wuffs_cbor__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_cbor__decoder(void) { ++ return sizeof(wuffs_cbor__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func cbor.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_deflate__decoder__decode_huffman_slow( +- wuffs_deflate__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_cbor__decoder__get_quirk( ++ const wuffs_cbor__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func cbor.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_cbor__decoder__set_quirk( ++ wuffs_cbor__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func cbor.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_cbor__decoder__workbuf_len( ++ const wuffs_cbor__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__empty_range_ii_u64(); ++} ++ ++// -------- func cbor.decoder.decode_tokens ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_cbor__decoder__decode_tokens( ++ wuffs_cbor__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_table_entry = 0; +- uint32_t v_table_entry_n_bits = 0; +- uint32_t v_lmask = 0; +- uint32_t v_dmask = 0; +- uint32_t v_b0 = 0; +- uint32_t v_redir_top = 0; +- uint32_t v_redir_mask = 0; +- uint32_t v_b1 = 0; +- uint32_t v_length = 0; +- uint32_t v_b2 = 0; +- uint32_t v_b3 = 0; +- uint32_t v_b4 = 0; +- uint32_t v_dist_minus_1 = 0; +- uint32_t v_b5 = 0; +- uint32_t v_n_copied = 0; +- uint32_t v_hlen = 0; +- uint32_t v_hdist = 0; ++ uint64_t v_string_length = 0; ++ uint64_t v_n64 = 0; ++ uint32_t v_depth = 0; ++ uint32_t v_stack_byte = 0; ++ uint32_t v_stack_bit = 0; ++ uint32_t v_stack_val = 0; ++ uint32_t v_token_length = 0; ++ uint32_t v_vminor = 0; ++ uint32_t v_vminor_alt = 0; ++ uint32_t v_continued = 0; ++ uint8_t v_c8 = 0; ++ uint8_t v_c_major = 0; ++ uint8_t v_c_minor = 0; ++ bool v_tagged = false; ++ uint8_t v_indefinite_string_major_type = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + if (a_dst && a_dst->data.ptr) { + io0_a_dst = a_dst->data.ptr; + io1_a_dst = io0_a_dst + a_dst->meta.wi; +@@ -36135,269 +35929,513 @@ wuffs_deflate__decoder__decode_huffman_slow( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_tokens; + if (coro_susp_point) { +- v_bits = self->private_data.s_decode_huffman_slow[0].v_bits; +- v_n_bits = self->private_data.s_decode_huffman_slow[0].v_n_bits; +- v_table_entry_n_bits = self->private_data.s_decode_huffman_slow[0].v_table_entry_n_bits; +- v_lmask = self->private_data.s_decode_huffman_slow[0].v_lmask; +- v_dmask = self->private_data.s_decode_huffman_slow[0].v_dmask; +- v_redir_top = self->private_data.s_decode_huffman_slow[0].v_redir_top; +- v_redir_mask = self->private_data.s_decode_huffman_slow[0].v_redir_mask; +- v_length = self->private_data.s_decode_huffman_slow[0].v_length; +- v_dist_minus_1 = self->private_data.s_decode_huffman_slow[0].v_dist_minus_1; ++ v_string_length = self->private_data.s_decode_tokens.v_string_length; ++ v_depth = self->private_data.s_decode_tokens.v_depth; ++ v_tagged = self->private_data.s_decode_tokens.v_tagged; ++ v_indefinite_string_major_type = self->private_data.s_decode_tokens.v_indefinite_string_major_type; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; ++ if (self->private_impl.f_end_of_data) { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } +- v_bits = self->private_impl.f_bits; +- v_n_bits = self->private_impl.f_n_bits; +- v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); +- v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); +- label__loop__continue:; +- while ( ! (self->private_impl.p_decode_huffman_slow[0] != 0)) { ++ label__outer__continue:; ++ while (true) { + while (true) { +- v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- if (v_n_bits >= v_table_entry_n_bits) { +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- break; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ do { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ goto label__outer__continue; + } +- uint32_t t_0 = *iop_a_src++; +- v_b0 = t_0; +- } +- v_bits |= (v_b0 << v_n_bits); +- v_n_bits += 8u; +- } +- if ((v_table_entry >> 31u) != 0u) { +- self->private_data.s_decode_huffman_slow[0].scratch = ((uint8_t)((v_table_entry >> 8u))); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (iop_a_dst == io2_a_dst) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- goto suspend; +- } +- *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow[0].scratch)); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- while (true) { +- v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- if (v_n_bits >= v_table_entry_n_bits) { +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- break; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ goto label__outer__continue; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if ((v_indefinite_string_major_type != 0u) && (v_indefinite_string_major_type != ((uint8_t)(v_c8 >> 5u)))) { ++ if (v_c8 != 255u) { ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ goto exit; + } +- uint32_t t_1 = *iop_a_src++; +- v_b1 = t_1; ++ v_vminor = 4194560u; ++ if (v_indefinite_string_major_type == 3u) { ++ v_vminor |= 19u; ++ } ++ v_indefinite_string_major_type = 0u; ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; + } +- v_bits |= (v_b1 << v_n_bits); +- v_n_bits += 8u; +- } +- if ((v_table_entry >> 31u) != 0u) { +- self->private_data.s_decode_huffman_slow[0].scratch = ((uint8_t)((v_table_entry >> 8u))); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (iop_a_dst == io2_a_dst) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- goto suspend; ++ iop_a_src += 1u; ++ v_c_major = ((uint8_t)(((uint8_t)(v_c8 >> 5u)))); ++ v_c_minor = ((uint8_t)(v_c8 & 31u)); ++ if (v_c_minor < 24u) { ++ v_string_length = ((uint64_t)(v_c_minor)); ++ } else { ++ while (true) { ++ if (v_c_minor == 24u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 1u) { ++ v_string_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); ++ iop_a_src += 1u; ++ break; ++ } ++ } else if (v_c_minor == 25u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 2u) { ++ v_string_length = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2u; ++ break; ++ } ++ } else if (v_c_minor == 26u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { ++ v_string_length = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4u; ++ break; ++ } ++ } else if (v_c_minor == 27u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 8u) { ++ v_string_length = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8u; ++ break; ++ } ++ } else { ++ v_string_length = 0u; ++ break; ++ } ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ goto label__outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } + } +- *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow[0].scratch)); +- continue; +- } else if ((v_table_entry >> 30u) != 0u) { +- } else if ((v_table_entry >> 29u) != 0u) { +- self->private_impl.f_end_of_block = true; +- break; +- } else if ((v_table_entry >> 28u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ if (v_c_major == 0u) { ++ if (v_c_minor < 26u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((14680064u | ((uint32_t)((v_string_length & 65535u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor < 28u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((14680064u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ *iop_a_dst++ = wuffs_base__make_token( ++ (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ } else if (v_c_major == 1u) { ++ if (v_c_minor < 26u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length & 65535u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor < 28u) { ++ if (v_string_length < 9223372036854775808u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length >> 46u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ *iop_a_dst++ = wuffs_base__make_token( ++ (~((18446744073709551615u - v_string_length) & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } else { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | ++ (((uint64_t)(16777216u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ } else if (v_c_major == 2u) { ++ if (v_c_minor < 28u) { ++ if (v_string_length == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } else if (v_c_minor == 31u) { ++ if (v_indefinite_string_major_type != 0u) { ++ break; ++ } ++ v_indefinite_string_major_type = 2u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__outer__continue; ++ } else { ++ break; ++ } ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ continue; ++ } ++ v_n64 = wuffs_base__u64__min(v_string_length, ((uint64_t)(io2_a_src - iop_a_src))); ++ v_token_length = ((uint32_t)((v_n64 & 65535u))); ++ if (v_n64 > 65535u) { ++ v_token_length = 65535u; ++ } else if (v_token_length <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ continue; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) { ++ status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length); ++ goto exit; ++ } ++ v_string_length -= ((uint64_t)(v_token_length)); ++ v_continued = 0u; ++ if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) { ++ v_continued = 1u; ++ } ++ iop_a_src += v_token_length; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194816u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (v_string_length > 0u) { ++ continue; ++ } else if (v_indefinite_string_major_type > 0u) { ++ goto label__outer__continue; ++ } ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ } else if (v_c_major == 3u) { ++ if (v_c_minor < 28u) { ++ if (v_string_length == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } else if (v_c_minor == 31u) { ++ if (v_indefinite_string_major_type != 0u) { ++ break; ++ } ++ v_indefinite_string_major_type = 3u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__outer__continue; ++ } else { ++ break; ++ } ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ continue; ++ } ++ v_n64 = wuffs_base__u64__min(v_string_length, 65535u); ++ v_n64 = ((uint64_t)(wuffs_base__utf_8__longest_valid_prefix(iop_a_src, ++ ((size_t)(wuffs_base__u64__min(((uint64_t)(io2_a_src - iop_a_src)), v_n64)))))); ++ v_token_length = ((uint32_t)((v_n64 & 65535u))); ++ if (v_token_length <= 0u) { ++ if ((a_src && a_src->meta.closed) || (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) { ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ continue; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) { ++ status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length); ++ goto exit; ++ } ++ v_string_length -= ((uint64_t)(v_token_length)); ++ v_continued = 0u; ++ if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) { ++ v_continued = 1u; ++ } ++ iop_a_src += v_token_length; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (v_string_length > 0u) { ++ continue; ++ } else if (v_indefinite_string_major_type > 0u) { ++ goto label__outer__continue; ++ } ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ } else if (v_c_major == 4u) { ++ if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) { ++ break; ++ } else if (v_depth >= 1024u) { ++ v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])); ++ while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) { ++ iop_a_src--; ++ v_token_length -= 1u; ++ } ++ status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth); ++ goto exit; ++ } ++ v_vminor = 2105361u; ++ v_vminor_alt = 2101282u; ++ if (v_depth > 0u) { ++ v_stack_byte = ((v_depth - 1u) / 16u); ++ v_stack_bit = (((v_depth - 1u) & 15u) * 2u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ v_vminor = 2105377u; ++ v_vminor_alt = 2105378u; ++ } else { ++ v_vminor = 2105409u; ++ v_vminor_alt = 2113570u; ++ } ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (v_c_minor == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ v_stack_byte = (v_depth / 16u); ++ v_stack_bit = ((v_depth & 15u) * 2u); ++ self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(3u)) << v_stack_bit)); ++ self->private_data.f_container_num_remaining[v_depth] = v_string_length; ++ v_depth += 1u; ++ v_tagged = false; ++ goto label__outer__continue; ++ } else if (v_c_major == 5u) { ++ if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) { ++ break; ++ } else if (v_depth >= 1024u) { ++ v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])); ++ while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) { ++ iop_a_src--; ++ v_token_length -= 1u; ++ } ++ status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth); ++ goto exit; ++ } ++ v_vminor = 2113553u; ++ v_vminor_alt = 2101314u; ++ if (v_depth > 0u) { ++ v_stack_byte = ((v_depth - 1u) / 16u); ++ v_stack_bit = (((v_depth - 1u) & 15u) * 2u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ v_vminor = 2113569u; ++ v_vminor_alt = 2105410u; ++ } else { ++ v_vminor = 2113601u; ++ v_vminor_alt = 2113602u; ++ } ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (v_c_minor == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ v_stack_byte = (v_depth / 16u); ++ v_stack_bit = ((v_depth & 15u) * 2u); ++ self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(3u)) << v_stack_bit); ++ self->private_data.f_container_num_remaining[v_depth] = v_string_length; ++ v_depth += 1u; ++ v_tagged = false; ++ goto label__outer__continue; ++ } else if (v_c_major == 6u) { ++ if (v_c_minor >= 28u) { ++ break; ++ } ++ if (v_string_length < 262144u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | ++ (((uint64_t)((4194304u | ((uint32_t)(v_string_length))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } else { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | ++ (((uint64_t)((4194304u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ *iop_a_dst++ = wuffs_base__make_token( ++ (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ v_tagged = true; ++ goto label__outer__continue; ++ } else if (v_c_major == 7u) { ++ if (v_c_minor < 20u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | ++ (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor < 24u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(WUFFS_CBOR__LITERALS[((uint8_t)(v_c_minor & 3u))])) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor == 24u) { ++ if (v_string_length < 24u) { ++ if ( ! (iop_a_src > io1_a_src)) { ++ status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ iop_a_src--; ++ break; ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(787997u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) | ++ (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor < 28u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(10490113u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } else if (v_c_minor == 31u) { ++ if (v_tagged || (v_depth <= 0u)) { ++ break; ++ } ++ v_depth -= 1u; ++ if (self->private_data.f_container_num_remaining[v_depth] != 0u) { ++ break; ++ } ++ v_stack_byte = (v_depth / 16u); ++ v_stack_bit = ((v_depth & 15u) * 2u); ++ v_stack_val = (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit)); ++ if (v_stack_val == 1u) { ++ break; ++ } ++ if (v_stack_val != 3u) { ++ v_vminor_alt = 2097186u; ++ } else { ++ v_vminor_alt = 2097218u; ++ } ++ if (v_depth <= 0u) { ++ v_vminor_alt |= 4096u; ++ } else { ++ v_stack_byte = ((v_depth - 1u) / 16u); ++ v_stack_bit = (((v_depth - 1u) & 15u) * 2u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ v_vminor_alt |= 8192u; ++ } else { ++ v_vminor_alt |= 16384u; ++ } ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__goto_parsed_a_leaf_value__break; ++ } ++ } ++ } while (0); ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ status = wuffs_base__make_status(wuffs_cbor__error__bad_input); + goto exit; + } +- } else if ((v_table_entry >> 27u) != 0u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o); + goto exit; + } +- v_length = (((v_table_entry >> 8u) & 255u) + 3u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_table_entry_n_bits > 0u) { +- while (v_n_bits < v_table_entry_n_bits) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint32_t t_2 = *iop_a_src++; +- v_b2 = t_2; +- } +- v_bits |= (v_b2 << v_n_bits); +- v_n_bits += 8u; ++ label__goto_parsed_a_leaf_value__break:; ++ v_tagged = false; ++ while (v_depth > 0u) { ++ v_stack_byte = ((v_depth - 1u) / 16u); ++ v_stack_bit = (((v_depth - 1u) & 15u) * 2u); ++ self->private_data.f_stack[v_stack_byte] ^= (((uint32_t)(1u)) << (v_stack_bit + 1u)); ++ if (1u == (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit))) { ++ goto label__outer__continue; + } +- v_length = (((v_length + 253u + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- while (true) { +- v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- if (v_n_bits >= v_table_entry_n_bits) { +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- break; ++ if (self->private_data.f_container_num_remaining[(v_depth - 1u)] <= 0u) { ++ goto label__outer__continue; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint32_t t_3 = *iop_a_src++; +- v_b3 = t_3; +- } +- v_bits |= (v_b3 << v_n_bits); +- v_n_bits += 8u; +- } +- if ((v_table_entry >> 28u) == 1u) { +- v_redir_top = ((v_table_entry >> 8u) & 65535u); +- v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); +- while (true) { +- v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; +- v_table_entry_n_bits = (v_table_entry & 15u); +- if (v_n_bits >= v_table_entry_n_bits) { +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- break; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint32_t t_4 = *iop_a_src++; +- v_b4 = t_4; +- } +- v_bits |= (v_b4 << v_n_bits); +- v_n_bits += 8u; ++ self->private_data.f_container_num_remaining[(v_depth - 1u)] -= 1u; ++ if (self->private_data.f_container_num_remaining[(v_depth - 1u)] > 0u) { ++ goto label__outer__continue; + } +- } +- if ((v_table_entry >> 24u) != 64u) { +- if ((v_table_entry >> 24u) == 8u) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); +- goto exit; ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ continue; + } +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); +- goto exit; +- } +- v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); +- v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); +- if (v_table_entry_n_bits > 0u) { +- while (v_n_bits < v_table_entry_n_bits) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint32_t t_5 = *iop_a_src++; +- v_b5 = t_5; +- } +- v_bits |= (v_b5 << v_n_bits); +- v_n_bits += 8u; ++ v_depth -= 1u; ++ v_stack_byte = (v_depth / 16u); ++ v_stack_bit = ((v_depth & 15u) * 2u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ v_vminor_alt = 2097186u; ++ } else { ++ v_vminor_alt = 2097218u; + } +- v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u); +- v_bits >>= v_table_entry_n_bits; +- v_n_bits -= v_table_entry_n_bits; +- } +- while (true) { +- if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { +- v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); +- if (v_hdist < v_length) { +- v_hlen = v_hdist; ++ if (v_depth <= 0u) { ++ v_vminor_alt |= 4096u; ++ } else { ++ v_stack_byte = ((v_depth - 1u) / 16u); ++ v_stack_bit = (((v_depth - 1u) & 15u) * 2u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ v_vminor_alt |= 8192u; + } else { +- v_hlen = v_length; +- } +- v_hdist += ((uint32_t)(((uint64_t)(self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u))))); +- if (self->private_impl.f_history_index < v_hdist) { +- status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); +- goto exit; +- } +- v_n_copied = wuffs_base__io_writer__limited_copy_u32_from_slice( +- &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); +- if (v_n_copied < v_hlen) { +- v_length -= v_n_copied; +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); +- continue; +- } +- v_length -= v_hlen; +- if (v_length == 0u) { +- goto label__loop__continue; ++ v_vminor_alt |= 16384u; + } + } +- v_n_copied = wuffs_base__io_writer__limited_copy_u32_from_history( +- &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); +- if (v_length <= v_n_copied) { +- goto label__loop__continue; +- } +- v_length -= v_n_copied; +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); + } ++ break; + } +- self->private_impl.f_bits = v_bits; +- self->private_impl.f_n_bits = v_n_bits; +- if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { +- status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); +- goto exit; +- } ++ self->private_impl.f_end_of_data = true; + + ok: +- self->private_impl.p_decode_huffman_slow[0] = 0; ++ self->private_impl.p_decode_tokens = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_huffman_slow[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_huffman_slow[0].v_bits = v_bits; +- self->private_data.s_decode_huffman_slow[0].v_n_bits = v_n_bits; +- self->private_data.s_decode_huffman_slow[0].v_table_entry_n_bits = v_table_entry_n_bits; +- self->private_data.s_decode_huffman_slow[0].v_lmask = v_lmask; +- self->private_data.s_decode_huffman_slow[0].v_dmask = v_dmask; +- self->private_data.s_decode_huffman_slow[0].v_redir_top = v_redir_top; +- self->private_data.s_decode_huffman_slow[0].v_redir_mask = v_redir_mask; +- self->private_data.s_decode_huffman_slow[0].v_length = v_length; +- self->private_data.s_decode_huffman_slow[0].v_dist_minus_1 = v_dist_minus_1; ++ self->private_impl.p_decode_tokens = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_data.s_decode_tokens.v_string_length = v_string_length; ++ self->private_data.s_decode_tokens.v_depth = v_depth; ++ self->private_data.s_decode_tokens.v_tagged = v_tagged; ++ self->private_data.s_decode_tokens.v_indefinite_string_major_type = v_indefinite_string_major_type; + + goto exit; + exit: +@@ -36408,243 +36446,607 @@ wuffs_deflate__decoder__decode_huffman_slow( + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } + return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) + + // ---------------- Status Codes Implementations + +-const char wuffs_gif__error__bad_lzw_code[] = "#gif: bad LZW code"; +-const char wuffs_gif__error__bad_extension_label[] = "#gif: bad extension label"; +-const char wuffs_gif__error__bad_frame_size[] = "#gif: bad frame size"; +-const char wuffs_gif__error__bad_graphic_control[] = "#gif: bad graphic control"; +-const char wuffs_gif__error__bad_header[] = "#gif: bad header"; +-const char wuffs_gif__error__bad_literal_width[] = "#gif: bad literal width"; +-const char wuffs_gif__error__bad_palette[] = "#gif: bad palette"; +-const char wuffs_gif__error__truncated_input[] = "#gif: truncated input"; +-const char wuffs_gif__error__internal_error_inconsistent_i_o[] = "#gif: internal error: inconsistent I/O"; +- + // ---------------- Private Consts + + static const uint32_t +-WUFFS_GIF__INTERLACE_START[5] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 4294967295, 1, 2, 4, 0, +-}; +- +-static const uint8_t +-WUFFS_GIF__INTERLACE_DELTA[5] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1, 2, 4, 8, 8, +-}; +- +-static const uint8_t +-WUFFS_GIF__INTERLACE_COUNT[5] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 1, 2, 4, 8, +-}; +- +-static const uint8_t +-WUFFS_GIF__ANIMEXTS1DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 65, 78, 73, 77, 69, 88, 84, 83, +- 49, 46, 48, +-}; +- +-static const uint8_t +-WUFFS_GIF__NETSCAPE2DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 78, 69, 84, 83, 67, 65, 80, 69, +- 50, 46, 48, +-}; +- +-static const uint8_t +-WUFFS_GIF__ICCRGBG1012[11] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 73, 67, 67, 82, 71, 66, 71, 49, +- 48, 49, 50, +-}; +- +-static const uint8_t +-WUFFS_GIF__XMPDATAXMP[11] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 88, 77, 80, 32, 68, 97, 116, 97, +- 88, 77, 80, ++WUFFS_CRC32__IEEE_TABLE[16][256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ { ++ 0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u, ++ 249268274u, 2044508324u, 3772115230u, 2547177864u, 162941995u, 2125561021u, 3887607047u, 2428444049u, ++ 498536548u, 1789927666u, 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u, ++ 325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u, 4195302755u, 2366115317u, ++ 997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u, ++ 901097722u, 1119000684u, 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u, ++ 651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u, 3485111705u, 3099436303u, ++ 671266974u, 1594198024u, 3322730930u, 2970347812u, 795835527u, 1483230225u, 3244367275u, 3060149565u, ++ 1994146192u, 31158534u, 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u, ++ 2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u, 2439277719u, 3865271297u, ++ 1802195444u, 476864866u, 2238001368u, 4066508878u, 1812370925u, 453092731u, 2181625025u, 4111451223u, ++ 1706088902u, 314042704u, 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u, ++ 1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u, ++ 1131014506u, 879679996u, 2909243462u, 3663771856u, 1141124467u, 855842277u, 2852801631u, 3708648649u, ++ 1342533948u, 654459306u, 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u, ++ 1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u, 3082640443u, 3233442989u, ++ 3988292384u, 2596254646u, 62317068u, 1957810842u, 3939845945u, 2647816111u, 81470997u, 1943803523u, ++ 3814918930u, 2489596804u, 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u, ++ 4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u, 426522225u, 1852507879u, ++ 4275313526u, 2312317920u, 282753626u, 1742555852u, 4189708143u, 2394877945u, 397917763u, 1622183637u, ++ 3604390888u, 2714866558u, 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u, ++ 3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u, 829329135u, 1181335161u, ++ 3412177804u, 3160834842u, 628085408u, 1382605366u, 3423369109u, 3138078467u, 570562233u, 1426400815u, ++ 3317316542u, 2998733608u, 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u, ++ 2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u, 1913087877u, 83908371u, ++ 2512341634u, 3803740692u, 2075208622u, 213261112u, 2463272603u, 3855990285u, 2094854071u, 198958881u, ++ 2262029012u, 4057260610u, 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u, ++ 2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u, 1634467795u, 376229701u, ++ 2685067896u, 3608007406u, 1308918612u, 956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u, ++ 2932959818u, 3654703836u, 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u, ++ 3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u, 1423857449u, 601450431u, ++ 3009837614u, 3294710456u, 1567103746u, 711928724u, 3020668471u, 3272380065u, 1510334235u, 755167117u, ++ }, { ++ 0u, 421212481u, 842424962u, 724390851u, 1684849924u, 2105013317u, 1448781702u, 1329698503u, ++ 3369699848u, 3519200073u, 4210026634u, 3824474571u, 2897563404u, 3048111693u, 2659397006u, 2274893007u, ++ 1254232657u, 1406739216u, 2029285587u, 1643069842u, 783210325u, 934667796u, 479770071u, 92505238u, ++ 2182846553u, 2600511768u, 2955803355u, 2838940570u, 3866582365u, 4285295644u, 3561045983u, 3445231262u, ++ 2508465314u, 2359236067u, 2813478432u, 3198777185u, 4058571174u, 3908292839u, 3286139684u, 3670389349u, ++ 1566420650u, 1145479147u, 1869335592u, 1987116393u, 959540142u, 539646703u, 185010476u, 303839341u, ++ 3745920755u, 3327985586u, 3983561841u, 4100678960u, 3140154359u, 2721170102u, 2300350837u, 2416418868u, ++ 396344571u, 243568058u, 631889529u, 1018359608u, 1945336319u, 1793607870u, 1103436669u, 1490954812u, ++ 4034481925u, 3915546180u, 3259968903u, 3679722694u, 2484439553u, 2366552896u, 2787371139u, 3208174018u, ++ 950060301u, 565965900u, 177645455u, 328046286u, 1556873225u, 1171730760u, 1861902987u, 2011255754u, ++ 3132841300u, 2745199637u, 2290958294u, 2442530455u, 3738671184u, 3352078609u, 3974232786u, 4126854035u, ++ 1919080284u, 1803150877u, 1079293406u, 1498383519u, 370020952u, 253043481u, 607678682u, 1025720731u, ++ 1711106983u, 2095471334u, 1472923941u, 1322268772u, 26324643u, 411738082u, 866634785u, 717028704u, ++ 2904875439u, 3024081134u, 2668790573u, 2248782444u, 3376948395u, 3495106026u, 4219356713u, 3798300520u, ++ 792689142u, 908347575u, 487136116u, 68299317u, 1263779058u, 1380486579u, 2036719216u, 1618931505u, ++ 3890672638u, 4278043327u, 3587215740u, 3435896893u, 2206873338u, 2593195963u, 2981909624u, 2829542713u, ++ 998479947u, 580430090u, 162921161u, 279890824u, 1609522511u, 1190423566u, 1842954189u, 1958874764u, ++ 4082766403u, 3930137346u, 3245109441u, 3631694208u, 2536953671u, 2385372678u, 2768287173u, 3155920004u, ++ 1900120602u, 1750776667u, 1131931800u, 1517083097u, 355290910u, 204897887u, 656092572u, 1040194781u, ++ 3113746450u, 2692952403u, 2343461520u, 2461357009u, 3723805974u, 3304059991u, 4022511508u, 4141455061u, ++ 2919742697u, 3072101800u, 2620513899u, 2234183466u, 3396041197u, 3547351212u, 4166851439u, 3779471918u, ++ 1725839073u, 2143618976u, 1424512099u, 1307796770u, 45282277u, 464110244u, 813994343u, 698327078u, ++ 3838160568u, 4259225593u, 3606301754u, 3488152955u, 2158586812u, 2578602749u, 2996767038u, 2877569151u, ++ 740041904u, 889656817u, 506086962u, 120682355u, 1215357364u, 1366020341u, 2051441462u, 1667084919u, ++ 3422213966u, 3538019855u, 4190942668u, 3772220557u, 2945847882u, 3062702859u, 2644537544u, 2226864521u, ++ 52649286u, 439905287u, 823476164u, 672009861u, 1733269570u, 2119477507u, 1434057408u, 1281543041u, ++ 2167981343u, 2552493150u, 3004082077u, 2853541596u, 3847487515u, 4233048410u, 3613549209u, 3464057816u, ++ 1239502615u, 1358593622u, 2077699477u, 1657543892u, 764250643u, 882293586u, 532408465u, 111204816u, ++ 1585378284u, 1197851309u, 1816695150u, 1968414767u, 974272232u, 587794345u, 136598634u, 289367339u, ++ 2527558116u, 2411481253u, 2760973158u, 3179948583u, 4073438432u, 3956313505u, 3237863010u, 3655790371u, ++ 347922877u, 229101820u, 646611775u, 1066513022u, 1892689081u, 1774917112u, 1122387515u, 1543337850u, ++ 3697634229u, 3313392372u, 3998419255u, 4148705398u, 3087642289u, 2702352368u, 2319436851u, 2468674930u, ++ }, { ++ 0u, 29518391u, 59036782u, 38190681u, 118073564u, 114017003u, 76381362u, 89069189u, ++ 236147128u, 265370511u, 228034006u, 206958561u, 152762724u, 148411219u, 178138378u, 190596925u, ++ 472294256u, 501532999u, 530741022u, 509615401u, 456068012u, 451764635u, 413917122u, 426358261u, ++ 305525448u, 334993663u, 296822438u, 275991697u, 356276756u, 352202787u, 381193850u, 393929805u, ++ 944588512u, 965684439u, 1003065998u, 973863097u, 1061482044u, 1049003019u, 1019230802u, 1023561829u, ++ 912136024u, 933002607u, 903529270u, 874031361u, 827834244u, 815125939u, 852716522u, 856752605u, ++ 611050896u, 631869351u, 669987326u, 640506825u, 593644876u, 580921211u, 551983394u, 556069653u, ++ 712553512u, 733666847u, 704405574u, 675154545u, 762387700u, 749958851u, 787859610u, 792175277u, ++ 1889177024u, 1901651959u, 1931368878u, 1927033753u, 2006131996u, 1985040171u, 1947726194u, 1976933189u, ++ 2122964088u, 2135668303u, 2098006038u, 2093965857u, 2038461604u, 2017599123u, 2047123658u, 2076625661u, ++ 1824272048u, 1836991623u, 1866005214u, 1861914857u, 1807058540u, 1786244187u, 1748062722u, 1777547317u, ++ 1655668488u, 1668093247u, 1630251878u, 1625932113u, 1705433044u, 1684323811u, 1713505210u, 1742760333u, ++ 1222101792u, 1226154263u, 1263738702u, 1251046777u, 1339974652u, 1310460363u, 1281013650u, 1301863845u, ++ 1187289752u, 1191637167u, 1161842422u, 1149379777u, 1103966788u, 1074747507u, 1112139306u, 1133218845u, ++ 1425107024u, 1429406311u, 1467333694u, 1454888457u, 1408811148u, 1379576507u, 1350309090u, 1371438805u, ++ 1524775400u, 1528845279u, 1499917702u, 1487177649u, 1575719220u, 1546255107u, 1584350554u, 1605185389u, ++ 3778354048u, 3774312887u, 3803303918u, 3816007129u, 3862737756u, 3892238699u, 3854067506u, 3833203973u, ++ 4012263992u, 4007927823u, 3970080342u, 3982554209u, 3895452388u, 3924658387u, 3953866378u, 3932773565u, ++ 4245928176u, 4241609415u, 4271336606u, 4283762345u, 4196012076u, 4225268251u, 4187931714u, 4166823541u, ++ 4076923208u, 4072833919u, 4035198246u, 4047918865u, 4094247316u, 4123732899u, 4153251322u, 4132437965u, ++ 3648544096u, 3636082519u, 3673983246u, 3678331705u, 3732010428u, 3753090955u, 3723829714u, 3694611429u, ++ 3614117080u, 3601426159u, 3572488374u, 3576541825u, 3496125444u, 3516976691u, 3555094634u, 3525581405u, ++ 3311336976u, 3298595879u, 3336186494u, 3340255305u, 3260503756u, 3281337595u, 3251864226u, 3222399125u, ++ 3410866088u, 3398419871u, 3368647622u, 3372945905u, 3427010420u, 3448139075u, 3485520666u, 3456284973u, ++ 2444203584u, 2423127159u, 2452308526u, 2481530905u, 2527477404u, 2539934891u, 2502093554u, 2497740997u, ++ 2679949304u, 2659102159u, 2620920726u, 2650438049u, 2562027300u, 2574714131u, 2603727690u, 2599670141u, ++ 2374579504u, 2353749767u, 2383274334u, 2412743529u, 2323684844u, 2336421851u, 2298759554u, 2294686645u, ++ 2207933576u, 2186809023u, 2149495014u, 2178734801u, 2224278612u, 2236720739u, 2266437690u, 2262135309u, ++ 2850214048u, 2820717207u, 2858812622u, 2879680249u, 2934667388u, 2938704459u, 2909776914u, 2897069605u, ++ 2817622296u, 2788420399u, 2759153014u, 2780249921u, 2700618180u, 2704950259u, 2742877610u, 2730399645u, ++ 3049550800u, 3020298727u, 3057690558u, 3078802825u, 2999835404u, 3004150075u, 2974355298u, 2961925461u, ++ 3151438440u, 3121956959u, 3092510214u, 3113327665u, 3168701108u, 3172786307u, 3210370778u, 3197646061u, ++ }, { ++ 0u, 3099354981u, 2852767883u, 313896942u, 2405603159u, 937357362u, 627793884u, 2648127673u, ++ 3316918511u, 2097696650u, 1874714724u, 3607201537u, 1255587768u, 4067088605u, 3772741427u, 1482887254u, ++ 1343838111u, 3903140090u, 4195393300u, 1118632049u, 3749429448u, 1741137837u, 1970407491u, 3452858150u, ++ 2511175536u, 756094997u, 1067759611u, 2266550430u, 449832999u, 2725482306u, 2965774508u, 142231497u, ++ 2687676222u, 412010587u, 171665333u, 2995192016u, 793786473u, 2548850444u, 2237264098u, 1038456711u, ++ 1703315409u, 3711623348u, 3482275674u, 1999841343u, 3940814982u, 1381529571u, 1089329165u, 4166106984u, ++ 4029413537u, 1217896388u, 1512189994u, 3802027855u, 2135519222u, 3354724499u, 3577784189u, 1845280792u, ++ 899665998u, 2367928107u, 2677414085u, 657096608u, 3137160985u, 37822588u, 284462994u, 2823350519u, ++ 2601801789u, 598228824u, 824021174u, 2309093331u, 343330666u, 2898962447u, 3195996129u, 113467524u, ++ 1587572946u, 3860600759u, 4104763481u, 1276501820u, 3519211397u, 1769898208u, 2076913422u, 3279374443u, ++ 3406630818u, 1941006535u, 1627703081u, 3652755532u, 1148164341u, 4241751952u, 3999682686u, 1457141531u, ++ 247015245u, 3053797416u, 2763059142u, 470583459u, 2178658330u, 963106687u, 735213713u, 2473467892u, ++ 992409347u, 2207944806u, 2435792776u, 697522413u, 3024379988u, 217581361u, 508405983u, 2800865210u, ++ 4271038444u, 1177467017u, 1419450215u, 3962007554u, 1911572667u, 3377213406u, 3690561584u, 1665525589u, ++ 1799331996u, 3548628985u, 3241568279u, 2039091058u, 3831314379u, 1558270126u, 1314193216u, 4142438437u, ++ 2928380019u, 372764438u, 75645176u, 3158189981u, 568925988u, 2572515393u, 2346768303u, 861712586u, ++ 3982079547u, 1441124702u, 1196457648u, 4293663189u, 1648042348u, 3666298377u, 3358779879u, 1888390786u, ++ 686661332u, 2421291441u, 2196002399u, 978858298u, 2811169155u, 523464422u, 226935048u, 3040519789u, ++ 3175145892u, 100435649u, 390670639u, 2952089162u, 841119475u, 2325614998u, 2553003640u, 546822429u, ++ 2029308235u, 3225988654u, 3539796416u, 1782671013u, 4153826844u, 1328167289u, 1570739863u, 3844338162u, ++ 1298864389u, 4124540512u, 3882013070u, 1608431339u, 3255406162u, 2058742071u, 1744848601u, 3501990332u, ++ 2296328682u, 811816591u, 584513889u, 2590678532u, 129869501u, 3204563416u, 2914283062u, 352848211u, ++ 494030490u, 2781751807u, 3078325777u, 264757620u, 2450577869u, 715964072u, 941166918u, 2158327331u, ++ 3636881013u, 1618608400u, 1926213374u, 3396585883u, 1470427426u, 4011365959u, 4255988137u, 1158766284u, ++ 1984818694u, 3471935843u, 3695453837u, 1693991400u, 4180638033u, 1100160564u, 1395044826u, 3952793279u, ++ 3019491049u, 189112716u, 435162722u, 2706139399u, 1016811966u, 2217162459u, 2526189877u, 774831696u, ++ 643086745u, 2666061564u, 2354934034u, 887166583u, 2838900430u, 294275499u, 54519365u, 3145957664u, ++ 3823145334u, 1532818963u, 1240029693u, 4048895640u, 1820460577u, 3560857924u, 3331051178u, 2117577167u, ++ 3598663992u, 1858283101u, 2088143283u, 3301633750u, 1495127663u, 3785470218u, 4078182116u, 1269332353u, ++ 332098007u, 2876706482u, 3116540252u, 25085497u, 2628386432u, 605395429u, 916469259u, 2384220526u, ++ 2254837415u, 1054503362u, 745528876u, 2496903497u, 151290352u, 2981684885u, 2735556987u, 464596510u, ++ 1137851976u, 4218313005u, 3923506883u, 1365741990u, 3434129695u, 1946996346u, 1723425172u, 3724871409u, ++ }, { ++ 0u, 1029712304u, 2059424608u, 1201699536u, 4118849216u, 3370159984u, 2403399072u, 2988497936u, ++ 812665793u, 219177585u, 1253054625u, 2010132753u, 3320900865u, 4170237105u, 3207642721u, 2186319825u, ++ 1625331586u, 1568718386u, 438355170u, 658566482u, 2506109250u, 2818578674u, 4020265506u, 3535817618u, ++ 1351670851u, 1844508147u, 709922595u, 389064339u, 2769320579u, 2557498163u, 3754961379u, 3803185235u, ++ 3250663172u, 4238411444u, 3137436772u, 2254525908u, 876710340u, 153198708u, 1317132964u, 1944187668u, ++ 4054934725u, 3436268917u, 2339452837u, 3054575125u, 70369797u, 961670069u, 2129760613u, 1133623509u, ++ 2703341702u, 2621542710u, 3689016294u, 3867263574u, 1419845190u, 1774270454u, 778128678u, 318858390u, ++ 2438067015u, 2888948471u, 3952189479u, 3606153623u, 1691440519u, 1504803895u, 504432359u, 594620247u, ++ 1492342857u, 1704161785u, 573770537u, 525542041u, 2910060169u, 2417219385u, 3618876905u, 3939730521u, ++ 1753420680u, 1440954936u, 306397416u, 790849880u, 2634265928u, 2690882808u, 3888375336u, 3668168600u, ++ 940822475u, 91481723u, 1121164459u, 2142483739u, 3448989963u, 4042473659u, 3075684971u, 2318603227u, ++ 140739594u, 889433530u, 1923340138u, 1338244826u, 4259521226u, 3229813626u, 2267247018u, 3124975642u, ++ 2570221389u, 2756861693u, 3824297005u, 3734113693u, 1823658381u, 1372780605u, 376603373u, 722643805u, ++ 2839690380u, 2485261628u, 3548540908u, 4007806556u, 1556257356u, 1638052860u, 637716780u, 459464860u, ++ 4191346895u, 3300051327u, 2199040943u, 3195181599u, 206718479u, 825388991u, 1989285231u, 1274166495u, ++ 3382881038u, 4106388158u, 3009607790u, 2382549470u, 1008864718u, 21111934u, 1189240494u, 2072147742u, ++ 2984685714u, 2357631266u, 3408323570u, 4131834434u, 1147541074u, 2030452706u, 1051084082u, 63335554u, ++ 2174155603u, 3170292451u, 4216760371u, 3325460867u, 1947622803u, 1232499747u, 248909555u, 867575619u, ++ 3506841360u, 3966111392u, 2881909872u, 2527485376u, 612794832u, 434546784u, 1581699760u, 1663499008u, ++ 3782634705u, 3692447073u, 2612412337u, 2799048193u, 351717905u, 697754529u, 1849071985u, 1398190273u, ++ 1881644950u, 1296545318u, 182963446u, 931652934u, 2242328918u, 3100053734u, 4284967478u, 3255255942u, ++ 1079497815u, 2100821479u, 983009079u, 133672583u, 3050795671u, 2293717799u, 3474399735u, 4067887175u, ++ 281479188u, 765927844u, 1778867060u, 1466397380u, 3846680276u, 3626469220u, 2676489652u, 2733102084u, ++ 548881365u, 500656741u, 1517752501u, 1729575173u, 3577210133u, 3898068133u, 2952246901u, 2459410373u, ++ 3910527195u, 3564487019u, 2480257979u, 2931134987u, 479546907u, 569730987u, 1716854139u, 1530213579u, ++ 3647316762u, 3825568426u, 2745561210u, 2663766474u, 753206746u, 293940330u, 1445287610u, 1799716618u, ++ 2314567513u, 3029685993u, 4080348217u, 3461678473u, 2088098201u, 1091956777u, 112560889u, 1003856713u, ++ 3112514712u, 2229607720u, 3276105720u, 4263857736u, 1275433560u, 1902492648u, 918929720u, 195422344u, ++ 685033439u, 364179055u, 1377080511u, 1869921551u, 3713294623u, 3761522863u, 2811507327u, 2599689167u, ++ 413436958u, 633644462u, 1650777982u, 1594160846u, 3978570462u, 3494118254u, 2548332990u, 2860797966u, ++ 1211387997u, 1968470509u, 854852413u, 261368461u, 3182753437u, 2161434413u, 3346310653u, 4195650637u, ++ 2017729436u, 1160000044u, 42223868u, 1071931724u, 2378480988u, 2963576044u, 4144295484u, 3395602316u, ++ }, { ++ 0u, 3411858341u, 1304994059u, 2257875630u, 2609988118u, 1355649459u, 3596215069u, 486879416u, ++ 3964895853u, 655315400u, 2711298918u, 1791488195u, 2009251963u, 3164476382u, 973758832u, 4048990933u, ++ 64357019u, 3364540734u, 1310630800u, 2235723829u, 2554806413u, 1394316072u, 3582976390u, 517157411u, ++ 4018503926u, 618222419u, 2722963965u, 1762783832u, 1947517664u, 3209171269u, 970744811u, 4068520014u, ++ 128714038u, 3438335635u, 1248109629u, 2167961496u, 2621261600u, 1466012805u, 3522553387u, 447296910u, ++ 3959392091u, 547575038u, 2788632144u, 1835791861u, 1886307661u, 3140622056u, 1034314822u, 4143626211u, ++ 75106221u, 3475428360u, 1236444838u, 2196665603u, 2682996155u, 1421317662u, 3525567664u, 427767573u, ++ 3895035328u, 594892389u, 2782995659u, 1857943406u, 1941489622u, 3101955187u, 1047553757u, 4113347960u, ++ 257428076u, 3288652233u, 1116777319u, 2311878850u, 2496219258u, 1603640287u, 3640781169u, 308099796u, ++ 3809183745u, 676813732u, 2932025610u, 1704983215u, 2023410199u, 3016104370u, 894593820u, 4262377657u, ++ 210634999u, 3352484690u, 1095150076u, 2316991065u, 2535410401u, 1547934020u, 3671583722u, 294336591u, ++ 3772615322u, 729897279u, 2903845777u, 1716123700u, 2068629644u, 2953845545u, 914647431u, 4258839074u, ++ 150212442u, 3282623743u, 1161604689u, 2388688372u, 2472889676u, 1480171241u, 3735940167u, 368132066u, ++ 3836185911u, 805002898u, 2842635324u, 1647574937u, 2134298401u, 3026852996u, 855535146u, 4188192143u, ++ 186781121u, 3229539940u, 1189784778u, 2377547631u, 2427670487u, 1542429810u, 3715886812u, 371670393u, ++ 3882979244u, 741170185u, 2864262823u, 1642462466u, 2095107514u, 3082559007u, 824732849u, 4201955092u, ++ 514856152u, 3589064573u, 1400419795u, 2552522358u, 2233554638u, 1316849003u, 3370776517u, 62202976u, ++ 4075001525u, 968836368u, 3207280574u, 1954014235u, 1769133219u, 2720925446u, 616199592u, 4024870413u, ++ 493229635u, 3594175974u, 1353627464u, 2616354029u, 2264355925u, 1303087088u, 3409966430u, 6498043u, ++ 4046820398u, 979978123u, 3170710821u, 2007099008u, 1789187640u, 2717386141u, 661419827u, 3962610838u, ++ 421269998u, 3527459403u, 1423225061u, 2676515648u, 2190300152u, 1238466653u, 3477467891u, 68755798u, ++ 4115633027u, 1041448998u, 3095868040u, 1943789869u, 1860096405u, 2776760880u, 588673182u, 3897205563u, ++ 449450869u, 3516317904u, 1459794558u, 2623431131u, 2170245475u, 1242006214u, 3432247400u, 131015629u, ++ 4137259288u, 1036337853u, 3142660115u, 1879958454u, 1829294862u, 2790523051u, 549483013u, 3952910752u, ++ 300424884u, 3669282065u, 1545650111u, 2541513754u, 2323209378u, 1092980487u, 3350330793u, 216870412u, ++ 4256931033u, 921128828u, 2960342482u, 2066738807u, 1714085583u, 2910195050u, 736264132u, 3770592353u, ++ 306060335u, 3647131530u, 1610005796u, 2494197377u, 2309971513u, 1123257756u, 3295149874u, 255536279u, ++ 4268596802u, 892423655u, 3013951305u, 2029645036u, 1711070292u, 2929725425u, 674528607u, 3815288570u, ++ 373562242u, 3709388839u, 1535949449u, 2429577516u, 2379569556u, 1183418929u, 3223189663u, 188820282u, ++ 4195850735u, 827017802u, 3084859620u, 2089020225u, 1636228089u, 2866415708u, 743340786u, 3876759895u, ++ 361896217u, 3738094268u, 1482340370u, 2466671543u, 2382584591u, 1163888810u, 3284924932u, 144124321u, ++ 4190215028u, 849168593u, 3020503679u, 2136336858u, 1649465698u, 2836138695u, 798521449u, 3838094284u, ++ }, { ++ 0u, 2792819636u, 2543784233u, 837294749u, 4098827283u, 1379413927u, 1674589498u, 3316072078u, ++ 871321191u, 2509784531u, 2758827854u, 34034938u, 3349178996u, 1641505216u, 1346337629u, 4131942633u, ++ 1742642382u, 3249117050u, 4030828007u, 1446413907u, 2475800797u, 904311657u, 68069876u, 2725880384u, ++ 1412551337u, 4064729373u, 3283010432u, 1708771380u, 2692675258u, 101317902u, 937551763u, 2442587175u, ++ 3485284764u, 1774858792u, 1478633653u, 4266992385u, 1005723023u, 2642744891u, 2892827814u, 169477906u, ++ 4233263099u, 1512406095u, 1808623314u, 3451546982u, 136139752u, 2926205020u, 2676114113u, 972376437u, ++ 2825102674u, 236236518u, 1073525883u, 2576072655u, 1546420545u, 4200303349u, 3417542760u, 1841601500u, ++ 2609703733u, 1039917185u, 202635804u, 2858742184u, 1875103526u, 3384067218u, 4166835727u, 1579931067u, ++ 1141601657u, 3799809741u, 3549717584u, 1977839588u, 2957267306u, 372464350u, 668680259u, 2175552503u, ++ 2011446046u, 3516084394u, 3766168119u, 1175200131u, 2209029901u, 635180217u, 338955812u, 2990736784u, ++ 601221559u, 2242044419u, 3024812190u, 306049834u, 3617246628u, 1911408144u, 1074125965u, 3866285881u, ++ 272279504u, 3058543716u, 2275784441u, 567459149u, 3832906691u, 1107462263u, 1944752874u, 3583875422u, ++ 2343980261u, 767641425u, 472473036u, 3126744696u, 2147051766u, 3649987394u, 3899029983u, 1309766251u, ++ 3092841090u, 506333494u, 801510315u, 2310084639u, 1276520081u, 3932237093u, 3683203000u, 2113813516u, ++ 3966292011u, 1243601823u, 2079834370u, 3716205238u, 405271608u, 3192979340u, 2411259153u, 701492901u, ++ 3750207052u, 2045810168u, 1209569125u, 4000285905u, 734575199u, 2378150379u, 3159862134u, 438345922u, ++ 2283203314u, 778166598u, 529136603u, 3120492655u, 2086260449u, 3660498261u, 3955679176u, 1303499900u, ++ 3153699989u, 495890209u, 744928700u, 2316418568u, 1337360518u, 3921775410u, 3626602927u, 2120129051u, ++ 4022892092u, 1237286280u, 2018993941u, 3726666913u, 461853231u, 3186645403u, 2350400262u, 711936178u, ++ 3693557851u, 2052076527u, 1270360434u, 3989775046u, 677911624u, 2384402428u, 3220639073u, 427820757u, ++ 1202443118u, 3789347034u, 3493118535u, 1984154099u, 3018127229u, 362020041u, 612099668u, 2181885408u, ++ 1950653705u, 3526596285u, 3822816288u, 1168934804u, 2148251930u, 645706414u, 395618355u, 2984485767u, ++ 544559008u, 2248295444u, 3085590153u, 295523645u, 3560598451u, 1917673479u, 1134918298u, 3855773998u, ++ 328860103u, 3052210803u, 2214924526u, 577903450u, 3889505748u, 1101147744u, 1883911421u, 3594338121u, ++ 3424493451u, 1785369663u, 1535282850u, 4260726038u, 944946072u, 2653270060u, 2949491377u, 163225861u, ++ 4294103532u, 1501944408u, 1752023237u, 3457862513u, 196998655u, 2915761739u, 2619532502u, 978710370u, ++ 2881684293u, 229902577u, 1012666988u, 2586515928u, 1603020630u, 4193987810u, 3356702335u, 1852063179u, ++ 2553040162u, 1046169238u, 263412747u, 2848217023u, 1818454321u, 3390333573u, 4227627032u, 1569420204u, ++ 60859927u, 2782375331u, 2487203646u, 843627658u, 4159668740u, 1368951216u, 1617990445u, 3322386585u, ++ 810543216u, 2520310724u, 2815490393u, 27783917u, 3288386659u, 1652017111u, 1402985802u, 4125677310u, ++ 1685994201u, 3255382381u, 4091620336u, 1435902020u, 2419138250u, 910562686u, 128847843u, 2715354199u, ++ 1469150398u, 4058414858u, 3222168983u, 1719234083u, 2749255853u, 94984985u, 876691844u, 2453031472u, ++ }, { ++ 0u, 3433693342u, 1109723005u, 2391738339u, 2219446010u, 1222643300u, 3329165703u, 180685081u, ++ 3555007413u, 525277995u, 2445286600u, 1567235158u, 1471092047u, 2600801745u, 361370162u, 3642757804u, ++ 2092642603u, 2953916853u, 1050555990u, 4063508168u, 4176560081u, 878395215u, 3134470316u, 1987983410u, ++ 2942184094u, 1676945920u, 3984272867u, 567356797u, 722740324u, 3887998202u, 1764827929u, 2778407815u, ++ 4185285206u, 903635656u, 3142804779u, 2012833205u, 2101111980u, 2979425330u, 1058630609u, 4088621903u, ++ 714308067u, 3862526333u, 1756790430u, 2753330688u, 2933487385u, 1651734407u, 3975966820u, 542535930u, ++ 2244825981u, 1231508451u, 3353891840u, 188896414u, 25648519u, 3442302233u, 1134713594u, 2399689316u, ++ 1445480648u, 2592229462u, 336416693u, 3634843435u, 3529655858u, 516441772u, 2420588879u, 1559052753u, ++ 698204909u, 3845636723u, 1807271312u, 2803025166u, 2916600855u, 1635634313u, 4025666410u, 593021940u, ++ 4202223960u, 919787974u, 3093159461u, 1962401467u, 2117261218u, 2996361020u, 1008193759u, 4038971457u, ++ 1428616134u, 2576151384u, 386135227u, 3685348389u, 3513580860u, 499580322u, 2471098945u, 1608776415u, ++ 2260985971u, 1248454893u, 3303468814u, 139259792u, 42591881u, 3458459159u, 1085071860u, 2349261162u, ++ 3505103035u, 474062885u, 2463016902u, 1583654744u, 1419882049u, 2550902495u, 377792828u, 3660491170u, ++ 51297038u, 3483679632u, 1093385331u, 2374089965u, 2269427188u, 1273935210u, 3311514249u, 164344343u, ++ 2890961296u, 1627033870u, 4000683757u, 585078387u, 672833386u, 3836780532u, 1782552599u, 2794821769u, ++ 2142603813u, 3005188795u, 1032883544u, 4047146438u, 4227826911u, 928351297u, 3118105506u, 1970307900u, ++ 1396409818u, 2677114180u, 287212199u, 3719594553u, 3614542624u, 467372990u, 2505346141u, 1509854403u, ++ 2162073199u, 1282711281u, 3271268626u, 240228748u, 76845205u, 3359543307u, 1186043880u, 2317064054u, ++ 796964081u, 3811226735u, 1839575948u, 2702160658u, 2882189835u, 1734392469u, 3924802934u, 625327592u, ++ 4234522436u, 818917338u, 3191908409u, 1927981223u, 2016387518u, 3028656416u, 973776579u, 4137723485u, ++ 2857232268u, 1726474002u, 3899187441u, 616751215u, 772270454u, 3803048424u, 1814228491u, 2693328533u, ++ 2041117753u, 3036871847u, 999160644u, 4146592730u, 4259508931u, 826864221u, 3217552830u, 1936586016u, ++ 3606501031u, 442291769u, 2496909786u, 1484378436u, 1388107869u, 2652297411u, 278519584u, 3694387134u, ++ 85183762u, 3384397196u, 1194773103u, 2342308593u, 2170143720u, 1307820918u, 3279733909u, 265733131u, ++ 2057717559u, 3054258089u, 948125770u, 4096344276u, 4276898253u, 843467091u, 3167309488u, 1885556270u, ++ 2839764098u, 1709792284u, 3949353983u, 667704161u, 755585656u, 3785577190u, 1865176325u, 2743489947u, ++ 102594076u, 3401021058u, 1144549729u, 2291298815u, 2186770662u, 1325234296u, 3228729243u, 215514885u, ++ 3589828009u, 424832311u, 2547870420u, 1534552650u, 1370645331u, 2635621325u, 328688686u, 3745342640u, ++ 2211456353u, 1333405183u, 3254067740u, 224338562u, 127544219u, 3408931589u, 1170156774u, 2299866232u, ++ 1345666772u, 2627681866u, 303053225u, 3736746295u, 3565105198u, 416624816u, 2522494803u, 1525692365u, ++ 4285207626u, 868291796u, 3176010551u, 1910772649u, 2065767088u, 3079346734u, 956571085u, 4121828691u, ++ 747507711u, 3760459617u, 1856702594u, 2717976604u, 2831417605u, 1684930971u, 3940615800u, 642451174u, ++ }, ++ { ++ 0u, 393942083u, 787884166u, 965557445u, 1575768332u, 1251427663u, 1931114890u, 1684106697u, ++ 3151536664u, 2896410203u, 2502855326u, 2186649309u, 3862229780u, 4048545623u, 3368213394u, 3753496529u, ++ 2898281073u, 3149616690u, 2184604407u, 2504883892u, 4046197629u, 3864463166u, 3755621371u, 3366006712u, ++ 387506281u, 6550570u, 971950319u, 781573292u, 1257550181u, 1569695014u, 1677892067u, 1937345952u, ++ 2196865699u, 2508887776u, 2886183461u, 3145514598u, 3743273903u, 3362179052u, 4058774313u, 3868258154u, ++ 958996667u, 777139448u, 400492605u, 10755198u, 1690661303u, 1941857780u, 1244879153u, 1565019506u, ++ 775012562u, 961205393u, 13101140u, 398261271u, 1943900638u, 1688634781u, 1563146584u, 1246801179u, ++ 2515100362u, 2190636681u, 3139390028u, 2892258831u, 3355784134u, 3749586821u, 3874691904u, 4052225795u, ++ 3734110983u, 3387496260u, 4033096577u, 3877584834u, 2206093835u, 2483373640u, 2911402637u, 3136515790u, ++ 1699389727u, 1915860316u, 1270647193u, 1556585946u, 950464531u, 803071056u, 374397077u, 19647702u, ++ 1917993334u, 1697207605u, 1554278896u, 1272937907u, 800985210u, 952435769u, 21510396u, 372452543u, ++ 3381322606u, 3740399405u, 3883715560u, 4027047851u, 2489758306u, 2199758369u, 3130039012u, 2917895847u, ++ 1550025124u, 1259902439u, 1922410786u, 1710144865u, 26202280u, 385139947u, 796522542u, 939715693u, ++ 3887801276u, 4039129087u, 3377269562u, 3728088953u, 3126293168u, 2905368307u, 2493602358u, 2212122229u, ++ 4037264341u, 3889747862u, 3730172755u, 3375300368u, 2907673305u, 3124004506u, 2209987167u, 2495786524u, ++ 1266377165u, 1543533966u, 1703758155u, 1928748296u, 379007169u, 32253058u, 945887303u, 790236164u, ++ 1716846671u, 1898845196u, 1218652361u, 1608006794u, 1002000707u, 750929152u, 357530053u, 36990342u, ++ 3717046871u, 3405166100u, 4084959953u, 3825245842u, 2153902939u, 2535122712u, 2929187805u, 3119304606u, ++ 3398779454u, 3723384445u, 3831720632u, 4078468859u, 2541294386u, 2147616625u, 3113171892u, 2935238647u, ++ 1900929062u, 1714877541u, 1606142112u, 1220599011u, 748794154u, 1004184937u, 39295404u, 355241455u, ++ 3835986668u, 4091516591u, 3394415210u, 3710500393u, 3108557792u, 2922629027u, 2545875814u, 2160455461u, ++ 1601970420u, 1208431799u, 1904871538u, 1727077425u, 43020792u, 367748539u, 744905086u, 991776061u, ++ 1214562461u, 1595921630u, 1720903707u, 1911159896u, 361271697u, 49513938u, 998160663u, 738569556u, ++ 4089209477u, 3838277318u, 3712633347u, 3392233024u, 2924491657u, 3106613194u, 2158369551u, 2547846988u, ++ 3100050248u, 2948339467u, 2519804878u, 2169126797u, 3844821572u, 4065347079u, 3420289730u, 3701894785u, ++ 52404560u, 342144275u, 770279894u, 982687125u, 1593045084u, 1233708063u, 1879431386u, 1736363161u, ++ 336019769u, 58479994u, 988899775u, 764050940u, 1240141877u, 1586496630u, 1729968307u, 1885744368u, ++ 2950685473u, 3097818978u, 2166999975u, 2522013668u, 4063474221u, 3846743662u, 3703937707u, 3418263272u, ++ 976650731u, 760059304u, 348170605u, 62635310u, 1742393575u, 1889649828u, 1227683937u, 1582820386u, ++ 2179867635u, 2526361520u, 2937588597u, 3093503798u, 3691148031u, 3413731004u, 4076100217u, 3851374138u, ++ 2532754330u, 2173556697u, 3087067932u, 2944139103u, 3407516310u, 3697379029u, 3857496592u, 4070026835u, ++ 758014338u, 978679233u, 64506116u, 346250567u, 1891774606u, 1740186829u, 1580472328u, 1229917259u, ++ }, { ++ 0u, 4022496062u, 83218493u, 3946298115u, 166436986u, 3861498692u, 220098631u, 3806075769u, ++ 332873972u, 4229245898u, 388141257u, 4175494135u, 440197262u, 4127099824u, 516501683u, 4044053389u, ++ 665747944u, 3362581206u, 593187285u, 3432594155u, 776282514u, 3246869164u, 716239279u, 3312622225u, ++ 880394524u, 3686509090u, 814485793u, 3746462239u, 1033003366u, 3528460888u, 963096923u, 3601193573u, ++ 1331495888u, 2694801646u, 1269355501u, 2758457555u, 1186374570u, 2843003028u, 1111716759u, 2910918825u, ++ 1552565028u, 3007850522u, 1484755737u, 3082680359u, 1432478558u, 3131279456u, 1368666979u, 3193329757u, ++ 1760789048u, 2268195078u, 1812353541u, 2210675003u, 1628971586u, 2396670332u, 1710092927u, 2318375233u, ++ 2066006732u, 2498144754u, 2144408305u, 2417195471u, 1926193846u, 2634877320u, 1983558283u, 2583222709u, ++ 2662991776u, 1903717534u, 2588923805u, 1972223139u, 2538711002u, 2022952164u, 2477029351u, 2087066841u, ++ 2372749140u, 1655647338u, 2308478825u, 1717238871u, 2223433518u, 1799654416u, 2155034387u, 1873894445u, ++ 3105130056u, 1456926070u, 3185661557u, 1378041163u, 2969511474u, 1597852940u, 3020617231u, 1539874097u, ++ 2864957116u, 1157737858u, 2922780289u, 1106542015u, 2737333958u, 1290407416u, 2816325371u, 1210047941u, ++ 3521578096u, 1042640718u, 3574781005u, 986759027u, 3624707082u, 936300340u, 3707335735u, 859512585u, ++ 3257943172u, 770846650u, 3334837433u, 688390023u, 3420185854u, 605654976u, 3475911875u, 552361981u, ++ 4132013464u, 428600998u, 4072428965u, 494812827u, 4288816610u, 274747100u, 4216845791u, 345349857u, ++ 3852387692u, 173846098u, 3781891409u, 245988975u, 3967116566u, 62328360u, 3900749099u, 121822741u, ++ 3859089665u, 164061759u, 3807435068u, 221426178u, 4025395579u, 2933317u, 3944446278u, 81334904u, ++ 4124199413u, 437265099u, 4045904328u, 518386422u, 4231653775u, 335250097u, 4174133682u, 386814604u, ++ 3249244393u, 778691543u, 3311294676u, 714879978u, 3359647891u, 662848429u, 3434477742u, 595039120u, ++ 3531393053u, 1035903779u, 3599308832u, 961245982u, 3684132967u, 877986649u, 3747788890u, 815846244u, ++ 2841119441u, 1184522735u, 2913852140u, 1114616274u, 2696129195u, 1332855189u, 2756082326u, 1266946472u, ++ 3129952805u, 1431118107u, 3195705880u, 1371074854u, 3009735263u, 1554415969u, 3079748194u, 1481855324u, ++ 2398522169u, 1630855175u, 2315475716u, 1707159610u, 2266835779u, 1759461501u, 2213084030u, 1814728768u, ++ 2636237773u, 1927520499u, 2580814832u, 1981182158u, 2496293815u, 2064121993u, 2420095882u, 2147340468u, ++ 2025787041u, 2541577631u, 2085281436u, 2475210146u, 1901375195u, 2660681189u, 1973518054u, 2590184920u, ++ 1801997909u, 2225743211u, 1872600680u, 2153772374u, 1652813359u, 2369881361u, 1719025170u, 2310296876u, ++ 1594986313u, 2966676599u, 1541693300u, 3022402634u, 1459236659u, 3107472397u, 1376780046u, 3184366640u, ++ 1288097725u, 2734990467u, 1211309952u, 2817619134u, 1160605639u, 2867791097u, 1104723962u, 2920993988u, ++ 937561457u, 3626001999u, 857201996u, 3704993394u, 1040821515u, 3519792693u, 989625654u, 3577615880u, ++ 607473029u, 3421972155u, 549494200u, 3473077894u, 769584639u, 3256649409u, 690699714u, 3337180924u, ++ 273452185u, 4287555495u, 347692196u, 4219156378u, 430386403u, 4133832669u, 491977950u, 4069562336u, ++ 60542061u, 3965298515u, 124656720u, 3903616878u, 175139863u, 3853649705u, 243645482u, 3779581716u, ++ }, { ++ 0u, 3247366080u, 1483520449u, 2581751297u, 2967040898u, 1901571138u, 3904227907u, 691737987u, ++ 3133399365u, 2068659845u, 3803142276u, 589399876u, 169513671u, 3415493895u, 1383475974u, 2482566342u, ++ 2935407819u, 1870142219u, 4137319690u, 924099274u, 506443593u, 3751897225u, 1178799752u, 2278412616u, ++ 339027342u, 3585866318u, 1280941135u, 2379694991u, 2766951948u, 1700956620u, 4236308429u, 1024339981u, ++ 2258407383u, 1192382487u, 3740284438u, 528411094u, 910556245u, 4157285269u, 1848198548u, 2946996820u, ++ 1012887186u, 4258378066u, 1681119059u, 2780629139u, 2357599504u, 1292419792u, 3572147409u, 358906641u, ++ 678054684u, 3924071644u, 1879503581u, 2978491677u, 2561882270u, 1497229150u, 3235873119u, 22109855u, ++ 2460592729u, 1395094937u, 3401913240u, 189516888u, 577821147u, 3825075739u, 2048679962u, 3146956762u, ++ 3595049455u, 398902831u, 2384764974u, 1336573934u, 1720805997u, 2803873197u, 1056822188u, 4285729900u, ++ 1821112490u, 2902796138u, 887570795u, 4117339819u, 3696397096u, 500978920u, 2218668777u, 1169222953u, ++ 2025774372u, 3106931428u, 550659301u, 3780950821u, 3362238118u, 166293862u, 2416645991u, 1367722151u, ++ 3262987361u, 66315169u, 2584839584u, 1537170016u, 1923370979u, 3005911075u, 717813282u, 3947244002u, ++ 1356109368u, 2438613496u, 146288633u, 3375820857u, 3759007162u, 562248314u, 3093388411u, 2045739963u, ++ 3927406461u, 731490493u, 2994458300u, 1945440636u, 1523451135u, 2604718911u, 44219710u, 3274466046u, ++ 4263662323u, 1068272947u, 2790189874u, 1740649714u, 1325080945u, 2406874801u, 379033776u, 3608758128u, ++ 1155642294u, 2238671990u, 479005303u, 3708016055u, 4097359924u, 901128180u, 2891217397u, 1843045941u, ++ 2011248031u, 3060787807u, 797805662u, 3993195422u, 3342353949u, 112630237u, 2673147868u, 1591353372u, ++ 3441611994u, 212601626u, 2504944923u, 1421914843u, 2113644376u, 3161815192u, 630660761u, 3826893145u, ++ 3642224980u, 412692116u, 2172340373u, 1089836885u, 1775141590u, 2822790422u, 832715543u, 4029474007u, ++ 1674842129u, 2723860433u, 1001957840u, 4197873168u, 3540870035u, 310623315u, 2338445906u, 1257178514u, ++ 4051548744u, 821257608u, 2836464521u, 1755307081u, 1101318602u, 2150241802u, 432566283u, 3628511179u, ++ 1270766349u, 2318435533u, 332587724u, 3529260300u, 4217841807u, 988411727u, 2735444302u, 1652903566u, ++ 1602977411u, 2651169091u, 132630338u, 3328776322u, 4015131905u, 786223809u, 3074340032u, 1991273216u, ++ 3846741958u, 616972294u, 3173262855u, 2091579847u, 1435626564u, 2485072772u, 234706309u, 3430124101u, ++ 2712218736u, 1613231024u, 4190475697u, 944458353u, 292577266u, 3506339890u, 1226630707u, 2291284467u, ++ 459984181u, 3672380149u, 1124496628u, 2189994804u, 2880683703u, 1782407543u, 4091479926u, 844224694u, ++ 257943739u, 3469817723u, 1462980986u, 2529005242u, 3213269817u, 2114471161u, 3890881272u, 644152632u, ++ 3046902270u, 1947391550u, 3991973951u, 746483711u, 88439420u, 3301680572u, 1563018173u, 2628197501u, ++ 657826727u, 3871046759u, 2136545894u, 3201811878u, 2548879397u, 1449267173u, 3481299428u, 235845156u, ++ 2650161890u, 1551408418u, 3315268387u, 68429027u, 758067552u, 3970035360u, 1967360161u, 3033356129u, ++ 2311284588u, 1213053100u, 3517963949u, 270598509u, 958010606u, 4170500910u, 1635167535u, 2700636911u, ++ 855672361u, 4069415401u, 1802256360u, 2866995240u, 2212099499u, 1113008747u, 3686091882u, 440112042u, ++ }, { ++ 0u, 2611301487u, 3963330207u, 2006897392u, 50740095u, 2560849680u, 4013794784u, 1956178319u, ++ 101480190u, 2645113489u, 3929532513u, 1905435662u, 84561281u, 2662269422u, 3912356638u, 1922342769u, ++ 202960380u, 2545787283u, 3760419683u, 2072395532u, 253679235u, 2495322860u, 3810871324u, 2021655667u, ++ 169122562u, 2444351341u, 3861841309u, 2106214898u, 152215677u, 2461527058u, 3844685538u, 2123133581u, ++ 405920760u, 2207553431u, 4094313831u, 1873742088u, 456646791u, 2157096168u, 4144791064u, 1823027831u, ++ 507358470u, 2241388905u, 4060492697u, 1772322806u, 490444409u, 2258557462u, 4043311334u, 1789215881u, ++ 338245124u, 2408348267u, 4161972379u, 1672996084u, 388959611u, 2357870868u, 4212429796u, 1622269835u, ++ 304431354u, 2306870421u, 4263435877u, 1706791434u, 287538053u, 2324051946u, 4246267162u, 1723705717u, ++ 811841520u, 2881944479u, 3696765295u, 1207788800u, 862293135u, 2831204576u, 3747484176u, 1157324415u, ++ 913293582u, 2915732833u, 3662962577u, 1106318334u, 896137841u, 2932651550u, 3646055662u, 1123494017u, ++ 1014716940u, 2816349795u, 3493905555u, 1273334012u, 1065181555u, 2765630748u, 3544645612u, 1222882179u, ++ 980888818u, 2714919069u, 3595350637u, 1307180546u, 963712909u, 2731826146u, 3578431762u, 1324336509u, ++ 676490248u, 3019317351u, 3295277719u, 1607253752u, 726947703u, 2968591128u, 3345992168u, 1556776327u, ++ 777919222u, 3053147801u, 3261432937u, 1505806342u, 760750473u, 3070062054u, 3244539670u, 1522987897u, ++ 608862708u, 3220163995u, 3362856811u, 1406423812u, 659339915u, 3169449700u, 3413582868u, 1355966587u, ++ 575076106u, 3118709605u, 3464325525u, 1440228858u, 557894773u, 3135602714u, 3447411434u, 1457397381u, ++ 1623683040u, 4217512847u, 2365387135u, 391757072u, 1673614495u, 4167309552u, 2415577600u, 341804655u, ++ 1724586270u, 4251866481u, 2331019137u, 290835438u, 1707942497u, 4268256782u, 2314648830u, 307490961u, ++ 1826587164u, 4152020595u, 2162433155u, 457265388u, 1876539747u, 4101829900u, 2212636668u, 407333779u, ++ 1792275682u, 4051089549u, 2263378557u, 491595282u, 1775619997u, 4067460082u, 2246988034u, 508239213u, ++ 2029433880u, 3813931127u, 2496473735u, 258500328u, 2079362919u, 3763716872u, 2546668024u, 208559511u, ++ 2130363110u, 3848244873u, 2462145657u, 157552662u, 2113730969u, 3864638966u, 2445764358u, 174205801u, ++ 1961777636u, 4014675339u, 2564147067u, 57707284u, 2011718299u, 3964481268u, 2614361092u, 7778411u, ++ 1927425818u, 3913769845u, 2665066885u, 92077546u, 1910772837u, 3930150922u, 2648673018u, 108709525u, ++ 1352980496u, 3405878399u, 3164554895u, 658115296u, 1403183983u, 3355946752u, 3214507504u, 607924639u, ++ 1453895406u, 3440239233u, 3130208369u, 557218846u, 1437504913u, 3456883198u, 3113552654u, 573589345u, ++ 1555838444u, 3340335491u, 2961681267u, 723707676u, 1606028947u, 3290383100u, 3011612684u, 673504355u, ++ 1521500946u, 3239382909u, 3062619533u, 758026722u, 1505130605u, 3256038402u, 3045975794u, 774417053u, ++ 1217725416u, 3543158663u, 2762906999u, 1057739032u, 1267939479u, 3493229816u, 2812847624u, 1007544935u, ++ 1318679830u, 3577493881u, 2728586121u, 956803046u, 1302285929u, 3594125830u, 2711933174u, 973184153u, ++ 1150152212u, 3743982203u, 2830528651u, 856898788u, 1200346475u, 3694041348u, 2880457716u, 806684571u, ++ 1115789546u, 3643069573u, 2931426933u, 891243034u, 1099408277u, 3659722746u, 2914794762u, 907637093u, ++ }, { ++ 0u, 3717650821u, 1616688459u, 3184159950u, 3233376918u, 489665299u, 2699419613u, 2104690264u, ++ 1510200173u, 2274691816u, 979330598u, 3888758691u, 2595928571u, 1194090622u, 4209380528u, 661706037u, ++ 3020400346u, 1771143007u, 3562738577u, 164481556u, 1958661196u, 2837976521u, 350386439u, 3379863682u, ++ 3993269687u, 865250354u, 2388181244u, 1406015865u, 784146209u, 4079732388u, 1323412074u, 2474079215u, ++ 3011398645u, 1860735600u, 3542286014u, 246687547u, 1942430051u, 2924607718u, 328963112u, 3456978349u, ++ 3917322392u, 887832861u, 2300653011u, 1421341782u, 700772878u, 4099025803u, 1234716485u, 2483986112u, ++ 125431087u, 3673109674u, 1730500708u, 3132326369u, 3351283641u, 441867836u, 2812031730u, 2047535991u, ++ 1568292418u, 2163009479u, 1025936137u, 3769651852u, 2646824148u, 1079348561u, 4255113631u, 537475098u, ++ 3180171691u, 1612400686u, 3721471200u, 4717925u, 2100624189u, 2694980280u, 493375094u, 3237910515u, ++ 3884860102u, 974691139u, 2278750093u, 1514417672u, 657926224u, 4204917205u, 1198234907u, 2600289438u, ++ 160053105u, 3558665972u, 1775665722u, 3024116671u, 3375586791u, 346391650u, 2842683564u, 1962488105u, ++ 1401545756u, 2384412057u, 869618007u, 3997403346u, 2469432970u, 1319524111u, 4083956673u, 788193860u, ++ 250862174u, 3546612699u, 1856990997u, 3006903952u, 3461001416u, 333211981u, 2920678787u, 1937824774u, ++ 1425017139u, 2305216694u, 883735672u, 3912918525u, 2487837605u, 1239398944u, 4095071982u, 696455019u, ++ 3136584836u, 1734518017u, 3668494799u, 121507914u, 2051872274u, 2816200599u, 437363545u, 3347544796u, ++ 3774328809u, 1029797484u, 2158697122u, 1564328743u, 542033279u, 4258798842u, 1074950196u, 2642717105u, ++ 2691310871u, 2113731730u, 3224801372u, 497043929u, 1624461185u, 3175454212u, 9435850u, 3709412175u, ++ 4201248378u, 671035391u, 2587181873u, 1201904308u, 986750188u, 3880142185u, 1519135143u, 2266689570u, ++ 342721485u, 3388693064u, 1949382278u, 2846355203u, 3570723163u, 155332830u, 3028835344u, 1763607957u, ++ 1315852448u, 2482538789u, 775087595u, 4087626862u, 2396469814u, 1396827059u, 4002123645u, 857560824u, ++ 320106210u, 3464673127u, 1934154665u, 2933785132u, 3551331444u, 238804465u, 3018961215u, 1852270778u, ++ 1226292623u, 2491507722u, 692783300u, 4108177729u, 2309936921u, 1412959900u, 3924976210u, 879016919u, ++ 2803091512u, 2055541181u, 3343875443u, 450471158u, 1739236014u, 3124525867u, 133568485u, 3663777376u, ++ 4245691221u, 545702608u, 2639048222u, 1088059291u, 1034514883u, 3762268230u, 1576387720u, 2153979149u, ++ 501724348u, 3228659001u, 2109407735u, 2687359090u, 3713981994u, 13109167u, 3171052385u, 1620357860u, ++ 1206151121u, 2591211092u, 666423962u, 4197321503u, 2271022407u, 1523307714u, 3875649548u, 982999433u, ++ 2850034278u, 1953942499u, 3384583981u, 338329256u, 1767471344u, 3033506165u, 151375291u, 3566408766u, ++ 4091789579u, 779425934u, 2478797888u, 1311354309u, 861580189u, 4006375960u, 1392910038u, 2391852883u, ++ 2929327945u, 1930372812u, 3469036034u, 324244359u, 1847629279u, 3015068762u, 243015828u, 3555391761u, ++ 4103744548u, 688715169u, 2496043375u, 1229996266u, 874727090u, 3920994103u, 1417671673u, 2313759356u, ++ 446585235u, 3339223062u, 2059594968u, 2807313757u, 3660002053u, 129100416u, 3128657486u, 1743609803u, ++ 1084066558u, 2634765179u, 549535669u, 4250396208u, 2149900392u, 1571961325u, 3765982499u, 1039043750u, ++ }, { ++ 0u, 2635063670u, 3782132909u, 2086741467u, 430739227u, 2225303149u, 4173482934u, 1707977408u, ++ 861478454u, 2924937024u, 3526875803u, 1329085421u, 720736557u, 3086643291u, 3415954816u, 1452586230u, ++ 1722956908u, 4223524122u, 2279405761u, 450042295u, 2132718455u, 3792785921u, 2658170842u, 58693292u, ++ 1441473114u, 3370435372u, 3028674295u, 696911745u, 1279765825u, 3511176247u, 2905172460u, 807831706u, ++ 3445913816u, 1349228974u, 738901109u, 2969918723u, 3569940419u, 1237784245u, 900084590u, 2829701656u, ++ 4265436910u, 1664255896u, 525574723u, 2187084597u, 3885099509u, 2057177219u, 117386584u, 2616249390u, ++ 2882946228u, 920233410u, 1253605401u, 3619119471u, 2994391983u, 796207833u, 1393823490u, 3457937012u, ++ 2559531650u, 92322804u, 2044829231u, 3840835417u, 2166609305u, 472659183u, 1615663412u, 4249022530u, ++ 1102706673u, 3702920839u, 2698457948u, 1037619754u, 1477802218u, 3306854812u, 3111894087u, 611605809u, ++ 1927342535u, 4025419953u, 2475568490u, 243387420u, 1800169180u, 4131620778u, 2317525617u, 388842247u, ++ 655084445u, 3120835307u, 3328511792u, 1533734470u, 1051149446u, 2745738736u, 3754524715u, 1120297309u, ++ 340972971u, 2304586973u, 4114354438u, 1748234352u, 234773168u, 2431761350u, 3968900637u, 1906278251u, ++ 2363330345u, 299003487u, 1840466820u, 4038896370u, 2507210802u, 142532932u, 1948239007u, 3910149609u, ++ 3213136159u, 579563625u, 1592415666u, 3286611140u, 2787646980u, 992477042u, 1195825833u, 3662232543u, ++ 3933188933u, 2002801203u, 184645608u, 2517538462u, 4089658462u, 1858919720u, 313391347u, 2409765253u, ++ 3644239219u, 1144605701u, 945318366u, 2773977256u, 3231326824u, 1570095902u, 569697989u, 3170568115u, ++ 2205413346u, 511446676u, 1646078799u, 4279421497u, 2598330617u, 131105167u, 2075239508u, 3871229218u, ++ 2955604436u, 757403810u, 1363424633u, 3427521551u, 2844163791u, 881434553u, 1223211618u, 3588709140u, ++ 3854685070u, 2026779384u, 78583587u, 2577462869u, 4235025557u, 1633861091u, 486774840u, 2148301134u, ++ 3600338360u, 1268198606u, 938871061u, 2868504675u, 3476308643u, 1379640277u, 777684494u, 3008718712u, ++ 1310168890u, 3541595724u, 2943964055u, 846639841u, 1471879201u, 3400857943u, 3067468940u, 735723002u, ++ 2102298892u, 3762382970u, 2619362721u, 19901655u, 1692534295u, 4193118049u, 2240594618u, 411247564u, ++ 681945942u, 3047836192u, 3385552891u, 1422167693u, 822682701u, 2886124859u, 3496468704u, 1298661782u, ++ 469546336u, 2264093718u, 4203901389u, 1738379451u, 38812283u, 2673859341u, 3812556502u, 2117148576u, ++ 3268024339u, 1606809957u, 598006974u, 3198893512u, 3680933640u, 1181316734u, 973624229u, 2802299603u, ++ 4052944421u, 1822222163u, 285065864u, 2381456382u, 3896478014u, 1966106696u, 156323219u, 2489232613u, ++ 2759337087u, 964150537u, 1159127250u, 3625517476u, 3184831332u, 551242258u, 1555722185u, 3249901247u, ++ 2535537225u, 170842943u, 1984954084u, 3946848146u, 2391651666u, 327308324u, 1877176831u, 4075589769u, ++ 263086283u, 2460058045u, 4005602406u, 1942963472u, 369291216u, 2332888742u, 4151061373u, 1784924683u, ++ 1022852861u, 2717425547u, 3717839440u, 1083595558u, 626782694u, 3092517008u, 3291821387u, 1497027645u, ++ 1763466407u, 4094934481u, 2289211402u, 360544636u, 1890636732u, 3988730570u, 2447251217u, 215086695u, ++ 1514488465u, 3343557607u, 3140191804u, 639919946u, 1139395978u, 3739626748u, 2726758695u, 1065936977u, ++ }, { ++ 0u, 3120290792u, 2827399569u, 293431929u, 2323408227u, 864534155u, 586863858u, 2600537882u, ++ 3481914503u, 1987188591u, 1729068310u, 3740575486u, 1173727716u, 4228805132u, 3983743093u, 1418249117u, ++ 1147313999u, 4254680231u, 3974377182u, 1428157750u, 3458136620u, 2011505092u, 1721256893u, 3747844181u, ++ 2347455432u, 839944224u, 594403929u, 2593536433u, 26687147u, 3094146371u, 2836498234u, 283794642u, ++ 2294627998u, 826205558u, 541298447u, 2578994407u, 45702141u, 3141697557u, 2856315500u, 331624836u, ++ 1196225049u, 4273416689u, 4023010184u, 1446090848u, 3442513786u, 1959480466u, 1706436331u, 3696098563u, ++ 3433538001u, 1968994873u, 1679888448u, 3722103720u, 1188807858u, 4280295258u, 3999102243u, 1470541515u, ++ 53374294u, 3134568126u, 2879970503u, 307431215u, 2303854645u, 816436189u, 567589284u, 2553242188u, ++ 3405478781u, 1929420949u, 1652411116u, 3682996484u, 1082596894u, 4185703926u, 3892424591u, 1375368295u, ++ 91404282u, 3163122706u, 2918450795u, 336584067u, 2400113305u, 922028401u, 663249672u, 2658384096u, ++ 2392450098u, 929185754u, 639587747u, 2682555979u, 82149713u, 3172883129u, 2892181696u, 362343208u, ++ 1091578037u, 4176212829u, 3918960932u, 1349337804u, 3412872662u, 1922537022u, 1676344391u, 3658557359u, ++ 1111377379u, 4224032267u, 3937989746u, 1396912026u, 3359776896u, 1908013928u, 1623494929u, 3644803833u, ++ 2377615716u, 877417100u, 623982837u, 2630542109u, 130804743u, 3190831087u, 2941083030u, 381060734u, ++ 106748588u, 3215393092u, 2933549885u, 388083925u, 2350956495u, 903570471u, 614862430u, 2640172470u, ++ 3386185259u, 1882115523u, 1632872378u, 3634920530u, 1135178568u, 4199721120u, 3945775833u, 1389631793u, ++ 1317531835u, 4152109907u, 3858841898u, 1610259138u, 3304822232u, 2097172016u, 1820140617u, 3582394273u, ++ 2165193788u, 955639764u, 696815021u, 2423477829u, 192043359u, 2995356343u, 2750736590u, 437203750u, ++ 182808564u, 3005133852u, 2724453989u, 462947725u, 2157513367u, 962777471u, 673168134u, 2447663342u, ++ 3312231283u, 2090301595u, 1844056802u, 3557935370u, 1326499344u, 4142603768u, 3885397889u, 1584245865u, ++ 3326266917u, 2142836173u, 1858371508u, 3611272284u, 1279175494u, 4123357358u, 3837270743u, 1564721471u, ++ 164299426u, 2955991370u, 2706223923u, 414607579u, 2209834945u, 978107433u, 724686416u, 2462715320u, ++ 2183156074u, 1004243586u, 715579643u, 2472360723u, 140260361u, 2980573153u, 2698675608u, 421617264u, ++ 1302961645u, 4099032581u, 3845074044u, 1557460884u, 3352688782u, 2116952934u, 1867729183u, 3601371895u, ++ 2222754758u, 1032278062u, 754596439u, 2499928511u, 234942117u, 3086693709u, 2793824052u, 528319708u, ++ 1274365761u, 4061043881u, 3816027856u, 1518873912u, 3246989858u, 2020800970u, 1762628531u, 3505670235u, ++ 3223196809u, 2045103969u, 1754834200u, 3512958704u, 1247965674u, 4086934018u, 3806642299u, 1528765331u, ++ 261609486u, 3060532198u, 2802936223u, 518697591u, 2246819181u, 1007707781u, 762121468u, 2492913428u, ++ 213497176u, 3041029808u, 2755593417u, 499441441u, 2261110843u, 1061030867u, 776167850u, 2545465922u, ++ 3274734047u, 2060165687u, 1807140942u, 3528266662u, 1229724860u, 4038575956u, 3788156205u, 1479636677u, ++ 1222322711u, 4045468159u, 3764231046u, 1504067694u, 3265744756u, 2069664924u, 1780612837u, 3554288909u, ++ 2270357136u, 1051278712u, 802445057u, 2519698665u, 221152243u, 3033880603u, 2779263586u, 475261322u, ++ }, { ++ 0u, 2926088593u, 2275419491u, 701019378u, 3560000647u, 2052709654u, 1402038756u, 4261017717u, ++ 1930665807u, 3715829470u, 4105419308u, 1524313021u, 2804077512u, 155861593u, 545453739u, 2397726522u, ++ 3861331614u, 1213181711u, 1636244477u, 3488582252u, 840331801u, 2625561480u, 3048626042u, 467584747u, ++ 2503254481u, 995897408u, 311723186u, 3170637091u, 1090907478u, 4016929991u, 3332753461u, 1758288292u, ++ 390036349u, 3109546732u, 2426363422u, 1056427919u, 3272488954u, 1835443819u, 1152258713u, 3938878216u, ++ 1680663602u, 3393484195u, 3817652561u, 1306808512u, 2954733749u, 510998820u, 935169494u, 2580880455u, ++ 4044899811u, 1601229938u, 1991794816u, 3637571857u, 623446372u, 2336332021u, 2726898695u, 216120726u, ++ 2181814956u, 744704829u, 95158223u, 2881711710u, 1446680107u, 4166125498u, 3516576584u, 2146575065u, ++ 780072698u, 2148951915u, 2849952665u, 129384968u, 4199529085u, 1411853292u, 2112855838u, 3548843663u, ++ 1567451573u, 4077254692u, 3670887638u, 1957027143u, 2304517426u, 657765539u, 251396177u, 2694091200u, ++ 3361327204u, 1714510325u, 1341779207u, 3784408214u, 476611811u, 2986349938u, 2613617024u, 899690513u, ++ 3142211371u, 354600634u, 1021997640u, 2458051545u, 1870338988u, 3239283261u, 3906682575u, 1186180958u, ++ 960597383u, 2536053782u, 3202459876u, 277428597u, 3983589632u, 1125666961u, 1792074851u, 3300423154u, ++ 1246892744u, 3829039961u, 3455203243u, 1671079482u, 2657312335u, 806080478u, 432241452u, 3081497277u, ++ 3748049689u, 1896751752u, 1489409658u, 4138600427u, 190316446u, 2772397583u, 2365053693u, 580864876u, ++ 2893360214u, 35503559u, 735381813u, 2243795108u, 2017747153u, 3593269568u, 4293150130u, 1368183843u, ++ 1560145396u, 4069882981u, 3680356503u, 1966430470u, 2295112051u, 648294626u, 258769936u, 2701399425u, ++ 804156091u, 2173100842u, 2823706584u, 103204425u, 4225711676u, 1438101421u, 2088704863u, 3524758222u, ++ 3134903146u, 347226875u, 1031468553u, 2467456920u, 1860935661u, 3229814396u, 3914054286u, 1193487135u, ++ 3385412645u, 1738661300u, 1315531078u, 3758225623u, 502792354u, 3012596019u, 2589468097u, 875607120u, ++ 1271043721u, 3853125400u, 3429020650u, 1644831355u, 2683558414u, 832261023u, 408158061u, 3057348348u, ++ 953223622u, 2528745559u, 3211865253u, 286899508u, 3974120769u, 1116263632u, 1799381026u, 3307794867u, ++ 2917509143u, 59586950u, 709201268u, 2217549029u, 2043995280u, 3619452161u, 4269064691u, 1344032866u, ++ 3740677976u, 1889445577u, 1498812987u, 4148069290u, 180845535u, 2762992206u, 2372361916u, 588238637u, ++ 1921194766u, 3706423967u, 4112727661u, 1531686908u, 2796705673u, 148555288u, 554857194u, 2407195515u, ++ 26248257u, 2952271312u, 2251333922u, 676868275u, 3584149702u, 2076793175u, 1375858085u, 4234771508u, ++ 2493785488u, 986493953u, 319029491u, 3178008930u, 1083533591u, 4009621638u, 3342158964u, 1767759333u, ++ 3887577823u, 1239362382u, 1612160956u, 3464433197u, 864482904u, 2649647049u, 3022443323u, 441336490u, ++ 1706844275u, 3419730402u, 3793503504u, 1282724993u, 2978819316u, 535149925u, 908921239u, 2554697734u, ++ 380632892u, 3100077741u, 2433735263u, 1063734222u, 3265180603u, 1828069930u, 1161729752u, 3948283721u, ++ 2207997677u, 770953084u, 71007118u, 2857626143u, 1470763626u, 4190274555u, 3490330377u, 2120394392u, ++ 4035494306u, 1591758899u, 1999168705u, 3644880208u, 616140069u, 2328960180u, 2736367686u, 225524183u, ++ }, + }; + +-#define WUFFS_GIF__QUIRKS_BASE 1041635328 +- +-#define WUFFS_GIF__QUIRKS_COUNT 7 +- + // ---------------- Private Initializer Prototypes + + // ---------------- Private Function Prototypes + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_decode_image_config( +- wuffs_gif__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_tell_me_more( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_decode_frame_config( +- wuffs_gif__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__skip_frame( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_decode_frame( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); +- + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_gif__decoder__reset_gc( +- wuffs_gif__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_up_to_id_part1( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_header( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_lsd( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_extension( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__skip_blocks( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_ae( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_gc( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_id_part0( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_id_part1( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__decode_id_part2( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); ++wuffs_crc32__ieee_hasher__up( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x); + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__copy_to_image_buffer( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_pb, +- wuffs_base__slice_u8 a_src); ++static wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__up__choosy_default( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x); + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_gif__decoder__lzw_init( +- wuffs_gif__decoder* self); ++wuffs_crc32__ieee_hasher__up_arm_crc32( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_gif__decoder__lzw_read_from( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src); ++wuffs_crc32__ieee_hasher__up_x86_sse42( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + + // ---------------- VTables + +-const wuffs_base__image_decoder__func_ptrs +-wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_gif__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_gif__decoder__frame_dirty_rect), ++const wuffs_base__hasher_u32__func_ptrs ++wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32 = { ++ (uint32_t(*)(const void*))(&wuffs_crc32__ieee_hasher__checksum_u32), + (uint64_t(*)(const void*, +- uint32_t))(&wuffs_gif__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_gif__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_gif__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_gif__decoder__restart_frame), ++ uint32_t))(&wuffs_crc32__ieee_hasher__get_quirk), + (wuffs_base__status(*)(void*, + uint32_t, +- uint64_t))(&wuffs_gif__decoder__set_quirk), ++ uint64_t))(&wuffs_crc32__ieee_hasher__set_quirk), + (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_gif__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_gif__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gif__decoder__workbuf_len), ++ wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update), ++ (uint32_t(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update_u32), + }; + + // ---------------- Initializer Implementations + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_gif__decoder__initialize( +- wuffs_gif__decoder* self, ++wuffs_crc32__ieee_hasher__initialize( ++ wuffs_crc32__ieee_hasher* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ +@@ -36681,23 +37083,25 @@ wuffs_gif__decoder__initialize( + } + } + ++ self->private_impl.choosy_up = &wuffs_crc32__ieee_hasher__up__choosy_default; ++ + self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = ++ wuffs_base__hasher_u32__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = ++ (const void*)(&wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32); + return wuffs_base__make_status(NULL); + } + +-wuffs_gif__decoder* +-wuffs_gif__decoder__alloc(void) { +- wuffs_gif__decoder* x = +- (wuffs_gif__decoder*)(calloc(sizeof(wuffs_gif__decoder), 1)); ++wuffs_crc32__ieee_hasher* ++wuffs_crc32__ieee_hasher__alloc(void) { ++ wuffs_crc32__ieee_hasher* x = ++ (wuffs_crc32__ieee_hasher*)(calloc(1, sizeof(wuffs_crc32__ieee_hasher))); + if (!x) { + return NULL; + } +- if (wuffs_gif__decoder__initialize( +- x, sizeof(wuffs_gif__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ if (wuffs_crc32__ieee_hasher__initialize( ++ x, sizeof(wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } +@@ -36705,18 +37109,18 @@ wuffs_gif__decoder__alloc(void) { + } + + size_t +-sizeof__wuffs_gif__decoder(void) { +- return sizeof(wuffs_gif__decoder); ++sizeof__wuffs_crc32__ieee_hasher(void) { ++ return sizeof(wuffs_crc32__ieee_hasher); + } + + // ---------------- Function Implementations + +-// -------- func gif.decoder.get_quirk ++// -------- func crc32.ieee_hasher.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gif__decoder__get_quirk( +- const wuffs_gif__decoder* self, ++wuffs_crc32__ieee_hasher__get_quirk( ++ const wuffs_crc32__ieee_hasher* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -36726,25 +37130,15 @@ wuffs_gif__decoder__get_quirk( + return 0; + } + +- uint32_t v_key = 0; +- +- if (a_key >= 1041635328u) { +- v_key = (a_key - 1041635328u); +- if (v_key < 7u) { +- if (self->private_impl.f_quirks[v_key]) { +- return 1u; +- } +- } +- } + return 0u; + } + +-// -------- func gif.decoder.set_quirk ++// -------- func crc32.ieee_hasher.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__set_quirk( +- wuffs_gif__decoder* self, ++wuffs_crc32__ieee_hasher__set_quirk( ++ wuffs_crc32__ieee_hasher* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -36757,377 +37151,812 @@ wuffs_gif__decoder__set_quirk( + : wuffs_base__error__initialize_not_called); + } + +- if ((self->private_impl.f_call_sequence == 0u) && (a_key >= 1041635328u)) { +- a_key -= 1041635328u; +- if (a_key < 7u) { +- self->private_impl.f_quirks[a_key] = (a_value > 0u); +- return wuffs_base__make_status(NULL); +- } +- } + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func gif.decoder.decode_image_config ++// -------- func crc32.ieee_hasher.update + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__decode_image_config( +- wuffs_gif__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__update( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ return wuffs_base__make_empty_struct(); + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_gif__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } + +- ok: +- self->private_impl.p_decode_image_config[0] = 0; +- goto exit; ++ if (self->private_impl.f_state == 0u) { ++ self->private_impl.choosy_up = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) ++ wuffs_base__cpu_arch__have_arm_crc32() ? &wuffs_crc32__ieee_hasher__up_arm_crc32 : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc32__ieee_hasher__up_x86_sse42 : ++#endif ++ self->private_impl.choosy_up); + } ++ wuffs_crc32__ieee_hasher__up(self, a_x); ++ return wuffs_base__make_empty_struct(); ++} + +- goto suspend; +- suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++// -------- func crc32.ieee_hasher.update_u32 + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_crc32__ieee_hasher__update_u32( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return 0; + } +- return status; ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return 0; ++ } ++ ++ wuffs_crc32__ieee_hasher__update(self, a_x); ++ return self->private_impl.f_state; + } + +-// -------- func gif.decoder.do_decode_image_config ++// -------- func crc32.ieee_hasher.up + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_decode_image_config( +- wuffs_gif__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- bool v_ffio = false; ++static wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__up( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ return (*self->private_impl.choosy_up)(self, a_x); ++} + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__up__choosy_default( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_s = 0; ++ wuffs_base__slice_u8 v_p = {0}; + +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if ( ! self->private_impl.f_seen_header) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_gif__decoder__decode_header(self, a_src); +- if (status.repr) { +- goto suspend; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_gif__decoder__decode_lsd(self, a_src); +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_header = true; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); +- if (status.repr) { +- goto suspend; +- } +- v_ffio = ! self->private_impl.f_gc_has_transparent_index; +- if ( ! self->private_impl.f_quirks[2u]) { +- v_ffio = (v_ffio && +- (self->private_impl.f_frame_rect_x0 == 0u) && +- (self->private_impl.f_frame_rect_y0 == 0u) && +- (self->private_impl.f_frame_rect_x1 == self->private_impl.f_width) && +- (self->private_impl.f_frame_rect_y1 == self->private_impl.f_height)); +- } else if (v_ffio) { +- self->private_impl.f_black_color_u32_argb_premul = 4278190080u; +- } +- if (self->private_impl.f_background_color_u32_argb_premul == 77u) { +- self->private_impl.f_background_color_u32_argb_premul = self->private_impl.f_black_color_u32_argb_premul; ++ v_s = (4294967295u ^ self->private_impl.f_state); ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 16; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32)); ++ while (v_p.ptr < i_end0_p) { ++ v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | ++ (((uint32_t)(v_p.ptr[1u])) << 8u) | ++ (((uint32_t)(v_p.ptr[2u])) << 16u) | ++ (((uint32_t)(v_p.ptr[3u])) << 24u)); ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); ++ v_p.ptr += 16; ++ v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | ++ (((uint32_t)(v_p.ptr[1u])) << 8u) | ++ (((uint32_t)(v_p.ptr[2u])) << 16u) | ++ (((uint32_t)(v_p.ptr[3u])) << 24u)); ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); ++ v_p.ptr += 16; + } +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- 2198077448u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- v_ffio); ++ v_p.len = 16; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16)); ++ while (v_p.ptr < i_end1_p) { ++ v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) | ++ (((uint32_t)(v_p.ptr[1u])) << 8u) | ++ (((uint32_t)(v_p.ptr[2u])) << 16u) | ++ (((uint32_t)(v_p.ptr[3u])) << 24u)); ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^ ++ WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^ ++ WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]); ++ v_p.ptr += 16; + } +- if (self->private_impl.f_call_sequence == 0u) { +- self->private_impl.f_call_sequence = 32u; ++ v_p.len = 1; ++ const uint8_t* i_end2_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end2_p) { ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u)); ++ v_p.ptr += 1; + } +- +- goto ok; +- ok: +- self->private_impl.p_do_decode_image_config[0] = 0; +- goto exit; ++ v_p.len = 0; + } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- return status; ++ self->private_impl.f_state = (4294967295u ^ v_s); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func gif.decoder.set_report_metadata ++// -------- func crc32.ieee_hasher.checksum_u32 + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_gif__decoder__set_report_metadata( +- wuffs_gif__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_crc32__ieee_hasher__checksum_u32( ++ const wuffs_crc32__ieee_hasher* self) { + if (!self) { +- return wuffs_base__make_empty_struct(); ++ return 0; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- if (a_fourcc == 1229144912u) { +- self->private_impl.f_report_metadata_iccp = a_report; +- } else if (a_fourcc == 1481461792u) { +- self->private_impl.f_report_metadata_xmp = a_report; ++ return self->private_impl.f_state; ++} ++ ++// ‼ WUFFS MULTI-FILE SECTION +arm_crc32 ++// -------- func crc32.ieee_hasher.up_arm_crc32 ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__up_arm_crc32( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ wuffs_base__slice_u8 v_p = {0}; ++ uint32_t v_s = 0; ++ ++ v_s = (4294967295u ^ self->private_impl.f_state); ++ while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { ++ v_s = __crc32b(v_s, a_x.ptr[0u]); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); ++ } ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 8; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 128) * 128)); ++ while (v_p.ptr < i_end0_p) { ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ } ++ v_p.len = 8; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8)); ++ while (v_p.ptr < i_end1_p) { ++ v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr)); ++ v_p.ptr += 8; ++ } ++ v_p.len = 1; ++ const uint8_t* i_end2_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end2_p) { ++ v_s = __crc32b(v_s, v_p.ptr[0u]); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; + } ++ self->private_impl.f_state = (4294967295u ^ v_s); + return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) ++// ‼ WUFFS MULTI-FILE SECTION -arm_crc32 + +-// -------- func gif.decoder.tell_me_more ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func crc32.ieee_hasher.up_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__tell_me_more( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++static wuffs_base__empty_struct ++wuffs_crc32__ieee_hasher__up_x86_sse42( ++ wuffs_crc32__ieee_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_s = 0; ++ __m128i v_kk = {0}; ++ __m128i v_x0 = {0}; ++ __m128i v_x1 = {0}; ++ __m128i v_x2 = {0}; ++ __m128i v_x3 = {0}; ++ __m128i v_x4 = {0}; ++ __m128i v_x5 = {0}; ++ __m128i v_x6 = {0}; ++ __m128i v_x7 = {0}; ++ __m128i v_y0 = {0}; ++ __m128i v_y1 = {0}; ++ __m128i v_y2 = {0}; ++ __m128i v_y3 = {0}; ++ __m128i v_y4 = {0}; ++ __m128i v_y5 = {0}; ++ __m128i v_y6 = {0}; ++ __m128i v_y7 = {0}; ++ ++ v_s = (4294967295u ^ self->private_impl.f_state); ++ while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); + } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ if (((uint64_t)(a_x.len)) >= 128u) { ++ v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)); ++ v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); ++ v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)); ++ v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)); ++ v_x4 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u)); ++ v_x5 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u)); ++ v_x6 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u)); ++ v_x7 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u)); ++ v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(2433674945u), (int32_t)(0u), (int32_t)(872412467u)); ++ v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u); ++ while (((uint64_t)(a_x.len)) >= 128u) { ++ v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u)); ++ v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u)); ++ v_y1 = _mm_clmulepi64_si128(v_x1, v_kk, (int32_t)(0u)); ++ v_x1 = _mm_clmulepi64_si128(v_x1, v_kk, (int32_t)(17u)); ++ v_y2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(0u)); ++ v_x2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(17u)); ++ v_y3 = _mm_clmulepi64_si128(v_x3, v_kk, (int32_t)(0u)); ++ v_x3 = _mm_clmulepi64_si128(v_x3, v_kk, (int32_t)(17u)); ++ v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u)); ++ v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u)); ++ v_y5 = _mm_clmulepi64_si128(v_x5, v_kk, (int32_t)(0u)); ++ v_x5 = _mm_clmulepi64_si128(v_x5, v_kk, (int32_t)(17u)); ++ v_y6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(0u)); ++ v_x6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(17u)); ++ v_y7 = _mm_clmulepi64_si128(v_x7, v_kk, (int32_t)(0u)); ++ v_x7 = _mm_clmulepi64_si128(v_x7, v_kk, (int32_t)(17u)); ++ v_y0 = _mm_xor_si128(v_y0, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u))); ++ v_x0 = _mm_xor_si128(v_x0, v_y0); ++ v_y1 = _mm_xor_si128(v_y1, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u))); ++ v_x1 = _mm_xor_si128(v_x1, v_y1); ++ v_y2 = _mm_xor_si128(v_y2, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u))); ++ v_x2 = _mm_xor_si128(v_x2, v_y2); ++ v_y3 = _mm_xor_si128(v_y3, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u))); ++ v_x3 = _mm_xor_si128(v_x3, v_y3); ++ v_y4 = _mm_xor_si128(v_y4, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u))); ++ v_x4 = _mm_xor_si128(v_x4, v_y4); ++ v_y5 = _mm_xor_si128(v_y5, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u))); ++ v_x5 = _mm_xor_si128(v_x5, v_y5); ++ v_y6 = _mm_xor_si128(v_y6, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u))); ++ v_x6 = _mm_xor_si128(v_x6, v_y6); ++ v_y7 = _mm_xor_si128(v_y7, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u))); ++ v_x7 = _mm_xor_si128(v_x7, v_y7); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u); ++ } ++ v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(3433693342u), (int32_t)(0u), (int32_t)(2926088593u)); ++ v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u)); ++ v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u)); ++ v_y2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(0u)); ++ v_x2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(17u)); ++ v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u)); ++ v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u)); ++ v_y6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(0u)); ++ v_x6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(17u)); ++ v_y0 = _mm_xor_si128(v_y0, v_x1); ++ v_x0 = _mm_xor_si128(v_x0, v_y0); ++ v_y2 = _mm_xor_si128(v_y2, v_x3); ++ v_x2 = _mm_xor_si128(v_x2, v_y2); ++ v_y4 = _mm_xor_si128(v_y4, v_x5); ++ v_x4 = _mm_xor_si128(v_x4, v_y4); ++ v_y6 = _mm_xor_si128(v_y6, v_x7); ++ v_x6 = _mm_xor_si128(v_x6, v_y6); ++ v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(2166711591u), (int32_t)(0u), (int32_t)(4057597354u)); ++ v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u)); ++ v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u)); ++ v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u)); ++ v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u)); ++ v_y0 = _mm_xor_si128(v_y0, v_x2); ++ v_x0 = _mm_xor_si128(v_x0, v_y0); ++ v_y4 = _mm_xor_si128(v_y4, v_x6); ++ v_x4 = _mm_xor_si128(v_x4, v_y4); ++ v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(496309207u), (int32_t)(0u), (int32_t)(2402626965u)); ++ v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u)); ++ v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u)); ++ v_y0 = _mm_xor_si128(v_y0, v_x4); ++ v_x0 = _mm_xor_si128(v_x0, v_y0); ++ v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u)); ++ v_s = ((uint32_t)(_mm_extract_epi32(_mm_clmulepi64_si128(_mm_clmulepi64_si128(_mm_cvtsi64_si128((int64_t)(((uint64_t)(_mm_extract_epi64(v_x0, (int32_t)(0u)))))), v_kk, (int32_t)(0u)), v_kk, (int32_t)(16u)), (int32_t)(2u)))); ++ v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u)); ++ v_s = ((uint32_t)(_mm_extract_epi32(_mm_clmulepi64_si128(_mm_clmulepi64_si128(_mm_cvtsi64_si128((int64_t)((((uint64_t)(_mm_extract_epi64(v_x0, (int32_t)(1u)))) ^ ((uint64_t)(v_s))))), v_kk, (int32_t)(0u)), v_kk, (int32_t)(16u)), (int32_t)(2u)))); ++ } ++ while (((uint64_t)(a_x.len)) >= 8u) { ++ v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u)); ++ v_s = ((uint32_t)(_mm_extract_epi32(_mm_clmulepi64_si128(_mm_clmulepi64_si128(_mm_cvtsi64_si128((int64_t)((wuffs_base__peek_u64le__no_bounds_check(a_x.ptr) ^ ((uint64_t)(v_s))))), v_kk, (int32_t)(0u)), v_kk, (int32_t)(16u)), (int32_t)(2u)))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 8u); + } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ while (((uint64_t)(a_x.len)) > 0u) { ++ v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ self->private_impl.f_state = (4294967295u ^ v_s); ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) + +- uint32_t coro_susp_point = self->private_impl.p_tell_me_more[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_gif__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_gif__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++// ---------------- Status Codes Implementations + +- ok: +- self->private_impl.p_tell_me_more[0] = 0; +- goto exit; +- } ++// ---------------- Private Consts + +- goto suspend; +- suspend: +- self->private_impl.p_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++static const uint64_t ++WUFFS_CRC64__ECMA_TABLE[8][256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ { ++ 0u, 12911341560706588527u, 17619267392293085275u, 5164075066763771700u, 8921845837811637811u, 14483170935171449180u, 10328150133527543400u, 4357999468653093127u, ++ 17843691675623275622u, 4940391307328217865u, 226782375002905661u, 12685511915359257426u, 10119945210068853333u, 4566377562367245626u, 8715998937306186254u, 14689403211693301089u, ++ 9051005139383707209u, 14895072503764629798u, 9880782614656435730u, 4193374422961527165u, 453564750005811322u, 13070904082541799189u, 17496296445768931361u, 4747102235666401102u, ++ 9960315520700766767u, 4113029525020509504u, 9132755124734491252u, 14812441257301386523u, 17431997874612372508u, 4811156168024382323u, 391483189436228679u, 13132671735097031464u, ++ 18102010278767414418u, 5195199925788447741u, 1131375642422963401u, 13591081480414639014u, 9288535643022529185u, 3731739485546663374u, 8386748845923054330u, 14361410892855143829u, ++ 907129500011622644u, 13814943346342178715u, 17875617253995106479u, 5421418680781082560u, 8594564625313771207u, 14152643483341451688u, 9494204471332802204u, 3525329033817543155u, ++ 9704381199536204507u, 3855837706121835956u, 8226059050041019008u, 13908973417437222383u, 18265510249468982504u, 5643692520190618503u, 718348998302913715u, 13463047253836762076u, ++ 8146277531524994749u, 13989069943491807698u, 9622312336048764646u, 3938150108875254153u, 782966378872457358u, 13399312233903888353u, 18327840216347633877u, 5582173445676054458u, ++ 7257036000092981153u, 15535280666427316430u, 10390399851576895482u, 2529986302517213333u, 2262751284845926802u, 12414353723947190013u, 16997392145760156105u, 6398650419759490726u, ++ 10599130201908394951u, 2322133910755632296u, 7463478971093326748u, 15329644185724306675u, 16773497691846108660u, 6622864283287239323u, 2036569382881248687u, 12640783567252986560u, ++ 1814259000023245288u, 12250853444207230599u, 17125426475222188467u, 6811676960462675676u, 7132938157145702363u, 15119434731753103540u, 10842837361562165120u, 2690676064372932847u, ++ 17189129250627542414u, 6747026957542163169u, 1875814858707893717u, 12188560364711551674u, 10762704257491731389u, 2770420489343360210u, 7050658067635086310u, 15201536148867841161u, ++ 11493583972846619443u, 3219832958944941148u, 7711675412243671912u, 15576564987190227975u, 16452118100082038016u, 6305011443818121839u, 1213047649942025563u, 11816267669673208372u, ++ 7503259434831574869u, 15784731923736995898u, 11287385040381237006u, 3425713581329221729u, 1436697996605827430u, 11591809733187859977u, 16677985422973077821u, 6078267261889762898u, ++ 16292555063049989498u, 5851447209550246421u, 1630020308903038241u, 11939238787801010766u, 11081681957373440841u, 3090674103720225830u, 7876300217750508306u, 16023932746787097725u, ++ 1565932757744914716u, 12003503911822413427u, 16230825569204842823u, 5913566482019610152u, 7956607163135676207u, 15944361922680361024u, 11164346891352108916u, 3008957496780927003u, ++ 14514072000185962306u, 8809633696146542637u, 4460922918905818905u, 10287960411460399222u, 12879331835779764593u, 113391187501452830u, 5059972605034426666u, 17660565739912801861u, ++ 4525502569691853604u, 10224187249629523019u, 14576435430675780479u, 8748148222884465680u, 4980157760350383383u, 17740628527280140920u, 12797300839518981452u, 195741594718114339u, ++ 13040162471224305931u, 565687821211481700u, 4644267821511264592u, 17536326748496696895u, 14926957942186653496u, 8937808626997553239u, 4297282312656885603u, 9839608450464401420u, ++ 4852190599768102253u, 17327666750234135042u, 13245728566574478646u, 359174499151456857u, 4073138765762497374u, 10063573324157604913u, 14700457781105076997u, 9163920108173816938u, ++ 3628518000046490576u, 9328460452529085631u, 14330211790445699979u, 8498696072880078052u, 5299565100954197475u, 18061012165519327884u, 13623353920925351352u, 1018284691440624343u, ++ 14265876314291404726u, 8562713237611094233u, 3566469078572851181u, 9390260331795218562u, 13702854325316886917u, 937907429353946858u, 5381352128745865694u, 17978417549248290481u, ++ 5746791986423309721u, 18225777846762470134u, 13494053915084326338u, 606523824971012781u, 3751629717415787434u, 9745292510640121029u, 13876787882151992305u, 8338992711486538910u, ++ 13285957365033343487u, 815010154451519120u, 5540840978686720420u, 18431906428167644875u, 14101316135270172620u, 8115412784602421411u, 3978303581567838103u, 9519354766961195256u, ++ 12527462061959317731u, 2230461459452909452u, 6439665917889882296u, 16893009583564617687u, 15423350824487343824u, 7288217715337890239u, 2490078880175191691u, 10493603952060017124u, ++ 6520081235612152965u, 16813546994155744234u, 12610022887636243678u, 2148641156328442801u, 2426095299884051126u, 10557972909709735385u, 15361512820870335213u, 7350228890552538498u, ++ 15006518869663149738u, 7165105895222849989u, 2649782550477098737u, 10947027550912647582u, 12362696414880903321u, 1783234539286425590u, 6851427162658443458u, 17022309211647725485u, ++ 2873395993211654860u, 10722532847870938531u, 15232418832718623383u, 6938393941075996152u, 6642978682516671743u, 17230443782969840528u, 12156534523779525796u, 1989151790783919051u, ++ 6263731030979658865u, 16556202624882645790u, 11702894419100492842u, 1245039440087595845u, 3260040617806076482u, 11390642587947386157u, 15688795063501830681u, 7680756410435167606u, ++ 11622868312827688983u, 1324891275238549368u, 6181348207440451660u, 16638201170595874595u, 15752600435501016612u, 7616209416359311691u, 3321489341258335871u, 11328242235714328848u, ++ 3131865515489829432u, 10977756817953029463u, 16137146508898304611u, 7844397531750915340u, 5811434156413844491u, 16395372229761246052u, 11827132964039220304u, 1660744670629167935u, ++ 15913214326271352414u, 8068573254449152305u, 2905717078206922245u, 11204220263579804010u, 12035829987123708013u, 1452858539103461122u, 6017914993561854006u, 16189773752444600153u, ++ }, { ++ 0u, 6118555238288912653u, 12237110476577825306u, 18247330833359770391u, 13942380710360636081u, 10778293617712507836u, 7543452712389327019u, 4343374206906190246u, ++ 1162559746622204903u, 4957131115480832746u, 13398436261328603645u, 17084888254066768112u, 15086905424778654038u, 9634902877839851611u, 8686748413812380492u, 3198961161184305729u, ++ 2325119493244409806u, 8407378615347160771u, 9914262230961665492u, 15960741045388068057u, 16229058527915052415u, 13101053971319389298u, 5254506258681524069u, 2018377927885299304u, ++ 3487552142959377449u, 7246080283574668580u, 11075676491871100467u, 14798208821638459198u, 17373496827624760984u, 11957750539307177877u, 6397922322368611458u, 873845550624159119u, ++ 4650238986488819612u, 1468611264581623441u, 16814757230694321542u, 13669406796222545035u, 9364600845881799981u, 15356367945216001056u, 2893367039927949111u, 8993183146101597754u, ++ 5812680741028562043u, 307286854339917174u, 17976181078471403105u, 12506848973898782572u, 10509012517363048138u, 14213073068277772231u, 4036755855770598608u, 7848658706446142941u, ++ 6975104285918754898u, 3757679901787621727u, 14492160567149337160u, 11382574084698991429u, 11651310343450272483u, 17679087685142107118u, 604386294999662841u, 6668229816820511220u, ++ 8137636784695169973u, 2596263716583940792u, 15653459723670892975u, 10220140060479144098u, 12795844644737222916u, 16535671346696648713u, 1747691101248318238u, 5523790692630174227u, ++ 9300477972977639224u, 15418239225476001333u, 2937222529163246882u, 8947075512310451247u, 4642267913777087881u, 1478833794519692420u, 16842993350473770899u, 13643422681269376670u, ++ 10462937938231096543u, 14256895642581861842u, 4098594218943518405u, 7784568886045304776u, 5786734079855898222u, 335485660068962147u, 17986366292203195508u, 12498915352811683193u, ++ 11625361482057124086u, 17707288688936286715u, 614573708679834348u, 6660293997941431265u, 6929031904881267271u, 3801500275841901386u, 14553996732492558429u, 11318486464284246352u, ++ 12787875770090627857u, 16545891676414235164u, 1775925023235784971u, 5497808777625382918u, 8073511711541197216u, 2658137194938402989u, 15697317412892285882u, 10174030228858301111u, ++ 13950208571837509796u, 10768213751408296361u, 7515359803575243454u, 4369215658492879795u, 64266086328445461u, 6056541296517372696u, 12193111774187735055u, 18293581128395077890u, ++ 15112713823828466499u, 9606842886146402894u, 8676701462472931673u, 3206755967968430164u, 1208772589999325682u, 4913169729330573567u, 13336459633641022440u, 17149116886581154533u, ++ 16275273569390339946u, 13057090384914568807u, 5192527433167881584u, 2082608760381092989u, 2350925692077440475u, 8379320821714095318u, 9904217479574233025u, 15968533654375526092u, ++ 17437760713698643085u, 11895738795633802624u, 6353925819959930519u, 920093647833407386u, 3495382202496636476u, 7235998217053677361u, 11047581385260348454u, 14824052473177163051u, ++ 10447068876609200373u, 14128364157388739064u, 4118967294799201007u, 7908597456515216354u, 5874445058326493764u, 391603411424480073u, 17894151024620902494u, 12447300791057279315u, ++ 9284535827554175762u, 15289779793358354975u, 2957667589039384840u, 9071030930460645381u, 4729911307347480995u, 1535020299074674862u, 16750846767572792249u, 13591740465559749300u, ++ 12735909365018523451u, 16453465302197274166u, 1832394617641637153u, 5585730863000118316u, 8197188437887036810u, 2678299164963691655u, 15569137772090609552u, 10158372272797335197u, ++ 11573468159711796444u, 17614790262716542417u, 670971320137924294u, 6748289234561093579u, 7052776217202099821u, 3821593491595032416u, 14425748405936874615u, 11302896163253294458u, ++ 15020497008676966249u, 9555230900528283236u, 8764415362900159859u, 3262871967819308158u, 1229147417359668696u, 5037195377843840213u, 13320587995882862530u, 17020586948957226703u, ++ 13858063809762534542u, 10716528681989657987u, 7603000551683802772u, 4425403642365261721u, 84709666887204415u, 6180499360129388338u, 12177172482473303077u, 18165119875451415848u, ++ 17309582619392432295u, 11880078264510294442u, 6477599625422879421u, 940257368289594288u, 3551850046471569942u, 7323923223311315739u, 10995617555250765836u, 14731624552464748801u, ++ 16147023423082394432u, 13041502936518885965u, 5316274389876805978u, 2102700497890566231u, 2407324781779167729u, 8467313413945678076u, 9852321304593615851u, 15876037047908055782u, ++ 1291018766690942925u, 4973072573440528064u, 13274480430592564695u, 17064442507263798490u, 15030719607150486908u, 9547259896855319665u, 8738431316985759590u, 3291108156134209131u, ++ 128532172656890922u, 6134424711959717159u, 12113082593034745392u, 18226958170089932605u, 13886262546419256987u, 10690581952315096982u, 7595066862094806145u, 4435588787024731532u, ++ 3580050981226981379u, 7297974293382715662u, 10987681667836234265u, 14741811897106152212u, 17353402924945863346u, 11834005814401532863u, 6413511935936860328u, 1002093465131966885u, ++ 2417545179998651364u, 8459344608371405545u, 9826339458661147134u, 15904271038397419763u, 16208896970474576213u, 12977377931899316312u, 5270164626790366031u, 2146558256149678658u, ++ 5864365122984562769u, 399431204366950748u, 17919992407673188939u, 12419207813205476166u, 10385054866335763168u, 14192630174644861933u, 4165217520762185978u, 7864598685623228919u, ++ 4701851384154880950u, 1560828767195761339u, 16758641643428190636u, 13581693582721149089u, 9240574510442684679u, 15335992705270927370u, 3021896290089222941u, 9009054371811832336u, ++ 8153224920554538911u, 2724514274940876434u, 15633368673088300421u, 10096393516356015240u, 12707851639919861038u, 16479271570068024355u, 1840187295666814772u, 5575686180147088953u, ++ 6990764404993272952u, 3885857308630146421u, 14471996434107354722u, 11258899592309161839u, 11563386024119531209u, 17622620253752952772u, 696814903175779539u, 6720194058879067614u, ++ }, { ++ 0u, 4542972359516777931u, 9085944719033555862u, 4691664355513513565u, 18171889438067111724u, 14061474303606774503u, 9383328711027027130u, 13633424072306524529u, ++ 7676286055365832925u, 6164376987427609878u, 1481798532234586955u, 3142253189322229376u, 10855962452864321521u, 12223826156538735162u, 16771372852738792551u, 15543052108730888620u, ++ 15352572110731665850u, 16862791698018765937u, 12328753974855219756u, 10669987536837040103u, 2963597064469173910u, 1597421751597874013u, 6284506378644458752u, 7511137813735006411u, ++ 13801544397233820007u, 9260261528098962604u, 13951919735851666161u, 18344511890033026874u, 4874982405016790603u, 8983709158270585728u, 4445237816650825181u, 196831773885239318u, ++ 4091022007653359089u, 562346998784700474u, 5103132815620245095u, 8780357948041161644u, 14189083196432476893u, 18150173592266475286u, 13474345022262784331u, 9652793049543924864u, ++ 5927194128938347820u, 7875246409875505383u, 3194843503195748026u, 1395478681687169905u, 12569012757288917504u, 10477056948030502859u, 15022275627470012822u, 17253916197967211613u, ++ 17134349580696108107u, 15186860751721288064u, 10655150290339489757u, 12453952663903504918u, 1289987737384422247u, 3381381201708377772u, 8066289525279445233u, 5835212509754572090u, ++ 9749964810033581206u, 13278076374523191645u, 17967418316541171456u, 14290755639648123595u, 8890475633301650362u, 4929947589851190897u, 393663547770478636u, 4214651972966108647u, ++ 8182044015306718178u, 5658655167774316073u, 1124693997569400948u, 3499391957275839935u, 10206265631240490190u, 12873559114121502981u, 17560715896082323288u, 14753743294414502547u, ++ 1948880861322201919u, 2594127930539943668u, 7285718382500778153u, 6491924633276939618u, 16655531858934856723u, 15577868310755742168u, 11039333611388512133u, 11977453108914408014u, ++ 11854388257876695640u, 11207451878732806035u, 15750492819751010766u, 16545974958769302533u, 6389687006391496052u, 7469038772501250239u, 2790957363374339810u, 1851148384058628905u, ++ 14845159798643632773u, 17370237963685480270u, 12687582131971748115u, 10311195790054169816u, 3615017233668480425u, 946035540305899618u, 5493509258033841727u, 8302171348940565492u, ++ 5281120895271462419u, 8521283507583323096u, 3989500891288354181u, 600787064567550030u, 13071075951463747903u, 9974957613568212212u, 14659789384177486505u, 17616368207971182434u, ++ 2579975474768844494u, 2073357103652371205u, 6762762403416755544u, 7120694423275413651u, 16132579050558890466u, 16206641305794825257u, 11670425019509144180u, 11456679111066785727u, ++ 11260412520859862953u, 11767594448091671138u, 16308316081471249471u, 15949821717821010420u, 6947506857025941637u, 6872882154850049358u, 2196985003345963795u, 2411294364755134168u, ++ 17780951266603300724u, 14540225107906894527u, 9859895179702381794u, 13249171359945539881u, 787327095540957272u, 3884007889973030291u, 8429303945932217294u, 5472161678768272901u, ++ 16364088030613436356u, 15858029804260760079u, 11317310335548632146u, 11674676600264311193u, 2249387995138801896u, 2322888996435045667u, 6998783914551679870u, 6785602652076537525u, ++ 9916730820443375385u, 13156333278251739858u, 17836661041797717135u, 14448512960480194884u, 8480501340405739573u, 5384944246861192702u, 839650424281590691u, 3795664592519366248u, ++ 3897761722644403838u, 656471011406904245u, 5188255861079887336u, 8578093388688728099u, 14571436765001556306u, 17668683201823263897u, 12983849266553879236u, 10026146741872662287u, ++ 6669836397870376611u, 7177582867921406824u, 2488175334770097461u, 2129119614032302334u, 11583119667977343375u, 11507929313807383620u, 16044147764761037337u, 16259017374083049426u, ++ 15843330937415051829u, 16489139217633298430u, 11946100509993103779u, 11151742071862860904u, 2878174689517968665u, 1799951022334374098u, 6478030266801178255u, 7416715545229372228u, ++ 12779374012782992104u, 10255423946675697443u, 14938077545002500478u, 17313340186040954037u, 5581914726748679620u, 8249768321177223183u, 3702296768117257810u, 894758378090191769u, ++ 1067805515879173007u, 3592318064290702916u, 8126281399163064345u, 5750455340522077650u, 17509465798031703203u, 14841048614271029608u, 10153889598922762037u, 12961990299524614910u, ++ 7230034467336960850u, 6583663697231173273u, 1892071080611799236u, 2686992928761285903u, 10987018516067683454u, 12065805765134311861u, 16604342697881130984u, 15665095101429070371u, ++ 10562241790542924838u, 12510858718452294125u, 17042567015166646192u, 15242640940723501691u, 7979001782576708362u, 5886480219318720193u, 1201574129135100060u, 3433774845539634519u, ++ 17875696825445760251u, 14346457162030502192u, 9657117384671061869u, 13334903762452155046u, 305328503063841751u, 4266984645440464412u, 8803266454141587521u, 4981154328058445194u, ++ 5159950949537688988u, 8687502257518297175u, 4146714207304742410u, 470617173809470401u, 13525524806833511088u, 9565558111887030139u, 14241388846550827302u, 18061812720343526637u, ++ 3250597773715660097u, 1303669193657626762u, 5984074333724313303u, 7782311056298339100u, 15074661043719826029u, 17165493152098584486u, 12620272307991097851u, 10389759836427934768u, ++ 12273052416502600151u, 10761709128327461916u, 15295744618112993857u, 16955639155056813962u, 6232173811933554427u, 7599472825692375856u, 2912390363305901421u, 1684630829289181350u, ++ 13895013714051883274u, 18437420284065877185u, 13745764309700098716u, 9352044056584181591u, 4393970006691927590u, 284119552558480365u, 4822588729510268336u, 9072122871209877627u, ++ 9177754244107333741u, 4635909983525117350u, 92935459340889083u, 4486092121981797936u, 9471751652205676353u, 13581038687731985034u, 18259186513699183831u, 14010214853299335452u, ++ 1574654191081914544u, 3085435160094502267u, 7768015779946060582u, 6108684823746459373u, 16858607891864434588u, 15491872287116188247u, 10944323357536545802u, 12171520400656925121u, ++ }, { ++ 0u, 2156813408461955548u, 4313626816923911096u, 2752718492472304228u, 8627253633847822192u, 7661928252530632364u, 5505436984944608456u, 5875429064940414228u, ++ 17254507267695644384u, 17481523150583344956u, 15323856505061264728u, 14503785508944014468u, 11010873969889216912u, 9592933115173218380u, 11750858129880828456u, 13762408288327199732u, ++ 5489899806547772229u, 5899293950881604249u, 8641596751236382973u, 7639112309309301025u, 4290280838231655477u, 2766522915734824425u, 24548853041579917u, 2141951263632483921u, ++ 11764625126767791525u, 13739024951972572281u, 10995904098661322269u, 9617374173086412737u, 15347829100153899733u, 14488356108428585737u, 17231728733602892141u, 17495903608387299505u, ++ 10979799613095544458u, 9623805157521532758u, 11798587901763208498u, 13714458609834648814u, 17283193502472765946u, 17452775347443867686u, 15278224618618602050u, 14549338234851124126u, ++ 8580561676463310954u, 7708699370463537590u, 5533045831469648850u, 5847881786764880398u, 49097706083159834u, 2107935609010204358u, 4283902527264967842u, 2782645096555375998u, ++ 15298762408106657231u, 14537220494637179923u, 17261466032775972471u, 17465946411177207723u, 11811312492909331135u, 13692276008895521635u, 10968273481005252871u, 9644925621600215259u, ++ 4261616546501692207u, 2795266376586341107u, 70185227798988951u, 2096376465831291211u, 5520961050865536095u, 5868452604588535171u, 8593836137267777511u, 7687075229128879675u, ++ 11680230827506930577u, 13832259058284016205u, 11080421551794245673u, 9523735455073038837u, 15394057194608301281u, 14432953972299937085u, 17185658977434064729u, 17550865948466574981u, ++ 5579070418531851633u, 5801301123735731373u, 8552830750928559817u, 7736981982542757653u, 4239857041646656001u, 2826138345940532189u, 75412445699561913u, 2082177495183685733u, ++ 17161123352926621908u, 17565732457015587080u, 15417398740927075180u, 14419136389292487344u, 11066091662939297700u, 9546555762013386360u, 11695763573529760796u, 13808381012597372352u, ++ 98195412166319668u, 2067810197125185512u, 4215871218020408716u, 2841563382736944208u, 8567805054529935684u, 7712554084374493336u, 5565290193110751996u, 5824680096370817824u, ++ 4213277561403610395u, 2852497928146826439u, 118647349622822563u, 2038740285422565247u, 5603244184571253355u, 5777048188553278391u, 8511711324634206675u, 7778039831901335567u, ++ 15351860113773370363u, 14475212630091872807u, 17208772955998935107u, 17527831139023518111u, 11724816064851319947u, 13787876126790335831u, 11055209722282565427u, 9549167182608629487u, ++ 8523233093003384414u, 7756906139291137922u, 5590532753172682214u, 5799235221864313914u, 140370455597977902u, 2025555993157185778u, 4192752931662582422u, 2864620100732154698u, ++ 11041922101731072190u, 9570786891571902818u, 11736905209177070342u, 13767318537498720986u, 17187672274535555022u, 17539385849830522386u, 15374150458257759350u, 14462604578592423338u, ++ 15486092620961298855u, 14629711868178897019u, 17092483903335922207u, 17355247692313779139u, 11624791503456485079u, 13600030943165030155u, 11137009302703308143u, 9754815117126884531u, ++ 4151744643171039047u, 2626583331457439387u, 162377516962444543u, 2282879863086044451u, 5631712546292871223u, 6037452326221451755u, 8501327171535303567u, 7499692239708246611u, ++ 11158140837063703266u, 9743299917872012094u, 11602602247471462746u, 13612749016692676742u, 17105661501857119634u, 17333526894853233742u, 15473963965085515306u, 14650238604571402230u, ++ 8479714083293312002u, 7512977616177960414u, 5652276691881064378u, 6025361010828170854u, 150824891399123826u, 2303974039851176622u, 4164354990367371466u, 2604286280411140374u, ++ 5659250822143950637u, 6009834889821986545u, 8454565055791594645u, 7546392787102457161u, 4121809449076176989u, 2656298618920900993u, 211263906290727909u, 2233791159333640761u, ++ 11672732454520566221u, 13552292306546298897u, 11106145987650286197u, 9785898338790069161u, 15440531030182573757u, 14675335027319969633u, 17121240571213837573u, 17326570184971408601u, ++ 196390824332639336u, 2258328937796115892u, 4135620394250371024u, 2632959299571932684u, 8431742436040817432u, 7560729365405768388u, 5683126765473888416u, 5994308631384381820u, ++ 17135610109059871368u, 17303780593489122132u, 15425108168748986672u, 14699314298944934124u, 11130580386221503992u, 9770921945649714212u, 11649360192741635648u, 13566070240564762524u, ++ 8426555122807220790u, 7574959341548112874u, 5704995856293652878u, 5963537623700588626u, 237294699245645126u, 2208312048661695642u, 4077480570845130494u, 2700071425513574178u, ++ 11206488369142506710u, 9686112028953249034u, 11554096377106556782u, 13670376701660284594u, 17023422649268413350u, 17424940338905547386u, 15556079663802671134u, 14559229772221530562u, ++ 4089596066908350835u, 2679540256679954607u, 224121464376355531u, 2230046074588744471u, 5727171952466636291u, 5950815117732351967u, 8405427952099257787u, 7586487769270013031u, ++ 15543464952953907091u, 14581513594800801359u, 17034988434643772459u, 17403850594581005815u, 11533527867866456291u, 13682454788587061567u, 11228114617197060955u, 9672831084924650119u, ++ 17046466186006768828u, 17401835225210195296u, 15513812278582275844u, 14601417988320120536u, 11181065506345364428u, 9711332585899690512u, 11598470443728627828u, 13625782737014311336u, ++ 280740911195955804u, 2165085734748128128u, 4051111986314371556u, 2726642315882184760u, 8385505863325164844u, 7616087770173211888u, 5729240201464309396u, 5939354855465699144u, ++ 11574598932837183481u, 13641322155266051621u, 11203874897631210561u, 9696991643941850525u, 15500005765847099529u, 14624770467483748693u, 17061326039500450609u, 17377293083093715693u, ++ 5752625691707646233u, 5925581285101240517u, 8361067032314929825u, 7631051003498906493u, 4066548076212889193u, 2702667407911749557u, 266366940911429073u, 2187862166416278541u, ++ }, { ++ 0u, 6642096280510406750u, 13284192561020813500u, 16462795876764246242u, 16315823105410768893u, 13708963636559134627u, 6500836570635362113u, 439922346977066783u, ++ 6197597939812213119u, 733872460607717665u, 17174658310779658691u, 12859417258165748125u, 13001673141270724226u, 16736026809386770140u, 879844693954133566u, 5771540452186644064u, ++ 12395195879624426238u, 17305613297699152544u, 1467744921215435330u, 5220531075568771612u, 5650300446275329283u, 1316336633116425565u, 17740532779662220735u, 12258375912742239713u, ++ 18016332033719362433u, 11973850846087693279u, 4781749989466252093u, 2193612730179060579u, 1759689387908267132u, 4919860766213921826u, 11543080904373288128u, 18166453874549300382u, ++ 14614610554166352761u, 10879836598703668007u, 8253805222095936453u, 3361408799105547163u, 2935489842430870660u, 8399638907315561690u, 10441062151137543224u, 14757009366268798054u, ++ 11300600892550658566u, 13906759146888600152u, 2632673266232851130u, 8693166652788693732u, 9132946036408395259u, 2491556468171146661u, 14331668736193815879u, 11153489555886392601u, ++ 7409848711186274695u, 4249257595424012761u, 16037314857127418171u, 9413239572791867749u, 9563499978932504186u, 15606406401646028324u, 4387225460358121158u, 6976068332272625304u, ++ 3519378775816534264u, 7852640824571713702u, 9839721532427843652u, 15321459211647031322u, 15184496315767285509u, 10274783960564057947u, 7701371084599273401u, 3949009615571978215u, ++ 539203352115488887u, 6581683165424715817u, 13772373076031531211u, 16360516657443457173u, 16507610444191872906u, 13347445937900984276u, 6722817598211094326u, 99441604310980456u, ++ 5870979684861741320u, 960568039155968342u, 16799277814631123380u, 13046489736199563754u, 12904108438562707189u, 17238069777753355947u, 814716683761407561u, 6296880972452001303u, ++ 12357655745765665417u, 17821378201246059223u, 1379747099228580405u, 5694995023857257067u, 5265346532465702260u, 1530999186474390826u, 17386333305577387464u, 12494636173022434710u, ++ 18265892072816790518u, 11623803214076996520u, 4983112936342293322u, 1804507146630605588u, 2238305212630619147u, 4845162757404030037u, 12054694172541097143u, 18115614168568345833u, ++ 14819697422372549390u, 10486441695742104400u, 8498515190848025522u, 3016776137306395628u, 3442815973027425523u, 8352525304506551469u, 10925090729870978127u, 14677459070913039377u, ++ 11216336045685248625u, 14376925237369287215u, 2590274523633996493u, 9214355580338500243u, 8774450920716242316u, 2731551919773330898u, 13952136664545250608u, 11363291318662491502u, ++ 7038757551633068528u, 4432606169309893038u, 15705281649143427404u, 9644785238863483154u, 9494645848386137613u, 16136034042300943955u, 4294513027018469041u, 7472698529450626799u, ++ 4011857131457007759u, 7746628612951437521u, 10373500843358195763u, 15265904688119197805u, 15402742169198546802u, 9938598876682809132u, 7898019231143956430u, 3582070091934478224u, ++ 1078406704230977774u, 5970139571501035696u, 13163366330849431634u, 16897748309796073484u, 17049000381336047379u, 12733717820530814797u, 6107119981172920239u, 643361792051163121u, ++ 6410046491609887121u, 349161128571523535u, 16190407203032477997u, 13583585392940618099u, 13445635196422188652u, 16624205252526067250u, 198883208621960912u, 6840937431151644302u, ++ 11741959369723482640u, 18365299631022420558u, 1921136078311936684u, 5081265949533565682u, 4656338829252136429u, 2068229881835728307u, 17925537898651110737u, 11883093821164285199u, ++ 17650059563187254127u, 12167860639460954929u, 5524638460789093331u, 1190641388963713933u, 1629433367522815122u, 5382257181810330828u, 12593761944904002606u, 17504208224571739248u, ++ 14134199920450915223u, 10956049054195313609u, 8970094247992396587u, 2328741787718953845u, 2759494198457160810u, 8819954874021999668u, 11389990047714514134u, 13996106797082358920u, ++ 10530693064931404520u, 14846677937748691638u, 3061998372948781652u, 8526176301674629642u, 8091274350704555285u, 3198835872954668363u, 14416890915810522537u, 10682083699634542071u, ++ 7503655637611612521u, 3751252662574033207u, 15021960841764981205u, 10112215774463453579u, 9966225872684586644u, 15448000658827392714u, 3609014293261211176u, 7942304654960916086u, ++ 4476610425261238294u, 7065420035288041544u, 9690325514808060074u, 15733189881789008116u, 15874467260079749099u, 9250420838410950581u, 7212375292832610135u, 4051821833783301897u, ++ 688179623118076057u, 6170372224719608007u, 12814440204992854053u, 17148438651140642939u, 16997030381696051044u, 13244209591132604218u, 6033552274612791256u, 1123099122930255750u, ++ 6885631946054851046u, 262293608834169272u, 16705050609013102938u, 13544914965422553348u, 13683025758949262875u, 16271127284595091013u, 412415468322195111u, 6454862019777308409u, ++ 11927910341603441255u, 17988788832627006009u, 2148953154424896219u, 4755777988240824965u, 5180549047267992986u, 2001980365486523844u, 18428711160677000486u, 11786650616022549880u, ++ 17548901841432484632u, 12657171448130714438u, 5463103839546661796u, 1728714438829439994u, 1290082918514197733u, 5605359706950509755u, 12231113943998710873u, 17694874057198724103u, ++ 14077515103266137056u, 11488706867561743294u, 8865212338619786076u, 2822341649514070786u, 2391433177253116957u, 9015472726907116611u, 11054926469989481633u, 14215482952762858751u, ++ 10763369033251996319u, 14515766235920655041u, 3244216653174833699u, 8153963644554617469u, 8589026054036938082u, 3107253741862419772u, 14945397058901253598u, 10612099275430968704u, ++ 8023714262914015518u, 3707732413820797248u, 15493257225902875042u, 10029072425162228220u, 10174906129304731363u, 15067338284929851069u, 3850131242430201439u, 7584939832928591361u, ++ 4133108057121652833u, 7311251501606674495u, 9295800309597257949u, 15937155243838988419u, 15796038462287912860u, 9735579710801330114u, 7164140183868956448u, 4558017662132191102u, ++ }, { ++ 0u, 7026975924517234630u, 14053951849034469260u, 11713158812725061706u, 1498566550037692829u, 8453026741656872539u, 15547077823203331601u, 13134332388348864983u, ++ 2997133100075385658u, 5193532126013515004u, 16906053483313745078u, 10023477084983765872u, 4421425403924087463u, 6690338751863514465u, 18326734871926164779u, 11516110084014746349u, ++ 5994266200150771316u, 3651077923391955378u, 10387064252027030008u, 17411644826573123134u, 5180286430728521705u, 2765428220391841839u, 9578516152858789989u, 16530863678517358499u, ++ 8842850807848174926u, 1962664170658947720u, 13380677503727028930u, 15579466327313067268u, 7958959654645957843u, 1150444288916906773u, 12500388506175163231u, 14771411239789669529u, ++ 11988532400301542632u, 14401112944851970862u, 7302155846783910756u, 347530691846251682u, 12867955000885349749u, 15208934917731379891u, 8186843028093092601u, 1160054057126929727u, ++ 10360572861457043410u, 17171366937719040020u, 5530856440783683678u, 3262112454209283992u, 11170013709381963343u, 18052407625221859721u, 6344013830343901635u, 4147432248901248517u, ++ 17685701615696349852u, 10733466276663946586u, 3925328341317895440u, 6340298665266291414u, 16265807495604570881u, 9241127928571882695u, 2500178400086410381u, 4843267757373072203u, ++ 15917919309291915686u, 13646779991004769888u, 2300888577833813546u, 9109287431904666092u, 14423962049646856251u, 12225267820500938749u, 803223682168014775u, 7683504840782913649u, ++ 16025789128531904341u, 13827140552201887891u, 2120809441137969369u, 9001136188144267039u, 14604311693567821512u, 12333148557000565006u, 695061383692503364u, 7503436758785666690u, ++ 17866059964468495471u, 10841338299774886825u, 3817174930229677027u, 6160221704524114981u, 16373686056186185202u, 9421479739856314932u, 2320108114253859454u, 4735107671358188984u, ++ 10180636633891078433u, 17063072784830850791u, 5638869205660782253u, 3442330069771397483u, 11061712881567367356u, 17872478072565786490u, 6524224908418567984u, 4255451551249279222u, ++ 11880240423364919835u, 14221174549956093405u, 7482375666214882711u, 455541244296276561u, 12688027660687803270u, 15100631886079386688u, 8294864497802497034u, 1340262959281482700u, ++ 8662912472460168125u, 1854372134182743163u, 13488687978245964849u, 15759686224643400695u, 7850656682635790880u, 970516889046347238u, 12680597330532582828u, 14879432787265004138u, ++ 5885971969496909959u, 3471141773623390017u, 10567281927262422795u, 17519657531808653517u, 5000356800172820762u, 2657127470508076764u, 9686535514746144406u, 16711074697083887952u, ++ 3105005063510429129u, 5373890534425651727u, 16725976600334615109u, 9915323596096578947u, 4601777155667627092u, 6798217371950640018u, 18218574863809332184u, 11336039720248747038u, ++ 180360639130832627u, 7134845665859430709u, 13945800545768817023u, 11533079735570376377u, 1606447364336029550u, 8633376307814525096u, 15367009681565827298u, 13026170149548992292u, ++ 3321048140255203375u, 5733767250183223273u, 17086394267351834531u, 10131907641284540517u, 4241618882275938738u, 6582455852881933940u, 18002272376288534078u, 10975340495589554680u, ++ 540800415553098517u, 7351451582082282707u, 14161821513074465945u, 11892934580260027231u, 1390122767385006728u, 8272655212095272270u, 15006873517571333380u, 12810430501506267842u, ++ 9023334491325470299u, 2070960623556915613u, 13704726720259086807u, 16119558478964112913u, 7634349860459354054u, 609813203025260544u, 12320443409048229962u, 14663675712440713100u, ++ 6101997361665611105u, 3831000989484282535u, 10927717295939115757u, 17736259059608567083u, 4640216228507718908u, 2441383434118427450u, 9470215342716377968u, 16350357972595129526u, ++ 9820495924665654471u, 16847328885758262017u, 5422549171225416523u, 3081613207998608525u, 11277738411321564506u, 18232337151134792348u, 6884660139542794966u, 4472053216375158032u, ++ 11663933463862517757u, 13860471001487472699u, 7122221882022416497u, 239784031886489527u, 13048449816837135968u, 15317220237859158438u, 8510903102498558444u, 1700135351162517034u, ++ 15809464669166377651u, 13466419319190748533u, 1760673139591009599u, 8785396677427507961u, 14964751332429765422u, 12549754610540477672u, 911082488592553122u, 7863291466191287140u, ++ 17505901828360837513u, 10625576643111779919u, 3600872305391818245u, 5799522617425244611u, 16589728995604994068u, 9781356593166352338u, 2680525918562965400u, 4951691578960654430u, ++ 17325824944920336250u, 10517423154702741692u, 3708744268365486326u, 5979881026315534128u, 16481568986909349607u, 9601286230029496609u, 2860877669727689067u, 5059570199676927661u, ++ 15701313365271581760u, 13286340242614875014u, 1941033778092694476u, 8893266419348519946u, 14784683190314112477u, 12441592372201976347u, 1018963302412737105u, 8043641032810315159u, ++ 11771943938993819918u, 14040690898222216904u, 6942283547246780034u, 131491994814691652u, 13228658641689481363u, 15425241784889898837u, 8402600130983321375u, 1520207950847359193u, ++ 10000713600345641524u, 16955341590498866674u, 5314254941016153528u, 2901677057735113342u, 11385757773804508073u, 18412548169088955503u, 6704730509582687269u, 4363752465879022563u, ++ 6210010127020858258u, 4011218604585024596u, 10747781068851303454u, 17627964906259002328u, 4820427307211528719u, 2549402735887646153u, 9361914515530929539u, 16170428419360240197u, ++ 9203554311335254184u, 2178971175377796974u, 13596434743901280036u, 15939620083439087842u, 7742371330630129973u, 790022104701665011u, 12140516069312059065u, 14555372680310567295u, ++ 360721278261665254u, 7243300338934250016u, 14269691331718861418u, 12073295142069515692u, 1281960468464901243u, 8092587130592951229u, 15187223161047700471u, 12918311238500824113u, ++ 3212894728672059100u, 5553690289885640986u, 17266752615629050192u, 10239779664840078998u, 4061548595831021377u, 6474295767462639751u, 18110150936257777869u, 11155692307469580043u, ++ }, { ++ 0u, 2517245393515406572u, 5034490787030813144u, 7435750759411199284u, 10068981574061626288u, 12201157653998401372u, 14871501518822398568u, 17045318164640841348u, ++ 9628913577918544357u, 12056075433989135625u, 13870769438669140029u, 16326061061730899153u, 1016952077871524437u, 3239211695253081785u, 5459183210385793933u, 7578968205522831201u, ++ 11067918171351838031u, 13508029996328618403u, 15872723984458359959u, 18349972777811820667u, 1307470557354262271u, 3515654148887976467u, 6339673239971903271u, 8436375012170683339u, ++ 2033904155743048874u, 4528066323082129478u, 6478423390506163570u, 8865607338129291678u, 10918366420771587866u, 13072499669943034870u, 15157936411045662402u, 17344703028974807598u, ++ 11667391723826758683u, 9441211325989495031u, 16444045520167767491u, 14329311757255665967u, 3050858413050517419u, 628778578755597127u, 8036894684654706291u, 5577642697640442527u, ++ 2614941114708524542u, 478839856218937618u, 7031308297775952934u, 4862538486186004682u, 12679346479943806542u, 10167187506301176482u, 16872750024341366678u, 14467534086004917114u, ++ 4067808311486097748u, 1917635425212288440u, 9056132646164258956u, 6864284009665987680u, 12956846781012327140u, 10457633378212404744u, 17731214676258583356u, 15347951510183778256u, ++ 13678285260964991153u, 11474057634298917981u, 17873974704293108073u, 15772186515461651845u, 3922409453435093761u, 1477250791027468269u, 8336488571297909465u, 5863164957556321845u, ++ 15063804914172139187u, 17573731408537121375u, 10724047561790938987u, 13131499433903012743u, 6535100908406441219u, 8673469987586793967u, 2265113888856263899u, 4431612735036172343u, ++ 6101716826101034838u, 8521560882533092282u, 1257557157511194254u, 3719041779816530530u, 16073789369309412582u, 18302240886422657034u, 11155285395280885054u, 13267751491267498450u, ++ 5229882229417049084u, 7672809353916620560u, 957679712437875236u, 3433240205686757064u, 14062616595551905868u, 16269110787469675680u, 9725076972372009364u, 11824592944582215032u, ++ 14786588404820918809u, 17283564772171425525u, 9865866699426761665u, 12251361247433944877u, 5082513026899726761u, 7234957975966594373u, 240568853608110193u, 2430150771060047005u, ++ 8135616622972195496u, 5911125624750880324u, 3835270850424576880u, 1717722887501053852u, 18112265292328517912u, 15687370158510810612u, 13728568019331975360u, 11271004332422294572u, ++ 17674167644946721613u, 15539754686561718177u, 12725302718847165077u, 10553717607734429305u, 9150035367232403709u, 6635062193578351633u, 4261933579054297381u, 1858407040333796809u, ++ 16825062113507622887u, 14668696227990231819u, 12439147139764057663u, 10254616302904316627u, 7116415003206659159u, 4624520499557157051u, 2818284765131990415u, 428829699325493603u, ++ 7844818906870187522u, 5634399380472423150u, 2954501582054936538u, 860032292373900086u, 16672977142595818930u, 14235136279826723166u, 11726329915112643690u, 9246813302127474822u, ++ 3513487962258617315u, 1309817375275636495u, 8438743075148003899u, 6337546835477044951u, 13510341259434958931u, 11065716548023207103u, 18347741267953084811u, 15874986514718330215u, ++ 13070201816812882438u, 10920562880461237994u, 17346939975173587934u, 15155660198108440370u, 4530227777712527798u, 2031571415669472602u, 8863225470072344686u, 6480554254231811202u, ++ 12203433652202069676u, 10066744842596399680u, 17043121765066184564u, 14873799311837557656u, 2515114315022388508u, 2382082824317424u, 7438083559633061060u, 5032329272252129320u, ++ 3241337884980569929u, 1014584229661574053u, 7576621447749742225u, 5461349336866867837u, 12053812688995611897u, 9631145302510833685u, 16328262745174523169u, 13868458115447806413u, ++ 10459764458834098168u, 12954464700354433812u, 15345618707833241120u, 17733376188870843084u, 1915359424875750472u, 4070045040789094564u, 6866480411373514128u, 9053834855311329660u, ++ 1479513538183220765u, 3920177730975673073u, 5860963271950469061u, 8338799892386374441u, 11471931442405006765u, 13680653107046267201u, 15774533275401163893u, 17871808579940708505u, ++ 626467317811485367u, 3053060038512016987u, 5579874205336949615u, 8034632152261867395u, 9443377510452431111u, 11665044903776710123u, 14326943696444768479u, 16446171926791300147u, ++ 10165026053799453522u, 12681679222183806910u, 14469915951933188746u, 16870619158449294950u, 481137707216220386u, 2612744652856644622u, 4860301542120094010u, 7033584512875404758u, ++ 16271233245944390992u, 14060243759811248572u, 11822251249501760648u, 9727246909562751076u, 7670541700849153760u, 5232109988680716812u, 3435445775002107704u, 955373222128557012u, ++ 7237229143405862069u, 5080272407415421017u, 2427958334666397037u, 242871556844564865u, 17281429885116092165u, 14788965422804986857u, 12253699033039161053u, 9863708918048465457u, ++ 8671167069616523295u, 6537293559533907187u, 4433853414635209159u, 2262842661302265131u, 17575888975148309423u, 15061467343334031171u, 13129122476067492471u, 10726182388697724571u, ++ 18300070734464807418u, 16076131279156974870u, 13270124387156703266u, 11153162876657622222u, 8523867158108594762u, 6099511471519499942u, 3716814080667593618u, 1259824750463930238u, ++ 4622362935074513227u, 7118752576211060135u, 431206655032469651u, 2816149936058911871u, 14670999143827763963u, 16822869460218058263u, 10252375625438018339u, 12441418369480155087u, ++ 14232830006413318318u, 16675182499310091330u, 9249040999114314102u, 11724062320027170202u, 5636569530263980830u, 7842476994894082034u, 857659398650987206u, 2956624102806742570u, ++ 15689637813740375044u, 18110037535197587688u, 11268798760944846300u, 13730874507508556080u, 5909003164109873076u, 8137989456584309592u, 1720064584747800172u, 3833100915362378368u, ++ 6637197082762229217u, 9147658351414628621u, 1856069252600036409u, 4264091358266300629u, 15537483516989711953u, 17676408262268928701u, 10555910046260817801u, 12723000017772809061u, ++ }, { ++ 0u, 15762200328042667840u, 2856835172924432389u, 18238190752146915141u, 5713670345848864778u, 10805715811487326026u, 7561135427655163919u, 12848797446532677455u, ++ 11427340691697729556u, 4911321075843194708u, 13345174655120580625u, 7173389830452510545u, 15122270855310327838u, 820654137405644638u, 17760118084036943899u, 3226275954771115867u, ++ 12678913378224905901u, 8451595299172663789u, 9822642151686389416u, 5976168202979041768u, 16194808345499688615u, 4179641502022828519u, 14346779660905021090u, 2135996745225445858u, ++ 3558579666237890233u, 16995468946051088889u, 1641308274811289276u, 14733962144962732540u, 9090961916423626419u, 11859948271085519347u, 6452551909542231734u, 9453764156601606646u, ++ 14785799433083167711u, 1697614691135618207u, 16903190598345327578u, 3470771065211313306u, 9402037001392841685u, 6396285171454065813u, 11952336405958083536u, 9178809987380452496u, ++ 6027971268800324555u, 9878982515431963787u, 8359283004045657038u, 12591138999497481358u, 2084233168694272961u, 14290549069261356161u, 4271993490450891716u, 16282692837778922628u, ++ 7117159332475780466u, 13293411258189767218u, 4999205320339463543u, 11519692655715205687u, 3282616549622578552u, 17811921192019632696u, 732879648334208381u, 15029958398333780541u, ++ 18181923832847252838u, 2805107922438644262u, 15850048426093911395u, 92388385340408355u, 12905103819084463468u, 7612972483059622444u, 10717907374994120041u, 5621392111171994153u, ++ 629311348378851643u, 15133597752622646907u, 3395229382271236414u, 17699378041462564478u, 5183867188229904689u, 11335100742646646385u, 6941542130422626612u, 13469099241846138484u, ++ 10821536956051937583u, 5517832210058282607u, 12792570342908131626u, 7725577015716947562u, 15665448522205731109u, 277059068684322405u, 18357619974760904992u, 2629481737494357600u, ++ 12055942537600649110u, 9075274912216783062u, 9289461107078326163u, 6508930745710590163u, 16718566008091314076u, 3655465612432595164u, 14961454118931310489u, 1522030784741112025u, ++ 4168466337388545922u, 16386289672930760898u, 2196870928291817351u, 14177982363995224263u, 8543986980901783432u, 12406505804242475208u, 5852377756745475981u, 10054645982306597069u, ++ 14234318664951560932u, 2248669261341992356u, 16298510681658284769u, 4076149859246245281u, 9998410640678927086u, 5800610134637962670u, 12494386096293518059u, 8636334373997692331u, ++ 6565233099245157104u, 9341293662428177840u, 8987461698644630261u, 11963660006880118197u, 1465759296668416762u, 14909722918146729402u, 3743309483160705791u, 16810949547632248255u, ++ 7673845564465570889u, 12736298827739970313u, 5610215844877288524u, 10909381007990496012u, 2681314179816367171u, 18413922163761052419u, 184776770680816710u, 15577635352405072646u, ++ 17647610443766686813u, 3338994288425483037u, 15225944966119244888u, 717191546761911064u, 13520897736746902615u, 6997878541721926423u, 11242784222343988306u, 5096087965850491666u, ++ 1258622696757703286u, 14684288965200833846u, 3950222953022231155u, 17036158029906267443u, 6790458764542472828u, 9548224856613104956u, 8762045755503235705u, 11756540858562383161u, ++ 10367734376459809378u, 6151638724996853026u, 12124837022850257511u, 8285082520580115751u, 13883084260845253224u, 1879138195689975080u, 16649556998353834605u, 4445490780332133677u, ++ 13727827248377474267u, 7223104792207356827u, 11035664420116565214u, 4870673773980832670u, 17422178244240010449u, 3131857036752565137u, 15451154031433895124u, 924103331921597332u, ++ 2311784730144877775u, 18062687245331231631u, 554118137368644810u, 15928680121837474698u, 8024872609708797125u, 13105623011270275973u, 5258963474988715200u, 10539833548380279680u, ++ 15872427342139003305u, 502333042764009193u, 18150549824433566124u, 2404114375865757420u, 10596187595637903779u, 5310779519913856739u, 13017861491421180326u, 7932573568563556070u, ++ 4814384572959953341u, 10983915471956430589u, 7310931224865190328u, 13820193315420761848u, 980423156880069047u, 15503004023780282103u, 3044061569482224050u, 17329913425393921778u, ++ 8336932674777091844u, 12181156958151692356u, 6059373863990406913u, 10279938678082531393u, 4393741856583634702u, 16593268045114871886u, 1971504083133951755u, 13970910599835103307u, ++ 17087973961803566864u, 4006576835745435728u, 14591990156772618005u, 1170861220680101973u, 11704755513490951962u, 8705792948709298266u, 9640554597612056351u, 6878321524855255135u, ++ 1858937689852799821u, 14083548048513152013u, 4497338522683984712u, 16489741062169236488u, 6235036951360285511u, 10104345546597921799u, 8152299718492490562u, 12365860697102636034u, ++ 9753200483853429593u, 6765745319621112857u, 11601220269275925340u, 8809399250468705308u, 14416405870873226067u, 1346516287098352659u, 17272668747995384662u, 3821952007586370582u, ++ 13130466198490314208u, 7820039919040899744u, 10492627387899532773u, 5414409408661555877u, 17974923397289260522u, 2579810761044912810u, 16057098401758057967u, 317732763665910447u, ++ 2931518593336833524u, 17442526084696124084u, 1084062204544407025u, 15399436031514938033u, 7486618966321411582u, 13644576356632980158u, 4629793036166665723u, 11168576964637084347u, ++ 15347691128931141778u, 1027777753507534802u, 17534896747071563927u, 3019349226222860247u, 11220431689754577048u, 4686116923914377176u, 13552315720802183325u, 7398828111596124125u, ++ 5362628359632734342u, 10436379358185592774u, 7912374160093407363u, 13218332977821366211u, 369553541361633420u, 16113456511805446092u, 2487515902914439305u, 17887166489985742793u, ++ 8865757316743550527u, 11653040814255671679u, 6677988576850966074u, 9660905738751846778u, 3765703796660934197u, 17220887603689539957u, 1434383093523822128u, 14508740362393577840u, ++ 16546065181022836267u, 4549193289962883435u, 13995757083443852846u, 1766676892172462446u, 12309576339732698657u, 8100554995509053793u, 10192175931700983332u, 6327407589325138276u, ++ }, ++}; + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} ++static const uint8_t ++WUFFS_CRC64__ECMA_X86_SSE42_FOLD1[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 228u, 58u, 57u, 202u, 151u, 212u, 93u, 224u, ++ 64u, 95u, 135u, 199u, 175u, 149u, 190u, 218u, ++}; + +-// -------- func gif.decoder.do_tell_me_more ++static const uint8_t ++WUFFS_CRC64__ECMA_X86_SSE42_FOLD2[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 68u, 250u, 158u, 138u, 0u, 91u, 9u, 96u, ++ 81u, 175u, 225u, 15u, 163u, 83u, 230u, 59u, ++}; ++ ++static const uint8_t ++WUFFS_CRC64__ECMA_X86_SSE42_FOLD4[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 243u, 65u, 212u, 157u, 187u, 239u, 227u, 106u, ++ 244u, 45u, 132u, 167u, 84u, 96u, 31u, 8u, ++}; ++ ++static const uint8_t ++WUFFS_CRC64__ECMA_X86_SSE42_FOLD8[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 16u, 204u, 79u, 29u, 215u, 87u, 135u, ++ 64u, 231u, 61u, 247u, 42u, 107u, 216u, 215u, ++}; ++ ++static const uint8_t ++WUFFS_CRC64__ECMA_X86_SSE42_MUPX[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 213u, 99u, 41u, 23u, 108u, 70u, 62u, 156u, ++ 133u, 30u, 14u, 175u, 43u, 175u, 216u, 146u, ++}; ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_tell_me_more( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); + +- uint64_t v_chunk_length = 0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up__choosy_default( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up_x86_sse42( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + +- uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// ---------------- VTables + +- if ((self->private_impl.f_call_sequence & 16u) == 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } +- if (self->private_impl.f_metadata_fourcc == 0u) { +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; +- } +- while (true) { +- while (true) { +- if (wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_io_position) { +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- 2u, +- 0u, +- self->private_impl.f_metadata_io_position, +- 0u, +- 0u); +- } +- status = wuffs_base__make_status(wuffs_base__suspension__mispositioned_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- 0u, +- 0u, +- 0u, +- 0u, +- 0u); +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- continue; +- } +- break; +- } +- v_chunk_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); +- if (v_chunk_length <= 0u) { +- iop_a_src += 1u; +- break; +- } +- if (self->private_impl.f_metadata_fourcc == 1481461792u) { +- v_chunk_length += 1u; +- } else { +- iop_a_src += 1u; +- } +- self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add(wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))), v_chunk_length); +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- 3u, +- self->private_impl.f_metadata_fourcc, +- 0u, +- wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))), +- self->private_impl.f_metadata_io_position); +- } +- status = wuffs_base__make_status(wuffs_base__suspension__even_more_information); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++const wuffs_base__hasher_u64__func_ptrs ++wuffs_crc64__ecma_hasher__func_ptrs_for__wuffs_base__hasher_u64 = { ++ (uint64_t(*)(const void*))(&wuffs_crc64__ecma_hasher__checksum_u64), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_crc64__ecma_hasher__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_crc64__ecma_hasher__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_crc64__ecma_hasher__update), ++ (uint64_t(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_crc64__ecma_hasher__update_u64), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_crc64__ecma_hasher__initialize( ++ wuffs_crc64__ecma_hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- 3u, +- self->private_impl.f_metadata_fourcc, +- 0u, +- self->private_impl.f_metadata_io_position, +- self->private_impl.f_metadata_io_position); ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } +- self->private_impl.f_call_sequence &= 239u; +- self->private_impl.f_metadata_fourcc = 0u; +- self->private_impl.f_metadata_io_position = 0u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- +- ok: +- self->private_impl.p_do_tell_me_more[0] = 0; +- goto exit; + } + +- goto suspend; +- suspend: +- self->private_impl.p_do_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.choosy_up = &wuffs_crc64__ecma_hasher__up__choosy_default; + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__hasher_u64.vtable_name = ++ wuffs_base__hasher_u64__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_u64.function_pointers = ++ (const void*)(&wuffs_crc64__ecma_hasher__func_ptrs_for__wuffs_base__hasher_u64); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_crc64__ecma_hasher* ++wuffs_crc64__ecma_hasher__alloc(void) { ++ wuffs_crc64__ecma_hasher* x = ++ (wuffs_crc64__ecma_hasher*)(calloc(1, sizeof(wuffs_crc64__ecma_hasher))); ++ if (!x) { ++ return NULL; + } ++ if (wuffs_crc64__ecma_hasher__initialize( ++ x, sizeof(wuffs_crc64__ecma_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} + +- return status; ++size_t ++sizeof__wuffs_crc64__ecma_hasher(void) { ++ return sizeof(wuffs_crc64__ecma_hasher); + } + +-// -------- func gif.decoder.num_animation_loops ++// ---------------- Function Implementations ++ ++// -------- func crc64.ecma_hasher.get_quirk + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_gif__decoder__num_animation_loops( +- const wuffs_gif__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_crc64__ecma_hasher__get_quirk( ++ const wuffs_crc64__ecma_hasher* self, ++ uint32_t a_key) { + if (!self) { + return 0; + } +@@ -37136,38 +37965,134 @@ wuffs_gif__decoder__num_animation_loops( + return 0; + } + +- if (self->private_impl.f_seen_num_animation_loops_value) { +- return self->private_impl.f_num_animation_loops_value; +- } +- if (self->private_impl.f_num_decoded_frame_configs_value > 1u) { +- return 1u; +- } + return 0u; + } + +-// -------- func gif.decoder.num_decoded_frame_configs ++// -------- func crc64.ecma_hasher.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_crc64__ecma_hasher__set_quirk( ++ wuffs_crc64__ecma_hasher* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func crc64.ecma_hasher.update ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__update( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } ++ ++ if (self->private_impl.f_state == 0u) { ++ self->private_impl.choosy_up = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc64__ecma_hasher__up_x86_sse42 : ++#endif ++ self->private_impl.choosy_up); ++ } ++ wuffs_crc64__ecma_hasher__up(self, a_x); ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func crc64.ecma_hasher.update_u64 + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gif__decoder__num_decoded_frame_configs( +- const wuffs_gif__decoder* self) { ++wuffs_crc64__ecma_hasher__update_u64( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { + return 0; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { + return 0; + } + +- return self->private_impl.f_num_decoded_frame_configs_value; ++ wuffs_crc64__ecma_hasher__update(self, a_x); ++ return wuffs_crc64__ecma_hasher__checksum_u64(self); + } + +-// -------- func gif.decoder.num_decoded_frames ++// -------- func crc64.ecma_hasher.up ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ return (*self->private_impl.choosy_up)(self, a_x); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up__choosy_default( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint64_t v_s = 0; ++ wuffs_base__slice_u8 v_p = {0}; ++ ++ v_s = (18446744073709551615u ^ self->private_impl.f_state); ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 8; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8)); ++ while (v_p.ptr < i_end0_p) { ++ v_s ^= ((((uint64_t)(v_p.ptr[0u])) << 0u) | ++ (((uint64_t)(v_p.ptr[1u])) << 8u) | ++ (((uint64_t)(v_p.ptr[2u])) << 16u) | ++ (((uint64_t)(v_p.ptr[3u])) << 24u) | ++ (((uint64_t)(v_p.ptr[4u])) << 32u) | ++ (((uint64_t)(v_p.ptr[5u])) << 40u) | ++ (((uint64_t)(v_p.ptr[6u])) << 48u) | ++ (((uint64_t)(v_p.ptr[7u])) << 56u)); ++ v_s = (WUFFS_CRC64__ECMA_TABLE[0u][(255u & (v_s >> 56u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[1u][(255u & (v_s >> 48u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[2u][(255u & (v_s >> 40u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[3u][(255u & (v_s >> 32u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[4u][(255u & (v_s >> 24u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[5u][(255u & (v_s >> 16u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[6u][(255u & (v_s >> 8u))] ^ ++ WUFFS_CRC64__ECMA_TABLE[7u][(255u & (v_s >> 0u))]); ++ v_p.ptr += 8; ++ } ++ v_p.len = 1; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end1_p) { ++ v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u)); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; ++ } ++ self->private_impl.f_state = (18446744073709551615u ^ v_s); ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func crc64.ecma_hasher.checksum_u64 + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gif__decoder__num_decoded_frames( +- const wuffs_gif__decoder* self) { ++wuffs_crc64__ecma_hasher__checksum_u64( ++ const wuffs_crc64__ecma_hasher* self) { + if (!self) { + return 0; + } +@@ -37176,72 +38101,473 @@ wuffs_gif__decoder__num_decoded_frames( + return 0; + } + +- return self->private_impl.f_num_decoded_frames_value; ++ return self->private_impl.f_state; + } + +-// -------- func gif.decoder.frame_dirty_rect ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func crc64.ecma_hasher.up_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_gif__decoder__frame_dirty_rect( +- const wuffs_gif__decoder* self) { ++static wuffs_base__empty_struct ++wuffs_crc64__ecma_hasher__up_x86_sse42( ++ wuffs_crc64__ecma_hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint64_t v_s = 0; ++ wuffs_base__slice_u8 v_p = {0}; ++ uint8_t v_buf[48] = {0}; ++ __m128i v_xa = {0}; ++ __m128i v_xb = {0}; ++ __m128i v_xc = {0}; ++ __m128i v_xd = {0}; ++ __m128i v_xe = {0}; ++ __m128i v_xf = {0}; ++ __m128i v_xg = {0}; ++ __m128i v_xh = {0}; ++ __m128i v_mu1 = {0}; ++ __m128i v_mu2 = {0}; ++ __m128i v_mu4 = {0}; ++ __m128i v_mu8 = {0}; ++ __m128i v_mupx = {0}; ++ ++ v_s = (18446744073709551615u ^ self->private_impl.f_state); ++ while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) { ++ v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); ++ } ++ do { ++ do { ++ if (((uint64_t)(a_x.len)) >= 128u) { ++ } else if (((uint64_t)(a_x.len)) >= 64u) { ++ v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s))); ++ v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); ++ v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)); ++ v_xd = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 64u); ++ break; ++ } else if (((uint64_t)(a_x.len)) >= 32u) { ++ v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s))); ++ v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 32u); ++ goto label__chain2__break; ++ } else { ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 1; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end0_p) { ++ v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u)); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; ++ } ++ self->private_impl.f_state = (18446744073709551615u ^ v_s); ++ return wuffs_base__make_empty_struct(); ++ } ++ v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s))); ++ v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)); ++ v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)); ++ v_xd = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)); ++ v_xe = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u)); ++ v_xf = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u)); ++ v_xg = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u)); ++ v_xh = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u)); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u); ++ v_mu8 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD8)); ++ while (((uint64_t)(a_x.len)) >= 128u) { ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u))); ++ v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u))); ++ v_xc = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xc, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xc, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u))); ++ v_xd = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xd, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xd, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u))); ++ v_xe = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xe, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xe, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u))); ++ v_xf = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xf, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xf, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u))); ++ v_xg = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xg, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xg, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u))); ++ v_xh = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xh, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xh, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u); ++ } ++ v_mu4 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD4)); ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu4, (int32_t)(17u))), v_xe); ++ v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu4, (int32_t)(17u))), v_xf); ++ v_xc = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xc, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xc, v_mu4, (int32_t)(17u))), v_xg); ++ v_xd = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xd, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xd, v_mu4, (int32_t)(17u))), v_xh); ++ if (((uint64_t)(a_x.len)) > 64u) { ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu4, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u))); ++ v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu4, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u))); ++ v_xc = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xc, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xc, v_mu4, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u))); ++ v_xd = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xd, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xd, v_mu4, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 64u); ++ } ++ } while (0); ++ v_mu2 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD2)); ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(17u))), v_xc); ++ v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu2, (int32_t)(17u))), v_xd); ++ if (((uint64_t)(a_x.len)) > 32u) { ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u))); ++ v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu2, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 32u); ++ } ++ } while (0); ++ label__chain2__break:; ++ v_mu1 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD1)); ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu1, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu1, (int32_t)(17u))), v_xb); ++ if (((uint64_t)(a_x.len)) > 24u) { ++ v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu1, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu1, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u))); ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 16u); ++ if (((uint64_t)(a_x.len)) > 24u) { ++ return wuffs_base__make_empty_struct(); ++ } ++ } ++ _mm_storeu_si128((__m128i*)(void*)(v_buf + (24u - ((uint64_t)(a_x.len)))), v_xa); ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(v_buf, ((24u - ((uint64_t)(a_x.len))) + 16u), 48), a_x); ++ v_mu2 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD2)); ++ v_xa = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 0u)); ++ v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 16u)); ++ v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 32u)); ++ v_xd = _mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(17u))); ++ v_xe = _mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu1, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu1, (int32_t)(17u))); ++ v_xa = _mm_xor_si128(v_xd, _mm_xor_si128(v_xe, v_xc)); ++ v_mupx = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_MUPX)); ++ v_xb = _mm_clmulepi64_si128(v_xa, v_mupx, (int32_t)(0u)); ++ v_xc = _mm_clmulepi64_si128(v_xb, v_mupx, (int32_t)(16u)); ++ v_s = ((uint64_t)(_mm_extract_epi64(_mm_xor_si128(_mm_xor_si128(v_xc, _mm_slli_si128(v_xb, (int32_t)(8u))), v_xa), (int32_t)(1u)))); ++ self->private_impl.f_state = (18446744073709551615u ^ v_s); ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_deflate__error__bad_huffman_code_over_subscribed[] = "#deflate: bad Huffman code (over-subscribed)"; ++const char wuffs_deflate__error__bad_huffman_code_under_subscribed[] = "#deflate: bad Huffman code (under-subscribed)"; ++const char wuffs_deflate__error__bad_huffman_code_length_count[] = "#deflate: bad Huffman code length count"; ++const char wuffs_deflate__error__bad_huffman_code_length_repetition[] = "#deflate: bad Huffman code length repetition"; ++const char wuffs_deflate__error__bad_huffman_code[] = "#deflate: bad Huffman code"; ++const char wuffs_deflate__error__bad_huffman_minimum_code_length[] = "#deflate: bad Huffman minimum code length"; ++const char wuffs_deflate__error__bad_block[] = "#deflate: bad block"; ++const char wuffs_deflate__error__bad_distance[] = "#deflate: bad distance"; ++const char wuffs_deflate__error__bad_distance_code_count[] = "#deflate: bad distance code count"; ++const char wuffs_deflate__error__bad_literal_length_code_count[] = "#deflate: bad literal/length code count"; ++const char wuffs_deflate__error__inconsistent_stored_block_length[] = "#deflate: inconsistent stored block length"; ++const char wuffs_deflate__error__missing_end_of_block_code[] = "#deflate: missing end-of-block code"; ++const char wuffs_deflate__error__no_huffman_codes[] = "#deflate: no Huffman codes"; ++const char wuffs_deflate__error__truncated_input[] = "#deflate: truncated input"; ++const char wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state[] = "#deflate: internal error: inconsistent Huffman decoder state"; ++const char wuffs_deflate__error__internal_error_inconsistent_i_o[] = "#deflate: internal error: inconsistent I/O"; ++const char wuffs_deflate__error__internal_error_inconsistent_distance[] = "#deflate: internal error: inconsistent distance"; ++const char wuffs_deflate__error__internal_error_inconsistent_n_bits[] = "#deflate: internal error: inconsistent n_bits"; ++ ++// ---------------- Private Consts ++ ++static const uint8_t ++WUFFS_DEFLATE__CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 16u, 17u, 18u, 0u, 8u, 7u, 9u, 6u, ++ 10u, 5u, 11u, 4u, 12u, 3u, 13u, 2u, ++ 14u, 1u, 15u, ++}; ++ ++static const uint8_t ++WUFFS_DEFLATE__REVERSE8[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 128u, 64u, 192u, 32u, 160u, 96u, 224u, ++ 16u, 144u, 80u, 208u, 48u, 176u, 112u, 240u, ++ 8u, 136u, 72u, 200u, 40u, 168u, 104u, 232u, ++ 24u, 152u, 88u, 216u, 56u, 184u, 120u, 248u, ++ 4u, 132u, 68u, 196u, 36u, 164u, 100u, 228u, ++ 20u, 148u, 84u, 212u, 52u, 180u, 116u, 244u, ++ 12u, 140u, 76u, 204u, 44u, 172u, 108u, 236u, ++ 28u, 156u, 92u, 220u, 60u, 188u, 124u, 252u, ++ 2u, 130u, 66u, 194u, 34u, 162u, 98u, 226u, ++ 18u, 146u, 82u, 210u, 50u, 178u, 114u, 242u, ++ 10u, 138u, 74u, 202u, 42u, 170u, 106u, 234u, ++ 26u, 154u, 90u, 218u, 58u, 186u, 122u, 250u, ++ 6u, 134u, 70u, 198u, 38u, 166u, 102u, 230u, ++ 22u, 150u, 86u, 214u, 54u, 182u, 118u, 246u, ++ 14u, 142u, 78u, 206u, 46u, 174u, 110u, 238u, ++ 30u, 158u, 94u, 222u, 62u, 190u, 126u, 254u, ++ 1u, 129u, 65u, 193u, 33u, 161u, 97u, 225u, ++ 17u, 145u, 81u, 209u, 49u, 177u, 113u, 241u, ++ 9u, 137u, 73u, 201u, 41u, 169u, 105u, 233u, ++ 25u, 153u, 89u, 217u, 57u, 185u, 121u, 249u, ++ 5u, 133u, 69u, 197u, 37u, 165u, 101u, 229u, ++ 21u, 149u, 85u, 213u, 53u, 181u, 117u, 245u, ++ 13u, 141u, 77u, 205u, 45u, 173u, 109u, 237u, ++ 29u, 157u, 93u, 221u, 61u, 189u, 125u, 253u, ++ 3u, 131u, 67u, 195u, 35u, 163u, 99u, 227u, ++ 19u, 147u, 83u, 211u, 51u, 179u, 115u, 243u, ++ 11u, 139u, 75u, 203u, 43u, 171u, 107u, 235u, ++ 27u, 155u, 91u, 219u, 59u, 187u, 123u, 251u, ++ 7u, 135u, 71u, 199u, 39u, 167u, 103u, 231u, ++ 23u, 151u, 87u, 215u, 55u, 183u, 119u, 247u, ++ 15u, 143u, 79u, 207u, 47u, 175u, 111u, 239u, ++ 31u, 159u, 95u, 223u, 63u, 191u, 127u, 255u, ++}; ++ ++static const uint32_t ++WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1073741824u, 1073742080u, 1073742336u, 1073742592u, 1073742848u, 1073743104u, 1073743360u, 1073743616u, ++ 1073743888u, 1073744400u, 1073744912u, 1073745424u, 1073745952u, 1073746976u, 1073748000u, 1073749024u, ++ 1073750064u, 1073752112u, 1073754160u, 1073756208u, 1073758272u, 1073762368u, 1073766464u, 1073770560u, ++ 1073774672u, 1073782864u, 1073791056u, 1073799248u, 1073807104u, 134217728u, 134217728u, 134217728u, ++}; ++ ++static const uint32_t ++WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1073741824u, 1073742080u, 1073742336u, 1073742592u, 1073742864u, 1073743376u, 1073743904u, 1073744928u, ++ 1073745968u, 1073748016u, 1073750080u, 1073754176u, 1073758288u, 1073766480u, 1073774688u, 1073791072u, ++ 1073807472u, 1073840240u, 1073873024u, 1073938560u, 1074004112u, 1074135184u, 1074266272u, 1074528416u, ++ 1074790576u, 1075314864u, 1075839168u, 1076887744u, 1077936336u, 1080033488u, 134217728u, 134217728u, ++}; ++ ++#define WUFFS_DEFLATE__HUFFS_TABLE_SIZE 1024u ++ ++#define WUFFS_DEFLATE__HUFFS_TABLE_MASK 1023u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__do_transform_io( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_blocks( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_uncompressed( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__init_fixed_huffman( ++ wuffs_deflate__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__init_dynamic_huffman( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__init_huff( ++ wuffs_deflate__decoder* self, ++ uint32_t a_which, ++ uint32_t a_n_codes0, ++ uint32_t a_n_codes1, ++ uint32_t a_base_symbol); ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_bmi2( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_fast32( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_fast64( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_slow( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_deflate__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_deflate__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_deflate__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_deflate__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_deflate__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_deflate__decoder__initialize( ++ wuffs_deflate__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ + if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + +- return wuffs_base__utility__make_rect_ie_u32( +- wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width), +- wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height), +- wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width), +- wuffs_base__u32__min(self->private_impl.f_dirty_max_excl_y, self->private_impl.f_height)); ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.choosy_decode_huffman_fast64 = &wuffs_deflate__decoder__decode_huffman_fast64__choosy_default; ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_deflate__decoder* ++wuffs_deflate__decoder__alloc(void) { ++ wuffs_deflate__decoder* x = ++ (wuffs_deflate__decoder*)(calloc(1, sizeof(wuffs_deflate__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_deflate__decoder__initialize( ++ x, sizeof(wuffs_deflate__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_deflate__decoder(void) { ++ return sizeof(wuffs_deflate__decoder); + } + +-// -------- func gif.decoder.history_retain_length ++// ---------------- Function Implementations ++ ++// -------- func deflate.decoder.add_history + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gif__decoder__history_retain_length( +- const wuffs_gif__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_deflate__decoder__add_history( ++ wuffs_deflate__decoder* self, ++ wuffs_base__slice_u8 a_hist) { + if (!self) { +- return 0; ++ return wuffs_base__make_empty_struct(); + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); + } + +- return 0u; ++ wuffs_base__slice_u8 v_s = {0}; ++ uint64_t v_n_copied = 0; ++ uint32_t v_already_full = 0; ++ ++ v_s = a_hist; ++ if (((uint64_t)(v_s.len)) >= 32768u) { ++ v_s = wuffs_private_impl__slice_u8__suffix(v_s, 32768u); ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s); ++ self->private_impl.f_history_index = 32768u; ++ } else { ++ v_n_copied = wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, (self->private_impl.f_history_index & 32767u), 32768), v_s); ++ if (v_n_copied < ((uint64_t)(v_s.len))) { ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, v_n_copied); ++ v_n_copied = wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s); ++ self->private_impl.f_history_index = (((uint32_t)((v_n_copied & 32767u))) + 32768u); ++ } else { ++ v_already_full = 0u; ++ if (self->private_impl.f_history_index >= 32768u) { ++ v_already_full = 32768u; ++ } ++ self->private_impl.f_history_index = ((self->private_impl.f_history_index & 32767u) + ((uint32_t)((v_n_copied & 32767u))) + v_already_full); ++ } ++ } ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, 32768, 33025), wuffs_base__make_slice_u8(self->private_data.f_history, 33025)); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func gif.decoder.workbuf_len ++// -------- func deflate.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_gif__decoder__workbuf_len( +- const wuffs_gif__decoder* self) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_deflate__decoder__get_quirk( ++ const wuffs_deflate__decoder* self, ++ uint32_t a_key) { + if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ return 0; + } + if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && + (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ return 0; + } + +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ return 0u; + } + +-// -------- func gif.decoder.restart_frame ++// -------- func deflate.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__restart_frame( +- wuffs_gif__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { ++wuffs_deflate__decoder__set_quirk( ++ wuffs_deflate__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -37252,28 +38578,52 @@ wuffs_gif__decoder__restart_frame( + : wuffs_base__error__initialize_not_called); + } + +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } else if (a_io_position == 0u) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func deflate.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_deflate__decoder__dst_history_retain_length( ++ const wuffs_deflate__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); + } +- self->private_impl.f_delayed_num_decoded_frames = false; +- self->private_impl.f_frame_config_io_position = a_io_position; +- self->private_impl.f_num_decoded_frame_configs_value = a_index; +- self->private_impl.f_num_decoded_frames_value = a_index; +- wuffs_gif__decoder__reset_gc(self); +- self->private_impl.f_call_sequence = 40u; +- return wuffs_base__make_status(NULL); ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_base__utility__make_optional_u63(true, 0u); + } + +-// -------- func gif.decoder.decode_frame_config ++// -------- func deflate.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_deflate__decoder__workbuf_len( ++ const wuffs_deflate__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++} ++ ++// -------- func deflate.decoder.transform_io + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__decode_frame_config( +- wuffs_gif__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++wuffs_deflate__decoder__transform_io( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -37283,12 +38633,12 @@ wuffs_gif__decoder__decode_frame_config( + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } +- if (!a_src) { ++ if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { ++ (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -37297,17 +38647,17 @@ wuffs_gif__decoder__decode_frame_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame_config(self, a_dst, a_src); ++ wuffs_base__status t_0 = wuffs_deflate__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_gif__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_deflate__error__truncated_input); + goto exit; + } + status = v_status; +@@ -37315,14 +38665,14 @@ wuffs_gif__decoder__decode_frame_config( + } + + ok: +- self->private_impl.p_decode_frame_config[0] = 0; ++ self->private_impl.p_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: +@@ -37332,403 +38682,103 @@ wuffs_gif__decoder__decode_frame_config( + return status; + } + +-// -------- func gif.decoder.do_decode_frame_config ++// -------- func deflate.decoder.do_transform_io + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__do_decode_frame_config( +- wuffs_gif__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++wuffs_deflate__decoder__do_transform_io( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_background_color = 0; +- uint8_t v_flags = 0; ++ uint64_t v_mark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; +- if (coro_susp_point) { +- v_background_color = self->private_data.s_do_decode_frame_config[0].v_background_color; +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- self->private_impl.f_dirty_max_excl_y = 0u; +- if ((self->private_impl.f_call_sequence & 16u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ self->private_impl.choosy_decode_huffman_fast64 = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++ wuffs_base__cpu_arch__have_x86_bmi2() ? &wuffs_deflate__decoder__decode_huffman_bmi2 : ++#endif ++ self->private_impl.choosy_decode_huffman_fast64); ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ wuffs_base__status t_0 = wuffs_deflate__decoder__decode_blocks(self, a_dst, a_src); ++ v_status = t_0; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_gif__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; +- } +- } else if (self->private_impl.f_call_sequence == 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_gif__decoder__skip_frame(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_call_sequence >= 96u) { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- if ((self->private_impl.f_num_decoded_frame_configs_value > 0u) || (self->private_impl.f_call_sequence == 40u)) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_call_sequence >= 96u) { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- } +- v_background_color = self->private_impl.f_black_color_u32_argb_premul; +- if ( ! self->private_impl.f_gc_has_transparent_index) { +- v_background_color = self->private_impl.f_background_color_u32_argb_premul; +- if (self->private_impl.f_quirks[1u] && (self->private_impl.f_num_decoded_frame_configs_value == 0u)) { +- while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- } +- v_flags = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if ((v_flags & 128u) != 0u) { +- v_background_color = self->private_impl.f_black_color_u32_argb_premul; ++ if ( ! wuffs_base__status__is_suspension(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; + } ++ goto ok; + } +- } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width), +- wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height), +- wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width), +- wuffs_base__u32__min(self->private_impl.f_frame_rect_y1, self->private_impl.f_height)), +- ((wuffs_base__flicks)(self->private_impl.f_gc_duration)), +- self->private_impl.f_num_decoded_frame_configs_value, +- self->private_impl.f_frame_config_io_position, +- self->private_impl.f_gc_disposal, +- ! self->private_impl.f_gc_has_transparent_index, +- false, +- v_background_color); +- } +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u); +- self->private_impl.f_call_sequence = 64u; +- +- ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_frame_config[0].v_background_color = v_background_color; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func gif.decoder.skip_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__skip_frame( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_flags = 0; +- uint8_t v_lw = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_skip_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_flags = t_0; +- } +- if ((v_flags & 128u) != 0u) { +- self->private_data.s_skip_frame[0].scratch = (((uint32_t)(3u)) << (1u + (v_flags & 7u))); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_skip_frame[0].scratch; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_lw = t_1; +- } +- if (v_lw > 8u) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- status = wuffs_gif__decoder__skip_blocks(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_quirks[0u]) { +- self->private_impl.f_delayed_num_decoded_frames = true; +- } else { +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); +- } +- wuffs_gif__decoder__reset_gc(self); +- self->private_impl.f_call_sequence = 32u; +- +- goto ok; +- ok: +- self->private_impl.p_skip_frame[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_skip_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func gif.decoder.decode_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gif__decoder__decode_frame( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_gif__error__truncated_input); +- goto exit; +- } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_transformed_history_count, wuffs_private_impl__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)))); ++ wuffs_deflate__decoder__add_history(self, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); + status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: +- self->private_impl.p_decode_frame[0] = 0; ++ self->private_impl.p_do_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} +- +-// -------- func gif.decoder.do_decode_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__do_decode_frame( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_gif__decoder__do_decode_frame_config(self, NULL, a_src); +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- if (self->private_impl.f_quirks[5u] && ((self->private_impl.f_frame_rect_x0 == self->private_impl.f_frame_rect_x1) || (self->private_impl.f_frame_rect_y0 == self->private_impl.f_frame_rect_y1))) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_frame_size); +- goto exit; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_gif__decoder__decode_id_part1(self, a_dst, a_src, a_blend); +- if (status.repr) { +- goto suspend; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_gif__decoder__decode_id_part2(self, a_dst, a_src, a_workbuf); +- if (status.repr) { +- goto suspend; +- } +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); +- wuffs_gif__decoder__reset_gc(self); +- self->private_impl.f_call_sequence = 32u; +- +- ok: +- self->private_impl.p_do_decode_frame[0] = 0; +- goto exit; ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } + +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: + return status; + } + +-// -------- func gif.decoder.reset_gc +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_gif__decoder__reset_gc( +- wuffs_gif__decoder* self) { +- self->private_impl.f_gc_has_transparent_index = false; +- self->private_impl.f_gc_transparent_index = 0u; +- self->private_impl.f_gc_disposal = 0u; +- self->private_impl.f_gc_duration = 0u; +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func gif.decoder.decode_up_to_id_part1 ++// -------- func deflate.decoder.decode_blocks + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_up_to_id_part1( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__decode_blocks( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_block_type = 0; ++ uint32_t v_final = 0; ++ uint32_t v_b0 = 0; ++ uint32_t v_type = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -37741,71 +38791,125 @@ wuffs_gif__decoder__decode_up_to_id_part1( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_up_to_id_part1[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_blocks; ++ if (coro_susp_point) { ++ v_final = self->private_data.s_decode_blocks.v_final; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_frame_config_io_position == 0u) || (self->private_impl.f_num_decoded_frame_configs_value > 0u)) { +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ label__outer__continue:; ++ while (v_final == 0u) { ++ while (self->private_impl.f_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_0 = *iop_a_src++; ++ v_b0 = t_0; + } +- uint8_t t_0 = *iop_a_src++; +- v_block_type = t_0; ++ self->private_impl.f_bits |= (v_b0 << (self->private_impl.f_n_bits & 3u)); ++ self->private_impl.f_n_bits = ((self->private_impl.f_n_bits & 3u) + 8u); + } +- if (v_block_type == 33u) { ++ v_final = (self->private_impl.f_bits & 1u); ++ v_type = ((self->private_impl.f_bits >> 1u) & 3u); ++ self->private_impl.f_bits >>= 3u; ++ self->private_impl.f_n_bits -= 3u; ++ if (v_type == 0u) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_gif__decoder__decode_extension(self, a_src); ++ status = wuffs_deflate__decoder__decode_uncompressed(self, a_dst, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } +- } else if (v_block_type == 44u) { +- if (self->private_impl.f_delayed_num_decoded_frames) { +- self->private_impl.f_delayed_num_decoded_frames = false; +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ continue; ++ } else if (v_type == 1u) { ++ v_status = wuffs_deflate__decoder__init_fixed_huffman(self); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; + } ++ } else if (v_type == 2u) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_gif__decoder__decode_id_part0(self, a_src); ++ status = wuffs_deflate__decoder__init_dynamic_huffman(self, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } +- break; + } else { +- if (self->private_impl.f_delayed_num_decoded_frames) { +- self->private_impl.f_delayed_num_decoded_frames = false; +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_block); ++ goto exit; ++ } ++ self->private_impl.f_end_of_block = false; ++ while (true) { ++ if (sizeof(void*) == 4u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_deflate__decoder__decode_huffman_fast32(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } else { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_status = wuffs_deflate__decoder__decode_huffman_fast64(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; ++ } ++ if (self->private_impl.f_end_of_block) { ++ goto label__outer__continue; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_deflate__decoder__decode_huffman_slow(self, a_dst, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_end_of_block) { ++ goto label__outer__continue; + } +- self->private_impl.f_call_sequence = 96u; +- break; + } + } + +- goto ok; + ok: +- self->private_impl.p_decode_up_to_id_part1[0] = 0; ++ self->private_impl.p_decode_blocks = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_up_to_id_part1[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_blocks = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_blocks.v_final = v_final; + + goto exit; + exit: +@@ -37816,18 +38920,32 @@ wuffs_gif__decoder__decode_up_to_id_part1( + return status; + } + +-// -------- func gif.decoder.decode_header ++// -------- func deflate.decoder.decode_uncompressed + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_header( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__decode_uncompressed( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c[6] = {0}; +- uint32_t v_i = 0; ++ uint32_t v_length = 0; ++ uint32_t v_n_copied = 0; + ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -37839,50 +38957,85 @@ wuffs_gif__decoder__decode_header( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_header[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_uncompressed; + if (coro_susp_point) { +- memcpy(v_c, self->private_data.s_decode_header[0].v_c, sizeof(v_c)); +- v_i = self->private_data.s_decode_header[0].v_i; ++ v_length = self->private_data.s_decode_uncompressed.v_length; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- while (v_i < 6u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_n_bits = 0u; ++ self->private_impl.f_bits = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_uncompressed.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_uncompressed.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; + } +- uint8_t t_0 = *iop_a_src++; +- v_c[v_i] = t_0; + } +- v_i += 1u; ++ v_length = t_0; + } +- if ((v_c[0u] != 71u) || +- (v_c[1u] != 73u) || +- (v_c[2u] != 70u) || +- (v_c[3u] != 56u) || +- ((v_c[4u] != 55u) && (v_c[4u] != 57u)) || +- (v_c[5u] != 97u)) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_header); ++ if ((((v_length) & 0xFFFFu) + ((v_length) >> (32u - 16u))) != 65535u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__inconsistent_stored_block_length); + goto exit; + } ++ v_length = ((v_length) & 0xFFFFu); ++ while (true) { ++ v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_reader( ++ &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src); ++ if (v_length <= v_n_copied) { ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ v_length -= v_n_copied; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ } else { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ } ++ } + +- goto ok; + ok: +- self->private_impl.p_decode_header[0] = 0; ++ self->private_impl.p_decode_uncompressed = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_header[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- memcpy(self->private_data.s_decode_header[0].v_c, v_c, sizeof(v_c)); +- self->private_data.s_decode_header[0].v_i = v_i; ++ self->private_impl.p_decode_uncompressed = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_uncompressed.v_length = v_length; + + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -37890,21 +39043,80 @@ wuffs_gif__decoder__decode_header( + return status; + } + +-// -------- func gif.decoder.decode_lsd ++// -------- func deflate.decoder.init_fixed_huffman + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_lsd( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__init_fixed_huffman( ++ wuffs_deflate__decoder* self) { ++ uint32_t v_i = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ while (v_i < 144u) { ++ self->private_data.f_code_lengths[v_i] = 8u; ++ v_i += 1u; ++ } ++ while (v_i < 256u) { ++ self->private_data.f_code_lengths[v_i] = 9u; ++ v_i += 1u; ++ } ++ while (v_i < 280u) { ++ self->private_data.f_code_lengths[v_i] = 7u; ++ v_i += 1u; ++ } ++ while (v_i < 288u) { ++ self->private_data.f_code_lengths[v_i] = 8u; ++ v_i += 1u; ++ } ++ while (v_i < 320u) { ++ self->private_data.f_code_lengths[v_i] = 5u; ++ v_i += 1u; ++ } ++ v_status = wuffs_deflate__decoder__init_huff(self, ++ 0u, ++ 0u, ++ 288u, ++ 257u); ++ if (wuffs_base__status__is_error(&v_status)) { ++ return v_status; ++ } ++ v_status = wuffs_deflate__decoder__init_huff(self, ++ 1u, ++ 288u, ++ 320u, ++ 0u); ++ if (wuffs_base__status__is_error(&v_status)) { ++ return v_status; ++ } ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func deflate.decoder.init_dynamic_huffman ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__init_dynamic_huffman( ++ wuffs_deflate__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_flags = 0; +- uint8_t v_background_color_index = 0; +- uint32_t v_num_palette_entries = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_b0 = 0; ++ uint32_t v_n_lit = 0; ++ uint32_t v_n_dist = 0; ++ uint32_t v_n_clen = 0; + uint32_t v_i = 0; +- uint32_t v_j = 0; +- uint32_t v_argb = 0; ++ uint32_t v_b1 = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_mask = 0; ++ uint32_t v_table_entry = 0; ++ uint32_t v_table_entry_n_bits = 0; ++ uint32_t v_b2 = 0; ++ uint32_t v_n_extra_bits = 0; ++ uint8_t v_rep_symbol = 0; ++ uint32_t v_rep_count = 0; ++ uint32_t v_b3 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -37917,172 +39129,215 @@ wuffs_gif__decoder__decode_lsd( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_lsd[0]; ++ uint32_t coro_susp_point = self->private_impl.p_init_dynamic_huffman; + if (coro_susp_point) { +- v_flags = self->private_data.s_decode_lsd[0].v_flags; +- v_background_color_index = self->private_data.s_decode_lsd[0].v_background_color_index; +- v_num_palette_entries = self->private_data.s_decode_lsd[0].v_num_palette_entries; +- v_i = self->private_data.s_decode_lsd[0].v_i; ++ v_bits = self->private_data.s_init_dynamic_huffman.v_bits; ++ v_n_bits = self->private_data.s_init_dynamic_huffman.v_n_bits; ++ v_n_lit = self->private_data.s_init_dynamic_huffman.v_n_lit; ++ v_n_dist = self->private_data.s_init_dynamic_huffman.v_n_dist; ++ v_n_clen = self->private_data.s_init_dynamic_huffman.v_n_clen; ++ v_i = self->private_data.s_init_dynamic_huffman.v_i; ++ v_mask = self->private_data.s_init_dynamic_huffman.v_mask; ++ v_n_extra_bits = self->private_data.s_init_dynamic_huffman.v_n_extra_bits; ++ v_rep_symbol = self->private_data.s_init_dynamic_huffman.v_rep_symbol; ++ v_rep_count = self->private_data.s_init_dynamic_huffman.v_rep_count; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_lsd[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { ++ v_bits = self->private_impl.f_bits; ++ v_n_bits = self->private_impl.f_n_bits; ++ while (v_n_bits < 14u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_0 = *iop_a_src++; ++ v_b0 = t_0; ++ } ++ v_bits |= (v_b0 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ v_n_lit = (((v_bits) & 0x1Fu) + 257u); ++ if (v_n_lit > 286u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_literal_length_code_count); ++ goto exit; ++ } ++ v_bits >>= 5u; ++ v_n_dist = (((v_bits) & 0x1Fu) + 1u); ++ if (v_n_dist > 30u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance_code_count); ++ goto exit; ++ } ++ v_bits >>= 5u; ++ v_n_clen = (((v_bits) & 0xFu) + 4u); ++ v_bits >>= 4u; ++ v_n_bits -= 14u; ++ v_i = 0u; ++ while (v_i < v_n_clen) { ++ while (v_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_lsd[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 8) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ uint32_t t_1 = *iop_a_src++; ++ v_b1 = t_1; + } ++ v_bits |= (v_b1 << v_n_bits); ++ v_n_bits += 8u; + } +- self->private_impl.f_width = t_0; ++ self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = ((uint8_t)((v_bits & 7u))); ++ v_bits >>= 3u; ++ v_n_bits -= 3u; ++ v_i += 1u; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_lsd[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { ++ while (v_i < 19u) { ++ self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = 0u; ++ v_i += 1u; ++ } ++ v_status = wuffs_deflate__decoder__init_huff(self, ++ 0u, ++ 0u, ++ 19u, ++ 4095u); ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; ++ } ++ v_mask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); ++ v_i = 0u; ++ while (v_i < (v_n_lit + v_n_dist)) { ++ while (true) { ++ v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_mask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ if (v_n_bits >= v_table_entry_n_bits) { ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_lsd[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 8) { +- t_1 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ uint32_t t_2 = *iop_a_src++; ++ v_b2 = t_2; + } ++ v_bits |= (v_b2 << v_n_bits); ++ v_n_bits += 8u; + } +- self->private_impl.f_height = t_1; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if ((v_table_entry >> 24u) != 128u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- uint8_t t_2 = *iop_a_src++; +- v_flags = t_2; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_table_entry = ((v_table_entry >> 8u) & 255u); ++ if (v_table_entry < 16u) { ++ self->private_data.f_code_lengths[v_i] = ((uint8_t)(v_table_entry)); ++ v_i += 1u; ++ continue; + } +- uint8_t t_3 = *iop_a_src++; +- v_background_color_index = t_3; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src++; +- v_i = 0u; +- self->private_impl.f_has_global_palette = ((v_flags & 128u) != 0u); +- if (self->private_impl.f_has_global_palette) { +- v_num_palette_entries = (((uint32_t)(1u)) << (1u + (v_flags & 7u))); +- while (v_i < v_num_palette_entries) { ++ v_n_extra_bits = 0u; ++ v_rep_symbol = 0u; ++ v_rep_count = 0u; ++ if (v_table_entry == 16u) { ++ v_n_extra_bits = 2u; ++ if (v_i <= 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_repetition); ++ goto exit; ++ } ++ v_rep_symbol = ((uint8_t)(self->private_data.f_code_lengths[(v_i - 1u)] & 15u)); ++ v_rep_count = 3u; ++ } else if (v_table_entry == 17u) { ++ v_n_extra_bits = 3u; ++ v_rep_symbol = 0u; ++ v_rep_count = 3u; ++ } else if (v_table_entry == 18u) { ++ v_n_extra_bits = 7u; ++ v_rep_symbol = 0u; ++ v_rep_count = 11u; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } ++ while (v_n_bits < v_n_extra_bits) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { +- t_4 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); +- iop_a_src += 3; +- } else { +- self->private_data.s_decode_lsd[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_lsd[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); +- if (num_bits_4 == 16) { +- t_4 = ((uint32_t)(*scratch >> 40)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)); +- } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_argb = t_4; ++ uint32_t t_3 = *iop_a_src++; ++ v_b3 = t_3; + } +- v_argb |= 4278190080u; +- self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); +- self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); +- self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); +- self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); +- v_i += 1u; ++ v_bits |= (v_b3 << v_n_bits); ++ v_n_bits += 8u; + } +- if (self->private_impl.f_quirks[2u]) { +- if ((v_background_color_index != 0u) && (((uint32_t)(v_background_color_index)) < v_num_palette_entries)) { +- v_j = (4u * ((uint32_t)(v_background_color_index))); +- self->private_impl.f_background_color_u32_argb_premul = ((((uint32_t)(self->private_data.f_palettes[0u][(v_j + 0u)])) << 0u) | +- (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 1u)])) << 8u) | +- (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 2u)])) << 16u) | +- (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 3u)])) << 24u)); +- } else { +- self->private_impl.f_background_color_u32_argb_premul = 77u; ++ v_rep_count += ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_n_extra_bits)); ++ v_bits >>= v_n_extra_bits; ++ v_n_bits -= v_n_extra_bits; ++ while (v_rep_count > 0u) { ++ if (v_i >= (v_n_lit + v_n_dist)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count); ++ goto exit; + } ++ self->private_data.f_code_lengths[v_i] = v_rep_symbol; ++ v_i += 1u; ++ v_rep_count -= 1u; + } + } +- while (v_i < 256u) { +- self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = 0u; +- self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = 0u; +- self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = 0u; +- self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = 255u; +- v_i += 1u; ++ if (v_i != (v_n_lit + v_n_dist)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count); ++ goto exit; ++ } ++ if (self->private_data.f_code_lengths[256u] == 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__missing_end_of_block_code); ++ goto exit; ++ } ++ v_status = wuffs_deflate__decoder__init_huff(self, ++ 0u, ++ 0u, ++ v_n_lit, ++ 257u); ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; ++ } ++ v_status = wuffs_deflate__decoder__init_huff(self, ++ 1u, ++ v_n_lit, ++ (v_n_lit + v_n_dist), ++ 0u); ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; + } ++ self->private_impl.f_bits = v_bits; ++ self->private_impl.f_n_bits = v_n_bits; + + goto ok; + ok: +- self->private_impl.p_decode_lsd[0] = 0; ++ self->private_impl.p_init_dynamic_huffman = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_lsd[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_lsd[0].v_flags = v_flags; +- self->private_data.s_decode_lsd[0].v_background_color_index = v_background_color_index; +- self->private_data.s_decode_lsd[0].v_num_palette_entries = v_num_palette_entries; +- self->private_data.s_decode_lsd[0].v_i = v_i; ++ self->private_impl.p_init_dynamic_huffman = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_init_dynamic_huffman.v_bits = v_bits; ++ self->private_data.s_init_dynamic_huffman.v_n_bits = v_n_bits; ++ self->private_data.s_init_dynamic_huffman.v_n_lit = v_n_lit; ++ self->private_data.s_init_dynamic_huffman.v_n_dist = v_n_dist; ++ self->private_data.s_init_dynamic_huffman.v_n_clen = v_n_clen; ++ self->private_data.s_init_dynamic_huffman.v_i = v_i; ++ self->private_data.s_init_dynamic_huffman.v_mask = v_mask; ++ self->private_data.s_init_dynamic_huffman.v_n_extra_bits = v_n_extra_bits; ++ self->private_data.s_init_dynamic_huffman.v_rep_symbol = v_rep_symbol; ++ self->private_data.s_init_dynamic_huffman.v_rep_count = v_rep_count; + + goto exit; + exit: +@@ -38093,185 +39348,299 @@ wuffs_gif__decoder__decode_lsd( + return status; + } + +-// -------- func gif.decoder.decode_extension ++// -------- func deflate.decoder.init_huff + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_extension( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_label = 0; ++wuffs_deflate__decoder__init_huff( ++ wuffs_deflate__decoder* self, ++ uint32_t a_which, ++ uint32_t a_n_codes0, ++ uint32_t a_n_codes1, ++ uint32_t a_base_symbol) { ++ uint16_t v_counts[16] = {0}; ++ uint32_t v_i = 0; ++ uint32_t v_remaining = 0; ++ uint16_t v_offsets[16] = {0}; ++ uint32_t v_n_symbols = 0; ++ uint32_t v_count = 0; ++ uint16_t v_symbols[320] = {0}; ++ uint32_t v_min_cl = 0; ++ uint32_t v_max_cl = 0; ++ uint32_t v_initial_high_bits = 0; ++ uint32_t v_prev_cl = 0; ++ uint32_t v_prev_redirect_key = 0; ++ uint32_t v_top = 0; ++ uint32_t v_next_top = 0; ++ uint32_t v_code = 0; ++ uint32_t v_key = 0; ++ uint32_t v_value = 0; ++ uint32_t v_cl = 0; ++ uint32_t v_redirect_key = 0; ++ uint32_t v_j = 0; ++ uint32_t v_reversed_key = 0; ++ uint32_t v_symbol = 0; ++ uint32_t v_high_bits = 0; ++ uint32_t v_delta = 0; + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ v_i = a_n_codes0; ++ while (v_i < a_n_codes1) { ++ if (v_counts[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] >= 320u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_counts[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_i += 1u; + } +- +- uint32_t coro_susp_point = self->private_impl.p_decode_extension[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_label = t_0; ++ if ((((uint32_t)(v_counts[0u])) + a_n_codes0) == a_n_codes1) { ++ return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes); ++ } ++ v_remaining = 1u; ++ v_i = 1u; ++ while (v_i <= 15u) { ++ if (v_remaining > 1073741824u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +- if (v_label == 249u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_gif__decoder__decode_gc(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- status = wuffs_base__make_status(NULL); +- goto ok; +- } else if (v_label == 255u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_gif__decoder__decode_ae(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; ++ v_remaining <<= 1u; ++ if (v_remaining < ((uint32_t)(v_counts[v_i]))) { ++ return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_over_subscribed); ++ } ++ v_remaining -= ((uint32_t)(v_counts[v_i])); ++ v_i += 1u; ++ } ++ if (v_remaining != 0u) { ++ if ((a_which == 1u) && (v_counts[1u] == 1u) && ((((uint32_t)(v_counts[0u])) + a_n_codes0 + 1u) == a_n_codes1)) { ++ v_i = 0u; ++ while (v_i <= 29u) { ++ if (self->private_data.f_code_lengths[(a_n_codes0 + v_i)] == 1u) { ++ self->private_impl.f_n_huffs_bits[1u] = 1u; ++ self->private_data.f_huffs[1u][0u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[v_i] | 1u); ++ self->private_data.f_huffs[1u][1u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[31u] | 1u); ++ return wuffs_base__make_status(NULL); ++ } ++ v_i += 1u; + } +- status = wuffs_base__make_status(NULL); +- goto ok; + } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_under_subscribed); ++ } ++ v_i = 1u; ++ while (v_i <= 15u) { ++ v_offsets[v_i] = ((uint16_t)(v_n_symbols)); ++ v_count = ((uint32_t)(v_counts[v_i])); ++ if (v_n_symbols > (320u - v_count)) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- status = wuffs_gif__decoder__skip_blocks(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ v_n_symbols = (v_n_symbols + v_count); ++ v_i += 1u; ++ } ++ if (v_n_symbols > 288u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_i = a_n_codes0; ++ while (v_i < a_n_codes1) { ++ if (v_i < a_n_codes0) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +- if (status.repr) { +- goto suspend; ++ if (self->private_data.f_code_lengths[v_i] != 0u) { ++ if (v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] >= 320u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_symbols[v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))]] = ((uint16_t)((v_i - a_n_codes0))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif + } +- +- ok: +- self->private_impl.p_decode_extension[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_extension[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ v_i += 1u; + } +- +- return status; +-} +- +-// -------- func gif.decoder.skip_blocks +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_gif__decoder__skip_blocks( +- wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_block_size = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ v_min_cl = 1u; ++ while (true) { ++ if (v_counts[v_min_cl] != 0u) { ++ break; ++ } ++ if (v_min_cl >= 9u) { ++ return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_minimum_code_length); ++ } ++ v_min_cl += 1u; + } +- +- uint32_t coro_susp_point = self->private_impl.p_skip_blocks[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_max_cl = 15u; ++ while (true) { ++ if (v_counts[v_max_cl] != 0u) { ++ break; ++ } ++ if (v_max_cl <= 1u) { ++ return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes); ++ } ++ v_max_cl -= 1u; ++ } ++ if (v_max_cl <= 9u) { ++ self->private_impl.f_n_huffs_bits[a_which] = v_max_cl; ++ } else { ++ self->private_impl.f_n_huffs_bits[a_which] = 9u; ++ } ++ v_i = 0u; ++ if ((v_n_symbols != ((uint32_t)(v_offsets[v_max_cl]))) || (v_n_symbols != ((uint32_t)(v_offsets[15u])))) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ if ((a_n_codes0 + ((uint32_t)(v_symbols[0u]))) >= 320u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_initial_high_bits = 512u; ++ if (v_max_cl < 9u) { ++ v_initial_high_bits = (((uint32_t)(1u)) << v_max_cl); ++ } ++ v_prev_cl = ((uint32_t)(((uint8_t)(self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[0u])))] & 15u)))); ++ v_prev_redirect_key = 4294967295u; ++ v_top = 0u; ++ v_next_top = 512u; ++ v_code = 0u; ++ v_key = 0u; ++ v_value = 0u; ++ while (true) { ++ if ((a_n_codes0 + ((uint32_t)(v_symbols[v_i]))) >= 320u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_cl = ((uint32_t)(((uint8_t)(self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[v_i])))] & 15u)))); ++ if (v_cl > v_prev_cl) { ++ v_code <<= (v_cl - v_prev_cl); ++ if (v_code >= 32768u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ } ++ v_prev_cl = v_cl; ++ v_key = v_code; ++ if (v_cl > 9u) { ++ v_cl -= 9u; ++ v_redirect_key = ((v_key >> v_cl) & 511u); ++ v_key = ((v_key) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_cl)); ++ if (v_prev_redirect_key != v_redirect_key) { ++ v_prev_redirect_key = v_redirect_key; ++ v_remaining = (((uint32_t)(1u)) << v_cl); ++ v_j = v_prev_cl; ++ while (v_j <= 15u) { ++ if (v_remaining <= ((uint32_t)(v_counts[v_j]))) { ++ break; ++ } ++ v_remaining -= ((uint32_t)(v_counts[v_j])); ++ if (v_remaining > 1073741824u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_remaining <<= 1u; ++ v_j += 1u; + } +- uint8_t t_0 = *iop_a_src++; +- v_block_size = t_0; ++ if ((v_j <= 9u) || (15u < v_j)) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_j -= 9u; ++ v_initial_high_bits = (((uint32_t)(1u)) << v_j); ++ v_top = v_next_top; ++ if ((v_top + (((uint32_t)(1u)) << v_j)) > 1024u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_next_top = (v_top + (((uint32_t)(1u)) << v_j)); ++ v_redirect_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_redirect_key >> 1u)])) | ((v_redirect_key & 1u) << 8u)); ++ self->private_data.f_huffs[a_which][v_redirect_key] = (268435465u | (v_top << 8u) | (v_j << 4u)); + } +- if (v_block_size == 0u) { +- status = wuffs_base__make_status(NULL); +- goto ok; ++ } ++ if ((v_key >= 512u) || (v_counts[v_prev_cl] <= 0u)) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_counts[v_prev_cl] -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_reversed_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_key >> 1u)])) | ((v_key & 1u) << 8u)); ++ v_reversed_key >>= (9u - v_cl); ++ v_symbol = ((uint32_t)(v_symbols[v_i])); ++ if (v_symbol == 256u) { ++ v_value = (536870912u | v_cl); ++ } else if ((v_symbol < 256u) && (a_which == 0u)) { ++ v_value = (2147483648u | (v_symbol << 8u) | v_cl); ++ } else if (v_symbol >= a_base_symbol) { ++ v_symbol -= a_base_symbol; ++ if (a_which == 0u) { ++ v_value = (WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl); ++ } else { ++ v_value = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl); + } +- self->private_data.s_skip_blocks[0].scratch = ((uint32_t)(v_block_size)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (self->private_data.s_skip_blocks[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_skip_blocks[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ } else { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ } ++ v_high_bits = v_initial_high_bits; ++ v_delta = (((uint32_t)(1u)) << v_cl); ++ while (v_high_bits >= v_delta) { ++ v_high_bits -= v_delta; ++ if ((v_top + ((v_high_bits | v_reversed_key) & 511u)) >= 1024u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +- iop_a_src += self->private_data.s_skip_blocks[0].scratch; ++ self->private_data.f_huffs[a_which][(v_top + ((v_high_bits | v_reversed_key) & 511u))] = v_value; ++ } ++ v_i += 1u; ++ if (v_i >= v_n_symbols) { ++ break; ++ } ++ v_code += 1u; ++ if (v_code >= 32768u) { ++ return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + } +- +- ok: +- self->private_impl.p_skip_blocks[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_skip_blocks[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- +- return status; ++ return wuffs_base__make_status(NULL); + } + +-// -------- func gif.decoder.decode_ae ++// ‼ WUFFS MULTI-FILE SECTION +x86_bmi2 ++// -------- func deflate.decoder.decode_huffman_bmi2 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("bmi2") + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_ae( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__decode_huffman_bmi2( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_block_size = 0; +- bool v_is_animexts = false; +- bool v_is_netscape = false; +- bool v_is_iccp = false; +- bool v_is_xmp = false; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_table_entry = 0; ++ uint32_t v_table_entry_n_bits = 0; ++ uint64_t v_lmask = 0; ++ uint64_t v_dmask = 0; ++ uint32_t v_redir_top = 0; ++ uint32_t v_redir_mask = 0; ++ uint32_t v_length = 0; ++ uint32_t v_dist_minus_1 = 0; ++ uint32_t v_hlen = 0; ++ uint32_t v_hdist = 0; ++ uint32_t v_hdist_adjustment = 0; + ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -38283,214 +39652,206 @@ wuffs_gif__decoder__decode_ae( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_ae[0]; +- if (coro_susp_point) { +- v_block_size = self->private_data.s_decode_ae[0].v_block_size; +- v_is_animexts = self->private_data.s_decode_ae[0].v_is_animexts; +- v_is_netscape = self->private_data.s_decode_ae[0].v_is_netscape; +- v_is_iccp = self->private_data.s_decode_ae[0].v_is_iccp; +- v_is_xmp = self->private_data.s_decode_ae[0].v_is_xmp; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- do { +- if (self->private_impl.f_metadata_fourcc != 0u) { +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_block_size = t_0; +- } +- if (v_block_size == 0u) { +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- if (v_block_size != 11u) { +- self->private_data.s_decode_ae[0].scratch = ((uint32_t)(v_block_size)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (self->private_data.s_decode_ae[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_ae[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_ae[0].scratch; ++ v_bits = ((uint64_t)(self->private_impl.f_bits)); ++ v_n_bits = self->private_impl.f_n_bits; ++ v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); ++ v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); ++ if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); ++ goto exit; ++ } ++ v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); ++ label__loop__continue:; ++ while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) { ++ v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u))); ++ iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; + break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- v_is_animexts = true; +- v_is_netscape = true; +- v_is_iccp = true; +- v_is_xmp = true; +- v_block_size = 0u; +- while (v_block_size < 11u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- v_is_animexts = (v_is_animexts && (v_c == WUFFS_GIF__ANIMEXTS1DOT0[v_block_size])); +- v_is_netscape = (v_is_netscape && (v_c == WUFFS_GIF__NETSCAPE2DOT0[v_block_size])); +- v_is_iccp = (v_is_iccp && (v_c == WUFFS_GIF__ICCRGBG1012[v_block_size])); +- v_is_xmp = (v_is_xmp && (v_c == WUFFS_GIF__XMPDATAXMP[v_block_size])); +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_block_size += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } ++ v_length = (((v_table_entry >> 8u) & 255u) + 3u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_table_entry_n_bits > 0u) { ++ v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } ++ v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 28u) == 1u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } ++ if ((v_table_entry >> 24u) != 64u) { ++ if ((v_table_entry >> 24u) == 8u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; + } +- if (v_is_animexts || v_is_netscape) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- v_block_size = t_2; +- } +- if (v_block_size != 3u) { +- self->private_data.s_decode_ae[0].scratch = ((uint32_t)(v_block_size)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (self->private_data.s_decode_ae[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_ae[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_ae[0].scratch; +- break; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } ++ v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ do { ++ if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_hlen = 0u; ++ v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_length > v_hdist) { ++ v_length -= v_hdist; ++ v_hlen = v_hdist; ++ } else { ++ v_hlen = v_length; ++ v_length = 0u; + } +- if (v_c != 1u) { +- self->private_data.s_decode_ae[0].scratch = 2u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (self->private_data.s_decode_ae[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_ae[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_ae[0].scratch; +- break; ++ v_hdist += v_hdist_adjustment; ++ if (self->private_impl.f_history_index < v_hdist) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); ++ goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_ae[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_ae[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 8) { +- t_4 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; +- } +- } +- self->private_impl.f_num_animation_loops_value = t_4; ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); ++ if (v_length == 0u) { ++ goto label__loop__continue; + } +- self->private_impl.f_seen_num_animation_loops_value = true; +- if ((0u < self->private_impl.f_num_animation_loops_value) && (self->private_impl.f_num_animation_loops_value <= 65535u)) { +- self->private_impl.f_num_animation_loops_value += 1u; ++ if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); ++ goto exit; + } +- } else if (self->private_impl.f_call_sequence >= 32u) { +- } else if (v_is_iccp && self->private_impl.f_report_metadata_iccp) { +- self->private_impl.f_metadata_fourcc = 1229144912u; +- self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- self->private_impl.f_call_sequence = 16u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; +- } else if (v_is_xmp && self->private_impl.f_report_metadata_xmp) { +- self->private_impl.f_metadata_fourcc = 1481461792u; +- self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- self->private_impl.f_call_sequence = 16u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; ++ } ++ if ((v_dist_minus_1 + 1u) >= 8u) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } else if ((v_dist_minus_1 + 1u) == 1u) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } else { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); + } + } while (0); +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- status = wuffs_gif__decoder__skip_blocks(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; ++ } ++ if (v_n_bits > 63u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ while (v_n_bits >= 8u) { ++ v_n_bits -= 8u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); ++ goto exit; + } +- +- ok: +- self->private_impl.p_decode_ae[0] = 0; ++ } ++ self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u)))); ++ self->private_impl.f_n_bits = v_n_bits; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_ae[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_ae[0].v_block_size = v_block_size; +- self->private_data.s_decode_ae[0].v_is_animexts = v_is_animexts; +- self->private_data.s_decode_ae[0].v_is_netscape = v_is_netscape; +- self->private_data.s_decode_ae[0].v_is_iccp = v_is_iccp; +- self->private_data.s_decode_ae[0].v_is_xmp = v_is_xmp; +- + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + + return status; + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++// ‼ WUFFS MULTI-FILE SECTION -x86_bmi2 + +-// -------- func gif.decoder.decode_gc ++// -------- func deflate.decoder.decode_huffman_fast32 + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_gc( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__decode_huffman_fast32( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_flags = 0; +- uint16_t v_gc_duration_centiseconds = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_table_entry = 0; ++ uint32_t v_table_entry_n_bits = 0; ++ uint32_t v_lmask = 0; ++ uint32_t v_dmask = 0; ++ uint32_t v_redir_top = 0; ++ uint32_t v_redir_mask = 0; ++ uint32_t v_length = 0; ++ uint32_t v_dist_minus_1 = 0; ++ uint32_t v_hlen = 0; ++ uint32_t v_hdist = 0; ++ uint32_t v_hdist_adjustment = 0; + ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -38502,106 +39863,205 @@ wuffs_gif__decoder__decode_gc( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_gc[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ v_bits = self->private_impl.f_bits; ++ v_n_bits = self->private_impl.f_n_bits; ++ v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); ++ v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); ++ if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); ++ goto exit; ++ } ++ v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); ++ label__loop__continue:; ++ while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 12u)) { ++ if (v_n_bits < 15u) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ } else { + } +- if (v_c != 4u) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control); ++ v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ if (v_n_bits < 15u) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ } else { ++ } ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_length = (((v_table_entry >> 8u) & 255u) + 3u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_table_entry_n_bits > 0u) { ++ if (v_n_bits < 15u) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ } else { + } +- uint8_t t_1 = *iop_a_src++; +- v_flags = t_1; ++ v_length = (((v_length + 253u + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } else { + } +- self->private_impl.f_gc_has_transparent_index = ((v_flags & 1u) != 0u); +- v_flags = ((v_flags >> 2u) & 7u); +- if (v_flags == 2u) { +- self->private_impl.f_gc_disposal = 1u; +- } else if ((v_flags == 3u) || (v_flags == 4u)) { +- self->private_impl.f_gc_disposal = 2u; ++ if (v_n_bits < 15u) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; + } else { +- self->private_impl.f_gc_disposal = 0u; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint16_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- iop_a_src += 2; ++ v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 28u) == 1u) { ++ if (v_n_bits < 15u) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; + } else { +- self->private_data.s_decode_gc[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_gc[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; +- if (num_bits_2 == 8) { +- t_2 = ((uint16_t)(*scratch)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; +- } + } +- v_gc_duration_centiseconds = t_2; ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } else { + } +- self->private_impl.f_gc_duration = (((uint64_t)(v_gc_duration_centiseconds)) * 7056000u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if ((v_table_entry >> 24u) != 64u) { ++ if ((v_table_entry >> 24u) == 8u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; + } +- uint8_t t_3 = *iop_a_src++; +- self->private_impl.f_gc_transparent_index = t_3; ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; ++ v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_n_bits < v_table_entry_n_bits) { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; + } +- if (v_c != 0u) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control); ++ v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ do { ++ if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_hlen = 0u; ++ v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_length > v_hdist) { ++ v_length -= v_hdist; ++ v_hlen = v_hdist; ++ } else { ++ v_hlen = v_length; ++ v_length = 0u; ++ } ++ v_hdist += v_hdist_adjustment; ++ if (self->private_impl.f_history_index < v_hdist) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); ++ goto exit; ++ } ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); ++ if (v_length == 0u) { ++ goto label__loop__continue; ++ } ++ if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); ++ goto exit; ++ } ++ } ++ if ((v_dist_minus_1 + 1u) >= 8u) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } else { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } ++ } while (0); ++ } ++ while (v_n_bits >= 8u) { ++ v_n_bits -= 8u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); + goto exit; + } +- +- goto ok; +- ok: +- self->private_impl.p_decode_gc[0] = 0; ++ } ++ self->private_impl.f_bits = (v_bits & ((((uint32_t)(1u)) << v_n_bits) - 1u)); ++ self->private_impl.f_n_bits = v_n_bits; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_gc[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -38609,15 +40069,52 @@ wuffs_gif__decoder__decode_gc( + return status; + } + +-// -------- func gif.decoder.decode_id_part0 ++// -------- func deflate.decoder.decode_huffman_fast64 + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_id_part0( +- wuffs_gif__decoder* self, ++wuffs_deflate__decoder__decode_huffman_fast64( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ return (*self->private_impl.choosy_decode_huffman_fast64)(self, a_dst, a_src); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_deflate__decoder__decode_huffman_fast64__choosy_default( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_table_entry = 0; ++ uint32_t v_table_entry_n_bits = 0; ++ uint64_t v_lmask = 0; ++ uint64_t v_dmask = 0; ++ uint32_t v_redir_top = 0; ++ uint32_t v_redir_mask = 0; ++ uint32_t v_length = 0; ++ uint32_t v_dist_minus_1 = 0; ++ uint32_t v_hlen = 0; ++ uint32_t v_hdist = 0; ++ uint32_t v_hdist_adjustment = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -38629,147 +40126,160 @@ wuffs_gif__decoder__decode_id_part0( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_id_part0[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ v_bits = ((uint64_t)(self->private_impl.f_bits)); ++ v_n_bits = self->private_impl.f_n_bits; ++ v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); ++ v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); ++ if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); ++ goto exit; ++ } ++ v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))); ++ label__loop__continue:; ++ while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) { ++ v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u))); ++ iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 31u) != 0u) { ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; + } else { +- self->private_data.s_decode_id_part0[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 8) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; +- } ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- self->private_impl.f_frame_rect_x0 = t_0; ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_id_part0[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 8) { +- t_1 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; +- } +- } +- self->private_impl.f_frame_rect_y0 = t_1; ++ v_length = (((v_table_entry >> 8u) & 255u) + 3u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_table_entry_n_bits > 0u) { ++ v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_2 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_id_part0[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; +- if (num_bits_2 == 8) { +- t_2 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; +- } ++ v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ if ((v_table_entry >> 28u) == 1u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } ++ if ((v_table_entry >> 24u) != 64u) { ++ if ((v_table_entry >> 24u) == 8u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; + } +- self->private_impl.f_frame_rect_x1 = t_2; ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- self->private_impl.f_frame_rect_x1 += self->private_impl.f_frame_rect_x0; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_id_part0[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_id_part0[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; +- if (num_bits_3 == 8) { +- t_3 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ do { ++ if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_hlen = 0u; ++ v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_length > v_hdist) { ++ v_length -= v_hdist; ++ v_hlen = v_hdist; ++ } else { ++ v_hlen = v_length; ++ v_length = 0u; ++ } ++ v_hdist += v_hdist_adjustment; ++ if (self->private_impl.f_history_index < v_hdist) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); ++ goto exit; ++ } ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); ++ if (v_length == 0u) { ++ goto label__loop__continue; ++ } ++ if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance); ++ goto exit; + } + } +- self->private_impl.f_frame_rect_y1 = t_3; +- } +- self->private_impl.f_frame_rect_y1 += self->private_impl.f_frame_rect_y0; +- self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; +- self->private_impl.f_dst_y = self->private_impl.f_frame_rect_y0; +- if ((self->private_impl.f_num_decoded_frame_configs_value == 0u) && ! self->private_impl.f_quirks[4u]) { +- self->private_impl.f_width = wuffs_base__u32__max(self->private_impl.f_width, self->private_impl.f_frame_rect_x1); +- self->private_impl.f_height = wuffs_base__u32__max(self->private_impl.f_height, self->private_impl.f_frame_rect_y1); ++ if ((v_dist_minus_1 + 1u) >= 8u) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } else if ((v_dist_minus_1 + 1u) == 1u) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } else { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ } ++ } while (0); ++ } ++ if (v_n_bits > 63u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ while (v_n_bits >= 8u) { ++ v_n_bits -= 8u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o); ++ goto exit; + } +- +- goto ok; +- ok: +- self->private_impl.p_decode_id_part0[0] = 0; ++ } ++ self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u)))); ++ self->private_impl.f_n_bits = v_n_bits; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_id_part0[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -38777,25 +40287,49 @@ wuffs_gif__decoder__decode_id_part0( + return status; + } + +-// -------- func gif.decoder.decode_id_part1 ++// -------- func deflate.decoder.decode_huffman_slow + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_id_part1( +- wuffs_gif__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend) { ++wuffs_deflate__decoder__decode_huffman_slow( ++ wuffs_deflate__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_flags = 0; +- uint8_t v_which_palette = 0; +- uint32_t v_num_palette_entries = 0; +- uint32_t v_i = 0; +- uint32_t v_argb = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint8_t v_lw = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_table_entry = 0; ++ uint32_t v_table_entry_n_bits = 0; ++ uint32_t v_lmask = 0; ++ uint32_t v_dmask = 0; ++ uint32_t v_b0 = 0; ++ uint32_t v_redir_top = 0; ++ uint32_t v_redir_mask = 0; ++ uint32_t v_b1 = 0; ++ uint32_t v_length = 0; ++ uint32_t v_b2 = 0; ++ uint32_t v_b3 = 0; ++ uint32_t v_b4 = 0; ++ uint32_t v_dist_minus_1 = 0; ++ uint32_t v_b5 = 0; ++ uint32_t v_n_copied = 0; ++ uint32_t v_hlen = 0; ++ uint32_t v_hdist = 0; + ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -38807,139 +40341,275 @@ wuffs_gif__decoder__decode_id_part1( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_id_part1[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow; + if (coro_susp_point) { +- v_which_palette = self->private_data.s_decode_id_part1[0].v_which_palette; +- v_num_palette_entries = self->private_data.s_decode_id_part1[0].v_num_palette_entries; +- v_i = self->private_data.s_decode_id_part1[0].v_i; ++ v_bits = self->private_data.s_decode_huffman_slow.v_bits; ++ v_n_bits = self->private_data.s_decode_huffman_slow.v_n_bits; ++ v_table_entry_n_bits = self->private_data.s_decode_huffman_slow.v_table_entry_n_bits; ++ v_lmask = self->private_data.s_decode_huffman_slow.v_lmask; ++ v_dmask = self->private_data.s_decode_huffman_slow.v_dmask; ++ v_redir_top = self->private_data.s_decode_huffman_slow.v_redir_top; ++ v_redir_mask = self->private_data.s_decode_huffman_slow.v_redir_mask; ++ v_length = self->private_data.s_decode_huffman_slow.v_length; ++ v_dist_minus_1 = self->private_data.s_decode_huffman_slow.v_dist_minus_1; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_flags = t_0; +- } +- if ((v_flags & 64u) != 0u) { +- self->private_impl.f_interlace = 4u; +- } else { +- self->private_impl.f_interlace = 0u; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); ++ goto exit; + } +- v_which_palette = 1u; +- if ((v_flags & 128u) != 0u) { +- v_num_palette_entries = (((uint32_t)(1u)) << (1u + (v_flags & 7u))); +- v_i = 0u; +- while (v_i < v_num_palette_entries) { ++ v_bits = self->private_impl.f_bits; ++ v_n_bits = self->private_impl.f_n_bits; ++ v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u); ++ v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u); ++ label__loop__continue:; ++ while ( ! (self->private_impl.p_decode_huffman_slow != 0)) { ++ while (true) { ++ v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ if (v_n_bits >= v_table_entry_n_bits) { ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ break; ++ } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { +- t_1 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); +- iop_a_src += 3; +- } else { +- self->private_data.s_decode_id_part1[0].scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_0 = *iop_a_src++; ++ v_b0 = t_0; ++ } ++ v_bits |= (v_b0 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ if ((v_table_entry >> 31u) != 0u) { ++ self->private_data.s_decode_huffman_slow.scratch = ((uint8_t)((v_table_entry >> 8u))); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (iop_a_dst == io2_a_dst) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ goto suspend; ++ } ++ *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow.scratch)); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ while (true) { ++ v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ if (v_n_bits >= v_table_entry_n_bits) { ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ break; ++ } ++ { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_id_part1[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 16) { +- t_1 = ((uint32_t)(*scratch >> 40)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint32_t t_1 = *iop_a_src++; ++ v_b1 = t_1; + } +- v_argb = t_1; ++ v_bits |= (v_b1 << v_n_bits); ++ v_n_bits += 8u; + } +- v_argb |= 4278190080u; +- self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); +- self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); +- self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); +- self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); +- v_i += 1u; ++ if ((v_table_entry >> 31u) != 0u) { ++ self->private_data.s_decode_huffman_slow.scratch = ((uint8_t)((v_table_entry >> 8u))); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (iop_a_dst == io2_a_dst) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ goto suspend; ++ } ++ *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow.scratch)); ++ continue; ++ } else if ((v_table_entry >> 30u) != 0u) { ++ } else if ((v_table_entry >> 29u) != 0u) { ++ self->private_impl.f_end_of_block = true; ++ break; ++ } else if ((v_table_entry >> 28u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; ++ } ++ } else if ((v_table_entry >> 27u) != 0u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); ++ goto exit; + } +- while (v_i < 256u) { +- self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = 0u; +- self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = 0u; +- self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = 0u; +- self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = 255u; +- v_i += 1u; ++ v_length = (((v_table_entry >> 8u) & 255u) + 3u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_table_entry_n_bits > 0u) { ++ while (v_n_bits < v_table_entry_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_2 = *iop_a_src++; ++ v_b2 = t_2; ++ } ++ v_bits |= (v_b2 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ v_length = (((v_length + 253u + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; + } +- } else if (self->private_impl.f_quirks[6u] && ! self->private_impl.f_has_global_palette) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_palette); +- goto exit; +- } else if (self->private_impl.f_gc_has_transparent_index) { +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_palettes[1u], 1024), wuffs_base__make_slice_u8(self->private_data.f_palettes[0u], 1024)); +- } else { +- v_which_palette = 0u; +- } +- if (self->private_impl.f_gc_has_transparent_index) { +- self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 0u)] = 0u; +- self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 1u)] = 0u; +- self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 2u)] = 0u; +- self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 3u)] = 0u; +- } +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), +- wuffs_base__utility__make_pixel_format(2198077448u), +- wuffs_base__make_slice_u8(self->private_data.f_palettes[v_which_palette], 1024), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ while (true) { ++ v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ if (v_n_bits >= v_table_entry_n_bits) { ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_3 = *iop_a_src++; ++ v_b3 = t_3; ++ } ++ v_bits |= (v_b3 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ if ((v_table_entry >> 28u) == 1u) { ++ v_redir_top = ((v_table_entry >> 8u) & 65535u); ++ v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u); ++ while (true) { ++ v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)]; ++ v_table_entry_n_bits = (v_table_entry & 15u); ++ if (v_n_bits >= v_table_entry_n_bits) { ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_4 = *iop_a_src++; ++ v_b4 = t_4; ++ } ++ v_bits |= (v_b4 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ } ++ if ((v_table_entry >> 24u) != 64u) { ++ if ((v_table_entry >> 24u) == 8u) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state); + goto exit; + } +- goto ok; +- } +- if (self->private_impl.f_ignored_but_affects_benchmarks) { +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u); ++ v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u); ++ if (v_table_entry_n_bits > 0u) { ++ while (v_n_bits < v_table_entry_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_5 = *iop_a_src++; ++ v_b5 = t_5; ++ } ++ v_bits |= (v_b5 << v_n_bits); ++ v_n_bits += 8u; ++ } ++ v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u); ++ v_bits >>= v_table_entry_n_bits; ++ v_n_bits -= v_table_entry_n_bits; ++ } ++ while (true) { ++ if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_hdist < v_length) { ++ v_hlen = v_hdist; ++ } else { ++ v_hlen = v_length; ++ } ++ v_hdist += ((uint32_t)(((uint64_t)(self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u))))); ++ if (self->private_impl.f_history_index < v_hdist) { ++ status = wuffs_base__make_status(wuffs_deflate__error__bad_distance); ++ goto exit; ++ } ++ v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025)); ++ if (v_n_copied < v_hlen) { ++ v_length -= v_n_copied; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ continue; ++ } ++ v_length -= v_hlen; ++ if (v_length == 0u) { ++ goto label__loop__continue; ++ } ++ } ++ v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_history( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u)); ++ if (v_length <= v_n_copied) { ++ goto label__loop__continue; ++ } ++ v_length -= v_n_copied; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); + } +- uint8_t t_2 = *iop_a_src++; +- v_lw = t_2; + } +- if (v_lw > 8u) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width); ++ self->private_impl.f_bits = v_bits; ++ self->private_impl.f_n_bits = v_n_bits; ++ if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) { ++ status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits); + goto exit; + } +- self->private_impl.f_lzw_pending_literal_width_plus_one = ((uint32_t)((1u + v_lw))); +- self->private_impl.f_ignored_but_affects_benchmarks = true; + + ok: +- self->private_impl.p_decode_id_part1[0] = 0; ++ self->private_impl.p_decode_huffman_slow = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_id_part1[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_id_part1[0].v_which_palette = v_which_palette; +- self->private_data.s_decode_id_part1[0].v_num_palette_entries = v_num_palette_entries; +- self->private_data.s_decode_id_part1[0].v_i = v_i; ++ self->private_impl.p_decode_huffman_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_huffman_slow.v_bits = v_bits; ++ self->private_data.s_decode_huffman_slow.v_n_bits = v_n_bits; ++ self->private_data.s_decode_huffman_slow.v_table_entry_n_bits = v_table_entry_n_bits; ++ self->private_data.s_decode_huffman_slow.v_lmask = v_lmask; ++ self->private_data.s_decode_huffman_slow.v_dmask = v_dmask; ++ self->private_data.s_decode_huffman_slow.v_redir_top = v_redir_top; ++ self->private_data.s_decode_huffman_slow.v_redir_mask = v_redir_mask; ++ self->private_data.s_decode_huffman_slow.v_length = v_length; ++ self->private_data.s_decode_huffman_slow.v_dist_minus_1 = v_dist_minus_1; + + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -38947,782 +40617,538 @@ wuffs_gif__decoder__decode_id_part1( + return status; + } + +-// -------- func gif.decoder.decode_id_part2 ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_gif__error__bad_lzw_code[] = "#gif: bad LZW code"; ++const char wuffs_gif__error__bad_extension_label[] = "#gif: bad extension label"; ++const char wuffs_gif__error__bad_frame_size[] = "#gif: bad frame size"; ++const char wuffs_gif__error__bad_graphic_control[] = "#gif: bad graphic control"; ++const char wuffs_gif__error__bad_header[] = "#gif: bad header"; ++const char wuffs_gif__error__bad_literal_width[] = "#gif: bad literal width"; ++const char wuffs_gif__error__bad_palette[] = "#gif: bad palette"; ++const char wuffs_gif__error__truncated_input[] = "#gif: truncated input"; ++const char wuffs_gif__error__internal_error_inconsistent_i_o[] = "#gif: internal error: inconsistent I/O"; ++ ++// ---------------- Private Consts ++ ++static const uint32_t ++WUFFS_GIF__INTERLACE_START[5] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 4294967295u, 1u, 2u, 4u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__INTERLACE_DELTA[5] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1u, 2u, 4u, 8u, 8u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__INTERLACE_COUNT[5] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 1u, 2u, 4u, 8u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__ANIMEXTS1DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 65u, 78u, 73u, 77u, 69u, 88u, 84u, 83u, ++ 49u, 46u, 48u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__NETSCAPE2DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 78u, 69u, 84u, 83u, 67u, 65u, 80u, 69u, ++ 50u, 46u, 48u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__ICCRGBG1012[11] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 73u, 67u, 67u, 82u, 71u, 66u, 71u, 49u, ++ 48u, 49u, 50u, ++}; ++ ++static const uint8_t ++WUFFS_GIF__XMPDATAXMP[11] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 88u, 77u, 80u, 32u, 68u, 97u, 116u, 97u, ++ 88u, 77u, 80u, ++}; ++ ++#define WUFFS_GIF__QUIRKS_BASE 1041635328u ++ ++#define WUFFS_GIF__QUIRKS_COUNT 7u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gif__decoder__decode_id_part2( ++wuffs_gif__decoder__do_decode_image_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__do_tell_me_more( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__do_decode_frame_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__skip_frame( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__do_decode_frame( + wuffs_gif__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint64_t v_block_size = 0; +- bool v_need_block_size = false; +- uint32_t v_n_copied = 0; +- uint64_t v_n_compressed = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint64_t v_mark = 0; +- wuffs_base__status v_copy_status = wuffs_base__make_status(NULL); ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_gif__decoder__reset_gc( ++ wuffs_gif__decoder* self); + +- uint32_t coro_susp_point = self->private_impl.p_decode_id_part2[0]; +- if (coro_susp_point) { +- v_block_size = self->private_data.s_decode_id_part2[0].v_block_size; +- v_need_block_size = self->private_data.s_decode_id_part2[0].v_need_block_size; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_up_to_id_part1( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- wuffs_gif__decoder__lzw_init(self); +- v_need_block_size = true; +- label__outer__continue:; +- while (true) { +- if (v_need_block_size) { +- v_need_block_size = false; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t t_0 = *iop_a_src++; +- v_block_size = t_0; +- } +- } +- if (v_block_size == 0u) { +- break; +- } +- while (((uint64_t)(io2_a_src - iop_a_src)) == 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- } +- if (self->private_impl.f_compressed_ri == self->private_impl.f_compressed_wi) { +- self->private_impl.f_compressed_ri = 0u; +- self->private_impl.f_compressed_wi = 0u; +- } +- while (self->private_impl.f_compressed_wi <= 3841u) { +- v_n_compressed = wuffs_base__u64__min(v_block_size, ((uint64_t)(io2_a_src - iop_a_src))); +- if (v_n_compressed <= 0u) { +- break; +- } +- v_n_copied = wuffs_base__io_reader__limited_copy_u32_to_slice( +- &iop_a_src, io2_a_src,((uint32_t)(v_n_compressed)), wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, self->private_impl.f_compressed_wi, 4096)); +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_compressed_wi, ((uint64_t)(v_n_copied))); +- wuffs_base__u64__sat_sub_indirect(&v_block_size, ((uint64_t)(v_n_copied))); +- if (v_block_size > 0u) { +- break; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- v_need_block_size = true; +- break; +- } +- v_block_size = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); +- iop_a_src += 1u; +- } +- while (true) { +- if ((self->private_impl.f_compressed_ri > self->private_impl.f_compressed_wi) || (self->private_impl.f_compressed_wi > 4096u)) { +- status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, +- self->private_impl.f_compressed_ri, +- self->private_impl.f_compressed_wi), +- 0u); +- v_mark = ((uint64_t)(iop_v_r - io0_v_r)); +- u_r.meta.ri = ((size_t)(iop_v_r - u_r.data.ptr)); +- wuffs_gif__decoder__lzw_read_from(self, v_r); +- iop_v_r = u_r.data.ptr + u_r.meta.ri; +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_compressed_ri, wuffs_base__io__count_since(v_mark, ((uint64_t)(iop_v_r - io0_v_r)))); +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; +- } +- if (self->private_impl.f_lzw_output_ri < self->private_impl.f_lzw_output_wi) { +- v_copy_status = wuffs_gif__decoder__copy_to_image_buffer(self, a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_lzw_output, +- self->private_impl.f_lzw_output_ri, +- self->private_impl.f_lzw_output_wi)); +- if (wuffs_base__status__is_error(&v_copy_status)) { +- status = v_copy_status; +- goto exit; +- } +- self->private_impl.f_lzw_output_ri = 0u; +- self->private_impl.f_lzw_output_wi = 0u; +- } +- if (self->private_impl.f_lzw_read_from_return_value == 0u) { +- self->private_impl.f_ignored_but_affects_benchmarks = false; +- if (v_need_block_size || (v_block_size > 0u)) { +- self->private_data.s_decode_id_part2[0].scratch = ((uint32_t)(v_block_size)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (self->private_data.s_decode_id_part2[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_id_part2[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_id_part2[0].scratch; +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- status = wuffs_gif__decoder__skip_blocks(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } +- goto label__outer__break; +- } else if (self->private_impl.f_lzw_read_from_return_value == 1u) { +- continue; +- } else if (self->private_impl.f_lzw_read_from_return_value == 2u) { +- goto label__outer__continue; +- } else if (self->private_impl.f_quirks[3u] && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) && (self->private_impl.f_interlace == 0u)) { +- if (v_need_block_size || (v_block_size > 0u)) { +- self->private_data.s_decode_id_part2[0].scratch = ((uint32_t)(v_block_size)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (self->private_data.s_decode_id_part2[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_id_part2[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_id_part2[0].scratch; +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- status = wuffs_gif__decoder__skip_blocks(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } +- goto label__outer__break; +- } else if (self->private_impl.f_lzw_read_from_return_value == 3u) { +- status = wuffs_base__make_status(wuffs_gif__error__truncated_input); +- goto exit; +- } else if (self->private_impl.f_lzw_read_from_return_value == 4u) { +- status = wuffs_base__make_status(wuffs_gif__error__bad_lzw_code); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- } +- label__outer__break:; +- self->private_impl.f_compressed_ri = 0u; +- self->private_impl.f_compressed_wi = 0u; +- if ((self->private_impl.f_dst_y < self->private_impl.f_frame_rect_y1) && (self->private_impl.f_frame_rect_x0 != self->private_impl.f_frame_rect_x1) && (self->private_impl.f_frame_rect_y0 != self->private_impl.f_frame_rect_y1)) { +- status = wuffs_base__make_status(wuffs_base__error__not_enough_data); +- goto exit; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_header( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- ok: +- self->private_impl.p_decode_id_part2[0] = 0; +- goto exit; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_lsd( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- goto suspend; +- suspend: +- self->private_impl.p_decode_id_part2[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_id_part2[0].v_block_size = v_block_size; +- self->private_data.s_decode_id_part2[0].v_need_block_size = v_need_block_size; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_extension( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__skip_blocks( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- return status; +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_ae( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); + +-// -------- func gif.decoder.copy_to_image_buffer ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_gc( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_id_part0( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_id_part1( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_id_part2( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status + wuffs_gif__decoder__copy_to_image_buffer( + wuffs_gif__decoder* self, + wuffs_base__pixel_buffer* a_pb, +- wuffs_base__slice_u8 a_src) { +- wuffs_base__slice_u8 v_dst = {0}; +- wuffs_base__slice_u8 v_src = {0}; +- uint64_t v_width_in_bytes = 0; +- uint64_t v_n = 0; +- uint64_t v_src_ri = 0; +- wuffs_base__pixel_format v_pixfmt = {0}; +- uint32_t v_bytes_per_pixel = 0; +- uint32_t v_bits_per_pixel = 0; +- wuffs_base__table_u8 v_tab = {0}; +- uint64_t v_i = 0; +- uint64_t v_j = 0; +- uint32_t v_replicate_y0 = 0; +- uint32_t v_replicate_y1 = 0; +- wuffs_base__slice_u8 v_replicate_dst = {0}; +- wuffs_base__slice_u8 v_replicate_src = {0}; ++ wuffs_base__slice_u8 a_src); + +- v_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_pb); +- v_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_pixfmt); +- if ((v_bits_per_pixel & 7u) != 0u) { +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_gif__decoder__lzw_init( ++ wuffs_gif__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_gif__decoder__lzw_read_from( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_gif__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_gif__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_gif__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_gif__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_gif__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_gif__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_gif__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_gif__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gif__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_gif__decoder__initialize( ++ wuffs_gif__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- v_bytes_per_pixel = (v_bits_per_pixel >> 3u); +- v_width_in_bytes = ((uint64_t)((self->private_impl.f_width * v_bytes_per_pixel))); +- v_tab = wuffs_base__pixel_buffer__plane(a_pb, 0u); +- while (v_src_ri < ((uint64_t)(a_src.len))) { +- v_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_ri); +- if (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) { +- if (self->private_impl.f_quirks[3u]) { +- return wuffs_base__make_status(NULL); +- } +- return wuffs_base__make_status(wuffs_base__error__too_much_data); +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, 0u); +- } else if (v_width_in_bytes < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_width_in_bytes); +- } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_bytes_per_pixel))); +- if (v_i < ((uint64_t)(v_dst.len))) { +- v_j = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * ((uint64_t)(v_bytes_per_pixel))); +- if ((v_i <= v_j) && (v_j <= ((uint64_t)(v_dst.len)))) { +- v_dst = wuffs_base__slice_u8__subslice_ij(v_dst, v_i, v_j); +- } else { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i); +- } +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024), v_src); +- wuffs_base__u64__sat_add_indirect(&v_src_ri, v_n); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1u)); +- } +- if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) { +- self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; +- if (self->private_impl.f_interlace == 0u) { +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_y, 1u); +- continue; +- } +- if ((self->private_impl.f_num_decoded_frames_value == 0u) && ! self->private_impl.f_gc_has_transparent_index && (self->private_impl.f_interlace > 1u)) { +- v_replicate_src = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- v_replicate_y0 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1u); +- v_replicate_y1 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_COUNT[self->private_impl.f_interlace]))); +- v_replicate_y1 = wuffs_base__u32__min(v_replicate_y1, self->private_impl.f_frame_rect_y1); +- while (v_replicate_y0 < v_replicate_y1) { +- v_replicate_dst = wuffs_base__table_u8__row_u32(v_tab, v_replicate_y0); +- wuffs_base__slice_u8__copy_from_slice(v_replicate_dst, v_replicate_src); +- v_replicate_y0 += 1u; +- } +- self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, v_replicate_y1); +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace]))); +- while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) { +-#if defined(__GNUC__) ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) + #pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_interlace -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" + #endif +- self->private_impl.f_dst_y = wuffs_base__u32__sat_add(self->private_impl.f_frame_rect_y0, WUFFS_GIF__INTERLACE_START[self->private_impl.f_interlace]); +- } +- continue; +- } +- if (((uint64_t)(a_src.len)) == v_src_ri) { +- break; +- } else if (((uint64_t)(a_src.len)) < v_src_ri) { +- return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +- v_n = ((uint64_t)((self->private_impl.f_frame_rect_x1 - self->private_impl.f_dst_x))); +- v_n = wuffs_base__u64__min(v_n, (((uint64_t)(a_src.len)) - v_src_ri)); +- wuffs_base__u64__sat_add_indirect(&v_src_ri, v_n); +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) { +- self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace]))); +- while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_interlace -= 1u; +-#if defined(__GNUC__) ++#if !defined(__clang__) && defined(__GNUC__) + #pragma GCC diagnostic pop + #endif +- self->private_impl.f_dst_y = wuffs_base__u32__sat_add(self->private_impl.f_frame_rect_y0, WUFFS_GIF__INTERLACE_START[self->private_impl.f_interlace]); +- } +- continue; +- } +- if (v_src_ri != ((uint64_t)(a_src.len))) { +- return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } +- break; + } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder); + return wuffs_base__make_status(NULL); + } + +-// -------- func gif.decoder.lzw_init ++wuffs_gif__decoder* ++wuffs_gif__decoder__alloc(void) { ++ wuffs_gif__decoder* x = ++ (wuffs_gif__decoder*)(calloc(1, sizeof(wuffs_gif__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_gif__decoder__initialize( ++ x, sizeof(wuffs_gif__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_gif__decoder__lzw_init( +- wuffs_gif__decoder* self) { +- uint32_t v_i = 0; ++size_t ++sizeof__wuffs_gif__decoder(void) { ++ return sizeof(wuffs_gif__decoder); ++} + +- self->private_impl.f_lzw_literal_width = 8u; +- if (self->private_impl.f_lzw_pending_literal_width_plus_one > 0u) { +- self->private_impl.f_lzw_literal_width = (self->private_impl.f_lzw_pending_literal_width_plus_one - 1u); ++// ---------------- Function Implementations ++ ++// -------- func gif.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_gif__decoder__get_quirk( ++ const wuffs_gif__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; + } +- self->private_impl.f_lzw_clear_code = (((uint32_t)(1u)) << self->private_impl.f_lzw_literal_width); +- self->private_impl.f_lzw_end_code = (self->private_impl.f_lzw_clear_code + 1u); +- self->private_impl.f_lzw_save_code = self->private_impl.f_lzw_end_code; +- self->private_impl.f_lzw_prev_code = self->private_impl.f_lzw_end_code; +- self->private_impl.f_lzw_width = (self->private_impl.f_lzw_literal_width + 1u); +- self->private_impl.f_lzw_bits = 0u; +- self->private_impl.f_lzw_n_bits = 0u; +- self->private_impl.f_lzw_output_ri = 0u; +- self->private_impl.f_lzw_output_wi = 0u; +- v_i = 0u; +- while (v_i < self->private_impl.f_lzw_clear_code) { +- self->private_data.f_lzw_lm1s[v_i] = 0u; +- self->private_data.f_lzw_suffixes[v_i][0u] = ((uint8_t)(v_i)); +- v_i += 1u; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } +- return wuffs_base__make_empty_struct(); ++ ++ uint32_t v_key = 0; ++ ++ if (a_key >= 1041635328u) { ++ v_key = (a_key - 1041635328u); ++ if (v_key < 7u) { ++ if (self->private_impl.f_quirks[v_key]) { ++ return 1u; ++ } ++ } ++ } ++ return 0u; + } + +-// -------- func gif.decoder.lzw_read_from ++// -------- func gif.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_gif__decoder__lzw_read_from( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gif__decoder__set_quirk( + wuffs_gif__decoder* self, +- wuffs_base__io_buffer* a_src) { +- uint32_t v_clear_code = 0; +- uint32_t v_end_code = 0; +- uint32_t v_save_code = 0; +- uint32_t v_prev_code = 0; +- uint32_t v_width = 0; +- uint32_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_output_wi = 0; +- uint32_t v_code = 0; +- uint32_t v_c = 0; +- uint32_t v_o = 0; +- uint32_t v_steps = 0; +- uint8_t v_first_byte = 0; +- uint16_t v_lm1_b = 0; +- uint16_t v_lm1_a = 0; ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ if ((self->private_impl.f_call_sequence == 0u) && (a_key >= 1041635328u)) { ++ a_key -= 1041635328u; ++ if (a_key < 7u) { ++ self->private_impl.f_quirks[a_key] = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } + } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} + +- v_clear_code = self->private_impl.f_lzw_clear_code; +- v_end_code = self->private_impl.f_lzw_end_code; +- v_save_code = self->private_impl.f_lzw_save_code; +- v_prev_code = self->private_impl.f_lzw_prev_code; +- v_width = self->private_impl.f_lzw_width; +- v_bits = self->private_impl.f_lzw_bits; +- v_n_bits = self->private_impl.f_lzw_n_bits; +- v_output_wi = self->private_impl.f_lzw_output_wi; +- while (true) { +- if (v_n_bits < v_width) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { +- v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits)); +- iop_a_src += ((31u - v_n_bits) >> 3u); +- v_n_bits |= 24u; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- self->private_impl.f_lzw_read_from_return_value = 3u; +- } else { +- self->private_impl.f_lzw_read_from_return_value = 2u; +- } +- break; +- } else { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- if (v_n_bits >= v_width) { +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- self->private_impl.f_lzw_read_from_return_value = 3u; +- } else { +- self->private_impl.f_lzw_read_from_return_value = 2u; +- } +- break; +- } else { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- if (v_n_bits < v_width) { +- self->private_impl.f_lzw_read_from_return_value = 5u; +- break; +- } +- } +- } +- } +- v_code = ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_width)); +- v_bits >>= v_width; +- v_n_bits -= v_width; +- if (v_code < v_clear_code) { +- self->private_data.f_lzw_output[v_output_wi] = ((uint8_t)(v_code)); +- v_output_wi = ((v_output_wi + 1u) & 8191u); +- if (v_save_code <= 4095u) { +- v_lm1_a = (((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u); +- self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_a; +- if ((v_lm1_a % 8u) != 0u) { +- self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code]; +- memcpy(self->private_data.f_lzw_suffixes[v_save_code],self->private_data.f_lzw_suffixes[v_prev_code], sizeof(self->private_data.f_lzw_suffixes[v_save_code])); +- self->private_data.f_lzw_suffixes[v_save_code][(v_lm1_a % 8u)] = ((uint8_t)(v_code)); +- } else { +- self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); +- self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_code)); +- } +- v_save_code += 1u; +- if (v_width < 12u) { +- v_width += (1u & (v_save_code >> v_width)); +- } +- v_prev_code = v_code; +- } +- } else if (v_code <= v_end_code) { +- if (v_code == v_end_code) { +- self->private_impl.f_lzw_read_from_return_value = 0u; +- break; +- } +- v_save_code = v_end_code; +- v_prev_code = v_end_code; +- v_width = (self->private_impl.f_lzw_literal_width + 1u); +- } else if (v_code <= v_save_code) { +- v_c = v_code; +- if (v_code == v_save_code) { +- v_c = v_prev_code; +- } +- v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) & 4294967288u)) & 8191u); +- v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lzw_lm1s[v_c]))) & 8191u); +- v_steps = (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) >> 3u); +- while (true) { +- memcpy((self->private_data.f_lzw_output)+(v_o), (self->private_data.f_lzw_suffixes[v_c]), 8u); +- if (v_steps <= 0u) { +- break; +- } +- v_steps -= 1u; +- v_o = (((uint32_t)(v_o - 8u)) & 8191u); +- v_c = ((uint32_t)(self->private_impl.f_lzw_prefixes[v_c])); +- } +- v_first_byte = self->private_data.f_lzw_suffixes[v_c][0u]; +- if (v_code == v_save_code) { +- self->private_data.f_lzw_output[v_output_wi] = v_first_byte; +- v_output_wi = ((v_output_wi + 1u) & 8191u); +- } +- if (v_save_code <= 4095u) { +- v_lm1_b = (((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u); +- self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_b; +- if ((v_lm1_b % 8u) != 0u) { +- self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code]; +- memcpy(self->private_data.f_lzw_suffixes[v_save_code],self->private_data.f_lzw_suffixes[v_prev_code], sizeof(self->private_data.f_lzw_suffixes[v_save_code])); +- self->private_data.f_lzw_suffixes[v_save_code][(v_lm1_b % 8u)] = v_first_byte; +- } else { +- self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); +- self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte)); +- } +- v_save_code += 1u; +- if (v_width < 12u) { +- v_width += (1u & (v_save_code >> v_width)); +- } +- v_prev_code = v_code; +- } +- } else { +- self->private_impl.f_lzw_read_from_return_value = 4u; +- break; +- } +- if (v_output_wi > 4095u) { +- self->private_impl.f_lzw_read_from_return_value = 1u; +- break; +- } ++// -------- func gif.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gif__decoder__decode_image_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if (self->private_impl.f_lzw_read_from_return_value != 2u) { +- while (v_n_bits >= 8u) { +- v_n_bits -= 8u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- self->private_impl.f_lzw_read_from_return_value = 5u; +- break; +- } +- } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } +- self->private_impl.f_lzw_save_code = v_save_code; +- self->private_impl.f_lzw_prev_code = v_prev_code; +- self->private_impl.f_lzw_width = v_width; +- self->private_impl.f_lzw_bits = v_bits; +- self->private_impl.f_lzw_n_bits = v_n_bits; +- self->private_impl.f_lzw_output_wi = v_output_wi; +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- return wuffs_base__make_empty_struct(); +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-// ---------------- Status Codes Implementations ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_gif__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } + +-const char wuffs_gzip__error__bad_checksum[] = "#gzip: bad checksum"; +-const char wuffs_gzip__error__bad_compression_method[] = "#gzip: bad compression method"; +-const char wuffs_gzip__error__bad_encoding_flags[] = "#gzip: bad encoding flags"; +-const char wuffs_gzip__error__bad_header[] = "#gzip: bad header"; +-const char wuffs_gzip__error__truncated_input[] = "#gzip: truncated input"; ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } + +-// ---------------- Private Consts ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + +-// ---------------- Private Initializer Prototypes ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} + +-// ---------------- Private Function Prototypes ++// -------- func gif.decoder.do_decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gzip__decoder__do_transform_io( +- wuffs_gzip__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); +- +-// ---------------- VTables +- +-const wuffs_base__io_transformer__func_ptrs +-wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer = { +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_gzip__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_gzip__decoder__history_retain_length), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_gzip__decoder__set_quirk), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_gzip__decoder__transform_io), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gzip__decoder__workbuf_len), +-}; ++wuffs_gif__decoder__do_decode_image_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// ---------------- Initializer Implementations ++ bool v_ffio = false; + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_gzip__decoder__initialize( +- wuffs_gzip__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if ( ! self->private_impl.f_seen_header) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_gif__decoder__decode_header(self, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_gif__decoder__decode_lsd(self, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_header = true; + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); ++ if (status.repr) { ++ goto suspend; + } +- } +- +- { +- wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( +- &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options); +- if (z.repr) { +- return z; ++ v_ffio = ! self->private_impl.f_gc_has_transparent_index; ++ if ( ! self->private_impl.f_quirks[2u]) { ++ v_ffio = (v_ffio && ++ (self->private_impl.f_frame_rect_x0 == 0u) && ++ (self->private_impl.f_frame_rect_y0 == 0u) && ++ (self->private_impl.f_frame_rect_x1 == self->private_impl.f_width) && ++ (self->private_impl.f_frame_rect_y1 == self->private_impl.f_height)); ++ } else if (v_ffio) { ++ self->private_impl.f_black_color_u32_argb_premul = 4278190080u; + } +- } +- { +- wuffs_base__status z = wuffs_deflate__decoder__initialize( +- &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options); +- if (z.repr) { +- return z; ++ if (self->private_impl.f_background_color_u32_argb_premul == 77u) { ++ self->private_impl.f_background_color_u32_argb_premul = self->private_impl.f_black_color_u32_argb_premul; ++ } ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ 2198077448u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ v_ffio); ++ } ++ if (self->private_impl.f_call_sequence == 0u) { ++ self->private_impl.f_call_sequence = 32u; + } +- } +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = +- wuffs_base__io_transformer__vtable_name; +- self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = +- (const void*)(&wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer); +- return wuffs_base__make_status(NULL); +-} + +-wuffs_gzip__decoder* +-wuffs_gzip__decoder__alloc(void) { +- wuffs_gzip__decoder* x = +- (wuffs_gzip__decoder*)(calloc(sizeof(wuffs_gzip__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_gzip__decoder__initialize( +- x, sizeof(wuffs_gzip__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; + } +- return x; +-} +- +-size_t +-sizeof__wuffs_gzip__decoder(void) { +- return sizeof(wuffs_gzip__decoder); +-} + +-// ---------------- Function Implementations +- +-// -------- func gzip.decoder.get_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gzip__decoder__get_quirk( +- const wuffs_gzip__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +- if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { +- return 1u; +- } +- return 0u; ++ goto exit; ++ exit: ++ return status; + } + +-// -------- func gzip.decoder.set_quirk ++// -------- func gif.decoder.set_report_metadata + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gzip__decoder__set_quirk( +- wuffs_gzip__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_gif__decoder__set_report_metadata( ++ wuffs_gif__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- if (a_key == 1u) { +- self->private_impl.f_ignore_checksum = (a_value > 0u); +- return wuffs_base__make_status(NULL); +- } +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +-} +- +-// -------- func gzip.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_gzip__decoder__history_retain_length( +- const wuffs_gzip__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ return wuffs_base__make_empty_struct(); + } + +- return 0u; +-} +- +-// -------- func gzip.decoder.workbuf_len +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_gzip__decoder__workbuf_len( +- const wuffs_gzip__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ if (a_fourcc == 1229144912u) { ++ self->private_impl.f_report_metadata_iccp = a_report; ++ } else if (a_fourcc == 1481461792u) { ++ self->private_impl.f_report_metadata_xmp = a_report; + } +- +- return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func gzip.decoder.transform_io ++// -------- func gif.decoder.tell_me_more + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_gzip__decoder__transform_io( +- wuffs_gzip__decoder* self, ++wuffs_gif__decoder__tell_me_more( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -39737,7 +41163,7 @@ wuffs_gzip__decoder__transform_io( + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { ++ (self->private_impl.active_coroutine != 2)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -39746,17 +41172,17 @@ wuffs_gzip__decoder__transform_io( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; ++ uint32_t coro_susp_point = self->private_impl.p_tell_me_more; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_gzip__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ wuffs_base__status t_0 = wuffs_gif__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_gzip__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_gif__error__truncated_input); + goto exit; + } + status = v_status; +@@ -39764,14 +41190,14 @@ wuffs_gzip__decoder__transform_io( + } + + ok: +- self->private_impl.p_transform_io[0] = 0; ++ self->private_impl.p_tell_me_more = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + + goto exit; + exit: +@@ -39781,40 +41207,19 @@ wuffs_gzip__decoder__transform_io( + return status; + } + +-// -------- func gzip.decoder.do_transform_io ++// -------- func gif.decoder.do_tell_me_more + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_gzip__decoder__do_transform_io( +- wuffs_gzip__decoder* self, ++wuffs_gif__decoder__do_tell_me_more( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_flags = 0; +- uint16_t v_xlen = 0; +- uint64_t v_mark = 0; +- uint32_t v_checksum_got = 0; +- uint32_t v_decoded_length_got = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint32_t v_checksum_want = 0; +- uint32_t v_decoded_length_want = 0; ++ uint64_t v_chunk_length = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -39826,269 +41231,95 @@ wuffs_gzip__decoder__do_transform_io( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0]; +- if (coro_susp_point) { +- v_flags = self->private_data.s_do_transform_io[0].v_flags; +- v_checksum_got = self->private_data.s_do_transform_io[0].v_checksum_got; +- v_decoded_length_got = self->private_data.s_do_transform_io[0].v_decoded_length_got; +- v_checksum_want = self->private_data.s_do_transform_io[0].v_checksum_want; +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c != 31u) { +- status = wuffs_base__make_status(wuffs_gzip__error__bad_header); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- if (v_c != 139u) { +- status = wuffs_base__make_status(wuffs_gzip__error__bad_header); ++ if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) == 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; +- } +- if (v_c != 8u) { +- status = wuffs_base__make_status(wuffs_gzip__error__bad_compression_method); ++ if (self->private_impl.f_metadata_fourcc == 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); + goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_flags = t_3; +- } +- self->private_data.s_do_transform_io[0].scratch = 6u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (self->private_data.s_do_transform_io[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_transform_io[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_transform_io[0].scratch; +- if ((v_flags & 4u) != 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint16_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_transform_io[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 8) { +- t_4 = ((uint16_t)(*scratch)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; +- } +- } +- v_xlen = t_4; +- } +- self->private_data.s_do_transform_io[0].scratch = ((uint32_t)(v_xlen)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (self->private_data.s_do_transform_io[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_transform_io[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_transform_io[0].scratch; +- } +- if ((v_flags & 8u) != 0u) { ++ while (true) { + while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if (wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_io_position) { ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ 2u, ++ 0u, ++ self->private_impl.f_metadata_io_position, ++ 0u, ++ 0u); + } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; +- } +- if (v_c == 0u) { +- break; ++ status = wuffs_base__make_status(wuffs_base__suspension__mispositioned_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; + } +- } +- } +- if ((v_flags & 16u) != 0u) { +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ 0u, ++ 0u, ++ 0u, ++ 0u, ++ 0u); + } +- uint8_t t_6 = *iop_a_src++; +- v_c = t_6; +- } +- if (v_c == 0u) { +- break; +- } +- } +- } +- if ((v_flags & 2u) != 0u) { +- self->private_data.s_do_transform_io[0].scratch = 2u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- if (self->private_data.s_do_transform_io[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_transform_io[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_transform_io[0].scratch; +- } +- if ((v_flags & 224u) != 0u) { +- status = wuffs_base__make_status(wuffs_gzip__error__bad_encoding_flags); +- goto exit; +- } +- while (true) { +- v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); +- { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_7 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf); +- v_status = t_7; +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ continue; + } ++ break; + } +- if ( ! self->private_impl.f_ignore_checksum) { +- v_checksum_got = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_checksum, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); +- v_decoded_length_got += ((uint32_t)(wuffs_base__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst))))); +- } +- if (wuffs_base__status__is_ok(&v_status)) { ++ v_chunk_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); ++ if (v_chunk_length <= 0u) { ++ iop_a_src += 1u; + break; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12); +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); +- uint32_t t_8; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; ++ if (self->private_impl.f_metadata_fourcc == 1481461792u) { ++ v_chunk_length += 1u; + } else { +- self->private_data.s_do_transform_io[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; +- uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; +- if (num_bits_8 == 24) { +- t_8 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_8 += 8u; +- *scratch |= ((uint64_t)(num_bits_8)) << 56; +- } ++ iop_a_src += 1u; + } +- v_checksum_want = t_8; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); +- uint32_t t_9; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_9 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_transform_io[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; +- uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9; +- if (num_bits_9 == 24) { +- t_9 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_9 += 8u; +- *scratch |= ((uint64_t)(num_bits_9)) << 56; +- } ++ self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add(wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))), v_chunk_length); ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ 3u, ++ self->private_impl.f_metadata_fourcc, ++ 0u, ++ wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))), ++ self->private_impl.f_metadata_io_position); + } +- v_decoded_length_want = t_9; ++ status = wuffs_base__make_status(wuffs_base__suspension__even_more_information); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); + } +- if ( ! self->private_impl.f_ignore_checksum && ((v_checksum_got != v_checksum_want) || (v_decoded_length_got != v_decoded_length_want))) { +- status = wuffs_base__make_status(wuffs_gzip__error__bad_checksum); +- goto exit; ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ 3u, ++ self->private_impl.f_metadata_fourcc, ++ 0u, ++ self->private_impl.f_metadata_io_position, ++ self->private_impl.f_metadata_io_position); + } ++ self->private_impl.f_call_sequence &= 239u; ++ self->private_impl.f_metadata_fourcc = 0u; ++ self->private_impl.f_metadata_io_position = 0u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; + + ok: +- self->private_impl.p_do_transform_io[0] = 0; ++ self->private_impl.p_do_tell_me_more = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_transform_io[0].v_flags = v_flags; +- self->private_data.s_do_transform_io[0].v_checksum_got = v_checksum_got; +- self->private_data.s_do_transform_io[0].v_decoded_length_got = v_decoded_length_got; +- self->private_data.s_do_transform_io[0].v_checksum_want = v_checksum_want; ++ self->private_impl.p_do_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -40096,2260 +41327,1143 @@ wuffs_gzip__decoder__do_transform_io( + return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) ++// -------- func gif.decoder.num_animation_loops + +-// ---------------- Status Codes Implementations ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_gif__decoder__num_animation_loops( ++ const wuffs_gif__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-const char wuffs_jpeg__error__bad_dht_marker[] = "#jpeg: bad DHT marker"; +-const char wuffs_jpeg__error__bad_dqt_marker[] = "#jpeg: bad DQT marker"; +-const char wuffs_jpeg__error__bad_dri_marker[] = "#jpeg: bad DRI marker"; +-const char wuffs_jpeg__error__bad_sof_marker[] = "#jpeg: bad SOF marker"; +-const char wuffs_jpeg__error__bad_sos_marker[] = "#jpeg: bad SOS marker"; +-const char wuffs_jpeg__error__bad_header[] = "#jpeg: bad header"; +-const char wuffs_jpeg__error__bad_marker[] = "#jpeg: bad marker"; +-const char wuffs_jpeg__error__missing_huffman_table[] = "#jpeg: missing Huffman table"; +-const char wuffs_jpeg__error__missing_quantization_table[] = "#jpeg: missing Quantization table"; +-const char wuffs_jpeg__error__truncated_input[] = "#jpeg: truncated input"; +-const char wuffs_jpeg__error__unsupported_arithmetic_coding[] = "#jpeg: unsupported arithmetic coding"; +-const char wuffs_jpeg__error__unsupported_color_model[] = "#jpeg: unsupported color model"; +-const char wuffs_jpeg__error__unsupported_fractional_sampling[] = "#jpeg: unsupported fractional sampling"; +-const char wuffs_jpeg__error__unsupported_hierarchical_coding[] = "#jpeg: unsupported hierarchical coding"; +-const char wuffs_jpeg__error__unsupported_implicit_height[] = "#jpeg: unsupported implicit height"; +-const char wuffs_jpeg__error__unsupported_lossless_coding[] = "#jpeg: unsupported lossless coding"; +-const char wuffs_jpeg__error__unsupported_marker[] = "#jpeg: unsupported marker"; +-const char wuffs_jpeg__error__unsupported_precision_12_bits[] = "#jpeg: unsupported precision (12 bits)"; +-const char wuffs_jpeg__error__unsupported_precision_16_bits[] = "#jpeg: unsupported precision (16 bits)"; +-const char wuffs_jpeg__error__unsupported_precision[] = "#jpeg: unsupported precision"; +-const char wuffs_jpeg__error__unsupported_scan_count[] = "#jpeg: unsupported scan count"; +-const char wuffs_jpeg__error__internal_error_inconsistent_decoder_state[] = "#jpeg: internal error: inconsistent decoder state"; ++ if (self->private_impl.f_seen_num_animation_loops_value) { ++ return self->private_impl.f_num_animation_loops_value; ++ } ++ if (self->private_impl.f_num_decoded_frame_configs_value > 1u) { ++ return 1u; ++ } ++ return 0u; ++} + +-// ---------------- Private Consts ++// -------- func gif.decoder.num_decoded_frame_configs + +-static const uint8_t +-WUFFS_JPEG__UNZIG[80] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 0, 1, 8, 16, 9, 2, 3, +- 10, 17, 24, 32, 25, 18, 11, 4, +- 5, 12, 19, 26, 33, 40, 48, 41, +- 34, 27, 20, 13, 6, 7, 14, 21, +- 28, 35, 42, 49, 56, 57, 50, 43, +- 36, 29, 22, 15, 23, 30, 37, 44, +- 51, 58, 59, 52, 45, 38, 31, 39, +- 46, 53, 60, 61, 54, 47, 55, 62, +- 63, 63, 63, 63, 63, 63, 63, 63, +- 63, 63, 63, 63, 63, 63, 63, 63, +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_gif__decoder__num_decoded_frame_configs( ++ const wuffs_gif__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-static const uint8_t +-WUFFS_JPEG__BIAS_AND_CLAMP[1024] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 128, 129, 130, 131, 132, 133, 134, 135, +- 136, 137, 138, 139, 140, 141, 142, 143, +- 144, 145, 146, 147, 148, 149, 150, 151, +- 152, 153, 154, 155, 156, 157, 158, 159, +- 160, 161, 162, 163, 164, 165, 166, 167, +- 168, 169, 170, 171, 172, 173, 174, 175, +- 176, 177, 178, 179, 180, 181, 182, 183, +- 184, 185, 186, 187, 188, 189, 190, 191, +- 192, 193, 194, 195, 196, 197, 198, 199, +- 200, 201, 202, 203, 204, 205, 206, 207, +- 208, 209, 210, 211, 212, 213, 214, 215, +- 216, 217, 218, 219, 220, 221, 222, 223, +- 224, 225, 226, 227, 228, 229, 230, 231, +- 232, 233, 234, 235, 236, 237, 238, 239, +- 240, 241, 242, 243, 244, 245, 246, 247, +- 248, 249, 250, 251, 252, 253, 254, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 255, 255, 255, 255, 255, 255, 255, 255, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 1, 2, 3, 4, 5, 6, 7, +- 8, 9, 10, 11, 12, 13, 14, 15, +- 16, 17, 18, 19, 20, 21, 22, 23, +- 24, 25, 26, 27, 28, 29, 30, 31, +- 32, 33, 34, 35, 36, 37, 38, 39, +- 40, 41, 42, 43, 44, 45, 46, 47, +- 48, 49, 50, 51, 52, 53, 54, 55, +- 56, 57, 58, 59, 60, 61, 62, 63, +- 64, 65, 66, 67, 68, 69, 70, 71, +- 72, 73, 74, 75, 76, 77, 78, 79, +- 80, 81, 82, 83, 84, 85, 86, 87, +- 88, 89, 90, 91, 92, 93, 94, 95, +- 96, 97, 98, 99, 100, 101, 102, 103, +- 104, 105, 106, 107, 108, 109, 110, 111, +- 112, 113, 114, 115, 116, 117, 118, 119, +- 120, 121, 122, 123, 124, 125, 126, 127, +-}; ++ return self->private_impl.f_num_decoded_frame_configs_value; ++} + +-static const uint16_t +-WUFFS_JPEG__EXTEND[16] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 65535, 65533, 65529, 65521, 65505, 65473, 65409, +- 65281, 65025, 64513, 63489, 61441, 57345, 49153, 32769, +-}; ++// -------- func gif.decoder.num_decoded_frames + +-static const uint8_t +-WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 0, 1, 5, 1, 1, 1, 1, +- 1, 1, 0, 0, 0, 0, 0, 0, +- 0, 0, 1, 2, 3, 4, 5, 6, +- 7, 8, 9, 10, 11, +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_gif__decoder__num_decoded_frames( ++ const wuffs_gif__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-static const uint8_t +-WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1, 0, 3, 1, 1, 1, 1, 1, +- 1, 1, 1, 1, 0, 0, 0, 0, +- 0, 0, 1, 2, 3, 4, 5, 6, +- 7, 8, 9, 10, 11, +-}; ++ return self->private_impl.f_num_decoded_frames_value; ++} + +-static const uint8_t +-WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 16, 0, 2, 1, 3, 3, 2, 4, +- 3, 5, 5, 4, 4, 0, 0, 1, +- 125, 1, 2, 3, 0, 4, 17, 5, +- 18, 33, 49, 65, 6, 19, 81, 97, +- 7, 34, 113, 20, 50, 129, 145, 161, +- 8, 35, 66, 177, 193, 21, 82, 209, +- 240, 36, 51, 98, 114, 130, 9, 10, +- 22, 23, 24, 25, 26, 37, 38, 39, +- 40, 41, 42, 52, 53, 54, 55, 56, +- 57, 58, 67, 68, 69, 70, 71, 72, +- 73, 74, 83, 84, 85, 86, 87, 88, +- 89, 90, 99, 100, 101, 102, 103, 104, +- 105, 106, 115, 116, 117, 118, 119, 120, +- 121, 122, 131, 132, 133, 134, 135, 136, +- 137, 138, 146, 147, 148, 149, 150, 151, +- 152, 153, 154, 162, 163, 164, 165, 166, +- 167, 168, 169, 170, 178, 179, 180, 181, +- 182, 183, 184, 185, 186, 194, 195, 196, +- 197, 198, 199, 200, 201, 202, 210, 211, +- 212, 213, 214, 215, 216, 217, 218, 225, +- 226, 227, 228, 229, 230, 231, 232, 233, +- 234, 241, 242, 243, 244, 245, 246, 247, +- 248, 249, 250, +-}; ++// -------- func gif.decoder.frame_dirty_rect + +-static const uint8_t +-WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 17, 0, 2, 1, 2, 4, 4, 3, +- 4, 7, 5, 4, 4, 0, 1, 2, +- 119, 0, 1, 2, 3, 17, 4, 5, +- 33, 49, 6, 18, 65, 81, 7, 97, +- 113, 19, 34, 50, 129, 8, 20, 66, +- 145, 161, 177, 193, 9, 35, 51, 82, +- 240, 21, 98, 114, 209, 10, 22, 36, +- 52, 225, 37, 241, 23, 24, 25, 26, +- 38, 39, 40, 41, 42, 53, 54, 55, +- 56, 57, 58, 67, 68, 69, 70, 71, +- 72, 73, 74, 83, 84, 85, 86, 87, +- 88, 89, 90, 99, 100, 101, 102, 103, +- 104, 105, 106, 115, 116, 117, 118, 119, +- 120, 121, 122, 130, 131, 132, 133, 134, +- 135, 136, 137, 138, 146, 147, 148, 149, +- 150, 151, 152, 153, 154, 162, 163, 164, +- 165, 166, 167, 168, 169, 170, 178, 179, +- 180, 181, 182, 183, 184, 185, 186, 194, +- 195, 196, 197, 198, 199, 200, 201, 202, +- 210, 211, 212, 213, 214, 215, 216, 217, +- 218, 226, 227, 228, 229, 230, 231, 232, +- 233, 234, 242, 243, 244, 245, 246, 247, +- 248, 249, 250, +-}; ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_gif__decoder__frame_dirty_rect( ++ const wuffs_gif__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } + +-// ---------------- Private Initializer Prototypes ++ return wuffs_base__utility__make_rect_ie_u32( ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width), ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height), ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width), ++ wuffs_base__u32__min(self->private_impl.f_dirty_max_excl_y, self->private_impl.f_height)); ++} + +-// ---------------- Private Function Prototypes ++// -------- func gif.decoder.workbuf_len + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_gif__decoder__workbuf_len( ++ const wuffs_gif__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct__choosy_default( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q); ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct_x86_avx2( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) ++// -------- func gif.decoder.restart_frame + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_image_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gif__decoder__restart_frame( ++ wuffs_gif__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_dqt( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } else if (a_io_position == 0u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_delayed_num_decoded_frames = false; ++ self->private_impl.f_frame_config_io_position = a_io_position; ++ self->private_impl.f_num_decoded_frame_configs_value = a_index; ++ self->private_impl.f_num_decoded_frames_value = a_index; ++ wuffs_gif__decoder__reset_gc(self); ++ self->private_impl.f_call_sequence = 40u; ++ return wuffs_base__make_status(NULL); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_dri( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++// -------- func gif.decoder.decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_appn( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src, +- uint8_t a_marker); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gif__decoder__decode_frame_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_sof( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__quantize_dimension( +- const wuffs_jpeg__decoder* self, +- uint32_t a_width, +- uint8_t a_h, +- uint8_t a_max_incl_h); ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_frame_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_gif__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_frame( +- wuffs_jpeg__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_dht( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; + +-WUFFS_BASE__GENERATED_C_CODE +-static bool +-wuffs_jpeg__decoder__calculate_huff_tables( +- wuffs_jpeg__decoder* self, +- uint8_t a_tc4_th, +- uint32_t a_total_count); ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_sos( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); ++// -------- func gif.decoder.do_decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__prepare_scan( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++wuffs_gif__decoder__do_decode_frame_config( ++ wuffs_gif__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__use_default_huffman_table( +- wuffs_jpeg__decoder* self, +- uint8_t a_tc4_th); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__calculate_single_component_scan_fields( +- wuffs_jpeg__decoder* self); ++ uint32_t v_background_color = 0; ++ uint8_t v_flags = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-static bool +-wuffs_jpeg__decoder__calculate_multiple_component_scan_fields( +- wuffs_jpeg__decoder* self); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__fill_bitstream( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ if (coro_susp_point) { ++ v_background_color = self->private_data.s_do_decode_frame_config.v_background_color; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__load_mcu_blocks_for_single_component( +- wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel); ++ self->private_impl.f_dirty_max_excl_y = 0u; ++ if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_gif__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_gif__decoder__skip_frame(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_call_sequence >= 96u) { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if ((self->private_impl.f_num_decoded_frame_configs_value > 0u) || (self->private_impl.f_call_sequence == 40u)) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_call_sequence >= 96u) { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ } ++ v_background_color = self->private_impl.f_black_color_u32_argb_premul; ++ if ( ! self->private_impl.f_gc_has_transparent_index) { ++ v_background_color = self->private_impl.f_background_color_u32_argb_premul; ++ if (self->private_impl.f_quirks[1u] && (self->private_impl.f_num_decoded_frame_configs_value == 0u)) { ++ while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ } ++ v_flags = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (((uint8_t)(v_flags & 128u)) != 0u) { ++ v_background_color = self->private_impl.f_black_color_u32_argb_premul; ++ } ++ } ++ } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width), ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height), ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width), ++ wuffs_base__u32__min(self->private_impl.f_frame_rect_y1, self->private_impl.f_height)), ++ ((wuffs_base__flicks)(self->private_impl.f_gc_duration)), ++ self->private_impl.f_num_decoded_frame_configs_value, ++ self->private_impl.f_frame_config_io_position, ++ self->private_impl.f_gc_disposal, ++ ! self->private_impl.f_gc_has_transparent_index, ++ false, ++ v_background_color); ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u); ++ self->private_impl.f_call_sequence = 64u; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default( +- wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel); ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__load_mcu_blocks( +- wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf); ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_frame_config.v_background_color = v_background_color; + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__save_mcu_blocks( +- wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__skip_past_the_next_restart_marker( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src); ++ return status; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__apply_progressive_idct( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf); ++// -------- func gif.decoder.skip_frame + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__swizzle_gray( +- wuffs_jpeg__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf); ++wuffs_gif__decoder__skip_frame( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__swizzle_colorful( +- wuffs_jpeg__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf); ++ uint8_t v_flags = 0; ++ uint8_t v_lw = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-static bool +-wuffs_jpeg__decoder__top_left_quants_has_zero( +- const wuffs_jpeg__decoder* self, +- uint32_t a_q); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth( +- wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel); ++ uint32_t coro_susp_point = self->private_impl.p_skip_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_flags = t_0; ++ } ++ if (((uint8_t)(v_flags & 128u)) != 0u) { ++ self->private_data.s_skip_frame.scratch = (((uint32_t)(3u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u))))); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_skip_frame.scratch; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_lw = t_1; ++ } ++ if (v_lw > 8u) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_gif__decoder__skip_blocks(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_quirks[0u]) { ++ self->private_impl.f_delayed_num_decoded_frames = true; ++ } else { ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ } ++ wuffs_gif__decoder__reset_gc(self); ++ self->private_impl.f_call_sequence = 32u; + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu__choosy_default( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); ++ goto ok; ++ ok: ++ self->private_impl.p_skip_frame = 0; ++ goto exit; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); ++ goto suspend; ++ suspend: ++ self->private_impl.p_skip_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); ++ return status; ++} ++ ++// -------- func gif.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit( +- wuffs_jpeg__decoder* self, ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gif__decoder__decode_frame( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, + wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my); +- +-// ---------------- VTables +- +-const wuffs_base__image_decoder__func_ptrs +-wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_jpeg__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_jpeg__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_jpeg__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_jpeg__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_jpeg__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_jpeg__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_jpeg__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_jpeg__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_jpeg__decoder__initialize( +- wuffs_jpeg__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ ++ wuffs_base__decode_frame_options* a_opts) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } +- +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- self->private_impl.choosy_decode_idct = &wuffs_jpeg__decoder__decode_idct__choosy_default; +- self->private_impl.choosy_load_mcu_blocks_for_single_component = &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default; +- self->private_impl.choosy_decode_mcu = &wuffs_jpeg__decoder__decode_mcu__choosy_default; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); +-} ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-wuffs_jpeg__decoder* +-wuffs_jpeg__decoder__alloc(void) { +- wuffs_jpeg__decoder* x = +- (wuffs_jpeg__decoder*)(calloc(sizeof(wuffs_jpeg__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_jpeg__decoder__initialize( +- x, sizeof(wuffs_jpeg__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_gif__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; + } +- return x; +-} + +-size_t +-sizeof__wuffs_jpeg__decoder(void) { +- return sizeof(wuffs_jpeg__decoder); +-} ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; + +-// ---------------- Function Implementations ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} + +-// -------- func jpeg.decoder.decode_idct ++// -------- func gif.decoder.do_decode_frame + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q) { +- return (*self->private_impl.choosy_decode_idct)(self, a_dst_buffer, a_dst_stride, a_q); +-} ++static wuffs_base__status ++wuffs_gif__decoder__do_decode_frame( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct__choosy_default( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q) { +- uint32_t v_bq0 = 0; +- uint32_t v_bq2 = 0; +- uint32_t v_bq4 = 0; +- uint32_t v_bq6 = 0; +- uint32_t v_ca = 0; +- uint32_t v_cb2 = 0; +- uint32_t v_cb6 = 0; +- uint32_t v_ccp = 0; +- uint32_t v_ccm = 0; +- uint32_t v_cd0 = 0; +- uint32_t v_cd1 = 0; +- uint32_t v_cd2 = 0; +- uint32_t v_cd3 = 0; +- uint32_t v_bq1 = 0; +- uint32_t v_bq3 = 0; +- uint32_t v_bq5 = 0; +- uint32_t v_bq7 = 0; +- uint32_t v_ci51 = 0; +- uint32_t v_ci53 = 0; +- uint32_t v_ci71 = 0; +- uint32_t v_ci73 = 0; +- uint32_t v_cj = 0; +- uint32_t v_ck1 = 0; +- uint32_t v_ck3 = 0; +- uint32_t v_ck5 = 0; +- uint32_t v_ck7 = 0; +- uint32_t v_cl51 = 0; +- uint32_t v_cl73 = 0; +- uint32_t v_in0 = 0; +- uint32_t v_in2 = 0; +- uint32_t v_in4 = 0; +- uint32_t v_in6 = 0; +- uint32_t v_ra = 0; +- uint32_t v_rb2 = 0; +- uint32_t v_rb6 = 0; +- uint32_t v_rcp = 0; +- uint32_t v_rcm = 0; +- uint32_t v_rd0 = 0; +- uint32_t v_rd1 = 0; +- uint32_t v_rd2 = 0; +- uint32_t v_rd3 = 0; +- uint32_t v_in1 = 0; +- uint32_t v_in3 = 0; +- uint32_t v_in5 = 0; +- uint32_t v_in7 = 0; +- uint32_t v_ri51 = 0; +- uint32_t v_ri53 = 0; +- uint32_t v_ri71 = 0; +- uint32_t v_ri73 = 0; +- uint32_t v_rj = 0; +- uint32_t v_rk1 = 0; +- uint32_t v_rk3 = 0; +- uint32_t v_rk5 = 0; +- uint32_t v_rk7 = 0; +- uint32_t v_rl51 = 0; +- uint32_t v_rl73 = 0; +- uint32_t v_intermediate[64] = {0}; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (8u > a_dst_stride) { +- return wuffs_base__make_empty_struct(); +- } +- if (0u == (self->private_data.f_mcu_blocks[0u][8u] | +- self->private_data.f_mcu_blocks[0u][16u] | +- self->private_data.f_mcu_blocks[0u][24u] | +- self->private_data.f_mcu_blocks[0u][32u] | +- self->private_data.f_mcu_blocks[0u][40u] | +- self->private_data.f_mcu_blocks[0u][48u] | +- self->private_data.f_mcu_blocks[0u][56u])) { +- v_intermediate[0u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][0u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][0u])))) << 2u)); +- v_intermediate[8u] = v_intermediate[0u]; +- v_intermediate[16u] = v_intermediate[0u]; +- v_intermediate[24u] = v_intermediate[0u]; +- v_intermediate[32u] = v_intermediate[0u]; +- v_intermediate[40u] = v_intermediate[0u]; +- v_intermediate[48u] = v_intermediate[0u]; +- v_intermediate[56u] = v_intermediate[0u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][16u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][16u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][48u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][48u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][0u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][0u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][32u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][32u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][8u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][8u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][24u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][24u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][40u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][40u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][56u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][56u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[0u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[56u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[8u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[48u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[16u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[40u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[24u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[32u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_gif__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (self->private_impl.f_quirks[5u] && ((self->private_impl.f_frame_rect_x0 == self->private_impl.f_frame_rect_x1) || (self->private_impl.f_frame_rect_y0 == self->private_impl.f_frame_rect_y1))) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_frame_size); ++ goto exit; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_gif__decoder__decode_id_part1(self, a_dst, a_src, a_blend); ++ if (status.repr) { ++ goto suspend; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_gif__decoder__decode_id_part2(self, a_dst, a_src, a_workbuf); ++ if (status.repr) { ++ goto suspend; ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ wuffs_gif__decoder__reset_gc(self); ++ self->private_impl.f_call_sequence = 32u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; + } +- if (0u == (self->private_data.f_mcu_blocks[0u][9u] | +- self->private_data.f_mcu_blocks[0u][17u] | +- self->private_data.f_mcu_blocks[0u][25u] | +- self->private_data.f_mcu_blocks[0u][33u] | +- self->private_data.f_mcu_blocks[0u][41u] | +- self->private_data.f_mcu_blocks[0u][49u] | +- self->private_data.f_mcu_blocks[0u][57u])) { +- v_intermediate[1u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][1u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][1u])))) << 2u)); +- v_intermediate[9u] = v_intermediate[1u]; +- v_intermediate[17u] = v_intermediate[1u]; +- v_intermediate[25u] = v_intermediate[1u]; +- v_intermediate[33u] = v_intermediate[1u]; +- v_intermediate[41u] = v_intermediate[1u]; +- v_intermediate[49u] = v_intermediate[1u]; +- v_intermediate[57u] = v_intermediate[1u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][17u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][17u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][49u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][49u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][1u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][1u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][33u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][33u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][9u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][9u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][25u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][25u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][41u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][41u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][57u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][57u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[1u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[57u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[9u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[49u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[17u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[41u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[25u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[33u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func gif.decoder.reset_gc ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_gif__decoder__reset_gc( ++ wuffs_gif__decoder* self) { ++ self->private_impl.f_gc_has_transparent_index = false; ++ self->private_impl.f_gc_transparent_index = 0u; ++ self->private_impl.f_gc_disposal = 0u; ++ self->private_impl.f_gc_duration = 0u; ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func gif.decoder.decode_up_to_id_part1 ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_up_to_id_part1( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_block_type = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (0u == (self->private_data.f_mcu_blocks[0u][10u] | +- self->private_data.f_mcu_blocks[0u][18u] | +- self->private_data.f_mcu_blocks[0u][26u] | +- self->private_data.f_mcu_blocks[0u][34u] | +- self->private_data.f_mcu_blocks[0u][42u] | +- self->private_data.f_mcu_blocks[0u][50u] | +- self->private_data.f_mcu_blocks[0u][58u])) { +- v_intermediate[2u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][2u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][2u])))) << 2u)); +- v_intermediate[10u] = v_intermediate[2u]; +- v_intermediate[18u] = v_intermediate[2u]; +- v_intermediate[26u] = v_intermediate[2u]; +- v_intermediate[34u] = v_intermediate[2u]; +- v_intermediate[42u] = v_intermediate[2u]; +- v_intermediate[50u] = v_intermediate[2u]; +- v_intermediate[58u] = v_intermediate[2u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][18u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][18u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][50u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][50u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][2u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][2u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][34u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][34u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][10u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][10u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][26u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][26u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][42u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][42u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][58u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][58u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[2u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[58u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[10u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[50u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[18u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[42u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[26u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[34u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_up_to_id_part1; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if ((self->private_impl.f_frame_config_io_position == 0u) || (self->private_impl.f_num_decoded_frame_configs_value > 0u)) { ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_block_type = t_0; ++ } ++ if (v_block_type == 33u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_gif__decoder__decode_extension(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (v_block_type == 44u) { ++ if (self->private_impl.f_delayed_num_decoded_frames) { ++ self->private_impl.f_delayed_num_decoded_frames = false; ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_gif__decoder__decode_id_part0(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ break; ++ } else { ++ if (self->private_impl.f_delayed_num_decoded_frames) { ++ self->private_impl.f_delayed_num_decoded_frames = false; ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ } ++ self->private_impl.f_call_sequence = 96u; ++ break; ++ } ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_up_to_id_part1 = 0; ++ goto exit; + } +- if (0u == (self->private_data.f_mcu_blocks[0u][11u] | +- self->private_data.f_mcu_blocks[0u][19u] | +- self->private_data.f_mcu_blocks[0u][27u] | +- self->private_data.f_mcu_blocks[0u][35u] | +- self->private_data.f_mcu_blocks[0u][43u] | +- self->private_data.f_mcu_blocks[0u][51u] | +- self->private_data.f_mcu_blocks[0u][59u])) { +- v_intermediate[3u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][3u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][3u])))) << 2u)); +- v_intermediate[11u] = v_intermediate[3u]; +- v_intermediate[19u] = v_intermediate[3u]; +- v_intermediate[27u] = v_intermediate[3u]; +- v_intermediate[35u] = v_intermediate[3u]; +- v_intermediate[43u] = v_intermediate[3u]; +- v_intermediate[51u] = v_intermediate[3u]; +- v_intermediate[59u] = v_intermediate[3u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][19u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][19u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][51u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][51u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][3u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][3u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][35u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][35u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][11u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][11u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][27u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][27u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][43u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][43u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][59u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][59u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[3u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[59u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[11u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[51u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[19u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[43u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[27u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[35u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_up_to_id_part1 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (0u == (self->private_data.f_mcu_blocks[0u][12u] | +- self->private_data.f_mcu_blocks[0u][20u] | +- self->private_data.f_mcu_blocks[0u][28u] | +- self->private_data.f_mcu_blocks[0u][36u] | +- self->private_data.f_mcu_blocks[0u][44u] | +- self->private_data.f_mcu_blocks[0u][52u] | +- self->private_data.f_mcu_blocks[0u][60u])) { +- v_intermediate[4u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][4u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][4u])))) << 2u)); +- v_intermediate[12u] = v_intermediate[4u]; +- v_intermediate[20u] = v_intermediate[4u]; +- v_intermediate[28u] = v_intermediate[4u]; +- v_intermediate[36u] = v_intermediate[4u]; +- v_intermediate[44u] = v_intermediate[4u]; +- v_intermediate[52u] = v_intermediate[4u]; +- v_intermediate[60u] = v_intermediate[4u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][20u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][20u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][52u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][52u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][4u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][4u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][36u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][36u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][12u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][12u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][28u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][28u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][44u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][44u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][60u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][60u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[4u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[60u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[12u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[52u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[20u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[44u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[28u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[36u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ return status; ++} ++ ++// -------- func gif.decoder.decode_header ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_header( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint64_t v_c48 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (0u == (self->private_data.f_mcu_blocks[0u][13u] | +- self->private_data.f_mcu_blocks[0u][21u] | +- self->private_data.f_mcu_blocks[0u][29u] | +- self->private_data.f_mcu_blocks[0u][37u] | +- self->private_data.f_mcu_blocks[0u][45u] | +- self->private_data.f_mcu_blocks[0u][53u] | +- self->private_data.f_mcu_blocks[0u][61u])) { +- v_intermediate[5u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][5u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][5u])))) << 2u)); +- v_intermediate[13u] = v_intermediate[5u]; +- v_intermediate[21u] = v_intermediate[5u]; +- v_intermediate[29u] = v_intermediate[5u]; +- v_intermediate[37u] = v_intermediate[5u]; +- v_intermediate[45u] = v_intermediate[5u]; +- v_intermediate[53u] = v_intermediate[5u]; +- v_intermediate[61u] = v_intermediate[5u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][21u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][21u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][53u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][53u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][5u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][5u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][37u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][37u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][13u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][13u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][29u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][29u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][45u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][45u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][61u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][61u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[5u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[61u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[13u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[53u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[21u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[45u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[29u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[37u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_header; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))); ++ iop_a_src += 6; ++ } else { ++ self->private_data.s_decode_header.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_header.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 40) { ++ t_0 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_c48 = t_0; ++ } ++ if ((v_c48 != 106889795225927u) && (v_c48 != 106898385160519u)) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_header); ++ goto exit; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_header = 0; ++ goto exit; + } +- if (0u == (self->private_data.f_mcu_blocks[0u][14u] | +- self->private_data.f_mcu_blocks[0u][22u] | +- self->private_data.f_mcu_blocks[0u][30u] | +- self->private_data.f_mcu_blocks[0u][38u] | +- self->private_data.f_mcu_blocks[0u][46u] | +- self->private_data.f_mcu_blocks[0u][54u] | +- self->private_data.f_mcu_blocks[0u][62u])) { +- v_intermediate[6u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][6u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][6u])))) << 2u)); +- v_intermediate[14u] = v_intermediate[6u]; +- v_intermediate[22u] = v_intermediate[6u]; +- v_intermediate[30u] = v_intermediate[6u]; +- v_intermediate[38u] = v_intermediate[6u]; +- v_intermediate[46u] = v_intermediate[6u]; +- v_intermediate[54u] = v_intermediate[6u]; +- v_intermediate[62u] = v_intermediate[6u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][22u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][22u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][54u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][54u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][6u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][6u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][38u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][38u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][14u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][14u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][30u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][30u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][46u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][46u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][62u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][62u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[6u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[62u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[14u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[54u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[22u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[46u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[30u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[38u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_header = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (0u == (self->private_data.f_mcu_blocks[0u][15u] | +- self->private_data.f_mcu_blocks[0u][23u] | +- self->private_data.f_mcu_blocks[0u][31u] | +- self->private_data.f_mcu_blocks[0u][39u] | +- self->private_data.f_mcu_blocks[0u][47u] | +- self->private_data.f_mcu_blocks[0u][55u] | +- self->private_data.f_mcu_blocks[0u][63u])) { +- v_intermediate[7u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][7u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][7u])))) << 2u)); +- v_intermediate[15u] = v_intermediate[7u]; +- v_intermediate[23u] = v_intermediate[7u]; +- v_intermediate[31u] = v_intermediate[7u]; +- v_intermediate[39u] = v_intermediate[7u]; +- v_intermediate[47u] = v_intermediate[7u]; +- v_intermediate[55u] = v_intermediate[7u]; +- v_intermediate[63u] = v_intermediate[7u]; +- } else { +- v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][23u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][23u])))); +- v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][55u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][55u])))); +- v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); +- v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); +- v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); +- v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][7u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][7u])))); +- v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][39u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][39u])))); +- v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); +- v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); +- v_cd0 = ((uint32_t)(v_ccp + v_cb2)); +- v_cd1 = ((uint32_t)(v_ccm + v_cb6)); +- v_cd2 = ((uint32_t)(v_ccm - v_cb6)); +- v_cd3 = ((uint32_t)(v_ccp - v_cb2)); +- v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][15u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][15u])))); +- v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][31u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][31u])))); +- v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][47u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][47u])))); +- v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][63u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][63u])))); +- v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); +- v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); +- v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); +- v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); +- v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); +- v_ck1 = ((uint32_t)(v_bq1 * 12299u)); +- v_ck3 = ((uint32_t)(v_bq3 * 25172u)); +- v_ck5 = ((uint32_t)(v_bq5 * 16819u)); +- v_ck7 = ((uint32_t)(v_bq7 * 2446u)); +- v_ci51 *= 4294964100u; +- v_ci53 *= 4294946301u; +- v_ci71 *= 4294959923u; +- v_ci73 *= 4294951227u; +- v_cl51 = ((uint32_t)(v_ci51 + v_cj)); +- v_cl73 = ((uint32_t)(v_ci73 + v_cj)); +- v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); +- v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); +- v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); +- v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); +- v_intermediate[7u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); +- v_intermediate[63u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); +- v_intermediate[15u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); +- v_intermediate[55u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); +- v_intermediate[23u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); +- v_intermediate[47u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); +- v_intermediate[31u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); +- v_intermediate[39u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); ++ ++ return status; ++} ++ ++// -------- func gif.decoder.decode_lsd ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_lsd( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_flags = 0; ++ uint8_t v_background_color_index = 0; ++ uint32_t v_num_palette_entries = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ uint32_t v_argb = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (0u == (v_intermediate[1u] | +- v_intermediate[2u] | +- v_intermediate[3u] | +- v_intermediate[4u] | +- v_intermediate[5u] | +- v_intermediate[6u] | +- v_intermediate[7u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[0u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[2u]; +- v_in6 = v_intermediate[6u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[0u]; +- v_in4 = v_intermediate[4u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[1u]; +- v_in3 = v_intermediate[3u]; +- v_in5 = v_intermediate[5u]; +- v_in7 = v_intermediate[7u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_lsd; ++ if (coro_susp_point) { ++ v_flags = self->private_data.s_decode_lsd.v_flags; ++ v_background_color_index = self->private_data.s_decode_lsd.v_background_color_index; ++ v_num_palette_entries = self->private_data.s_decode_lsd.v_num_palette_entries; ++ v_i = self->private_data.s_decode_lsd.v_i; + } +- if (0u == (v_intermediate[9u] | +- v_intermediate[10u] | +- v_intermediate[11u] | +- v_intermediate[12u] | +- v_intermediate[13u] | +- v_intermediate[14u] | +- v_intermediate[15u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_lsd.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_lsd.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 8) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ self->private_impl.f_width = t_0; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[8u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[10u]; +- v_in6 = v_intermediate[14u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[8u]; +- v_in4 = v_intermediate[12u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[9u]; +- v_in3 = v_intermediate[11u]; +- v_in5 = v_intermediate[13u]; +- v_in7 = v_intermediate[15u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_lsd.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_lsd.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 8) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ self->private_impl.f_height = t_1; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } +- if (0u == (v_intermediate[17u] | +- v_intermediate[18u] | +- v_intermediate[19u] | +- v_intermediate[20u] | +- v_intermediate[21u] | +- v_intermediate[22u] | +- v_intermediate[23u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_flags = t_2; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[16u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[18u]; +- v_in6 = v_intermediate[22u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[16u]; +- v_in4 = v_intermediate[20u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[17u]; +- v_in3 = v_intermediate[19u]; +- v_in5 = v_intermediate[21u]; +- v_in7 = v_intermediate[23u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_background_color_index = t_3; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } +- if (0u == (v_intermediate[25u] | +- v_intermediate[26u] | +- v_intermediate[27u] | +- v_intermediate[28u] | +- v_intermediate[29u] | +- v_intermediate[30u] | +- v_intermediate[31u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[24u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[26u]; +- v_in6 = v_intermediate[30u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[24u]; +- v_in4 = v_intermediate[28u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[25u]; +- v_in3 = v_intermediate[27u]; +- v_in5 = v_intermediate[29u]; +- v_in7 = v_intermediate[31u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } +- if (0u == (v_intermediate[33u] | +- v_intermediate[34u] | +- v_intermediate[35u] | +- v_intermediate[36u] | +- v_intermediate[37u] | +- v_intermediate[38u] | +- v_intermediate[39u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ iop_a_src++; ++ v_i = 0u; ++ self->private_impl.f_has_global_palette = (((uint8_t)(v_flags & 128u)) != 0u); ++ if (self->private_impl.f_has_global_palette) { ++ v_num_palette_entries = (((uint32_t)(1u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u))))); ++ while (v_i < v_num_palette_entries) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { ++ t_4 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); ++ iop_a_src += 3; ++ } else { ++ self->private_data.s_decode_lsd.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_lsd.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ if (num_bits_4 == 16) { ++ t_4 = ((uint32_t)(*scratch >> 40)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)); ++ } ++ } ++ v_argb = t_4; ++ } ++ v_argb |= 4278190080u; ++ self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); ++ self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); ++ self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); ++ self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); ++ v_i += 1u; ++ } ++ if (self->private_impl.f_quirks[2u]) { ++ if ((v_background_color_index != 0u) && (((uint32_t)(v_background_color_index)) < v_num_palette_entries)) { ++ v_j = (4u * ((uint32_t)(v_background_color_index))); ++ self->private_impl.f_background_color_u32_argb_premul = ((((uint32_t)(self->private_data.f_palettes[0u][(v_j + 0u)])) << 0u) | ++ (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 1u)])) << 8u) | ++ (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 2u)])) << 16u) | ++ (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 3u)])) << 24u)); ++ } else { ++ self->private_impl.f_background_color_u32_argb_premul = 77u; ++ } ++ } + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[32u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[34u]; +- v_in6 = v_intermediate[38u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[32u]; +- v_in4 = v_intermediate[36u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[33u]; +- v_in3 = v_intermediate[35u]; +- v_in5 = v_intermediate[37u]; +- v_in7 = v_intermediate[39u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ while (v_i < 256u) { ++ self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = 0u; ++ self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = 0u; ++ self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = 0u; ++ self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = 255u; ++ v_i += 1u; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_lsd = 0; ++ goto exit; + } +- if (0u == (v_intermediate[41u] | +- v_intermediate[42u] | +- v_intermediate[43u] | +- v_intermediate[44u] | +- v_intermediate[45u] | +- v_intermediate[46u] | +- v_intermediate[47u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[40u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[42u]; +- v_in6 = v_intermediate[46u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[40u]; +- v_in4 = v_intermediate[44u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[41u]; +- v_in3 = v_intermediate[43u]; +- v_in5 = v_intermediate[45u]; +- v_in7 = v_intermediate[47u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_lsd = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_lsd.v_flags = v_flags; ++ self->private_data.s_decode_lsd.v_background_color_index = v_background_color_index; ++ self->private_data.s_decode_lsd.v_num_palette_entries = v_num_palette_entries; ++ self->private_data.s_decode_lsd.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (0u == (v_intermediate[49u] | +- v_intermediate[50u] | +- v_intermediate[51u] | +- v_intermediate[52u] | +- v_intermediate[53u] | +- v_intermediate[54u] | +- v_intermediate[55u])) { +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ ++ return status; ++} ++ ++// -------- func gif.decoder.decode_extension ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_gif__decoder__decode_extension( ++ wuffs_gif__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_label = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_extension; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_label = t_0; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[48u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } else { +- v_in2 = v_intermediate[50u]; +- v_in6 = v_intermediate[54u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[48u]; +- v_in4 = v_intermediate[52u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[49u]; +- v_in3 = v_intermediate[51u]; +- v_in5 = v_intermediate[53u]; +- v_in7 = v_intermediate[55u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ if (v_label == 249u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_gif__decoder__decode_gc(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } else if (v_label == 255u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_gif__decoder__decode_ae(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- } +- if (0u == (v_intermediate[57u] | +- v_intermediate[58u] | +- v_intermediate[59u] | +- v_intermediate[60u] | +- v_intermediate[61u] | +- v_intermediate[62u] | +- v_intermediate[63u])) { +- if (8u > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[56u] + 16u)) >> 5u) & 1023u)]; +- a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; +- a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; +- } else { +- v_in2 = v_intermediate[58u]; +- v_in6 = v_intermediate[62u]; +- v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); +- v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); +- v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); +- v_in0 = v_intermediate[56u]; +- v_in4 = v_intermediate[60u]; +- v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); +- v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); +- v_rd0 = ((uint32_t)(v_rcp + v_rb2)); +- v_rd1 = ((uint32_t)(v_rcm + v_rb6)); +- v_rd2 = ((uint32_t)(v_rcm - v_rb6)); +- v_rd3 = ((uint32_t)(v_rcp - v_rb2)); +- v_in1 = v_intermediate[57u]; +- v_in3 = v_intermediate[59u]; +- v_in5 = v_intermediate[61u]; +- v_in7 = v_intermediate[63u]; +- v_ri51 = ((uint32_t)(v_in5 + v_in1)); +- v_ri53 = ((uint32_t)(v_in5 + v_in3)); +- v_ri71 = ((uint32_t)(v_in7 + v_in1)); +- v_ri73 = ((uint32_t)(v_in7 + v_in3)); +- v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); +- v_rk1 = ((uint32_t)(v_in1 * 12299u)); +- v_rk3 = ((uint32_t)(v_in3 * 25172u)); +- v_rk5 = ((uint32_t)(v_in5 * 16819u)); +- v_rk7 = ((uint32_t)(v_in7 * 2446u)); +- v_ri51 *= 4294964100u; +- v_ri53 *= 4294946301u; +- v_ri71 *= 4294959923u; +- v_ri73 *= 4294951227u; +- v_rl51 = ((uint32_t)(v_ri51 + v_rj)); +- v_rl73 = ((uint32_t)(v_ri73 + v_rj)); +- v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); +- v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); +- v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); +- v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); +- if (8u > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_gif__decoder__skip_blocks(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; +- a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ if (status.repr) { ++ goto suspend; ++ } ++ ++ ok: ++ self->private_impl.p_decode_extension = 0; ++ goto exit; + } +- return wuffs_base__make_empty_struct(); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_extension = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; + } + +-// ‼ WUFFS MULTI-FILE SECTION +x86_avx2 +-// -------- func jpeg.decoder.decode_idct_x86_avx2 ++// -------- func gif.decoder.skip_blocks + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_jpeg__decoder__decode_idct_x86_avx2( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_dst_buffer, +- uint64_t a_dst_stride, +- uint32_t a_q) { +- __m256i v_k_0000 = {0}; +- __m256i v_k_8080 = {0}; +- __m256i v_k_0000_0002 = {0}; +- __m256i v_k_0001_FFFF = {0}; +- __m256i v_k_0400_0000 = {0}; +- __m256i v_k_29CF_1151_D630_1151 = {0}; +- __m256i v_k_E333_133E_ADFD_1051 = {0}; +- __m256i v_k_E6DC_25A1_1925_25A1 = {0}; +- __m256i v_k_ECC1_E333_EFB0_ADFD = {0}; +- __m128i v_az_coeffs = {0}; +- __m256i v_az_ah00 = {0}; +- __m256i v_az_ad00 = {0}; +- __m256i v_az_eh00 = {0}; +- __m256i v_az_adeh = {0}; +- __m256i v_rows01 = {0}; +- __m256i v_rows23 = {0}; +- __m256i v_rows45 = {0}; +- __m256i v_rows67 = {0}; +- __m256i v_quants01 = {0}; +- __m256i v_quants23 = {0}; +- __m256i v_quants45 = {0}; +- __m256i v_quants67 = {0}; +- __m256i v_rows04 = {0}; +- __m256i v_rows31 = {0}; +- __m256i v_rows26 = {0}; +- __m256i v_rows75 = {0}; +- __m256i v_fp_rows62 = {0}; +- __m256i v_fp_bq2662ad = {0}; +- __m256i v_fp_bq2662eh = {0}; +- __m256i v_fp_cb26ad = {0}; +- __m256i v_fp_cb26eh = {0}; +- __m256i v_fp_rows40pos = {0}; +- __m256i v_fp_rows04neg = {0}; +- __m256i v_fp_rows0pm4 = {0}; +- __m256i v_fp_ccpmad = {0}; +- __m256i v_fp_ccpmeh = {0}; +- __m256i v_fp_cd01ad = {0}; +- __m256i v_fp_cd01eh = {0}; +- __m256i v_fp_cd32ad = {0}; +- __m256i v_fp_cd32eh = {0}; +- __m256i v_fp_sums7351 = {0}; +- __m256i v_fp_sums5173 = {0}; +- __m256i v_fp_ci73515173ad = {0}; +- __m256i v_fp_ci73515173eh = {0}; +- __m256i v_fp_cl7351ad = {0}; +- __m256i v_fp_cl7351eh = {0}; +- __m256i v_fp_rows13 = {0}; +- __m256i v_fp_bq7153ad = {0}; +- __m256i v_fp_bq7153eh = {0}; +- __m256i v_fp_ck75ad = {0}; +- __m256i v_fp_ck75eh = {0}; +- __m256i v_fp_cl5173ad = {0}; +- __m256i v_fp_cl5173eh = {0}; +- __m256i v_fp_ck13ad = {0}; +- __m256i v_fp_ck13eh = {0}; +- __m256i v_intermediate01ad = {0}; +- __m256i v_intermediate01eh = {0}; +- __m256i v_intermediate01 = {0}; +- __m256i v_intermediate32ad = {0}; +- __m256i v_intermediate32eh = {0}; +- __m256i v_intermediate32 = {0}; +- __m256i v_intermediate45ad = {0}; +- __m256i v_intermediate45eh = {0}; +- __m256i v_intermediate45 = {0}; +- __m256i v_intermediate76ad = {0}; +- __m256i v_intermediate76eh = {0}; +- __m256i v_intermediate76 = {0}; +- __m256i v_ita0a1e0e1 = {0}; +- __m256i v_ita2a3e2e3 = {0}; +- __m256i v_ita4a5e4e5 = {0}; +- __m256i v_ita6a7e6e7 = {0}; +- __m256i v_ita0c0e0g0 = {0}; +- __m256i v_ita1c1e1g1 = {0}; +- __m256i v_ita4c4e4g4 = {0}; +- __m256i v_ita5c5e5g5 = {0}; +- __m256i v_ita0b0e0f0 = {0}; +- __m256i v_ita4b4e4f4 = {0}; +- __m256i v_itc0d0g0h0 = {0}; +- __m256i v_itc4d4g4h4 = {0}; +- __m256i v_intermediateae = {0}; +- __m256i v_intermediatebf = {0}; +- __m256i v_intermediatecg = {0}; +- __m256i v_intermediatedh = {0}; +- __m256i v_intermediatedb = {0}; +- __m256i v_intermediatehf = {0}; +- __m256i v_sp_cols62 = {0}; +- __m256i v_sp_bq2662ad = {0}; +- __m256i v_sp_bq2662eh = {0}; +- __m256i v_sp_rb26ad = {0}; +- __m256i v_sp_rb26eh = {0}; +- __m256i v_sp_cols40pos = {0}; +- __m256i v_sp_cols04neg = {0}; +- __m256i v_sp_cols0pm4 = {0}; +- __m256i v_sp_rcpmad = {0}; +- __m256i v_sp_rcpmeh = {0}; +- __m256i v_sp_rd01ad = {0}; +- __m256i v_sp_rd01eh = {0}; +- __m256i v_sp_rd32ad = {0}; +- __m256i v_sp_rd32eh = {0}; +- __m256i v_sp_sums7351 = {0}; +- __m256i v_sp_sums5173 = {0}; +- __m256i v_sp_ri73515173ad = {0}; +- __m256i v_sp_ri73515173eh = {0}; +- __m256i v_sp_rl7351ad = {0}; +- __m256i v_sp_rl7351eh = {0}; +- __m256i v_sp_cols13 = {0}; +- __m256i v_sp_bq7153ad = {0}; +- __m256i v_sp_bq7153eh = {0}; +- __m256i v_sp_rk75ad = {0}; +- __m256i v_sp_rk75eh = {0}; +- __m256i v_sp_rl5173ad = {0}; +- __m256i v_sp_rl5173eh = {0}; +- __m256i v_sp_rk13ad = {0}; +- __m256i v_sp_rk13eh = {0}; +- __m256i v_final01ad = {0}; +- __m256i v_final01eh = {0}; +- __m256i v_final01 = {0}; +- __m256i v_final32ad = {0}; +- __m256i v_final32eh = {0}; +- __m256i v_final32 = {0}; +- __m256i v_final45ad = {0}; +- __m256i v_final45eh = {0}; +- __m256i v_final45 = {0}; +- __m256i v_final76ad = {0}; +- __m256i v_final76eh = {0}; +- __m256i v_final76 = {0}; +- __m256i v_fta0a1e0e1 = {0}; +- __m256i v_fta2a3e2e3 = {0}; +- __m256i v_fta4a5e4e5 = {0}; +- __m256i v_fta6a7e6e7 = {0}; +- __m256i v_fta0c0e0g0 = {0}; +- __m256i v_fta1c1e1g1 = {0}; +- __m256i v_fta4c4e4g4 = {0}; +- __m256i v_fta5c5e5g5 = {0}; +- __m256i v_fta0b0e0f0 = {0}; +- __m256i v_ftc0d0g0h0 = {0}; +- __m256i v_fta4b4e4f4 = {0}; +- __m256i v_ftc4d4g4h4 = {0}; +- __m256i v_finalae = {0}; +- __m256i v_finalbf = {0}; +- __m256i v_finalcg = {0}; +- __m256i v_finaldh = {0}; +- __m256i v_final0145 = {0}; +- __m256i v_final2367 = {0}; +- uint64_t v_final0 = 0; +- uint64_t v_final1 = 0; +- uint64_t v_final2 = 0; +- uint64_t v_final3 = 0; +- uint64_t v_final4 = 0; +- uint64_t v_final5 = 0; +- uint64_t v_final6 = 0; +- uint64_t v_final7 = 0; +- wuffs_base__slice_u8 v_remaining = {0}; +- +- if (8u > a_dst_stride) { +- return wuffs_base__make_empty_struct(); +- } +- v_k_0000 = _mm256_set_epi16((int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u)); +- v_k_8080 = _mm256_set_epi16((int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u)); +- v_k_0000_0002 = _mm256_set_epi16((int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u)); +- v_k_0001_FFFF = _mm256_set_epi16((int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u)); +- v_k_0400_0000 = _mm256_set_epi16((int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u)); +- v_k_29CF_1151_D630_1151 = _mm256_set_epi16((int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u)); +- v_k_E333_133E_ADFD_1051 = _mm256_set_epi16((int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u)); +- v_k_E6DC_25A1_1925_25A1 = _mm256_set_epi16((int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u)); +- v_k_ECC1_E333_EFB0_ADFD = _mm256_set_epi16((int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u)); +- do { +- if (0u == (wuffs_base__peek_u64le__no_bounds_check((const uint8_t*)(const void*)(self->private_data.f_mcu_blocks[0u] + 8u)) | wuffs_base__peek_u64le__no_bounds_check((const uint8_t*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u)))) { +- v_az_coeffs = _mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 8u)), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 24u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 32u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 40u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 48u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 56u))); +- if (0u == ((uint64_t)(_mm_cvtsi128_si64(_mm_packs_epi16(v_az_coeffs, v_az_coeffs))))) { +- v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u)); +- v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u)); +- v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01); +- v_az_ah00 = _mm256_slli_epi16(v_rows01, (int32_t)(2u)); +- v_az_ad00 = _mm256_unpacklo_epi16(v_az_ah00, v_az_ah00); +- v_az_eh00 = _mm256_unpackhi_epi16(v_az_ah00, v_az_ah00); +- v_az_adeh = _mm256_inserti128_si256(v_az_ad00, _mm256_castsi256_si128(v_az_eh00), (int32_t)(1u)); +- v_intermediateae = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(0u)); +- v_intermediatebf = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(85u)); +- v_intermediatecg = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(170u)); +- v_intermediatedh = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(255u)); +- break; +- } +- } +- v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u)); +- v_rows23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u)); +- v_rows45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 32u)); +- v_rows67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 48u)); +- v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u)); +- v_quants23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 16u)); +- v_quants45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 32u)); +- v_quants67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 48u)); +- v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01); +- v_rows23 = _mm256_mullo_epi16(v_rows23, v_quants23); +- v_rows45 = _mm256_mullo_epi16(v_rows45, v_quants45); +- v_rows67 = _mm256_mullo_epi16(v_rows67, v_quants67); +- v_rows04 = _mm256_permute2x128_si256(v_rows01, v_rows45, (int32_t)(32u)); +- v_rows31 = _mm256_permute2x128_si256(v_rows23, v_rows01, (int32_t)(49u)); +- v_rows26 = _mm256_permute2x128_si256(v_rows23, v_rows67, (int32_t)(32u)); +- v_rows75 = _mm256_permute2x128_si256(v_rows67, v_rows45, (int32_t)(49u)); +- v_fp_rows62 = _mm256_permute2x128_si256(v_rows26, v_rows26, (int32_t)(1u)); +- v_fp_bq2662ad = _mm256_unpacklo_epi16(v_rows26, v_fp_rows62); +- v_fp_bq2662eh = _mm256_unpackhi_epi16(v_rows26, v_fp_rows62); +- v_fp_cb26ad = _mm256_madd_epi16(v_fp_bq2662ad, v_k_29CF_1151_D630_1151); +- v_fp_cb26eh = _mm256_madd_epi16(v_fp_bq2662eh, v_k_29CF_1151_D630_1151); +- v_fp_rows40pos = _mm256_permute2x128_si256(v_rows04, v_rows04, (int32_t)(1u)); +- v_fp_rows04neg = _mm256_sign_epi16(v_rows04, v_k_0001_FFFF); +- v_fp_rows0pm4 = _mm256_add_epi16(v_fp_rows40pos, v_fp_rows04neg); +- v_fp_ccpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u)); +- v_fp_ccpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u)); +- v_fp_cd01ad = _mm256_add_epi32(v_fp_ccpmad, v_fp_cb26ad); +- v_fp_cd01eh = _mm256_add_epi32(v_fp_ccpmeh, v_fp_cb26eh); +- v_fp_cd32ad = _mm256_sub_epi32(v_fp_ccpmad, v_fp_cb26ad); +- v_fp_cd32eh = _mm256_sub_epi32(v_fp_ccpmeh, v_fp_cb26eh); +- v_fp_sums7351 = _mm256_add_epi16(v_rows75, v_rows31); +- v_fp_sums5173 = _mm256_permute2x128_si256(v_fp_sums7351, v_fp_sums7351, (int32_t)(1u)); +- v_fp_ci73515173ad = _mm256_unpacklo_epi16(v_fp_sums7351, v_fp_sums5173); +- v_fp_ci73515173eh = _mm256_unpackhi_epi16(v_fp_sums7351, v_fp_sums5173); +- v_fp_cl7351ad = _mm256_madd_epi16(v_fp_ci73515173ad, v_k_E6DC_25A1_1925_25A1); +- v_fp_cl7351eh = _mm256_madd_epi16(v_fp_ci73515173eh, v_k_E6DC_25A1_1925_25A1); +- v_fp_rows13 = _mm256_permute2x128_si256(v_rows31, v_rows31, (int32_t)(1u)); +- v_fp_bq7153ad = _mm256_unpacklo_epi16(v_rows75, v_fp_rows13); +- v_fp_bq7153eh = _mm256_unpackhi_epi16(v_rows75, v_fp_rows13); +- v_fp_ck75ad = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351ad); +- v_fp_ck75eh = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351eh); +- v_fp_cl5173ad = _mm256_permute2x128_si256(v_fp_cl7351ad, v_fp_cl7351ad, (int32_t)(1u)); +- v_fp_cl5173eh = _mm256_permute2x128_si256(v_fp_cl7351eh, v_fp_cl7351eh, (int32_t)(1u)); +- v_fp_ck13ad = _mm256_add_epi32(v_fp_cl5173ad, _mm256_madd_epi16(v_fp_bq7153ad, v_k_E333_133E_ADFD_1051)); +- v_fp_ck13eh = _mm256_add_epi32(v_fp_cl5173eh, _mm256_madd_epi16(v_fp_bq7153eh, v_k_E333_133E_ADFD_1051)); +- v_intermediate01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate01 = _mm256_packs_epi32(v_intermediate01ad, v_intermediate01eh); +- v_intermediate32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate32 = _mm256_packs_epi32(v_intermediate32ad, v_intermediate32eh); +- v_intermediate45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate45 = _mm256_packs_epi32(v_intermediate45ad, v_intermediate45eh); +- v_intermediate76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u)); +- v_intermediate76 = _mm256_packs_epi32(v_intermediate76ad, v_intermediate76eh); +- v_ita0a1e0e1 = _mm256_permute4x64_epi64(v_intermediate01, (int32_t)(216u)); +- v_ita2a3e2e3 = _mm256_permute4x64_epi64(v_intermediate32, (int32_t)(114u)); +- v_ita4a5e4e5 = _mm256_permute4x64_epi64(v_intermediate45, (int32_t)(216u)); +- v_ita6a7e6e7 = _mm256_permute4x64_epi64(v_intermediate76, (int32_t)(114u)); +- v_ita0c0e0g0 = _mm256_unpacklo_epi16(v_ita0a1e0e1, v_ita2a3e2e3); +- v_ita1c1e1g1 = _mm256_unpackhi_epi16(v_ita0a1e0e1, v_ita2a3e2e3); +- v_ita4c4e4g4 = _mm256_unpacklo_epi16(v_ita4a5e4e5, v_ita6a7e6e7); +- v_ita5c5e5g5 = _mm256_unpackhi_epi16(v_ita4a5e4e5, v_ita6a7e6e7); +- v_ita0b0e0f0 = _mm256_unpacklo_epi16(v_ita0c0e0g0, v_ita1c1e1g1); +- v_itc0d0g0h0 = _mm256_unpackhi_epi16(v_ita0c0e0g0, v_ita1c1e1g1); +- v_ita4b4e4f4 = _mm256_unpacklo_epi16(v_ita4c4e4g4, v_ita5c5e5g5); +- v_itc4d4g4h4 = _mm256_unpackhi_epi16(v_ita4c4e4g4, v_ita5c5e5g5); +- v_intermediateae = _mm256_unpacklo_epi64(v_ita0b0e0f0, v_ita4b4e4f4); +- v_intermediatebf = _mm256_unpackhi_epi64(v_ita0b0e0f0, v_ita4b4e4f4); +- v_intermediatecg = _mm256_unpacklo_epi64(v_itc0d0g0h0, v_itc4d4g4h4); +- v_intermediatedh = _mm256_unpackhi_epi64(v_itc0d0g0h0, v_itc4d4g4h4); +- } while (0); +- v_intermediatedb = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(32u)); +- v_intermediatehf = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(49u)); +- v_sp_cols62 = _mm256_permute2x128_si256(v_intermediatecg, v_intermediatecg, (int32_t)(1u)); +- v_sp_bq2662ad = _mm256_unpacklo_epi16(v_intermediatecg, v_sp_cols62); +- v_sp_bq2662eh = _mm256_unpackhi_epi16(v_intermediatecg, v_sp_cols62); +- v_sp_rb26ad = _mm256_madd_epi16(v_sp_bq2662ad, v_k_29CF_1151_D630_1151); +- v_sp_rb26eh = _mm256_madd_epi16(v_sp_bq2662eh, v_k_29CF_1151_D630_1151); +- v_sp_cols40pos = _mm256_permute2x128_si256(v_intermediateae, v_intermediateae, (int32_t)(1u)); +- v_sp_cols04neg = _mm256_sign_epi16(v_intermediateae, v_k_0001_FFFF); +- v_sp_cols0pm4 = _mm256_add_epi16(v_sp_cols40pos, v_sp_cols04neg); +- v_sp_rcpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u)); +- v_sp_rcpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u)); +- v_sp_rd01ad = _mm256_add_epi32(v_sp_rcpmad, v_sp_rb26ad); +- v_sp_rd01eh = _mm256_add_epi32(v_sp_rcpmeh, v_sp_rb26eh); +- v_sp_rd32ad = _mm256_sub_epi32(v_sp_rcpmad, v_sp_rb26ad); +- v_sp_rd32eh = _mm256_sub_epi32(v_sp_rcpmeh, v_sp_rb26eh); +- v_sp_sums7351 = _mm256_add_epi16(v_intermediatehf, v_intermediatedb); +- v_sp_sums5173 = _mm256_permute2x128_si256(v_sp_sums7351, v_sp_sums7351, (int32_t)(1u)); +- v_sp_ri73515173ad = _mm256_unpacklo_epi16(v_sp_sums7351, v_sp_sums5173); +- v_sp_ri73515173eh = _mm256_unpackhi_epi16(v_sp_sums7351, v_sp_sums5173); +- v_sp_rl7351ad = _mm256_madd_epi16(v_sp_ri73515173ad, v_k_E6DC_25A1_1925_25A1); +- v_sp_rl7351eh = _mm256_madd_epi16(v_sp_ri73515173eh, v_k_E6DC_25A1_1925_25A1); +- v_sp_cols13 = _mm256_permute2x128_si256(v_intermediatedb, v_intermediatedb, (int32_t)(1u)); +- v_sp_bq7153ad = _mm256_unpacklo_epi16(v_intermediatehf, v_sp_cols13); +- v_sp_bq7153eh = _mm256_unpackhi_epi16(v_intermediatehf, v_sp_cols13); +- v_sp_rk75ad = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351ad); +- v_sp_rk75eh = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351eh); +- v_sp_rl5173ad = _mm256_permute2x128_si256(v_sp_rl7351ad, v_sp_rl7351ad, (int32_t)(1u)); +- v_sp_rl5173eh = _mm256_permute2x128_si256(v_sp_rl7351eh, v_sp_rl7351eh, (int32_t)(1u)); +- v_sp_rk13ad = _mm256_add_epi32(v_sp_rl5173ad, _mm256_madd_epi16(v_sp_bq7153ad, v_k_E333_133E_ADFD_1051)); +- v_sp_rk13eh = _mm256_add_epi32(v_sp_rl5173eh, _mm256_madd_epi16(v_sp_bq7153eh, v_k_E333_133E_ADFD_1051)); +- v_final01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u)); +- v_final01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u)); +- v_final01 = _mm256_packs_epi32(v_final01ad, v_final01eh); +- v_final32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u)); +- v_final32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u)); +- v_final32 = _mm256_packs_epi32(v_final32ad, v_final32eh); +- v_final45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u)); +- v_final45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u)); +- v_final45 = _mm256_packs_epi32(v_final45ad, v_final45eh); +- v_final76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u)); +- v_final76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u)); +- v_final76 = _mm256_packs_epi32(v_final76ad, v_final76eh); +- v_fta0a1e0e1 = _mm256_permute4x64_epi64(v_final01, (int32_t)(216u)); +- v_fta2a3e2e3 = _mm256_permute4x64_epi64(v_final32, (int32_t)(114u)); +- v_fta4a5e4e5 = _mm256_permute4x64_epi64(v_final45, (int32_t)(216u)); +- v_fta6a7e6e7 = _mm256_permute4x64_epi64(v_final76, (int32_t)(114u)); +- v_fta0c0e0g0 = _mm256_unpacklo_epi16(v_fta0a1e0e1, v_fta2a3e2e3); +- v_fta1c1e1g1 = _mm256_unpackhi_epi16(v_fta0a1e0e1, v_fta2a3e2e3); +- v_fta4c4e4g4 = _mm256_unpacklo_epi16(v_fta4a5e4e5, v_fta6a7e6e7); +- v_fta5c5e5g5 = _mm256_unpackhi_epi16(v_fta4a5e4e5, v_fta6a7e6e7); +- v_fta0b0e0f0 = _mm256_unpacklo_epi16(v_fta0c0e0g0, v_fta1c1e1g1); +- v_ftc0d0g0h0 = _mm256_unpackhi_epi16(v_fta0c0e0g0, v_fta1c1e1g1); +- v_fta4b4e4f4 = _mm256_unpacklo_epi16(v_fta4c4e4g4, v_fta5c5e5g5); +- v_ftc4d4g4h4 = _mm256_unpackhi_epi16(v_fta4c4e4g4, v_fta5c5e5g5); +- v_finalae = _mm256_unpacklo_epi64(v_fta0b0e0f0, v_fta4b4e4f4); +- v_finalbf = _mm256_unpackhi_epi64(v_fta0b0e0f0, v_fta4b4e4f4); +- v_finalcg = _mm256_unpacklo_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4); +- v_finaldh = _mm256_unpackhi_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4); +- v_final0145 = _mm256_add_epi8(_mm256_packs_epi16(v_finalae, v_finalbf), v_k_8080); +- v_final2367 = _mm256_add_epi8(_mm256_packs_epi16(v_finalcg, v_finaldh), v_k_8080); +- v_final0 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(0u)))); +- v_final1 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(1u)))); +- v_final2 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(0u)))); +- v_final3 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(1u)))); +- v_final4 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(2u)))); +- v_final5 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(3u)))); +- v_final6 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(2u)))); +- v_final7 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(3u)))); +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final0); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final1); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final2); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final3); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final4); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final5); +- a_dst_buffer = v_remaining; +- if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final6); +- a_dst_buffer = v_remaining; +- if (8u > ((uint64_t)(a_dst_buffer.len))) { +- return wuffs_base__make_empty_struct(); +- } +- wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final7); +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_64) +-// ‼ WUFFS MULTI-FILE SECTION -x86_avx2 +- +-// -------- func jpeg.decoder.get_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_jpeg__decoder__get_quirk( +- const wuffs_jpeg__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func jpeg.decoder.set_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__set_quirk( +- wuffs_jpeg__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +-} +- +-// -------- func jpeg.decoder.decode_image_config +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__decode_image_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__image_config* a_dst, ++static wuffs_base__status ++wuffs_gif__decoder__skip_blocks( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint8_t v_block_size = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_skip_blocks; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_block_size = t_0; + } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); +- goto exit; ++ if (v_block_size == 0u) { ++ status = wuffs_base__make_status(NULL); ++ goto ok; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ self->private_data.s_skip_blocks.scratch = ((uint32_t)(v_block_size)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (self->private_data.s_skip_blocks.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_skip_blocks.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_skip_blocks.scratch; + } + + ok: +- self->private_impl.p_decode_image_config[0] = 0; ++ self->private_impl.p_skip_blocks = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_impl.p_skip_blocks = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func jpeg.decoder.do_decode_image_config ++// -------- func gif.decoder.decode_ae + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_image_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__image_config* a_dst, ++wuffs_gif__decoder__decode_ae( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_marker = 0; +- uint32_t v_pixfmt = 0; ++ uint8_t v_c8 = 0; ++ uint8_t v_block_size = 0; ++ bool v_is_animexts = false; ++ bool v_is_netscape = false; ++ bool v_is_iccp = false; ++ bool v_is_xmp = false; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -42362,253 +42476,191 @@ wuffs_jpeg__decoder__do_decode_image_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_ae; + if (coro_susp_point) { +- v_marker = self->private_data.s_do_decode_image_config[0].v_marker; ++ v_block_size = self->private_data.s_decode_ae.v_block_size; ++ v_is_animexts = self->private_data.s_decode_ae.v_is_animexts; ++ v_is_netscape = self->private_data.s_decode_ae.v_is_netscape; ++ v_is_iccp = self->private_data.s_decode_ae.v_is_iccp; ++ v_is_xmp = self->private_data.s_decode_ae.v_is_xmp; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ do { ++ if (self->private_impl.f_metadata_fourcc != 0u) { ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; + } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c != 255u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_header); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_block_size = t_0; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- if (v_c != 216u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_header); +- goto exit; +- } +- while (true) { +- while (true) { ++ if (v_block_size == 0u) { ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ if (v_block_size != 11u) { ++ self->private_data.s_decode_ae.scratch = ((uint32_t)(v_block_size)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_ae.scratch; ++ break; ++ } ++ v_is_animexts = true; ++ v_is_netscape = true; ++ v_is_iccp = true; ++ v_is_xmp = true; ++ v_block_size = 0u; ++ while (v_block_size < 11u) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ v_is_animexts = (v_is_animexts && (v_c8 == WUFFS_GIF__ANIMEXTS1DOT0[v_block_size])); ++ v_is_netscape = (v_is_netscape && (v_c8 == WUFFS_GIF__NETSCAPE2DOT0[v_block_size])); ++ v_is_iccp = (v_is_iccp && (v_c8 == WUFFS_GIF__ICCRGBG1012[v_block_size])); ++ v_is_xmp = (v_is_xmp && (v_c8 == WUFFS_GIF__XMPDATAXMP[v_block_size])); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_block_size += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ if (v_is_animexts || v_is_netscape) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } + uint8_t t_2 = *iop_a_src++; +- v_c = t_2; ++ v_block_size = t_2; + } +- if (v_c == 255u) { ++ if (v_block_size != 3u) { ++ self->private_data.s_decode_ae.scratch = ((uint32_t)(v_block_size)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_ae.scratch; + break; + } +- } +- while (true) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } + uint8_t t_3 = *iop_a_src++; +- v_c = t_3; ++ v_c8 = t_3; + } +- if (v_c != 255u) { +- v_marker = v_c; ++ if (v_c8 != 1u) { ++ self->private_data.s_decode_ae.scratch = 2u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_ae.scratch; + break; + } +- } +- if (v_marker == 0u) { +- continue; +- } else if ((208u <= v_marker) && (v_marker <= 217u)) { +- if (v_marker <= 215u) { +- continue; +- } +- } else { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + uint32_t t_4; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ self->private_data.s_decode_ae.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_decode_ae.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; + if (num_bits_4 == 8) { +- t_4 = ((uint32_t)(*scratch >> 48)); ++ t_4 = ((uint32_t)(*scratch)); + break; + } + num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)); ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; + } + } +- self->private_impl.f_payload_length = t_4; +- } +- if (self->private_impl.f_payload_length < 2u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); +- goto exit; +- } +- self->private_impl.f_payload_length -= 2u; +- } +- if (v_marker < 192u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } else if (v_marker < 208u) { +- if (v_marker <= 194u) { +- if (self->private_impl.f_sof_marker != 0u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } +- self->private_impl.f_sof_marker = v_marker; +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- status = wuffs_jpeg__decoder__decode_sof(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- break; +- } else if (v_marker == 195u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_lossless_coding); +- goto exit; +- } else if (v_marker == 196u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } else if ((197u <= v_marker) && (v_marker <= 199u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_hierarchical_coding); +- goto exit; +- } else if (v_marker == 200u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_arithmetic_coding); +- goto exit; +- } +- } else if (v_marker < 224u) { +- if (v_marker < 218u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); +- goto exit; +- } else if (v_marker == 218u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } else if (v_marker == 219u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- status = wuffs_jpeg__decoder__decode_dqt(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- continue; +- } else if (v_marker == 221u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_jpeg__decoder__decode_dri(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- continue; +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } +- } else if (v_marker < 240u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- status = wuffs_jpeg__decoder__decode_appn(self, a_src, v_marker); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; ++ self->private_impl.f_num_animation_loops_value = t_4; + } +- continue; +- } else { +- if (v_marker == 254u) { +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; ++ self->private_impl.f_seen_num_animation_loops_value = true; ++ if ((0u < self->private_impl.f_num_animation_loops_value) && (self->private_impl.f_num_animation_loops_value <= 65535u)) { ++ self->private_impl.f_num_animation_loops_value += 1u; + } ++ } else if (self->private_impl.f_call_sequence >= 32u) { ++ } else if (v_is_iccp && self->private_impl.f_report_metadata_iccp) { ++ self->private_impl.f_metadata_fourcc = 1229144912u; ++ self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ self->private_impl.f_call_sequence = 16u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; ++ } else if (v_is_xmp && self->private_impl.f_report_metadata_xmp) { ++ self->private_impl.f_metadata_fourcc = 1481461792u; ++ self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ self->private_impl.f_call_sequence = 16u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; + } +- self->private_data.s_do_decode_image_config[0].scratch = self->private_impl.f_payload_length; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- self->private_impl.f_payload_length = 0u; ++ } while (0); ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- self->private_impl.choosy_decode_idct = ( +-#if defined(WUFFS_BASE__CPU_ARCH__X86_64) +- wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_jpeg__decoder__decode_idct_x86_avx2 : +-#endif +- self->private_impl.choosy_decode_idct); +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- if (a_dst != NULL) { +- v_pixfmt = 536870920u; +- if (self->private_impl.f_num_components > 1u) { +- v_pixfmt = 2415954056u; +- } +- wuffs_base__image_config__set( +- a_dst, +- v_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- true); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ status = wuffs_gif__decoder__skip_blocks(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; + } +- self->private_impl.f_call_sequence = 32u; + +- goto ok; + ok: +- self->private_impl.p_do_decode_image_config[0] = 0; ++ self->private_impl.p_decode_ae = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_image_config[0].v_marker = v_marker; ++ self->private_impl.p_decode_ae = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_ae.v_block_size = v_block_size; ++ self->private_data.s_decode_ae.v_is_animexts = v_is_animexts; ++ self->private_data.s_decode_ae.v_is_netscape = v_is_netscape; ++ self->private_data.s_decode_ae.v_is_iccp = v_is_iccp; ++ self->private_data.s_decode_ae.v_is_xmp = v_is_xmp; + + goto exit; + exit: +@@ -42619,18 +42671,18 @@ wuffs_jpeg__decoder__do_decode_image_config( + return status; + } + +-// -------- func jpeg.decoder.decode_dqt ++// -------- func gif.decoder.decode_gc + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__decode_dqt( +- wuffs_jpeg__decoder* self, ++wuffs_gif__decoder__decode_gc( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_q = 0; +- uint32_t v_i = 0; ++ uint8_t v_c8 = 0; ++ uint8_t v_flags = 0; ++ uint16_t v_gc_duration_centiseconds = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -42643,73 +42695,103 @@ wuffs_jpeg__decoder__decode_dqt( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_dqt[0]; +- if (coro_susp_point) { +- v_q = self->private_data.s_decode_dqt[0].v_q; +- v_i = self->private_data.s_decode_dqt[0].v_i; +- } ++ uint32_t coro_susp_point = self->private_impl.p_decode_gc; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- while (self->private_impl.f_payload_length > 0u) { +- self->private_impl.f_payload_length -= 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if ((v_c & 15u) > 3u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker); +- goto exit; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_q = (v_c & 15u); +- if ((v_c >> 4u) == 1u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision); +- goto exit; +- } else if (((v_c >> 4u) > 1u) || (self->private_impl.f_payload_length < 64u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker); +- goto exit; ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 4u) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- self->private_impl.f_payload_length -= 64u; +- v_i = 0u; +- while (v_i < 64u) { +- v_i += 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint8_t t_1 = *iop_a_src++; ++ v_flags = t_1; ++ } ++ self->private_impl.f_gc_has_transparent_index = (((uint8_t)(v_flags & 1u)) != 0u); ++ v_flags = ((uint8_t)(((uint8_t)(v_flags >> 2u)) & 7u)); ++ if (v_flags == 2u) { ++ self->private_impl.f_gc_disposal = 1u; ++ } else if ((v_flags == 3u) || (v_flags == 4u)) { ++ self->private_impl.f_gc_disposal = 2u; ++ } else { ++ self->private_impl.f_gc_disposal = 0u; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint16_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_gc.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint16_t t_1 = *iop_a_src++; +- self->private_impl.f_quant_tables[v_q][WUFFS_JPEG__UNZIG[v_i]] = t_1; ++ uint64_t* scratch = &self->private_data.s_decode_gc.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 8) { ++ t_2 = ((uint16_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; + } + } +- self->private_impl.f_seen_dqt[v_q] = true; +- if (self->private_impl.f_sof_marker == 0u) { +- v_i = 0u; +- while (v_i < 64u) { +- self->private_impl.f_saved_quant_tables[v_q][v_i] = self->private_impl.f_quant_tables[v_q][v_i]; +- v_i += 1u; +- } +- self->private_impl.f_saved_seen_dqt[v_q] = true; ++ v_gc_duration_centiseconds = t_2; ++ } ++ self->private_impl.f_gc_duration = (((uint64_t)(v_gc_duration_centiseconds)) * 7056000u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ self->private_impl.f_gc_transparent_index = t_3; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control); ++ goto exit; + } + + goto ok; + ok: +- self->private_impl.p_decode_dqt[0] = 0; ++ self->private_impl.p_decode_gc = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_dqt[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_dqt[0].v_q = v_q; +- self->private_data.s_decode_dqt[0].v_i = v_i; ++ self->private_impl.p_decode_gc = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -42720,12 +42802,12 @@ wuffs_jpeg__decoder__decode_dqt( + return status; + } + +-// -------- func jpeg.decoder.decode_dri ++// -------- func gif.decoder.decode_id_part0 + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__decode_dri( +- wuffs_jpeg__decoder* self, ++wuffs_gif__decoder__decode_id_part0( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +@@ -42740,57 +42822,144 @@ wuffs_jpeg__decoder__decode_dri( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_dri[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_id_part0; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_payload_length != 2u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dri_marker); +- goto exit; +- } +- self->private_impl.f_payload_length = 0u; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint16_t t_0; ++ uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src); ++ t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { +- self->private_data.s_decode_dri[0].scratch = 0; ++ self->private_data.s_decode_id_part0.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_dri[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; + if (num_bits_0 == 8) { +- t_0 = ((uint16_t)(*scratch >> 48)); ++ t_0 = ((uint32_t)(*scratch)); + break; + } + num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; + } + } +- self->private_impl.f_restart_interval = t_0; ++ self->private_impl.f_frame_rect_x0 = t_0; + } +- if (self->private_impl.f_sof_marker == 0u) { +- self->private_impl.f_saved_restart_interval = self->private_impl.f_restart_interval; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_id_part0.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 8) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ self->private_impl.f_frame_rect_y0 = t_1; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_2 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_id_part0.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 8) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ self->private_impl.f_frame_rect_x1 = t_2; ++ } ++ self->private_impl.f_frame_rect_x1 += self->private_impl.f_frame_rect_x0; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_id_part0.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 8) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ } ++ } ++ self->private_impl.f_frame_rect_y1 = t_3; ++ } ++ self->private_impl.f_frame_rect_y1 += self->private_impl.f_frame_rect_y0; ++ self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; ++ self->private_impl.f_dst_y = self->private_impl.f_frame_rect_y0; ++ if ((self->private_impl.f_num_decoded_frame_configs_value == 0u) && ! self->private_impl.f_quirks[4u]) { ++ self->private_impl.f_width = wuffs_base__u32__max(self->private_impl.f_width, self->private_impl.f_frame_rect_x1); ++ self->private_impl.f_height = wuffs_base__u32__max(self->private_impl.f_height, self->private_impl.f_frame_rect_y1); + } + + goto ok; + ok: +- self->private_impl.p_decode_dri[0] = 0; ++ self->private_impl.p_decode_id_part0 = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_dri[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_id_part0 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -42801,18 +42970,24 @@ wuffs_jpeg__decoder__decode_dri( + return status; + } + +-// -------- func jpeg.decoder.decode_appn ++// -------- func gif.decoder.decode_id_part1 + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__decode_appn( +- wuffs_jpeg__decoder* self, ++wuffs_gif__decoder__decode_id_part1( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- uint8_t a_marker) { ++ wuffs_base__pixel_blend a_blend) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c8 = 0; +- uint32_t v_c32 = 0; ++ uint8_t v_flags = 0; ++ uint8_t v_which_palette = 0; ++ uint32_t v_num_palette_entries = 0; ++ uint32_t v_i = 0; ++ uint32_t v_argb = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint8_t v_lw = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -42825,184 +43000,136 @@ wuffs_jpeg__decoder__decode_appn( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_appn[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_id_part1; ++ if (coro_susp_point) { ++ v_which_palette = self->private_data.s_decode_id_part1.v_which_palette; ++ v_num_palette_entries = self->private_data.s_decode_id_part1.v_num_palette_entries; ++ v_i = self->private_data.s_decode_id_part1.v_i; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- do { +- if (a_marker == 224u) { +- if (self->private_impl.f_payload_length >= 5u) { +- self->private_impl.f_payload_length -= 5u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_appn[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_appn[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; +- } +- } +- v_c32 = t_0; +- } +- if (v_c32 != 1179207242u) { +- self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 1u)); +- break; +- } +- { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_flags = t_0; ++ } ++ if (((uint8_t)(v_flags & 64u)) != 0u) { ++ self->private_impl.f_interlace = 4u; ++ } else { ++ self->private_impl.f_interlace = 0u; ++ } ++ v_which_palette = 1u; ++ if (((uint8_t)(v_flags & 128u)) != 0u) { ++ v_num_palette_entries = (((uint32_t)(1u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u))))); ++ v_i = 0u; ++ while (v_i < v_num_palette_entries) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { ++ t_1 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); ++ iop_a_src += 3; ++ } else { ++ self->private_data.s_decode_id_part1.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c8 = t_1; +- } +- self->private_impl.f_is_jfif = (v_c8 == 0u); +- } +- } else if (a_marker == 238u) { +- if (self->private_impl.f_payload_length >= 12u) { +- self->private_impl.f_payload_length -= 12u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_appn[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_appn[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; +- if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; +- } +- } +- v_c32 = t_2; +- } +- if (v_c32 != 1651467329u) { +- self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 8u)); +- break; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_appn[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_appn[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- } +- v_c32 = t_3; +- } +- if ((255u & v_c32) != 101u) { +- self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 4u)); +- break; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_appn[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_appn[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 24) { +- t_4 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; ++ uint64_t* scratch = &self->private_data.s_decode_id_part1.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 16) { ++ t_1 = ((uint32_t)(*scratch >> 40)); ++ break; + } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); + } +- v_c32 = t_4; +- } +- if ((v_c32 >> 24u) == 0u) { +- self->private_impl.f_is_adobe = 1u; +- } else { +- self->private_impl.f_is_adobe = 2u; + } ++ v_argb = t_1; + } ++ v_argb |= 4278190080u; ++ self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); ++ self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); ++ self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); ++ self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); ++ v_i += 1u; + } +- } while (0); +- self->private_data.s_decode_appn[0].scratch = self->private_impl.f_payload_length; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (self->private_data.s_decode_appn[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_appn[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ while (v_i < 256u) { ++ self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = 255u; ++ v_i += 1u; ++ } ++ } else if (self->private_impl.f_quirks[6u] && ! self->private_impl.f_has_global_palette) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_palette); ++ goto exit; ++ } else if (self->private_impl.f_gc_has_transparent_index) { ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_palettes[1u], 1024), wuffs_base__make_slice_u8(self->private_data.f_palettes[0u], 1024)); ++ } else { ++ v_which_palette = 0u; + } +- iop_a_src += self->private_data.s_decode_appn[0].scratch; +- self->private_impl.f_payload_length = 0u; ++ if (self->private_impl.f_gc_has_transparent_index) { ++ self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 0u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 1u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 2u)] = 0u; ++ self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 3u)] = 0u; ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), ++ wuffs_base__utility__make_pixel_format(2198077448u), ++ wuffs_base__make_slice_u8(self->private_data.f_palettes[v_which_palette], 1024), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ if (self->private_impl.f_ignored_but_affects_benchmarks) { ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_lw = t_2; ++ } ++ if (v_lw > 8u) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width); ++ goto exit; ++ } ++ self->private_impl.f_lzw_pending_literal_width_plus_one = ((uint32_t)(((uint8_t)(1u + v_lw)))); ++ self->private_impl.f_ignored_but_affects_benchmarks = true; + +- goto ok; + ok: +- self->private_impl.p_decode_appn[0] = 0; ++ self->private_impl.p_decode_id_part1 = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_appn[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_id_part1 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_id_part1.v_which_palette = v_which_palette; ++ self->private_data.s_decode_id_part1.v_num_palette_entries = v_num_palette_entries; ++ self->private_data.s_decode_id_part1.v_i = v_i; + + goto exit; + exit: +@@ -43013,30 +43140,29 @@ wuffs_jpeg__decoder__decode_appn( + return status; + } + +-// -------- func jpeg.decoder.decode_sof ++// -------- func gif.decoder.decode_id_part2 + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__decode_sof( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src) { ++wuffs_gif__decoder__decode_id_part2( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint8_t v_comp_h = 0; +- uint8_t v_comp_v = 0; +- uint32_t v_i = 0; +- uint32_t v_j = 0; +- bool v_has_h24 = false; +- bool v_has_h3 = false; +- bool v_has_v24 = false; +- bool v_has_v3 = false; +- uint32_t v_upper_bound = 0; +- uint64_t v_wh0 = 0; +- uint64_t v_wh1 = 0; +- uint64_t v_wh2 = 0; +- uint64_t v_wh3 = 0; +- uint64_t v_progressive = 0; ++ uint64_t v_block_size = 0; ++ bool v_need_block_size = false; ++ uint32_t v_n_copied = 0; ++ uint64_t v_n_compressed = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint64_t v_mark = 0; ++ wuffs_base__status v_copy_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -43049,269 +43175,185 @@ wuffs_jpeg__decoder__decode_sof( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_sof[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_id_part2; + if (coro_susp_point) { +- v_i = self->private_data.s_decode_sof[0].v_i; ++ v_block_size = self->private_data.s_decode_id_part2.v_block_size; ++ v_need_block_size = self->private_data.s_decode_id_part2.v_need_block_size; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_payload_length < 6u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } +- self->private_impl.f_payload_length -= 6u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c == 8u) { +- } else if (v_c == 12u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_12_bits); +- goto exit; +- } else if (v_c == 16u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_16_bits); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_1 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_sof[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- while (true) { ++ wuffs_gif__decoder__lzw_init(self); ++ v_need_block_size = true; ++ label__outer__continue:; ++ while (true) { ++ if (v_need_block_size) { ++ v_need_block_size = false; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_sof[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 8) { +- t_1 = ((uint32_t)(*scratch >> 48)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); ++ uint64_t t_0 = *iop_a_src++; ++ v_block_size = t_0; + } + } +- self->private_impl.f_height = t_1; +- } +- if (self->private_impl.f_height == 0u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_implicit_height); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_sof[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_sof[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); +- if (num_bits_2 == 8) { +- t_2 = ((uint32_t)(*scratch >> 48)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)); +- } ++ if (v_block_size == 0u) { ++ break; + } +- self->private_impl.f_width = t_2; +- } +- if (self->private_impl.f_width == 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ while (((uint64_t)(io2_a_src - iop_a_src)) == 0u) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); + } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; +- } +- if ((v_c == 0u) || (v_c > 4u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } else if (v_c == 2u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_color_model); +- goto exit; +- } +- self->private_impl.f_num_components = ((uint32_t)(v_c)); +- if (self->private_impl.f_payload_length != (3u * self->private_impl.f_num_components)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } +- self->private_impl.f_payload_length = 0u; +- v_i = 0u; +- while (v_i < self->private_impl.f_num_components) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- self->private_impl.f_components_c[v_i] = t_4; ++ if (self->private_impl.f_compressed_ri == self->private_impl.f_compressed_wi) { ++ self->private_impl.f_compressed_ri = 0u; ++ self->private_impl.f_compressed_wi = 0u; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ while (self->private_impl.f_compressed_wi <= 3841u) { ++ v_n_compressed = wuffs_base__u64__min(v_block_size, ((uint64_t)(io2_a_src - iop_a_src))); ++ if (v_n_compressed <= 0u) { ++ break; + } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; +- } +- v_comp_h = (v_c >> 4u); +- v_comp_v = (v_c & 15u); +- if ((v_comp_h == 0u) || +- (v_comp_h > 4u) || +- (v_comp_v == 0u) || +- (v_comp_v > 4u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } +- self->private_impl.f_components_h[v_i] = v_comp_h; +- if (self->private_impl.f_max_incl_components_h < self->private_impl.f_components_h[v_i]) { +- self->private_impl.f_max_incl_components_h = self->private_impl.f_components_h[v_i]; +- } +- self->private_impl.f_components_v[v_i] = v_comp_v; +- if (self->private_impl.f_max_incl_components_v < self->private_impl.f_components_v[v_i]) { +- self->private_impl.f_max_incl_components_v = self->private_impl.f_components_v[v_i]; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_n_copied = wuffs_private_impl__io_reader__limited_copy_u32_to_slice( ++ &iop_a_src, io2_a_src,((uint32_t)(v_n_compressed)), wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, self->private_impl.f_compressed_wi, 4096)); ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_wi, ((uint64_t)(v_n_copied))); ++ wuffs_private_impl__u64__sat_sub_indirect(&v_block_size, ((uint64_t)(v_n_copied))); ++ if (v_block_size > 0u) { ++ break; + } +- uint8_t t_6 = *iop_a_src++; +- v_c = t_6; +- } +- if (v_c >= 4u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ v_need_block_size = true; ++ break; ++ } ++ v_block_size = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))); ++ iop_a_src += 1u; + } +- self->private_impl.f_components_tq[v_i] = v_c; +- v_j = 0u; +- while (v_j < v_i) { +- if (self->private_impl.f_components_c[v_j] == self->private_impl.f_components_c[v_i]) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ while (true) { ++ if ((self->private_impl.f_compressed_ri > self->private_impl.f_compressed_wi) || (self->private_impl.f_compressed_wi > 4096u)) { ++ status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); + goto exit; + } +- v_j += 1u; +- } +- v_i += 1u; +- } +- if (self->private_impl.f_num_components == 1u) { +- self->private_impl.f_max_incl_components_h = 1u; +- self->private_impl.f_max_incl_components_v = 1u; +- self->private_impl.f_components_h[0u] = 1u; +- self->private_impl.f_components_v[0u] = 1u; +- } else { +- v_has_h24 = false; +- v_has_h3 = false; +- v_has_v24 = false; +- v_has_v3 = false; +- v_i = 0u; +- while (v_i < self->private_impl.f_num_components) { +- v_has_h24 = (v_has_h24 || (self->private_impl.f_components_h[v_i] == 2u) || (self->private_impl.f_components_h[v_i] == 4u)); +- v_has_h3 = (v_has_h3 || (self->private_impl.f_components_h[v_i] == 3u)); +- v_has_v24 = (v_has_v24 || (self->private_impl.f_components_v[v_i] == 2u) || (self->private_impl.f_components_v[v_i] == 4u)); +- v_has_v3 = (v_has_v3 || (self->private_impl.f_components_v[v_i] == 3u)); +- v_i += 1u; +- } +- if ((v_has_h24 && v_has_h3) || (v_has_v24 && v_has_v3)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_fractional_sampling); +- goto exit; +- } +- if (self->private_impl.f_num_components == 4u) { +- self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe < 2u); +- } else { +- if (self->private_impl.f_is_jfif) { +- self->private_impl.f_is_rgb_or_cmyk = false; +- } else if (self->private_impl.f_is_adobe > 0u) { +- self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe == 1u); +- } else { +- self->private_impl.f_is_rgb_or_cmyk = ((self->private_impl.f_components_c[0u] == 82u) && (self->private_impl.f_components_c[1u] == 71u) && (self->private_impl.f_components_c[2u] == 66u)); ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, ++ self->private_impl.f_compressed_ri, ++ self->private_impl.f_compressed_wi), ++ 0u); ++ v_mark = ((uint64_t)(iop_v_r - io0_v_r)); ++ u_r.meta.ri = ((size_t)(iop_v_r - u_r.data.ptr)); ++ wuffs_gif__decoder__lzw_read_from(self, v_r); ++ iop_v_r = u_r.data.ptr + u_r.meta.ri; ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_ri, wuffs_private_impl__io__count_since(v_mark, ((uint64_t)(iop_v_r - io0_v_r)))); ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; + } +- } +- } +- self->private_impl.f_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, 1u, self->private_impl.f_max_incl_components_h); +- self->private_impl.f_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, 1u, self->private_impl.f_max_incl_components_v); +- v_upper_bound = 65544u; +- self->private_impl.f_components_workbuf_widths[0u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[0u])))); +- self->private_impl.f_components_workbuf_widths[1u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[1u])))); +- self->private_impl.f_components_workbuf_widths[2u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[2u])))); +- self->private_impl.f_components_workbuf_widths[3u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[3u])))); +- self->private_impl.f_components_workbuf_heights[0u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[0u])))); +- self->private_impl.f_components_workbuf_heights[1u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[1u])))); +- self->private_impl.f_components_workbuf_heights[2u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[2u])))); +- self->private_impl.f_components_workbuf_heights[3u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[3u])))); +- v_wh0 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[0u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[0u]))); +- v_wh1 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[1u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[1u]))); +- v_wh2 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[2u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[2u]))); +- v_wh3 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[3u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[3u]))); +- v_progressive = 0u; +- if (self->private_impl.f_sof_marker >= 194u) { +- v_progressive = 2u; +- v_i = 0u; +- while (v_i < 4u) { +- v_j = 0u; +- while (v_j < 10u) { +- self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u; +- v_j += 1u; ++ if (self->private_impl.f_lzw_output_ri < self->private_impl.f_lzw_output_wi) { ++ v_copy_status = wuffs_gif__decoder__copy_to_image_buffer(self, a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_lzw_output, ++ self->private_impl.f_lzw_output_ri, ++ self->private_impl.f_lzw_output_wi)); ++ if (wuffs_base__status__is_error(&v_copy_status)) { ++ status = v_copy_status; ++ goto exit; ++ } ++ self->private_impl.f_lzw_output_ri = 0u; ++ self->private_impl.f_lzw_output_wi = 0u; + } +- v_i += 1u; ++ if (self->private_impl.f_lzw_read_from_return_value == 0u) { ++ self->private_impl.f_ignored_but_affects_benchmarks = false; ++ if (v_need_block_size || (v_block_size > 0u)) { ++ self->private_data.s_decode_id_part2.scratch = ((uint32_t)(v_block_size)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (self->private_data.s_decode_id_part2.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_id_part2.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_id_part2.scratch; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_gif__decoder__skip_blocks(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ goto label__outer__break; ++ } else if (self->private_impl.f_lzw_read_from_return_value == 1u) { ++ continue; ++ } else if (self->private_impl.f_lzw_read_from_return_value == 2u) { ++ goto label__outer__continue; ++ } else if (self->private_impl.f_quirks[3u] && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) && (self->private_impl.f_interlace == 0u)) { ++ if (v_need_block_size || (v_block_size > 0u)) { ++ self->private_data.s_decode_id_part2.scratch = ((uint32_t)(v_block_size)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_data.s_decode_id_part2.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_id_part2.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_id_part2.scratch; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ status = wuffs_gif__decoder__skip_blocks(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ goto label__outer__break; ++ } else if (self->private_impl.f_lzw_read_from_return_value == 3u) { ++ status = wuffs_base__make_status(wuffs_gif__error__truncated_input); ++ goto exit; ++ } else if (self->private_impl.f_lzw_read_from_return_value == 4u) { ++ status = wuffs_base__make_status(wuffs_gif__error__bad_lzw_code); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); ++ goto exit; + } + } +- self->private_impl.f_components_workbuf_offsets[0u] = 0u; +- self->private_impl.f_components_workbuf_offsets[1u] = (self->private_impl.f_components_workbuf_offsets[0u] + v_wh0); +- self->private_impl.f_components_workbuf_offsets[2u] = (self->private_impl.f_components_workbuf_offsets[1u] + v_wh1); +- self->private_impl.f_components_workbuf_offsets[3u] = (self->private_impl.f_components_workbuf_offsets[2u] + v_wh2); +- self->private_impl.f_components_workbuf_offsets[4u] = (self->private_impl.f_components_workbuf_offsets[3u] + v_wh3); +- self->private_impl.f_components_workbuf_offsets[5u] = (self->private_impl.f_components_workbuf_offsets[4u] + (v_wh0 * v_progressive)); +- self->private_impl.f_components_workbuf_offsets[6u] = (self->private_impl.f_components_workbuf_offsets[5u] + (v_wh1 * v_progressive)); +- self->private_impl.f_components_workbuf_offsets[7u] = (self->private_impl.f_components_workbuf_offsets[6u] + (v_wh2 * v_progressive)); +- self->private_impl.f_components_workbuf_offsets[8u] = (self->private_impl.f_components_workbuf_offsets[7u] + (v_wh3 * v_progressive)); ++ label__outer__break:; ++ self->private_impl.f_compressed_ri = 0u; ++ self->private_impl.f_compressed_wi = 0u; ++ if ((self->private_impl.f_dst_y < self->private_impl.f_frame_rect_y1) && (self->private_impl.f_frame_rect_x0 != self->private_impl.f_frame_rect_x1) && (self->private_impl.f_frame_rect_y0 != self->private_impl.f_frame_rect_y1)) { ++ status = wuffs_base__make_status(wuffs_base__error__not_enough_data); ++ goto exit; ++ } + +- goto ok; + ok: +- self->private_impl.p_decode_sof[0] = 0; ++ self->private_impl.p_decode_id_part2 = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_sof[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_sof[0].v_i = v_i; ++ self->private_impl.p_decode_id_part2 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_id_part2.v_block_size = v_block_size; ++ self->private_data.s_decode_id_part2.v_need_block_size = v_need_block_size; + + goto exit; + exit: +@@ -43322,106 +43364,182 @@ wuffs_jpeg__decoder__decode_sof( + return status; + } + +-// -------- func jpeg.decoder.quantize_dimension ++// -------- func gif.decoder.copy_to_image_buffer + + WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__quantize_dimension( +- const wuffs_jpeg__decoder* self, +- uint32_t a_width, +- uint8_t a_h, +- uint8_t a_max_incl_h) { +- uint32_t v_ratio = 0; ++static wuffs_base__status ++wuffs_gif__decoder__copy_to_image_buffer( ++ wuffs_gif__decoder* self, ++ wuffs_base__pixel_buffer* a_pb, ++ wuffs_base__slice_u8 a_src) { ++ wuffs_base__slice_u8 v_dst = {0}; ++ wuffs_base__slice_u8 v_src = {0}; ++ uint64_t v_width_in_bytes = 0; ++ uint64_t v_n = 0; ++ uint64_t v_src_ri = 0; ++ wuffs_base__pixel_format v_pixfmt = {0}; ++ uint32_t v_bytes_per_pixel = 0; ++ uint32_t v_bits_per_pixel = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_j = 0; ++ uint32_t v_replicate_y0 = 0; ++ uint32_t v_replicate_y1 = 0; ++ wuffs_base__slice_u8 v_replicate_dst = {0}; ++ wuffs_base__slice_u8 v_replicate_src = {0}; + +- v_ratio = 0u; +- if (a_h > 0u) { +- v_ratio = ((uint32_t)((a_max_incl_h / a_h))); ++ v_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_pb); ++ v_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_pixfmt); ++ if ((v_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } +- if (v_ratio == 1u) { +- return ((a_width + 7u) / 8u); +- } else if (v_ratio == 2u) { +- return ((a_width + 15u) / 16u); +- } else if (v_ratio == 3u) { +- return ((a_width + 23u) / 24u); ++ v_bytes_per_pixel = (v_bits_per_pixel >> 3u); ++ v_width_in_bytes = ((uint64_t)((self->private_impl.f_width * v_bytes_per_pixel))); ++ v_tab = wuffs_base__pixel_buffer__plane(a_pb, 0u); ++ while (v_src_ri < ((uint64_t)(a_src.len))) { ++ v_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_ri); ++ if (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) { ++ if (self->private_impl.f_quirks[3u]) { ++ return wuffs_base__make_status(NULL); ++ } ++ return wuffs_base__make_status(wuffs_base__error__too_much_data); ++ } ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, 0u); ++ } else if (v_width_in_bytes < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_width_in_bytes); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_bytes_per_pixel))); ++ if (v_i < ((uint64_t)(v_dst.len))) { ++ v_j = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * ((uint64_t)(v_bytes_per_pixel))); ++ if ((v_i <= v_j) && (v_j <= ((uint64_t)(v_dst.len)))) { ++ v_dst = wuffs_base__slice_u8__subslice_ij(v_dst, v_i, v_j); ++ } else { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i); ++ } ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024), v_src); ++ wuffs_private_impl__u64__sat_add_indirect(&v_src_ri, v_n); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1u)); ++ } ++ if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) { ++ self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; ++ if (self->private_impl.f_interlace == 0u) { ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, 1u); ++ continue; ++ } ++ if ((self->private_impl.f_num_decoded_frames_value == 0u) && ! self->private_impl.f_gc_has_transparent_index && (self->private_impl.f_interlace > 1u)) { ++ v_replicate_src = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ v_replicate_y0 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1u); ++ v_replicate_y1 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_COUNT[self->private_impl.f_interlace]))); ++ v_replicate_y1 = wuffs_base__u32__min(v_replicate_y1, self->private_impl.f_frame_rect_y1); ++ while (v_replicate_y0 < v_replicate_y1) { ++ v_replicate_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_replicate_y0); ++ wuffs_private_impl__slice_u8__copy_from_slice(v_replicate_dst, v_replicate_src); ++ v_replicate_y0 += 1u; ++ } ++ self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, v_replicate_y1); ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace]))); ++ while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_interlace -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_impl.f_dst_y = wuffs_base__u32__sat_add(self->private_impl.f_frame_rect_y0, WUFFS_GIF__INTERLACE_START[self->private_impl.f_interlace]); ++ } ++ continue; ++ } ++ if (((uint64_t)(a_src.len)) == v_src_ri) { ++ break; ++ } else if (((uint64_t)(a_src.len)) < v_src_ri) { ++ return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); ++ } ++ v_n = ((uint64_t)((self->private_impl.f_frame_rect_x1 - self->private_impl.f_dst_x))); ++ v_n = wuffs_base__u64__min(v_n, (((uint64_t)(a_src.len)) - v_src_ri)); ++ wuffs_private_impl__u64__sat_add_indirect(&v_src_ri, v_n); ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) { ++ self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0; ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace]))); ++ while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_interlace -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_impl.f_dst_y = wuffs_base__u32__sat_add(self->private_impl.f_frame_rect_y0, WUFFS_GIF__INTERLACE_START[self->private_impl.f_interlace]); ++ } ++ continue; ++ } ++ if (v_src_ri != ((uint64_t)(a_src.len))) { ++ return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o); ++ } ++ break; + } +- return ((a_width + 31u) / 32u); ++ return wuffs_base__make_status(NULL); + } + +-// -------- func jpeg.decoder.decode_frame_config ++// -------- func gif.decoder.lzw_init + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__decode_frame_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++static wuffs_base__empty_struct ++wuffs_gif__decoder__lzw_init( ++ wuffs_gif__decoder* self) { ++ uint32_t v_i = 0; + +- ok: +- self->private_impl.p_decode_frame_config[0] = 0; +- goto exit; ++ self->private_impl.f_lzw_literal_width = 8u; ++ if (self->private_impl.f_lzw_pending_literal_width_plus_one > 0u) { ++ self->private_impl.f_lzw_literal_width = (self->private_impl.f_lzw_pending_literal_width_plus_one - 1u); + } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ self->private_impl.f_lzw_clear_code = (((uint32_t)(1u)) << self->private_impl.f_lzw_literal_width); ++ self->private_impl.f_lzw_end_code = (self->private_impl.f_lzw_clear_code + 1u); ++ self->private_impl.f_lzw_save_code = self->private_impl.f_lzw_end_code; ++ self->private_impl.f_lzw_prev_code = self->private_impl.f_lzw_end_code; ++ self->private_impl.f_lzw_width = (self->private_impl.f_lzw_literal_width + 1u); ++ self->private_impl.f_lzw_bits = 0u; ++ self->private_impl.f_lzw_n_bits = 0u; ++ self->private_impl.f_lzw_output_ri = 0u; ++ self->private_impl.f_lzw_output_wi = 0u; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_lzw_clear_code) { ++ self->private_data.f_lzw_lm1s[v_i] = 0u; ++ self->private_data.f_lzw_suffixes[v_i][0u] = ((uint8_t)(v_i)); ++ v_i += 1u; + } +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func jpeg.decoder.do_decode_frame_config ++// -------- func gif.decoder.lzw_read_from + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_frame_config( +- wuffs_jpeg__decoder* self, +- wuffs_base__frame_config* a_dst, ++static wuffs_base__empty_struct ++wuffs_gif__decoder__lzw_read_from( ++ wuffs_gif__decoder* self, + wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++ uint32_t v_clear_code = 0; ++ uint32_t v_end_code = 0; ++ uint32_t v_save_code = 0; ++ uint32_t v_prev_code = 0; ++ uint32_t v_width = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_output_wi = 0; ++ uint32_t v_code = 0; ++ uint32_t v_c = 0; ++ uint32_t v_o = 0; ++ uint32_t v_steps = 0; ++ uint8_t v_first_byte = 0; ++ uint16_t v_lm1_b = 0; ++ uint16_t v_lm1_a = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -43434,83 +43552,370 @@ wuffs_jpeg__decoder__do_decode_frame_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ v_clear_code = self->private_impl.f_lzw_clear_code; ++ v_end_code = self->private_impl.f_lzw_end_code; ++ v_save_code = self->private_impl.f_lzw_save_code; ++ v_prev_code = self->private_impl.f_lzw_prev_code; ++ v_width = self->private_impl.f_lzw_width; ++ v_bits = self->private_impl.f_lzw_bits; ++ v_n_bits = self->private_impl.f_lzw_n_bits; ++ v_output_wi = self->private_impl.f_lzw_output_wi; ++ while (true) { ++ if (v_n_bits < v_width) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { ++ v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits)); ++ iop_a_src += ((31u - v_n_bits) >> 3u); ++ v_n_bits |= 24u; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ self->private_impl.f_lzw_read_from_return_value = 3u; ++ } else { ++ self->private_impl.f_lzw_read_from_return_value = 2u; ++ } ++ break; ++ } else { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ if (v_n_bits >= v_width) { ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ self->private_impl.f_lzw_read_from_return_value = 3u; ++ } else { ++ self->private_impl.f_lzw_read_from_return_value = 2u; ++ } ++ break; ++ } else { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ if (v_n_bits < v_width) { ++ self->private_impl.f_lzw_read_from_return_value = 5u; ++ break; ++ } ++ } + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_jpeg__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ v_code = ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_width)); ++ v_bits >>= v_width; ++ v_n_bits -= v_width; ++ if (v_code < v_clear_code) { ++ self->private_data.f_lzw_output[v_output_wi] = ((uint8_t)(v_code)); ++ v_output_wi = ((v_output_wi + 1u) & 8191u); ++ if (v_save_code <= 4095u) { ++ v_lm1_a = ((uint16_t)(((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u)); ++ self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_a; ++ if (((uint16_t)(v_lm1_a % 8u)) != 0u) { ++ self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code]; ++ memcpy(self->private_data.f_lzw_suffixes[v_save_code],self->private_data.f_lzw_suffixes[v_prev_code], sizeof(self->private_data.f_lzw_suffixes[v_save_code])); ++ self->private_data.f_lzw_suffixes[v_save_code][((uint16_t)(v_lm1_a % 8u))] = ((uint8_t)(v_code)); ++ } else { ++ self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); ++ self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_code)); ++ } ++ v_save_code += 1u; ++ if (v_width < 12u) { ++ v_width += (1u & (v_save_code >> v_width)); ++ } ++ v_prev_code = v_code; + } +- if (status.repr) { +- goto suspend; ++ } else if (v_code <= v_end_code) { ++ if (v_code == v_end_code) { ++ self->private_impl.f_lzw_read_from_return_value = 0u; ++ break; + } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; ++ v_save_code = v_end_code; ++ v_prev_code = v_end_code; ++ v_width = (self->private_impl.f_lzw_literal_width + 1u); ++ } else if (v_code <= v_save_code) { ++ v_c = v_code; ++ if (v_code == v_save_code) { ++ v_c = v_prev_code; ++ } ++ v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) & 4294967288u)) & 8191u); ++ v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lzw_lm1s[v_c]))) & 8191u); ++ v_steps = (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) >> 3u); ++ while (true) { ++ memcpy((self->private_data.f_lzw_output)+(v_o), (self->private_data.f_lzw_suffixes[v_c]), 8u); ++ if (v_steps <= 0u) { ++ break; ++ } ++ v_steps -= 1u; ++ v_o = (((uint32_t)(v_o - 8u)) & 8191u); ++ v_c = ((uint32_t)(self->private_impl.f_lzw_prefixes[v_c])); ++ } ++ v_first_byte = self->private_data.f_lzw_suffixes[v_c][0u]; ++ if (v_code == v_save_code) { ++ self->private_data.f_lzw_output[v_output_wi] = v_first_byte; ++ v_output_wi = ((v_output_wi + 1u) & 8191u); ++ } ++ if (v_save_code <= 4095u) { ++ v_lm1_b = ((uint16_t)(((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u)); ++ self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_b; ++ if (((uint16_t)(v_lm1_b % 8u)) != 0u) { ++ self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code]; ++ memcpy(self->private_data.f_lzw_suffixes[v_save_code],self->private_data.f_lzw_suffixes[v_prev_code], sizeof(self->private_data.f_lzw_suffixes[v_save_code])); ++ self->private_data.f_lzw_suffixes[v_save_code][((uint16_t)(v_lm1_b % 8u))] = v_first_byte; ++ } else { ++ self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); ++ self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte)); ++ } ++ v_save_code += 1u; ++ if (v_width < 12u) { ++ v_width += (1u & (v_save_code >> v_width)); ++ } ++ v_prev_code = v_code; + } +- } else if (self->private_impl.f_call_sequence == 64u) { +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; + } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ self->private_impl.f_lzw_read_from_return_value = 4u; ++ break; + } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height), +- ((wuffs_base__flicks)(0u)), +- 0u, +- self->private_impl.f_frame_config_io_position, +- 0u, +- true, +- false, +- 4278190080u); ++ if (v_output_wi > 4095u) { ++ self->private_impl.f_lzw_read_from_return_value = 1u; ++ break; + } +- self->private_impl.f_call_sequence = 64u; +- +- ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; +- goto exit; + } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: ++ if (self->private_impl.f_lzw_read_from_return_value != 2u) { ++ while (v_n_bits >= 8u) { ++ v_n_bits -= 8u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ self->private_impl.f_lzw_read_from_return_value = 5u; ++ break; ++ } ++ } ++ } ++ self->private_impl.f_lzw_save_code = v_save_code; ++ self->private_impl.f_lzw_prev_code = v_prev_code; ++ self->private_impl.f_lzw_width = v_width; ++ self->private_impl.f_lzw_bits = v_bits; ++ self->private_impl.f_lzw_n_bits = v_n_bits; ++ self->private_impl.f_lzw_output_wi = v_output_wi; + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func jpeg.decoder.decode_frame ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_gzip__error__bad_checksum[] = "#gzip: bad checksum"; ++const char wuffs_gzip__error__bad_compression_method[] = "#gzip: bad compression method"; ++const char wuffs_gzip__error__bad_encoding_flags[] = "#gzip: bad encoding flags"; ++const char wuffs_gzip__error__bad_header[] = "#gzip: bad header"; ++const char wuffs_gzip__error__truncated_input[] = "#gzip: truncated input"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__decode_frame( +- wuffs_jpeg__decoder* self, +- wuffs_base__pixel_buffer* a_dst, ++static wuffs_base__status ++wuffs_gzip__decoder__do_transform_io( ++ wuffs_gzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__slice_u8 a_workbuf); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_gzip__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_gzip__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_gzip__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_gzip__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gzip__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_gzip__decoder__initialize( ++ wuffs_gzip__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ { ++ wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( ++ &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_deflate__decoder__initialize( ++ &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_gzip__decoder* ++wuffs_gzip__decoder__alloc(void) { ++ wuffs_gzip__decoder* x = ++ (wuffs_gzip__decoder*)(calloc(1, sizeof(wuffs_gzip__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_gzip__decoder__initialize( ++ x, sizeof(wuffs_gzip__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_gzip__decoder(void) { ++ return sizeof(wuffs_gzip__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func gzip.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_gzip__decoder__get_quirk( ++ const wuffs_gzip__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func gzip.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gzip__decoder__set_quirk( ++ wuffs_gzip__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func gzip.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_gzip__decoder__dst_history_retain_length( ++ const wuffs_gzip__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_base__utility__make_optional_u63(true, 0u); ++} ++ ++// -------- func gzip.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_gzip__decoder__workbuf_len( ++ const wuffs_gzip__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++} ++ ++// -------- func gzip.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_gzip__decoder__transform_io( ++ wuffs_gzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -43525,65 +43930,41 @@ wuffs_jpeg__decoder__decode_frame( + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { ++ (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_ddf_status = wuffs_base__make_status(NULL); +- wuffs_base__status v_swizzle_status = wuffs_base__make_status(NULL); +- uint32_t v_scan_count = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { +- v_scan_count = self->private_impl.f_scan_count; + { +- wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_ddf_status = t_0; +- } +- if ((v_ddf_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- v_ddf_status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); ++ wuffs_base__status t_0 = wuffs_gzip__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ v_status = t_0; + } +- if (wuffs_base__status__is_error(&v_ddf_status) || (v_scan_count < self->private_impl.f_scan_count)) { +- if (self->private_impl.f_sof_marker >= 194u) { +- wuffs_jpeg__decoder__apply_progressive_idct(self, a_workbuf); +- } +- if (self->private_impl.f_num_components == 1u) { +- v_swizzle_status = wuffs_jpeg__decoder__swizzle_gray(self, a_dst, a_workbuf); +- } else { +- v_swizzle_status = wuffs_jpeg__decoder__swizzle_colorful(self, a_dst, a_workbuf); +- } +- if (wuffs_base__status__is_error(&v_ddf_status)) { +- status = v_ddf_status; +- goto exit; +- } else if (wuffs_base__status__is_error(&v_swizzle_status)) { +- status = v_swizzle_status; +- goto exit; +- } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_gzip__error__truncated_input); ++ goto exit; + } +- status = v_ddf_status; ++ status = v_status; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } + + ok: +- self->private_impl.p_decode_frame[0] = 0; ++ self->private_impl.p_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: +@@ -43593,24 +43974,40 @@ wuffs_jpeg__decoder__decode_frame( + return status; + } + +-// -------- func jpeg.decoder.do_decode_frame ++// -------- func gzip.decoder.do_transform_io + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__do_decode_frame( +- wuffs_jpeg__decoder* self, +- wuffs_base__pixel_buffer* a_dst, ++wuffs_gzip__decoder__do_transform_io( ++ wuffs_gzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_pixfmt = 0; ++ uint8_t v_c8 = 0; ++ uint8_t v_flags = 0; ++ uint16_t v_xlen = 0; ++ uint64_t v_mark = 0; ++ uint32_t v_checksum_have = 0; ++ uint32_t v_decoded_length_have = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint8_t v_c = 0; +- uint8_t v_marker = 0; ++ uint32_t v_checksum_want = 0; ++ uint32_t v_decoded_length_want = 0; + ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -43622,236 +44019,269 @@ wuffs_jpeg__decoder__do_decode_frame( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; + if (coro_susp_point) { +- v_marker = self->private_data.s_do_decode_frame[0].v_marker; ++ v_flags = self->private_data.s_do_transform_io.v_flags; ++ v_checksum_have = self->private_data.s_do_transform_io.v_checksum_have; ++ v_decoded_length_have = self->private_data.s_do_transform_io.v_decoded_length_have; ++ v_checksum_want = self->private_data.s_do_transform_io.v_checksum_want; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++ { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_jpeg__decoder__do_decode_frame_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- if (status.repr) { ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 31u) { ++ status = wuffs_base__make_status(wuffs_gzip__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; + } +- v_pixfmt = 536870920u; +- if (self->private_impl.f_num_components > 1u) { +- v_pixfmt = 2415954056u; ++ if (v_c8 != 139u) { ++ status = wuffs_base__make_status(wuffs_gzip__error__bad_header); ++ goto exit; + } +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), +- wuffs_base__utility__make_pixel_format(v_pixfmt), +- wuffs_base__utility__empty_slice_u8(), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- goto ok; ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; + } +- if (self->private_impl.f_components_workbuf_offsets[8u] > ((uint64_t)(a_workbuf.len))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ if (v_c8 != 8u) { ++ status = wuffs_base__make_status(wuffs_gzip__error__bad_compression_method); + goto exit; +- } else if (self->private_impl.f_components_workbuf_offsets[4u] < self->private_impl.f_components_workbuf_offsets[8u]) { +- wuffs_base__bulk_memset(a_workbuf.ptr + self->private_impl.f_components_workbuf_offsets[4u], (self->private_impl.f_components_workbuf_offsets[8u] - self->private_impl.f_components_workbuf_offsets[4u]), 0u); + } +- if (self->private_impl.f_components_workbuf_offsets[4u] <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_memset(a_workbuf.ptr, self->private_impl.f_components_workbuf_offsets[4u], 128u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_flags = t_3; + } +- while (true) { ++ self->private_data.s_do_transform_io.scratch = 6u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_transform_io.scratch; ++ if (((uint8_t)(v_flags & 4u)) != 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint16_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 8) { ++ t_4 = ((uint16_t)(*scratch)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; ++ } ++ } ++ v_xlen = t_4; ++ } ++ self->private_data.s_do_transform_io.scratch = ((uint32_t)(v_xlen)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_transform_io.scratch; ++ } ++ if (((uint8_t)(v_flags & 8u)) != 0u) { + while (true) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; + } +- if (v_c == 255u) { ++ if (v_c8 == 0u) { + break; + } + } ++ } ++ if (((uint8_t)(v_flags & 16u)) != 0u) { + while (true) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; + } +- if (v_c != 255u) { +- v_marker = v_c; ++ if (v_c8 == 0u) { + break; + } + } +- if (v_marker == 0u) { +- continue; +- } else if ((208u <= v_marker) && (v_marker <= 217u)) { +- if (v_marker <= 215u) { +- continue; ++ } ++ if (((uint8_t)(v_flags & 2u)) != 0u) { ++ self->private_data.s_do_transform_io.scratch = 2u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_transform_io.scratch; ++ } ++ if (((uint8_t)(v_flags & 224u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_gzip__error__bad_encoding_flags); ++ goto exit; ++ } ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } +- } else { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_frame[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_frame[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); +- if (num_bits_2 == 8) { +- t_2 = ((uint32_t)(*scratch >> 48)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)); +- } +- } +- self->private_impl.f_payload_length = t_2; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (self->private_impl.f_payload_length < 2u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); +- goto exit; ++ wuffs_base__status t_7 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf); ++ v_status = t_7; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- self->private_impl.f_payload_length -= 2u; + } +- if (v_marker < 192u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } else if (v_marker < 208u) { +- if (v_marker == 196u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- status = wuffs_jpeg__decoder__decode_dht(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { ++ if ( ! self->private_impl.f_ignore_checksum) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_checksum, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ v_decoded_length_have += ((uint32_t)(wuffs_private_impl__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ uint32_t t_8; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- continue; +- } else if (v_marker == 200u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); +- goto exit; +- } else if (v_marker < 224u) { +- if (v_marker < 217u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); +- goto exit; +- } else if (v_marker == 217u) { +- break; +- } else if (v_marker == 218u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- status = wuffs_jpeg__decoder__decode_sos(self, a_src, a_workbuf); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; ++ if (num_bits_8 == 24) { ++ t_8 = ((uint32_t)(*scratch)); ++ break; + } +- if (status.repr) { ++ num_bits_8 += 8u; ++ *scratch |= ((uint64_t)(num_bits_8)) << 56; ++ } ++ } ++ v_checksum_want = t_8; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ uint32_t t_9; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_9 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- continue; +- } else if (v_marker == 219u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- status = wuffs_jpeg__decoder__decode_dqt(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- continue; +- } else if (v_marker == 221u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_jpeg__decoder__decode_dri(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9; ++ if (num_bits_9 == 24) { ++ t_9 = ((uint32_t)(*scratch)); ++ break; + } +- continue; +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; +- } +- } else if (v_marker < 240u) { +- } else { +- if (v_marker == 254u) { +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); +- goto exit; ++ num_bits_9 += 8u; ++ *scratch |= ((uint64_t)(num_bits_9)) << 56; + } + } +- self->private_data.s_do_decode_frame[0].scratch = self->private_impl.f_payload_length; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame[0].scratch; +- self->private_impl.f_payload_length = 0u; ++ v_decoded_length_want = t_9; ++ } ++ if ( ! self->private_impl.f_ignore_checksum && ((v_checksum_have != v_checksum_want) || (v_decoded_length_have != v_decoded_length_want))) { ++ status = wuffs_base__make_status(wuffs_gzip__error__bad_checksum); ++ goto exit; + } +- self->private_impl.f_call_sequence = 96u; + + ok: +- self->private_impl.p_do_decode_frame[0] = 0; ++ self->private_impl.p_do_transform_io = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_frame[0].v_marker = v_marker; ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_transform_io.v_flags = v_flags; ++ self->private_data.s_do_transform_io.v_checksum_have = v_checksum_have; ++ self->private_data.s_do_transform_io.v_decoded_length_have = v_decoded_length_have; ++ self->private_data.s_do_transform_io.v_checksum_want = v_checksum_want; + + goto exit; + exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -43859,891 +44289,398 @@ wuffs_jpeg__decoder__do_decode_frame( + return status; + } + +-// -------- func jpeg.decoder.decode_dht ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_jpeg__decoder__decode_dht( +- wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) + +- uint8_t v_c = 0; +- uint8_t v_tc = 0; +- uint8_t v_th = 0; +- uint8_t v_tc4_th = 0; +- uint32_t v_working_total_count = 0; +- uint32_t v_total_count = 0; +- uint32_t v_i = 0; +- bool v_failed = false; ++// ---------------- Status Codes Implementations + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++const char wuffs_jpeg__error__bad_dht_marker[] = "#jpeg: bad DHT marker"; ++const char wuffs_jpeg__error__bad_dqt_marker[] = "#jpeg: bad DQT marker"; ++const char wuffs_jpeg__error__bad_dri_marker[] = "#jpeg: bad DRI marker"; ++const char wuffs_jpeg__error__bad_sof_marker[] = "#jpeg: bad SOF marker"; ++const char wuffs_jpeg__error__bad_sos_marker[] = "#jpeg: bad SOS marker"; ++const char wuffs_jpeg__error__bad_header[] = "#jpeg: bad header"; ++const char wuffs_jpeg__error__bad_marker[] = "#jpeg: bad marker"; ++const char wuffs_jpeg__error__bad_scan_count[] = "#jpeg: bad scan count"; ++const char wuffs_jpeg__error__missing_huffman_table[] = "#jpeg: missing Huffman table"; ++const char wuffs_jpeg__error__missing_quantization_table[] = "#jpeg: missing Quantization table"; ++const char wuffs_jpeg__error__rejected_progressive_jpeg[] = "#jpeg: rejected progressive JPEG"; ++const char wuffs_jpeg__error__truncated_input[] = "#jpeg: truncated input"; ++const char wuffs_jpeg__error__unsupported_arithmetic_coding[] = "#jpeg: unsupported arithmetic coding"; ++const char wuffs_jpeg__error__unsupported_color_model[] = "#jpeg: unsupported color model"; ++const char wuffs_jpeg__error__unsupported_fractional_sampling[] = "#jpeg: unsupported fractional sampling"; ++const char wuffs_jpeg__error__unsupported_hierarchical_coding[] = "#jpeg: unsupported hierarchical coding"; ++const char wuffs_jpeg__error__unsupported_implicit_height[] = "#jpeg: unsupported implicit height"; ++const char wuffs_jpeg__error__unsupported_lossless_coding[] = "#jpeg: unsupported lossless coding"; ++const char wuffs_jpeg__error__unsupported_marker[] = "#jpeg: unsupported marker"; ++const char wuffs_jpeg__error__unsupported_precision_12_bits[] = "#jpeg: unsupported precision (12 bits)"; ++const char wuffs_jpeg__error__unsupported_precision_16_bits[] = "#jpeg: unsupported precision (16 bits)"; ++const char wuffs_jpeg__error__unsupported_precision[] = "#jpeg: unsupported precision"; ++const char wuffs_jpeg__error__unsupported_scan_count[] = "#jpeg: unsupported scan count"; ++const char wuffs_jpeg__error__internal_error_inconsistent_decoder_state[] = "#jpeg: internal error: inconsistent decoder state"; + +- uint32_t coro_susp_point = self->private_impl.p_decode_dht[0]; +- if (coro_susp_point) { +- v_tc4_th = self->private_data.s_decode_dht[0].v_tc4_th; +- v_total_count = self->private_data.s_decode_dht[0].v_total_count; +- v_i = self->private_data.s_decode_dht[0].v_i; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// ---------------- Private Consts + +- if (self->private_impl.f_sof_marker == 0u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- while (self->private_impl.f_payload_length > 0u) { +- if (self->private_impl.f_payload_length < 17u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- self->private_impl.f_payload_length -= 17u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (((v_c >> 4u) > 1u) || ((v_c & 15u) > 3u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- v_tc = (v_c >> 4u); +- v_th = (v_c & 15u); +- v_tc4_th = ((uint8_t)(((v_tc * 4u) | v_th))); +- if ((self->private_impl.f_sof_marker == 192u) && ((v_tc4_th & 3u) > 1u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- v_i = 0u; +- while (v_i < 16u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- self->private_data.f_dht_temp_counts[v_i] = t_1; +- } +- v_i += 1u; +- } +- v_working_total_count = 0u; +- v_i = 0u; +- while (v_i < 16u) { +- v_working_total_count = ((v_working_total_count + ((uint32_t)(self->private_data.f_dht_temp_counts[v_i]))) & 65535u); +- v_i += 1u; +- } +- if ((v_working_total_count <= 0u) || (256u < v_working_total_count)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- v_total_count = v_working_total_count; +- if (self->private_impl.f_payload_length < v_total_count) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- self->private_impl.f_payload_length -= v_total_count; +- v_i = 0u; +- while (v_i < v_total_count) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = t_2; +- } +- v_i += 1u; +- } +- while (v_i < 256u) { +- self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = 0u; +- v_i += 1u; +- } +- if ((v_tc4_th & 4u) == 0u) { +- v_i = 0u; +- while (v_i < v_total_count) { +- if (self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] > 15u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- v_i += 1u; +- } +- } +- v_failed = wuffs_jpeg__decoder__calculate_huff_tables(self, v_tc4_th, v_total_count); +- if (v_failed) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); +- goto exit; +- } +- self->private_impl.f_seen_dht[v_tc4_th] = true; +- } ++static const uint8_t ++WUFFS_JPEG__UNZIG[80] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 1u, 8u, 16u, 9u, 2u, 3u, ++ 10u, 17u, 24u, 32u, 25u, 18u, 11u, 4u, ++ 5u, 12u, 19u, 26u, 33u, 40u, 48u, 41u, ++ 34u, 27u, 20u, 13u, 6u, 7u, 14u, 21u, ++ 28u, 35u, 42u, 49u, 56u, 57u, 50u, 43u, ++ 36u, 29u, 22u, 15u, 23u, 30u, 37u, 44u, ++ 51u, 58u, 59u, 52u, 45u, 38u, 31u, 39u, ++ 46u, 53u, 60u, 61u, 54u, 47u, 55u, 62u, ++ 63u, 63u, 63u, 63u, 63u, 63u, 63u, 63u, ++ 63u, 63u, 63u, 63u, 63u, 63u, 63u, 63u, ++}; + +- goto ok; +- ok: +- self->private_impl.p_decode_dht[0] = 0; +- goto exit; +- } ++static const uint8_t ++WUFFS_JPEG__BIAS_AND_CLAMP[1024] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u, ++ 136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u, ++ 144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u, ++ 152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u, ++ 160u, 161u, 162u, 163u, 164u, 165u, 166u, 167u, ++ 168u, 169u, 170u, 171u, 172u, 173u, 174u, 175u, ++ 176u, 177u, 178u, 179u, 180u, 181u, 182u, 183u, ++ 184u, 185u, 186u, 187u, 188u, 189u, 190u, 191u, ++ 192u, 193u, 194u, 195u, 196u, 197u, 198u, 199u, ++ 200u, 201u, 202u, 203u, 204u, 205u, 206u, 207u, ++ 208u, 209u, 210u, 211u, 212u, 213u, 214u, 215u, ++ 216u, 217u, 218u, 219u, 220u, 221u, 222u, 223u, ++ 224u, 225u, 226u, 227u, 228u, 229u, 230u, 231u, ++ 232u, 233u, 234u, 235u, 236u, 237u, 238u, 239u, ++ 240u, 241u, 242u, 243u, 244u, 245u, 246u, 247u, ++ 248u, 249u, 250u, 251u, 252u, 253u, 254u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, ++ 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, ++ 16u, 17u, 18u, 19u, 20u, 21u, 22u, 23u, ++ 24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u, ++ 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, ++ 40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u, ++ 48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u, ++ 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, ++ 64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u, ++ 72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u, ++ 80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u, ++ 88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u, ++ 96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u, ++ 104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u, ++ 112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u, ++ 120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u, ++}; + +- goto suspend; +- suspend: +- self->private_impl.p_decode_dht[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_dht[0].v_tc4_th = v_tc4_th; +- self->private_data.s_decode_dht[0].v_total_count = v_total_count; +- self->private_data.s_decode_dht[0].v_i = v_i; ++static const uint16_t ++WUFFS_JPEG__EXTEND[16] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 65535u, 65533u, 65529u, 65521u, 65505u, 65473u, 65409u, ++ 65281u, 65025u, 64513u, 63489u, 61441u, 57345u, 49153u, 32769u, ++}; + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++static const uint8_t ++WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 1u, 5u, 1u, 1u, 1u, 1u, ++ 1u, 1u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 1u, 2u, 3u, 4u, 5u, 6u, ++ 7u, 8u, 9u, 10u, 11u, ++}; + +- return status; +-} ++static const uint8_t ++WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1u, 0u, 3u, 1u, 1u, 1u, 1u, 1u, ++ 1u, 1u, 1u, 1u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 1u, 2u, 3u, 4u, 5u, 6u, ++ 7u, 8u, 9u, 10u, 11u, ++}; + +-// -------- func jpeg.decoder.calculate_huff_tables ++static const uint8_t ++WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 16u, 0u, 2u, 1u, 3u, 3u, 2u, 4u, ++ 3u, 5u, 5u, 4u, 4u, 0u, 0u, 1u, ++ 125u, 1u, 2u, 3u, 0u, 4u, 17u, 5u, ++ 18u, 33u, 49u, 65u, 6u, 19u, 81u, 97u, ++ 7u, 34u, 113u, 20u, 50u, 129u, 145u, 161u, ++ 8u, 35u, 66u, 177u, 193u, 21u, 82u, 209u, ++ 240u, 36u, 51u, 98u, 114u, 130u, 9u, 10u, ++ 22u, 23u, 24u, 25u, 26u, 37u, 38u, 39u, ++ 40u, 41u, 42u, 52u, 53u, 54u, 55u, 56u, ++ 57u, 58u, 67u, 68u, 69u, 70u, 71u, 72u, ++ 73u, 74u, 83u, 84u, 85u, 86u, 87u, 88u, ++ 89u, 90u, 99u, 100u, 101u, 102u, 103u, 104u, ++ 105u, 106u, 115u, 116u, 117u, 118u, 119u, 120u, ++ 121u, 122u, 131u, 132u, 133u, 134u, 135u, 136u, ++ 137u, 138u, 146u, 147u, 148u, 149u, 150u, 151u, ++ 152u, 153u, 154u, 162u, 163u, 164u, 165u, 166u, ++ 167u, 168u, 169u, 170u, 178u, 179u, 180u, 181u, ++ 182u, 183u, 184u, 185u, 186u, 194u, 195u, 196u, ++ 197u, 198u, 199u, 200u, 201u, 202u, 210u, 211u, ++ 212u, 213u, 214u, 215u, 216u, 217u, 218u, 225u, ++ 226u, 227u, 228u, 229u, 230u, 231u, 232u, 233u, ++ 234u, 241u, 242u, 243u, 244u, 245u, 246u, 247u, ++ 248u, 249u, 250u, ++}; ++ ++static const uint8_t ++WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 17u, 0u, 2u, 1u, 2u, 4u, 4u, 3u, ++ 4u, 7u, 5u, 4u, 4u, 0u, 1u, 2u, ++ 119u, 0u, 1u, 2u, 3u, 17u, 4u, 5u, ++ 33u, 49u, 6u, 18u, 65u, 81u, 7u, 97u, ++ 113u, 19u, 34u, 50u, 129u, 8u, 20u, 66u, ++ 145u, 161u, 177u, 193u, 9u, 35u, 51u, 82u, ++ 240u, 21u, 98u, 114u, 209u, 10u, 22u, 36u, ++ 52u, 225u, 37u, 241u, 23u, 24u, 25u, 26u, ++ 38u, 39u, 40u, 41u, 42u, 53u, 54u, 55u, ++ 56u, 57u, 58u, 67u, 68u, 69u, 70u, 71u, ++ 72u, 73u, 74u, 83u, 84u, 85u, 86u, 87u, ++ 88u, 89u, 90u, 99u, 100u, 101u, 102u, 103u, ++ 104u, 105u, 106u, 115u, 116u, 117u, 118u, 119u, ++ 120u, 121u, 122u, 130u, 131u, 132u, 133u, 134u, ++ 135u, 136u, 137u, 138u, 146u, 147u, 148u, 149u, ++ 150u, 151u, 152u, 153u, 154u, 162u, 163u, 164u, ++ 165u, 166u, 167u, 168u, 169u, 170u, 178u, 179u, ++ 180u, 181u, 182u, 183u, 184u, 185u, 186u, 194u, ++ 195u, 196u, 197u, 198u, 199u, 200u, 201u, 202u, ++ 210u, 211u, 212u, 213u, 214u, 215u, 216u, 217u, ++ 218u, 226u, 227u, 228u, 229u, 230u, 231u, 232u, ++ 233u, 234u, 242u, 243u, 244u, 245u, 246u, 247u, ++ 248u, 249u, 250u, ++}; ++ ++#define WUFFS_JPEG__QUIRKS_BASE 1220532224u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-static bool +-wuffs_jpeg__decoder__calculate_huff_tables( ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__decode_idct( + wuffs_jpeg__decoder* self, +- uint8_t a_tc4_th, +- uint32_t a_total_count) { +- uint32_t v_i = 0; +- uint8_t v_j = 0; +- uint8_t v_k = 0; +- uint32_t v_bit_length_minus_one = 0; +- uint8_t v_bit_length = 0; +- uint32_t v_bit_string = 0; +- uint32_t v_slow = 0; +- uint8_t v_prefix = 0; +- uint16_t v_fast = 0; +- uint32_t v_reps = 0; ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, ++ uint32_t a_q); + +- v_i = 0u; +- v_k = 0u; +- v_bit_length_minus_one = 0u; +- while (v_i < a_total_count) { +- while (v_k >= self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) { +- v_k = 0u; +- v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u); +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_k += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- self->private_data.f_dht_temp_bit_lengths[v_i] = ((uint8_t)((v_bit_length_minus_one + 1u))); +- v_i += 1u; +- } +- v_bit_length = 0u; +- v_bit_string = 0u; +- v_i = 0u; +- while (v_i < a_total_count) { +- while (v_bit_length < self->private_data.f_dht_temp_bit_lengths[v_i]) { +- if (v_bit_length >= 16u) { +- return true; +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_bit_length += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- v_bit_string <<= 1u; +- } +- self->private_data.f_dht_temp_bit_strings[v_i] = ((uint16_t)(v_bit_string)); +- v_bit_string += 1u; +- if ((v_bit_string >> v_bit_length) > 0u) { +- return true; +- } +- v_i += 1u; +- } +- v_k = 0u; +- v_bit_length_minus_one = 0u; +- while (true) { +- if (self->private_data.f_dht_temp_counts[v_bit_length_minus_one] == 0u) { +- self->private_impl.f_huff_tables_slow[a_tc4_th][v_bit_length_minus_one] = 0u; +- } else { +- v_slow = (255u & ((uint32_t)(((uint32_t)(v_k)) - ((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_k]))))); +- v_k += self->private_data.f_dht_temp_counts[v_bit_length_minus_one]; +- self->private_impl.f_huff_tables_slow[a_tc4_th][v_bit_length_minus_one] = (v_slow | ((((uint32_t)(self->private_data.f_dht_temp_bit_strings[((uint8_t)(v_k - 1u))])) + 1u) << 8u)); +- } +- v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u); +- if (v_bit_length_minus_one == 0u) { +- break; +- } +- } +- v_i = 0u; +- while (v_i < 256u) { +- self->private_impl.f_huff_tables_fast[a_tc4_th][v_i] = 65535u; +- v_i += 1u; +- } +- v_j = 0u; +- v_bit_length_minus_one = 0u; +- while (v_bit_length_minus_one < 8u) { +- v_k = 0u; +- while (v_k < self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) { +- v_prefix = ((uint8_t)((((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_j])) << (7u - v_bit_length_minus_one)))); +- v_fast = ((uint16_t)(((((uint32_t)((v_bit_length_minus_one + 1u))) << 8u) | ((uint32_t)(self->private_impl.f_huff_tables_symbols[a_tc4_th][v_j]))))); +- v_reps = (((uint32_t)(1u)) << (7u - v_bit_length_minus_one)); +- while (v_reps > 0u) { +- self->private_impl.f_huff_tables_fast[a_tc4_th][v_prefix] = v_fast; +- v_prefix += 1u; +- v_reps -= 1u; +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- v_k += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- v_j += 1u; +- } +- v_bit_length_minus_one += 1u; +- } +- return false; +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__decode_idct__choosy_default( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, ++ uint32_t a_q); + +-// -------- func jpeg.decoder.decode_sos ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__decode_idct_x86_avx2( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, ++ uint32_t a_q); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__decode_sos( ++wuffs_jpeg__decoder__do_decode_image_config( + wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_my = 0; +- uint32_t v_mx = 0; +- uint32_t v_decode_mcu_result = 0; +- uint32_t v_bitstream_length = 0; +- +- uint32_t coro_susp_point = self->private_impl.p_decode_sos[0]; +- if (coro_susp_point) { +- v_my = self->private_data.s_decode_sos[0].v_my; +- v_mx = self->private_data.s_decode_sos[0].v_mx; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- if (self->private_impl.f_scan_count >= 64u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_scan_count); +- goto exit; +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_jpeg__decoder__prepare_scan(self, a_src); +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_next_restart_marker = 0u; +- self->private_impl.f_mcu_previous_dc_values[0u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[1u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[2u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[3u] = 0u; +- self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval; +- self->private_impl.f_eob_run = 0u; +- self->private_impl.f_bitstream_bits = 0u; +- self->private_impl.f_bitstream_n_bits = 0u; +- self->private_impl.f_bitstream_ri = 0u; +- self->private_impl.f_bitstream_wi = 0u; +- self->private_impl.f_bitstream_padding = 12345u; +- wuffs_jpeg__decoder__fill_bitstream(self, a_src); +- v_my = 0u; +- while (v_my < self->private_impl.f_scan_height_in_mcus) { +- v_mx = 0u; +- while (v_mx < self->private_impl.f_scan_width_in_mcus) { +- self->private_impl.f_mcu_current_block = 0u; +- self->private_impl.f_mcu_zig_index = ((uint32_t)(self->private_impl.f_scan_ss)); +- if (self->private_impl.f_sof_marker >= 194u) { +- wuffs_jpeg__decoder__load_mcu_blocks(self, v_mx, v_my, a_workbuf); +- } +- while (true) { +- v_decode_mcu_result = wuffs_jpeg__decoder__decode_mcu(self, a_workbuf, v_mx, v_my); +- if (v_decode_mcu_result == 0u) { +- break; +- } else if (v_decode_mcu_result != 1u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__internal_error_inconsistent_decoder_state); +- goto exit; +- } +- while (true) { +- v_bitstream_length = ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri)); +- wuffs_jpeg__decoder__fill_bitstream(self, a_src); +- if (v_bitstream_length < ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri))) { +- break; +- } else if (self->private_impl.f_bitstream_padding == 0u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } else if ((a_src && a_src->meta.closed) && ! self->private_impl.f_bitstream_is_closed) { +- if (self->private_impl.f_bitstream_wi < 1024u) { +- wuffs_base__bulk_memset(&self->private_data.f_bitstream_buffer[self->private_impl.f_bitstream_wi], 264u, 0u); +- self->private_impl.f_bitstream_wi += 264u; +- self->private_impl.f_bitstream_is_closed = true; +- } +- break; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- } +- } +- if (self->private_impl.f_sof_marker >= 194u) { +- wuffs_jpeg__decoder__save_mcu_blocks(self, v_mx, v_my, a_workbuf); +- } +- if (self->private_impl.f_restarts_remaining > 0u) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_restarts_remaining -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- if (self->private_impl.f_restarts_remaining == 0u) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_jpeg__decoder__skip_past_the_next_restart_marker(self, a_src); +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_mcu_previous_dc_values[0u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[1u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[2u] = 0u; +- self->private_impl.f_mcu_previous_dc_values[3u] = 0u; +- self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval; +- self->private_impl.f_eob_run = 0u; +- self->private_impl.f_bitstream_bits = 0u; +- self->private_impl.f_bitstream_n_bits = 0u; +- self->private_impl.f_bitstream_ri = 0u; +- self->private_impl.f_bitstream_wi = 0u; +- self->private_impl.f_bitstream_padding = 12345u; +- } +- } +- v_mx += 1u; +- } +- v_my += 1u; +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_scan_count, 1u); ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dqt( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- ok: +- self->private_impl.p_decode_sos[0] = 0; +- goto exit; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dri( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- goto suspend; +- suspend: +- self->private_impl.p_decode_sos[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_sos[0].v_my = v_my; +- self->private_data.s_decode_sos[0].v_mx = v_mx; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_appn( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint8_t a_marker); + +- goto exit; +- exit: +- return status; +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_sof( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src); + +-// -------- func jpeg.decoder.prepare_scan ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__quantize_dimension( ++ const wuffs_jpeg__decoder* self, ++ uint32_t a_width, ++ uint8_t a_h, ++ uint8_t a_max_incl_h); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_jpeg__decoder__prepare_scan( ++wuffs_jpeg__decoder__do_decode_frame_config( + wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- uint32_t v_i = 0; +- uint32_t v_j = 0; +- uint32_t v_j_max_incl = 0; +- bool v_failed = false; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_prepare_scan[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_prepare_scan[0].v_i; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if ((self->private_impl.f_payload_length < 6u) || (self->private_impl.f_payload_length > 12u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if ((v_c < 1u) || (v_c > 4u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_scan_num_components = ((uint32_t)(v_c)); +- if ((self->private_impl.f_scan_num_components > self->private_impl.f_num_components) || (self->private_impl.f_payload_length != (4u + (2u * self->private_impl.f_scan_num_components)))) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_payload_length = 0u; +- v_i = 0u; +- while (v_i < self->private_impl.f_scan_num_components) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- v_j = 0u; +- while (true) { +- if (v_j >= self->private_impl.f_num_components) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- if (v_c == self->private_impl.f_components_c[v_j]) { +- if ( ! self->private_impl.f_seen_dqt[self->private_impl.f_components_tq[v_j]]) { +- status = wuffs_base__make_status(wuffs_jpeg__error__missing_quantization_table); +- goto exit; +- } +- self->private_impl.f_scan_comps_cselector[v_i] = ((uint8_t)(v_j)); +- break; +- } +- v_j += 1u; +- } +- v_j = 0u; +- while (v_j < v_i) { +- if (self->private_impl.f_scan_comps_cselector[v_i] == self->private_impl.f_scan_comps_cselector[v_j]) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- v_j += 1u; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; +- } +- if (((v_c >> 4u) > 3u) || ((v_c & 15u) > 3u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_scan_comps_td[v_i] = (v_c >> 4u); +- self->private_impl.f_scan_comps_ta[v_i] = (v_c & 15u); +- if (self->private_impl.f_sof_marker == 192u) { +- if ((self->private_impl.f_scan_comps_td[v_i] > 1u) || (self->private_impl.f_scan_comps_ta[v_i] > 1u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- } +- v_i += 1u; +- } +- if (self->private_impl.f_sof_marker < 194u) { +- self->private_data.s_prepare_scan[0].scratch = 3u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (self->private_data.s_prepare_scan[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_prepare_scan[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_prepare_scan[0].scratch; +- self->private_impl.f_scan_ss = 0u; +- self->private_impl.f_scan_se = 63u; +- self->private_impl.f_scan_ah = 0u; +- self->private_impl.f_scan_al = 0u; +- } else { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; +- } +- if (v_c > 63u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_scan_ss = v_c; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; +- } +- if ((v_c > 63u) || (v_c < self->private_impl.f_scan_ss)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_scan_se = v_c; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; +- } +- if (((v_c >> 4u) > 14u) || ((v_c & 15u) > 13u)) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- self->private_impl.f_scan_ah = (v_c >> 4u); +- self->private_impl.f_scan_al = (v_c & 15u); +- if (self->private_impl.f_scan_ah > 0u) { +- if ((self->private_impl.f_scan_ah - 1u) != self->private_impl.f_scan_al) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- } +- if (self->private_impl.f_scan_ss == 0u) { +- if (self->private_impl.f_scan_se != 0u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } else if (self->private_impl.f_scan_ah == 0u) { +- self->private_impl.choosy_decode_mcu = ( +- &wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits); +- } else { +- self->private_impl.choosy_decode_mcu = ( +- &wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit); +- } +- } else { +- if (self->private_impl.f_scan_num_components != 1u) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } else if (self->private_impl.f_scan_ah == 0u) { +- self->private_impl.choosy_decode_mcu = ( +- &wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits); +- } else { +- self->private_impl.choosy_decode_mcu = ( +- &wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit); +- } +- } +- } +- v_i = 0u; +- while (v_i < self->private_impl.f_scan_num_components) { +- if ((self->private_impl.f_scan_ss == 0u) && ! self->private_impl.f_seen_dht[(0u | self->private_impl.f_scan_comps_td[v_i])]) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- status = wuffs_jpeg__decoder__use_default_huffman_table(self, (0u | self->private_impl.f_scan_comps_td[v_i])); +- if (status.repr) { +- goto suspend; +- } +- } +- if ((self->private_impl.f_scan_se != 0u) && ! self->private_impl.f_seen_dht[(4u | self->private_impl.f_scan_comps_ta[v_i])]) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_jpeg__decoder__use_default_huffman_table(self, (4u | self->private_impl.f_scan_comps_ta[v_i])); +- if (status.repr) { +- goto suspend; +- } +- } +- v_j = ((uint32_t)(self->private_impl.f_scan_ss)); +- v_j_max_incl = ((uint32_t)(wuffs_base__u8__min(self->private_impl.f_scan_se, 9u))); +- while (v_j <= v_j_max_incl) { +- self->private_impl.f_block_smoothing_lowest_scan_al[self->private_impl.f_scan_comps_cselector[v_i]][v_j] = self->private_impl.f_scan_al; +- v_j += 1u; +- } +- v_i += 1u; +- } +- if (self->private_impl.f_scan_num_components == 1u) { +- wuffs_jpeg__decoder__calculate_single_component_scan_fields(self); +- } else { +- v_failed = wuffs_jpeg__decoder__calculate_multiple_component_scan_fields(self); +- if (v_failed) { +- status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); +- goto exit; +- } +- } ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- goto ok; +- ok: +- self->private_impl.p_prepare_scan[0] = 0; +- goto exit; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__do_decode_frame( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); + +- goto suspend; +- suspend: +- self->private_impl.p_prepare_scan[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_prepare_scan[0].v_i = v_i; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dht( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src); + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++WUFFS_BASE__GENERATED_C_CODE ++static bool ++wuffs_jpeg__decoder__calculate_huff_tables( ++ wuffs_jpeg__decoder* self, ++ uint8_t a_tc4_th, ++ uint32_t a_total_count); + +- return status; +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_sos( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); + +-// -------- func jpeg.decoder.use_default_huffman_table ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__prepare_scan( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status + wuffs_jpeg__decoder__use_default_huffman_table( + wuffs_jpeg__decoder* self, +- uint8_t a_tc4_th) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__slice_u8 v_data = {0}; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- if (a_tc4_th == 0u) { +- v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA), 29); +- } else if (a_tc4_th == 1u) { +- v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA), 29); +- } else if (a_tc4_th == 4u) { +- v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA), 179); +- } else if (a_tc4_th == 5u) { +- v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA), 179); +- } else { +- status = wuffs_base__make_status(wuffs_jpeg__error__missing_huffman_table); +- goto exit; +- } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- v_data, +- 0u); +- self->private_impl.f_payload_length = ((uint32_t)((((uint64_t)(v_data.len)) & 65535u))); +- { +- wuffs_base__status t_0 = wuffs_jpeg__decoder__decode_dht(self, v_r); +- v_status = t_0; +- } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; +- } +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- +- ok: +- goto exit; +- exit: +- return status; +-} +- +-// -------- func jpeg.decoder.calculate_single_component_scan_fields ++ uint8_t a_tc4_th); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct + wuffs_jpeg__decoder__calculate_single_component_scan_fields( +- wuffs_jpeg__decoder* self) { +- uint8_t v_csel = 0; +- +- self->private_impl.f_scan_comps_bx_offset[0u] = 0u; +- self->private_impl.f_scan_comps_by_offset[0u] = 0u; +- self->private_impl.f_mcu_num_blocks = 1u; +- self->private_impl.f_mcu_blocks_sselector[0u] = 0u; +- v_csel = self->private_impl.f_scan_comps_cselector[0u]; +- self->private_impl.f_mcu_blocks_offset[0u] = self->private_impl.f_components_workbuf_offsets[v_csel]; +- self->private_impl.f_mcu_blocks_mx_mul[0u] = 8u; +- self->private_impl.f_mcu_blocks_my_mul[0u] = (8u * self->private_impl.f_components_workbuf_widths[v_csel]); +- self->private_impl.f_mcu_blocks_dc_hselector[0u] = (0u | self->private_impl.f_scan_comps_td[0u]); +- self->private_impl.f_mcu_blocks_ac_hselector[0u] = (4u | self->private_impl.f_scan_comps_ta[0u]); +- self->private_impl.f_scan_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, self->private_impl.f_components_h[v_csel], self->private_impl.f_max_incl_components_h); +- self->private_impl.f_scan_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, self->private_impl.f_components_v[v_csel], self->private_impl.f_max_incl_components_v); +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.calculate_multiple_component_scan_fields ++ wuffs_jpeg__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + static bool + wuffs_jpeg__decoder__calculate_multiple_component_scan_fields( +- wuffs_jpeg__decoder* self) { +- uint32_t v_i = 0; +- uint32_t v_h = 0; +- uint32_t v_v = 0; +- uint32_t v_hv = 0; +- uint32_t v_total_hv = 0; +- uint32_t v_b = 0; +- uint32_t v_bx_offset = 0; +- uint32_t v_by_offset = 0; +- uint8_t v_ssel = 0; +- uint8_t v_csel = 0; +- +- v_total_hv = 0u; +- v_i = 0u; +- v_b = 0u; +- v_bx_offset = 0u; +- v_by_offset = 0u; +- while (v_i < self->private_impl.f_scan_num_components) { +- v_h = ((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]])); +- v_v = ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]])); +- v_hv = (((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]])) * ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]]))); +- v_total_hv += v_hv; +- while (v_hv > 0u) { +- self->private_impl.f_scan_comps_bx_offset[(v_b & 15u)] = ((uint8_t)((v_bx_offset & 3u))); +- self->private_impl.f_scan_comps_by_offset[(v_b & 15u)] = ((uint8_t)((v_by_offset & 3u))); +- self->private_impl.f_mcu_blocks_sselector[(v_b & 15u)] = ((uint8_t)(v_i)); +- v_b += 1u; +- v_bx_offset += 1u; +- if (v_bx_offset == v_h) { +- v_bx_offset = 0u; +- v_by_offset += 1u; +- if (v_by_offset == v_v) { +- v_by_offset = 0u; +- } +- } +- v_hv -= 1u; +- } +- v_i += 1u; +- } +- if (v_total_hv > 10u) { +- return true; +- } +- self->private_impl.f_mcu_num_blocks = v_total_hv; +- v_b = 0u; +- while (v_b < self->private_impl.f_mcu_num_blocks) { +- v_ssel = self->private_impl.f_mcu_blocks_sselector[v_b]; +- v_csel = self->private_impl.f_scan_comps_cselector[v_ssel]; +- self->private_impl.f_mcu_blocks_offset[v_b] = (self->private_impl.f_components_workbuf_offsets[v_csel] + (8u * ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) + (8u * ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b])) * ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])))); +- self->private_impl.f_mcu_blocks_mx_mul[v_b] = (8u * ((uint32_t)(self->private_impl.f_components_h[v_csel]))); +- self->private_impl.f_mcu_blocks_my_mul[v_b] = (8u * ((uint32_t)(self->private_impl.f_components_v[v_csel])) * self->private_impl.f_components_workbuf_widths[v_csel]); +- self->private_impl.f_mcu_blocks_dc_hselector[v_b] = (0u | self->private_impl.f_scan_comps_td[v_ssel]); +- self->private_impl.f_mcu_blocks_ac_hselector[v_b] = (4u | self->private_impl.f_scan_comps_ta[v_ssel]); +- v_b += 1u; +- } +- self->private_impl.f_scan_width_in_mcus = self->private_impl.f_width_in_mcus; +- self->private_impl.f_scan_height_in_mcus = self->private_impl.f_height_in_mcus; +- return false; +-} +- +-// -------- func jpeg.decoder.fill_bitstream ++ wuffs_jpeg__decoder* self); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct + wuffs_jpeg__decoder__fill_bitstream( + wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src) { +- uint32_t v_wi = 0; +- uint8_t v_c = 0; +- uint32_t v_new_wi = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- if (self->private_impl.f_bitstream_ri <= 0u) { +- } else if (self->private_impl.f_bitstream_ri >= self->private_impl.f_bitstream_wi) { +- self->private_impl.f_bitstream_ri = 0u; +- self->private_impl.f_bitstream_wi = 0u; +- } else { +- v_wi = (self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri); +- wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_bitstream_buffer, 2048), wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi)); +- self->private_impl.f_bitstream_ri = 0u; +- self->private_impl.f_bitstream_wi = v_wi; +- } +- v_wi = self->private_impl.f_bitstream_wi; +- while ((v_wi < 2048u) && (((uint64_t)(io2_a_src - iop_a_src)) > 0u)) { +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (v_c < 255u) { +- self->private_data.f_bitstream_buffer[v_wi] = v_c; +- v_wi += 1u; +- iop_a_src += 1u; +- continue; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) { +- break; +- } else if ((wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u) > 0u) { +- break; +- } else { +- self->private_data.f_bitstream_buffer[v_wi] = 255u; +- v_wi += 1u; +- iop_a_src += 2u; +- } +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) > 1u) { +- if ((wuffs_base__peek_u8be__no_bounds_check(iop_a_src) >= 255u) && ((wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u) > 0u)) { +- v_new_wi = (wuffs_base__u32__min(v_wi, 1784u) + 264u); +- v_new_wi = wuffs_base__u32__min(v_new_wi, (v_wi + self->private_impl.f_bitstream_padding)); +- if (v_wi < v_new_wi) { +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_bitstream_padding, (v_new_wi - v_wi)); +- wuffs_base__bulk_memset(&self->private_data.f_bitstream_buffer[v_wi], (v_new_wi - v_wi), 0u); +- v_wi = v_new_wi; +- } +- } +- } +- self->private_impl.f_bitstream_wi = v_wi; +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.load_mcu_blocks_for_single_component ++ wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +@@ -44752,9 +44689,7 @@ wuffs_jpeg__decoder__load_mcu_blocks_for_single_component( + uint32_t a_mx, + uint32_t a_my, + wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel) { +- return (*self->private_impl.choosy_load_mcu_blocks_for_single_component)(self, a_mx, a_my, a_workbuf, a_csel); +-} ++ uint32_t a_csel); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +@@ -44763,19 +44698,7 @@ wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default( + uint32_t a_mx, + uint32_t a_my, + wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel) { +- uint64_t v_stride16 = 0; +- uint64_t v_offset = 0; +- +- v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u))); +- v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16)); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); +- } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.load_mcu_blocks ++ uint32_t a_csel); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +@@ -44783,34 +44706,7 @@ wuffs_jpeg__decoder__load_mcu_blocks( + wuffs_jpeg__decoder* self, + uint32_t a_mx, + uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf) { +- uint32_t v_b = 0; +- uint8_t v_csel = 0; +- uint64_t v_h = 0; +- uint64_t v_v = 0; +- uint64_t v_stride16 = 0; +- uint64_t v_offset = 0; +- +- v_h = 1u; +- v_v = 1u; +- v_b = 0u; +- while (v_b < self->private_impl.f_mcu_num_blocks) { +- v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]]; +- if (self->private_impl.f_scan_num_components > 1u) { +- v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel])); +- v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel])); +- } +- v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u))); +- v_offset = (self->private_impl.f_components_workbuf_offsets[(v_csel | 4u)] + (((v_h * ((uint64_t)(a_mx))) + ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) * 128u) + (((v_v * ((uint64_t)(a_my))) + ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b]))) * v_stride16)); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_load_host_endian(&self->private_data.f_mcu_blocks[v_b], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); +- } +- v_b += 1u; +- } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.save_mcu_blocks ++ wuffs_base__slice_u8 a_workbuf); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +@@ -44818,4983 +44714,17911 @@ wuffs_jpeg__decoder__save_mcu_blocks( + wuffs_jpeg__decoder* self, + uint32_t a_mx, + uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf) { +- uint32_t v_b = 0; +- uint8_t v_csel = 0; +- uint64_t v_h = 0; +- uint64_t v_v = 0; +- uint64_t v_stride16 = 0; +- uint64_t v_offset = 0; +- +- v_h = 1u; +- v_v = 1u; +- v_b = 0u; +- while (v_b < self->private_impl.f_mcu_num_blocks) { +- v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]]; +- if (self->private_impl.f_scan_num_components > 1u) { +- v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel])); +- v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel])); +- } +- v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u))); +- v_offset = (self->private_impl.f_components_workbuf_offsets[(v_csel | 4u)] + (((v_h * ((uint64_t)(a_mx))) + ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) * 128u) + (((v_v * ((uint64_t)(a_my))) + ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b]))) * v_stride16)); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_save_host_endian(&self->private_data.f_mcu_blocks[v_b], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); +- } +- v_b += 1u; +- } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.skip_past_the_next_restart_marker ++ wuffs_base__slice_u8 a_workbuf); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status + wuffs_jpeg__decoder__skip_past_the_next_restart_marker( + wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_skip_past_the_next_restart_marker[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; +- } else if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) < 255u) { +- iop_a_src += 1u; +- continue; +- } +- v_c = ((uint8_t)((wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u))); +- if (v_c < 192u) { +- iop_a_src += 2u; +- continue; +- } else if ((v_c < 208u) || (215u < v_c)) { +- break; +- } +- v_c &= 7u; +- if ((self->private_impl.f_next_restart_marker == ((v_c + 1u) & 7u)) || (self->private_impl.f_next_restart_marker == ((v_c + 2u) & 7u))) { +- break; +- } else if ((self->private_impl.f_next_restart_marker == ((v_c + 7u) & 7u)) || (self->private_impl.f_next_restart_marker == ((v_c + 6u) & 7u))) { +- iop_a_src += 2u; +- continue; +- } else { +- iop_a_src += 2u; +- break; +- } +- } +- self->private_impl.f_next_restart_marker = (((uint8_t)(self->private_impl.f_next_restart_marker + 1u)) & 7u); +- +- ok: +- self->private_impl.p_skip_past_the_next_restart_marker[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_skip_past_the_next_restart_marker[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func jpeg.decoder.apply_progressive_idct ++ wuffs_base__io_buffer* a_src); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct + wuffs_jpeg__decoder__apply_progressive_idct( + wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf) { +- uint32_t v_csel = 0; +- bool v_block_smoothing_applicable = false; +- uint32_t v_scan_width_in_mcus = 0; +- uint32_t v_scan_height_in_mcus = 0; +- uint32_t v_mcu_blocks_mx_mul_0 = 0; +- uint32_t v_mcu_blocks_my_mul_0 = 0; +- uint32_t v_my = 0; +- uint32_t v_mx = 0; +- uint64_t v_stride = 0; +- uint64_t v_offset = 0; +- uint8_t v_stashed_mcu_blocks_0[128] = {0}; +- +- wuffs_base__bulk_save_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__make_slice_u8(v_stashed_mcu_blocks_0, 128)); +- v_block_smoothing_applicable = true; +- v_csel = 0u; +- while (v_csel < self->private_impl.f_num_components) { +- if ((self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][0u] >= 16u) || wuffs_jpeg__decoder__top_left_quants_has_zero(self, ((uint32_t)(self->private_impl.f_components_tq[v_csel])))) { +- v_block_smoothing_applicable = false; +- } +- v_csel += 1u; +- } +- v_csel = 0u; +- while (v_csel < self->private_impl.f_num_components) { +- v_scan_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, self->private_impl.f_components_h[v_csel], self->private_impl.f_max_incl_components_h); +- v_scan_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, self->private_impl.f_components_v[v_csel], self->private_impl.f_max_incl_components_v); +- v_mcu_blocks_mx_mul_0 = 8u; +- v_mcu_blocks_my_mul_0 = (8u * self->private_impl.f_components_workbuf_widths[v_csel]); +- if (v_block_smoothing_applicable && (0u != (self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][1u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][2u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][3u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][4u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][5u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][6u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] | +- self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][9u]))) { +- self->private_impl.choosy_load_mcu_blocks_for_single_component = ( +- &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth); +- self->private_impl.f_block_smoothing_mx_max_incl = wuffs_base__u32__sat_sub(v_scan_width_in_mcus, 1u); +- self->private_impl.f_block_smoothing_my_max_incl = wuffs_base__u32__sat_sub(v_scan_height_in_mcus, 1u); +- } else { +- self->private_impl.choosy_load_mcu_blocks_for_single_component = ( +- &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default); +- } +- v_my = 0u; +- while (v_my < v_scan_height_in_mcus) { +- v_mx = 0u; +- while (v_mx < v_scan_width_in_mcus) { +- wuffs_jpeg__decoder__load_mcu_blocks_for_single_component(self, +- v_mx, +- v_my, +- a_workbuf, +- v_csel); +- v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])); +- v_offset = (self->private_impl.f_components_workbuf_offsets[v_csel] + (((uint64_t)(v_mcu_blocks_mx_mul_0)) * ((uint64_t)(v_mx))) + (((uint64_t)(v_mcu_blocks_my_mul_0)) * ((uint64_t)(v_my)))); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_jpeg__decoder__decode_idct(self, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); +- } +- v_mx += 1u; +- } +- v_my += 1u; +- } +- v_csel += 1u; +- } +- wuffs_base__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__make_slice_u8(v_stashed_mcu_blocks_0, 128)); +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.swizzle_gray ++ wuffs_base__slice_u8 a_workbuf); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status + wuffs_jpeg__decoder__swizzle_gray( + wuffs_jpeg__decoder* self, + wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_length = 0; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint32_t v_y = 0; +- uint64_t v_stride = 0; +- +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_length = ((uint64_t)((v_dst_bytes_per_pixel * self->private_impl.f_width))); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- v_y = 0u; +- while (v_y < self->private_impl.f_height) { +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_y); +- if (v_dst_length < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_length); +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), a_workbuf); +- v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[0u])); +- if (v_stride <= ((uint64_t)(a_workbuf.len))) { +- a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, v_stride); +- } else { +- a_workbuf = wuffs_base__utility__empty_slice_u8(); +- } +- v_y += 1u; +- } +- return wuffs_base__make_status(NULL); +-} +- +-// -------- func jpeg.decoder.swizzle_colorful ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_x0, ++ uint32_t a_x1, ++ uint32_t a_y0, ++ uint32_t a_y1, ++ uint64_t a_stride); + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status + wuffs_jpeg__decoder__swizzle_colorful( + wuffs_jpeg__decoder* self, + wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__slice_u8 v_src0 = {0}; +- wuffs_base__slice_u8 v_src1 = {0}; +- wuffs_base__slice_u8 v_src2 = {0}; +- wuffs_base__slice_u8 v_src3 = {0}; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- if ((self->private_impl.f_components_workbuf_offsets[0u] <= self->private_impl.f_components_workbuf_offsets[1u]) && (self->private_impl.f_components_workbuf_offsets[1u] <= ((uint64_t)(a_workbuf.len)))) { +- v_src0 = wuffs_base__slice_u8__subslice_ij(a_workbuf, +- self->private_impl.f_components_workbuf_offsets[0u], +- self->private_impl.f_components_workbuf_offsets[1u]); +- } +- if ((self->private_impl.f_components_workbuf_offsets[1u] <= self->private_impl.f_components_workbuf_offsets[2u]) && (self->private_impl.f_components_workbuf_offsets[2u] <= ((uint64_t)(a_workbuf.len)))) { +- v_src1 = wuffs_base__slice_u8__subslice_ij(a_workbuf, +- self->private_impl.f_components_workbuf_offsets[1u], +- self->private_impl.f_components_workbuf_offsets[2u]); +- } +- if ((self->private_impl.f_components_workbuf_offsets[2u] <= self->private_impl.f_components_workbuf_offsets[3u]) && (self->private_impl.f_components_workbuf_offsets[3u] <= ((uint64_t)(a_workbuf.len)))) { +- v_src2 = wuffs_base__slice_u8__subslice_ij(a_workbuf, +- self->private_impl.f_components_workbuf_offsets[2u], +- self->private_impl.f_components_workbuf_offsets[3u]); +- } +- if ((self->private_impl.f_components_workbuf_offsets[3u] <= self->private_impl.f_components_workbuf_offsets[4u]) && (self->private_impl.f_components_workbuf_offsets[4u] <= ((uint64_t)(a_workbuf.len)))) { +- v_src3 = wuffs_base__slice_u8__subslice_ij(a_workbuf, +- self->private_impl.f_components_workbuf_offsets[3u], +- self->private_impl.f_components_workbuf_offsets[4u]); +- } +- v_status = wuffs_base__pixel_swizzler__swizzle_ycck(&self->private_impl.f_swizzler, +- a_dst, +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), +- self->private_impl.f_width, +- self->private_impl.f_height, +- v_src0, +- v_src1, +- v_src2, +- v_src3, +- self->private_impl.f_components_workbuf_widths[0u], +- self->private_impl.f_components_workbuf_widths[1u], +- self->private_impl.f_components_workbuf_widths[2u], +- self->private_impl.f_components_workbuf_widths[3u], +- self->private_impl.f_components_workbuf_heights[0u], +- self->private_impl.f_components_workbuf_heights[1u], +- self->private_impl.f_components_workbuf_heights[2u], +- self->private_impl.f_components_workbuf_heights[3u], +- self->private_impl.f_components_workbuf_widths[0u], +- self->private_impl.f_components_workbuf_widths[1u], +- self->private_impl.f_components_workbuf_widths[2u], +- self->private_impl.f_components_workbuf_widths[3u], +- self->private_impl.f_components_h[0u], +- self->private_impl.f_components_h[1u], +- self->private_impl.f_components_h[2u], +- self->private_impl.f_components_h[3u], +- self->private_impl.f_components_v[0u], +- self->private_impl.f_components_v[1u], +- self->private_impl.f_components_v[2u], +- self->private_impl.f_components_v[3u], +- self->private_impl.f_is_rgb_or_cmyk, +- true, +- wuffs_base__make_slice_u8(self->private_data.f_swizzle_ycck_scratch_buffer_2k, 2048)); +- return wuffs_base__status__ensure_not_a_suspension(v_status); +-} +- +-// -------- func jpeg.decoder.frame_dirty_rect ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_x0, ++ uint32_t a_x1, ++ uint32_t a_y0, ++ uint32_t a_y1); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_jpeg__decoder__frame_dirty_rect( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- +- return wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height); +-} +- +-// -------- func jpeg.decoder.num_animation_loops ++static bool ++wuffs_jpeg__decoder__top_left_quants_has_zero( ++ const wuffs_jpeg__decoder* self, ++ uint32_t a_q); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_jpeg__decoder__num_animation_loops( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func jpeg.decoder.num_decoded_frame_configs ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_csel); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_jpeg__decoder__num_decoded_frame_configs( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- if (self->private_impl.f_call_sequence > 32u) { +- return 1u; +- } +- return 0u; +-} +- +-// -------- func jpeg.decoder.num_decoded_frames ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_jpeg__decoder__num_decoded_frames( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- if (self->private_impl.f_call_sequence > 64u) { +- return 1u; +- } +- return 0u; +-} +- +-// -------- func jpeg.decoder.restart_frame ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu__choosy_default( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__restart_frame( ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits( + wuffs_jpeg__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- uint32_t v_i = 0; +- uint32_t v_j = 0; ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } +- if (a_index != 0u) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- self->private_impl.f_call_sequence = 40u; +- self->private_impl.f_bitstream_is_closed = false; +- self->private_impl.f_frame_config_io_position = a_io_position; +- self->private_impl.f_scan_count = 0u; +- self->private_impl.f_restart_interval = self->private_impl.f_saved_restart_interval; +- v_i = 0u; +- while (v_i < 4u) { +- self->private_impl.f_seen_dqt[v_i] = self->private_impl.f_saved_seen_dqt[v_i]; +- v_j = 0u; +- while (v_j < 64u) { +- self->private_impl.f_quant_tables[v_i][v_j] = self->private_impl.f_saved_quant_tables[v_i][v_j]; +- v_j += 1u; +- } +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < 4u) { +- v_j = 0u; +- while (v_j < 10u) { +- self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u; +- v_j += 1u; +- } +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < 8u) { +- self->private_impl.f_seen_dht[v_i] = false; +- v_i += 1u; +- } +- return wuffs_base__make_status(NULL); +-} ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + +-// -------- func jpeg.decoder.set_report_metadata ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_jpeg__decoder__set_report_metadata( ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit( + wuffs_jpeg__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_base__make_empty_struct(); +-} ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my); + +-// -------- func jpeg.decoder.tell_me_more ++// ---------------- VTables + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_jpeg__decoder__tell_me_more( ++const wuffs_base__image_decoder__func_ptrs ++wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_jpeg__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_jpeg__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_jpeg__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_jpeg__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_jpeg__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_jpeg__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_jpeg__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_jpeg__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_jpeg__decoder__initialize( + wuffs_jpeg__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); + } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); + +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; ++ self->private_impl.choosy_decode_idct = &wuffs_jpeg__decoder__decode_idct__choosy_default; ++ self->private_impl.choosy_load_mcu_blocks_for_single_component = &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default; ++ self->private_impl.choosy_decode_mcu = &wuffs_jpeg__decoder__decode_mcu__choosy_default; + +- goto ok; +- ok: +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); + } + +-// -------- func jpeg.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_jpeg__decoder__history_retain_length( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return 0; ++wuffs_jpeg__decoder* ++wuffs_jpeg__decoder__alloc(void) { ++ wuffs_jpeg__decoder* x = ++ (wuffs_jpeg__decoder*)(calloc(1, sizeof(wuffs_jpeg__decoder))); ++ if (!x) { ++ return NULL; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (wuffs_jpeg__decoder__initialize( ++ x, sizeof(wuffs_jpeg__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; + } ++ return x; ++} + +- return 0u; ++size_t ++sizeof__wuffs_jpeg__decoder(void) { ++ return sizeof(wuffs_jpeg__decoder); + } + +-// -------- func jpeg.decoder.workbuf_len ++// ---------------- Function Implementations ++ ++// -------- func jpeg.decoder.decode_idct + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_jpeg__decoder__workbuf_len( +- const wuffs_jpeg__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- +- return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_components_workbuf_offsets[8u], self->private_impl.f_components_workbuf_offsets[8u]); +-} +- +-// -------- func jpeg.decoder.top_left_quants_has_zero +- +-WUFFS_BASE__GENERATED_C_CODE +-static bool +-wuffs_jpeg__decoder__top_left_quants_has_zero( +- const wuffs_jpeg__decoder* self, ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__decode_idct( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, + uint32_t a_q) { +- return ((self->private_impl.f_quant_tables[a_q][0u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][1u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][2u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][3u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][8u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][9u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][10u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][16u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][17u] == 0u) || +- (self->private_impl.f_quant_tables[a_q][24u] == 0u)); ++ return (*self->private_impl.choosy_decode_idct)(self, a_dst_buffer, a_dst_stride, a_q); + } + +-// -------- func jpeg.decoder.load_mcu_blocks_for_single_component_smooth +- + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth( ++wuffs_jpeg__decoder__decode_idct__choosy_default( + wuffs_jpeg__decoder* self, +- uint32_t a_mx, +- uint32_t a_my, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_csel) { +- uint64_t v_stride16 = 0; +- uint64_t v_offset = 0; +- uint32_t v_dx = 0; +- uint32_t v_dy = 0; +- uint32_t v_mx = 0; +- uint32_t v_my = 0; +- uint8_t v_q = 0; +- uint32_t v_q_00 = 0; +- uint32_t v_q_xy = 0; +- uint8_t v_al = 0; +- uint32_t v_scratch = 0; +- uint32_t v_limit = 0; ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, ++ uint32_t a_q) { ++ uint32_t v_bq0 = 0; ++ uint32_t v_bq2 = 0; ++ uint32_t v_bq4 = 0; ++ uint32_t v_bq6 = 0; ++ uint32_t v_ca = 0; ++ uint32_t v_cb2 = 0; ++ uint32_t v_cb6 = 0; ++ uint32_t v_ccp = 0; ++ uint32_t v_ccm = 0; ++ uint32_t v_cd0 = 0; ++ uint32_t v_cd1 = 0; ++ uint32_t v_cd2 = 0; ++ uint32_t v_cd3 = 0; ++ uint32_t v_bq1 = 0; ++ uint32_t v_bq3 = 0; ++ uint32_t v_bq5 = 0; ++ uint32_t v_bq7 = 0; ++ uint32_t v_ci51 = 0; ++ uint32_t v_ci53 = 0; ++ uint32_t v_ci71 = 0; ++ uint32_t v_ci73 = 0; ++ uint32_t v_cj = 0; ++ uint32_t v_ck1 = 0; ++ uint32_t v_ck3 = 0; ++ uint32_t v_ck5 = 0; ++ uint32_t v_ck7 = 0; ++ uint32_t v_cl51 = 0; ++ uint32_t v_cl73 = 0; ++ uint32_t v_in0 = 0; ++ uint32_t v_in2 = 0; ++ uint32_t v_in4 = 0; ++ uint32_t v_in6 = 0; ++ uint32_t v_ra = 0; ++ uint32_t v_rb2 = 0; ++ uint32_t v_rb6 = 0; ++ uint32_t v_rcp = 0; ++ uint32_t v_rcm = 0; ++ uint32_t v_rd0 = 0; ++ uint32_t v_rd1 = 0; ++ uint32_t v_rd2 = 0; ++ uint32_t v_rd3 = 0; ++ uint32_t v_in1 = 0; ++ uint32_t v_in3 = 0; ++ uint32_t v_in5 = 0; ++ uint32_t v_in7 = 0; ++ uint32_t v_ri51 = 0; ++ uint32_t v_ri53 = 0; ++ uint32_t v_ri71 = 0; ++ uint32_t v_ri73 = 0; ++ uint32_t v_rj = 0; ++ uint32_t v_rk1 = 0; ++ uint32_t v_rk3 = 0; ++ uint32_t v_rk5 = 0; ++ uint32_t v_rk7 = 0; ++ uint32_t v_rl51 = 0; ++ uint32_t v_rl73 = 0; ++ uint32_t v_intermediate[64] = {0}; + +- v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u))); +- v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16)); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ if (8u > a_dst_stride) { ++ return wuffs_base__make_empty_struct(); + } +- v_dy = 0u; +- while (v_dy < 5u) { +- v_my = wuffs_base__u32__min(self->private_impl.f_block_smoothing_my_max_incl, wuffs_base__u32__sat_sub((a_my + v_dy), 2u)); +- v_dx = 0u; +- while (v_dx < 5u) { +- v_mx = wuffs_base__u32__min(self->private_impl.f_block_smoothing_mx_max_incl, wuffs_base__u32__sat_sub((a_mx + v_dx), 2u)); +- v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(v_mx)) * 128u) + (((uint64_t)(v_my)) * v_stride16)); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_base__bulk_load_host_endian(&self->private_impl.f_block_smoothing_dc_values[v_dy][v_dx], 1u * (size_t)2u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); +- } +- v_dx += 1u; +- } +- v_dy += 1u; ++ if (0u == (self->private_data.f_mcu_blocks[0u][8u] | ++ self->private_data.f_mcu_blocks[0u][16u] | ++ self->private_data.f_mcu_blocks[0u][24u] | ++ self->private_data.f_mcu_blocks[0u][32u] | ++ self->private_data.f_mcu_blocks[0u][40u] | ++ self->private_data.f_mcu_blocks[0u][48u] | ++ self->private_data.f_mcu_blocks[0u][56u])) { ++ v_intermediate[0u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][0u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][0u])))) << 2u)); ++ v_intermediate[8u] = v_intermediate[0u]; ++ v_intermediate[16u] = v_intermediate[0u]; ++ v_intermediate[24u] = v_intermediate[0u]; ++ v_intermediate[32u] = v_intermediate[0u]; ++ v_intermediate[40u] = v_intermediate[0u]; ++ v_intermediate[48u] = v_intermediate[0u]; ++ v_intermediate[56u] = v_intermediate[0u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][16u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][16u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][48u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][48u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][0u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][0u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][32u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][32u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][8u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][8u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][24u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][24u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][40u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][40u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][56u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][56u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[0u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[56u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[8u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[48u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[16u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[40u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[24u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[32u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- v_q = self->private_impl.f_components_tq[a_csel]; +- v_q_00 = ((uint32_t)(self->private_impl.f_quant_tables[v_q][0u])); +- if (v_q_00 <= 0u) { +- return wuffs_base__make_empty_struct(); ++ if (0u == (self->private_data.f_mcu_blocks[0u][9u] | ++ self->private_data.f_mcu_blocks[0u][17u] | ++ self->private_data.f_mcu_blocks[0u][25u] | ++ self->private_data.f_mcu_blocks[0u][33u] | ++ self->private_data.f_mcu_blocks[0u][41u] | ++ self->private_data.f_mcu_blocks[0u][49u] | ++ self->private_data.f_mcu_blocks[0u][57u])) { ++ v_intermediate[1u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][1u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][1u])))) << 2u)); ++ v_intermediate[9u] = v_intermediate[1u]; ++ v_intermediate[17u] = v_intermediate[1u]; ++ v_intermediate[25u] = v_intermediate[1u]; ++ v_intermediate[33u] = v_intermediate[1u]; ++ v_intermediate[41u] = v_intermediate[1u]; ++ v_intermediate[49u] = v_intermediate[1u]; ++ v_intermediate[57u] = v_intermediate[1u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][17u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][17u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][49u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][49u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][1u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][1u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][33u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][33u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][9u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][9u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][25u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][25u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][41u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][41u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][57u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][57u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[1u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[57u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[9u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[49u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[17u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[41u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[25u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[33u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- if (0u != (16u & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][6u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][7u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][8u] & +- self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][9u])) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(152u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + 128u)) / 256u))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + 128u)) / 256u))); +- } +- self->private_data.f_mcu_blocks[0u][0u] = ((uint16_t)(v_scratch)); +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][3u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][3u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][3u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][10u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][10u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][10u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][17u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][17u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][17u] = ((uint16_t)(v_scratch)); +- } +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][24u])); +- if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][24u] == 0u)) { +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } else { +- v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); +- } +- self->private_data.f_mcu_blocks[0u][24u] = ((uint16_t)(v_scratch)); +- } ++ if (0u == (self->private_data.f_mcu_blocks[0u][10u] | ++ self->private_data.f_mcu_blocks[0u][18u] | ++ self->private_data.f_mcu_blocks[0u][26u] | ++ self->private_data.f_mcu_blocks[0u][34u] | ++ self->private_data.f_mcu_blocks[0u][42u] | ++ self->private_data.f_mcu_blocks[0u][50u] | ++ self->private_data.f_mcu_blocks[0u][58u])) { ++ v_intermediate[2u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][2u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][2u])))) << 2u)); ++ v_intermediate[10u] = v_intermediate[2u]; ++ v_intermediate[18u] = v_intermediate[2u]; ++ v_intermediate[26u] = v_intermediate[2u]; ++ v_intermediate[34u] = v_intermediate[2u]; ++ v_intermediate[42u] = v_intermediate[2u]; ++ v_intermediate[50u] = v_intermediate[2u]; ++ v_intermediate[58u] = v_intermediate[2u]; + } else { +- v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u]; +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u])); +- if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) { +- v_limit = ((((uint32_t)(1u)) << v_al) - 1u); +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } else { +- v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } +- self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch)); +- } +- v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u]; +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u])); +- if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) { +- v_limit = ((((uint32_t)(1u)) << v_al) - 1u); +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } else { +- v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } +- self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch)); +- } +- v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u]; +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u])); +- if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) { +- v_limit = ((((uint32_t)(1u)) << v_al) - 1u); +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } else { +- v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } +- self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch)); +- } +- v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u]; +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u])); +- if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) { +- v_limit = ((((uint32_t)(1u)) << v_al) - 1u); +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } else { +- v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } +- self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch)); +- } +- v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u]; +- v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u])); +- if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) { +- v_limit = ((((uint32_t)(1u)) << v_al) - 1u); +- v_scratch = 0u; +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); +- v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); +- v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); +- v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); +- v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); +- v_scratch *= v_q_00; +- if (v_scratch < 2147483648u) { +- v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } else { +- v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); +- } +- self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch)); +- } ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][18u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][18u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][50u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][50u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][2u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][2u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][34u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][34u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][10u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][10u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][26u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][26u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][42u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][42u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][58u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][58u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[2u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[58u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[10u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[50u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[18u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[42u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[26u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[34u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func jpeg.decoder.decode_mcu +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- return (*self->private_impl.choosy_decode_mcu)(self, a_workbuf, a_mx, a_my); +-} +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu__choosy_default( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- uint32_t v_ret = 0; +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint8_t v_csel = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint32_t v_pos = 0; +- uint8_t v_dc_h = 0; +- uint32_t v_dc_symbol = 0; +- uint32_t v_dc_ht_fast = 0; +- uint32_t v_dc_bl = 0; +- uint32_t v_dc_code = 0; +- uint32_t v_dc_blm1 = 0; +- uint32_t v_dc_ht_slow = 0; +- uint16_t v_dc_value = 0; +- uint16_t v_dc_extend = 0; +- const uint16_t* v_ac_huff_table_fast = NULL; +- uint8_t v_ac_h = 0; +- uint32_t v_ac_symbol = 0; +- uint32_t v_ac_ht_fast = 0; +- uint32_t v_ac_bl = 0; +- uint32_t v_ac_code = 0; +- uint32_t v_ac_blm1 = 0; +- uint32_t v_ac_ht_slow = 0; +- uint16_t v_ac_value = 0; +- uint16_t v_ac_extend = 0; +- uint32_t v_ac_rrrr = 0; +- uint32_t v_ac_ssss = 0; +- uint32_t v_z = 0; +- uint32_t v_mcb = 0; +- uint64_t v_stride = 0; +- uint64_t v_offset = 0; +- +- v_bits = self->private_impl.f_bitstream_bits; +- v_n_bits = self->private_impl.f_bitstream_n_bits; +- if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { +- return 2u; ++ if (0u == (self->private_data.f_mcu_blocks[0u][11u] | ++ self->private_data.f_mcu_blocks[0u][19u] | ++ self->private_data.f_mcu_blocks[0u][27u] | ++ self->private_data.f_mcu_blocks[0u][35u] | ++ self->private_data.f_mcu_blocks[0u][43u] | ++ self->private_data.f_mcu_blocks[0u][51u] | ++ self->private_data.f_mcu_blocks[0u][59u])) { ++ v_intermediate[3u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][3u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][3u])))) << 2u)); ++ v_intermediate[11u] = v_intermediate[3u]; ++ v_intermediate[19u] = v_intermediate[3u]; ++ v_intermediate[27u] = v_intermediate[3u]; ++ v_intermediate[35u] = v_intermediate[3u]; ++ v_intermediate[43u] = v_intermediate[3u]; ++ v_intermediate[51u] = v_intermediate[3u]; ++ v_intermediate[59u] = v_intermediate[3u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][19u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][19u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][51u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][51u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][3u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][3u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][35u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][35u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][11u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][11u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][27u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][27u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][43u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][43u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][59u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][59u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[3u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[59u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[11u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[51u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[19u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[43u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[27u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[35u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi), +- ((uint64_t)(self->private_impl.f_bitstream_ri))); +- do { +- while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { +- while (self->private_impl.f_mcu_zig_index <= 0u) { +- wuffs_base__bulk_memset(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, 0u); +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block]; +- v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)])); +- v_dc_bl = (v_dc_ht_fast >> 8u); +- if (v_n_bits >= v_dc_bl) { +- v_dc_symbol = (15u & v_dc_ht_fast); +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- v_bits <<= (v_dc_bl & 63u); +- v_n_bits -= v_dc_bl; +- } else { +- v_dc_code = ((uint32_t)((v_bits >> 55u))); +- v_dc_blm1 = 8u; +- v_bits <<= 9u; +- v_n_bits -= 9u; +- while (true) { +- v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1]; +- if (v_dc_code < (v_dc_ht_slow >> 8u)) { +- v_dc_symbol = (15u & ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_dc_h][(255u & ((uint32_t)(v_dc_code + v_dc_ht_slow)))]))); +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- break; +- } +- v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u); +- if (v_dc_blm1 == 0u) { +- v_dc_symbol = 0u; +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- break; +- } +- } +- } +- v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol)))); +- v_dc_value += (v_dc_extend & (((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)); +- v_bits <<= v_dc_symbol; +- v_n_bits -= v_dc_symbol; +- v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]]; +- self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value; +- self->private_data.f_mcu_blocks[0u][0u] = self->private_impl.f_mcu_previous_dc_values[v_csel]; +- self->private_impl.f_mcu_zig_index = 1u; +- break; +- } +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- if (v_n_bits < 16u) { +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- } +- v_z = 1u; +- self->private_impl.f_mcu_zig_index = 0u; +- v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[self->private_impl.f_mcu_current_block]; +- v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; +- while (v_z < 64u) { +- v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_ac_bl = (v_ac_ht_fast >> 8u); +- if (v_n_bits >= v_ac_bl) { +- v_ac_symbol = (255u & v_ac_ht_fast); +- v_bits <<= (v_ac_bl & 63u); +- v_n_bits -= v_ac_bl; +- } else { +- v_ac_code = ((uint32_t)((v_bits >> 55u))); +- v_ac_blm1 = 8u; +- v_bits <<= 9u; +- v_n_bits -= 9u; +- while (true) { +- v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; +- if (v_ac_code < (v_ac_ht_slow >> 8u)) { +- v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); +- break; +- } +- v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); +- if (v_ac_blm1 == 0u) { +- v_ac_symbol = 0u; +- break; +- } +- } +- } +- v_ac_rrrr = (v_ac_symbol >> 4u); +- v_z += (v_ac_rrrr + 1u); +- v_ac_ssss = (v_ac_symbol & 15u); +- v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss]; +- if (v_ac_ssss > 0u) { +- v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss)))); +- v_ac_value += (v_ac_extend & (((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)); +- v_bits <<= v_ac_ssss; +- v_n_bits -= v_ac_ssss; +- self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[v_z]] = v_ac_value; +- } else if (v_ac_rrrr < 15u) { +- break; +- } +- } +- v_mcb = self->private_impl.f_mcu_current_block; +- self->private_impl.f_mcu_current_block += 1u; +- if (self->private_impl.f_test_only_interrupt_decode_mcu) { +- goto label__goto_done__break; +- } +- v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]]; +- v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])); +- v_offset = (self->private_impl.f_mcu_blocks_offset[v_mcb] + (((uint64_t)(self->private_impl.f_mcu_blocks_mx_mul[v_mcb])) * ((uint64_t)(a_mx))) + (((uint64_t)(self->private_impl.f_mcu_blocks_my_mul[v_mcb])) * ((uint64_t)(a_my)))); +- if (v_offset <= ((uint64_t)(a_workbuf.len))) { +- wuffs_jpeg__decoder__decode_idct(self, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); +- } +- } +- self->private_impl.f_mcu_current_block = 0u; +- } while (0); +- label__goto_done__break:; +- v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); +- if (v_pos > self->private_impl.f_bitstream_wi) { +- v_ret = 2u; +- } else { +- self->private_impl.f_bitstream_ri = v_pos; +- } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; ++ if (0u == (self->private_data.f_mcu_blocks[0u][12u] | ++ self->private_data.f_mcu_blocks[0u][20u] | ++ self->private_data.f_mcu_blocks[0u][28u] | ++ self->private_data.f_mcu_blocks[0u][36u] | ++ self->private_data.f_mcu_blocks[0u][44u] | ++ self->private_data.f_mcu_blocks[0u][52u] | ++ self->private_data.f_mcu_blocks[0u][60u])) { ++ v_intermediate[4u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][4u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][4u])))) << 2u)); ++ v_intermediate[12u] = v_intermediate[4u]; ++ v_intermediate[20u] = v_intermediate[4u]; ++ v_intermediate[28u] = v_intermediate[4u]; ++ v_intermediate[36u] = v_intermediate[4u]; ++ v_intermediate[44u] = v_intermediate[4u]; ++ v_intermediate[52u] = v_intermediate[4u]; ++ v_intermediate[60u] = v_intermediate[4u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][20u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][20u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][52u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][52u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][4u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][4u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][36u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][36u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][12u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][12u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][28u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][28u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][44u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][44u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][60u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][60u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[4u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[60u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[12u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[52u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[20u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[44u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[28u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[36u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- self->private_impl.f_bitstream_bits = v_bits; +- self->private_impl.f_bitstream_n_bits = v_n_bits; +- return v_ret; +-} +- +-// -------- func jpeg.decoder.decode_mcu_progressive_ac_high_bits +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- uint32_t v_ret = 0; +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint32_t v_pos = 0; +- const uint16_t* v_ac_huff_table_fast = NULL; +- uint8_t v_ac_h = 0; +- uint32_t v_ac_symbol = 0; +- uint32_t v_ac_ht_fast = 0; +- uint32_t v_ac_bl = 0; +- uint32_t v_ac_code = 0; +- uint32_t v_ac_blm1 = 0; +- uint32_t v_ac_ht_slow = 0; +- uint16_t v_ac_value = 0; +- uint16_t v_ac_extend = 0; +- uint32_t v_ac_rrrr = 0; +- uint32_t v_ac_ssss = 0; +- uint32_t v_z = 0; +- +- if (self->private_impl.f_eob_run > 0u) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_eob_run -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- return 0u; ++ if (0u == (self->private_data.f_mcu_blocks[0u][13u] | ++ self->private_data.f_mcu_blocks[0u][21u] | ++ self->private_data.f_mcu_blocks[0u][29u] | ++ self->private_data.f_mcu_blocks[0u][37u] | ++ self->private_data.f_mcu_blocks[0u][45u] | ++ self->private_data.f_mcu_blocks[0u][53u] | ++ self->private_data.f_mcu_blocks[0u][61u])) { ++ v_intermediate[5u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][5u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][5u])))) << 2u)); ++ v_intermediate[13u] = v_intermediate[5u]; ++ v_intermediate[21u] = v_intermediate[5u]; ++ v_intermediate[29u] = v_intermediate[5u]; ++ v_intermediate[37u] = v_intermediate[5u]; ++ v_intermediate[45u] = v_intermediate[5u]; ++ v_intermediate[53u] = v_intermediate[5u]; ++ v_intermediate[61u] = v_intermediate[5u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][21u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][21u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][53u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][53u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][5u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][5u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][37u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][37u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][13u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][13u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][29u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][29u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][45u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][45u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][61u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][61u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[5u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[61u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[13u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[53u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[21u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[45u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[29u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[37u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- v_bits = self->private_impl.f_bitstream_bits; +- v_n_bits = self->private_impl.f_bitstream_n_bits; +- if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { +- return 2u; ++ if (0u == (self->private_data.f_mcu_blocks[0u][14u] | ++ self->private_data.f_mcu_blocks[0u][22u] | ++ self->private_data.f_mcu_blocks[0u][30u] | ++ self->private_data.f_mcu_blocks[0u][38u] | ++ self->private_data.f_mcu_blocks[0u][46u] | ++ self->private_data.f_mcu_blocks[0u][54u] | ++ self->private_data.f_mcu_blocks[0u][62u])) { ++ v_intermediate[6u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][6u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][6u])))) << 2u)); ++ v_intermediate[14u] = v_intermediate[6u]; ++ v_intermediate[22u] = v_intermediate[6u]; ++ v_intermediate[30u] = v_intermediate[6u]; ++ v_intermediate[38u] = v_intermediate[6u]; ++ v_intermediate[46u] = v_intermediate[6u]; ++ v_intermediate[54u] = v_intermediate[6u]; ++ v_intermediate[62u] = v_intermediate[6u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][22u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][22u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][54u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][54u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][6u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][6u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][38u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][38u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][14u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][14u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][30u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][30u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][46u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][46u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][62u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][62u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[6u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[62u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[14u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[54u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[22u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[46u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[30u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[38u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi), +- ((uint64_t)(self->private_impl.f_bitstream_ri))); +- do { +- do { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- if (v_n_bits < 16u) { +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- } +- v_z = self->private_impl.f_mcu_zig_index; +- self->private_impl.f_mcu_zig_index = 0u; +- v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u]; +- v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; +- while (v_z <= ((uint32_t)(self->private_impl.f_scan_se))) { +- v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_ac_bl = (v_ac_ht_fast >> 8u); +- if (v_n_bits >= v_ac_bl) { +- v_ac_symbol = (255u & v_ac_ht_fast); +- v_bits <<= (v_ac_bl & 63u); +- v_n_bits -= v_ac_bl; +- } else { +- v_ac_code = ((uint32_t)((v_bits >> 55u))); +- v_ac_blm1 = 8u; +- v_bits <<= 9u; +- v_n_bits -= 9u; +- while (true) { +- v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; +- if (v_ac_code < (v_ac_ht_slow >> 8u)) { +- v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); +- break; +- } +- v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); +- if (v_ac_blm1 == 0u) { +- v_ac_symbol = 0u; +- break; +- } +- } +- } +- v_ac_rrrr = (v_ac_symbol >> 4u); +- v_z += (v_ac_rrrr + 1u); +- v_ac_ssss = (v_ac_symbol & 15u); +- v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss]; +- if (v_ac_ssss > 0u) { +- v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss)))); +- v_ac_value += (v_ac_extend & (((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)); +- v_bits <<= v_ac_ssss; +- v_n_bits -= v_ac_ssss; +- self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[v_z]] = ((uint16_t)(((uint16_t)(v_ac_value << self->private_impl.f_scan_al)))); +- } else if (v_ac_rrrr < 15u) { +- self->private_impl.f_eob_run = ((uint16_t)(((((uint16_t)(1u)) << v_ac_rrrr) - 1u))); +- if (v_ac_rrrr > 0u) { +- self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr)))); +- v_bits <<= v_ac_rrrr; +- v_n_bits -= v_ac_rrrr; +- } +- break; +- } +- } +- } while (0); +- } while (0); +- label__goto_done__break:; +- v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); +- if (v_pos > self->private_impl.f_bitstream_wi) { +- v_ret = 2u; +- } else { +- self->private_impl.f_bitstream_ri = v_pos; +- } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; ++ if (0u == (self->private_data.f_mcu_blocks[0u][15u] | ++ self->private_data.f_mcu_blocks[0u][23u] | ++ self->private_data.f_mcu_blocks[0u][31u] | ++ self->private_data.f_mcu_blocks[0u][39u] | ++ self->private_data.f_mcu_blocks[0u][47u] | ++ self->private_data.f_mcu_blocks[0u][55u] | ++ self->private_data.f_mcu_blocks[0u][63u])) { ++ v_intermediate[7u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][7u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][7u])))) << 2u)); ++ v_intermediate[15u] = v_intermediate[7u]; ++ v_intermediate[23u] = v_intermediate[7u]; ++ v_intermediate[31u] = v_intermediate[7u]; ++ v_intermediate[39u] = v_intermediate[7u]; ++ v_intermediate[47u] = v_intermediate[7u]; ++ v_intermediate[55u] = v_intermediate[7u]; ++ v_intermediate[63u] = v_intermediate[7u]; ++ } else { ++ v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][23u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][23u])))); ++ v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][55u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][55u])))); ++ v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u)); ++ v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u)))); ++ v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u)))); ++ v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][7u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][7u])))); ++ v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][39u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][39u])))); ++ v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u)); ++ v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u)); ++ v_cd0 = ((uint32_t)(v_ccp + v_cb2)); ++ v_cd1 = ((uint32_t)(v_ccm + v_cb6)); ++ v_cd2 = ((uint32_t)(v_ccm - v_cb6)); ++ v_cd3 = ((uint32_t)(v_ccp - v_cb2)); ++ v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][15u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][15u])))); ++ v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][31u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][31u])))); ++ v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][47u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][47u])))); ++ v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][63u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][63u])))); ++ v_ci51 = ((uint32_t)(v_bq5 + v_bq1)); ++ v_ci53 = ((uint32_t)(v_bq5 + v_bq3)); ++ v_ci71 = ((uint32_t)(v_bq7 + v_bq1)); ++ v_ci73 = ((uint32_t)(v_bq7 + v_bq3)); ++ v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u)); ++ v_ck1 = ((uint32_t)(v_bq1 * 12299u)); ++ v_ck3 = ((uint32_t)(v_bq3 * 25172u)); ++ v_ck5 = ((uint32_t)(v_bq5 * 16819u)); ++ v_ck7 = ((uint32_t)(v_bq7 * 2446u)); ++ v_ci51 *= 4294964100u; ++ v_ci53 *= 4294946301u; ++ v_ci71 *= 4294959923u; ++ v_ci73 *= 4294951227u; ++ v_cl51 = ((uint32_t)(v_ci51 + v_cj)); ++ v_cl73 = ((uint32_t)(v_ci73 + v_cj)); ++ v_ck1 += ((uint32_t)(v_ci71 + v_cl51)); ++ v_ck3 += ((uint32_t)(v_ci53 + v_cl73)); ++ v_ck5 += ((uint32_t)(v_ci53 + v_cl51)); ++ v_ck7 += ((uint32_t)(v_ci71 + v_cl73)); ++ v_intermediate[7u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u); ++ v_intermediate[63u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u); ++ v_intermediate[15u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u); ++ v_intermediate[55u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u); ++ v_intermediate[23u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u); ++ v_intermediate[47u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u); ++ v_intermediate[31u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u); ++ v_intermediate[39u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u); + } +- self->private_impl.f_bitstream_bits = v_bits; +- self->private_impl.f_bitstream_n_bits = v_n_bits; +- return v_ret; +-} +- +-// -------- func jpeg.decoder.decode_mcu_progressive_ac_low_bit +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- uint32_t v_ret = 0; +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint16_t v_one_lshift_scan_al = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint32_t v_pos = 0; +- const uint16_t* v_ac_huff_table_fast = NULL; +- uint8_t v_ac_h = 0; +- uint32_t v_ac_symbol = 0; +- uint32_t v_ac_ht_fast = 0; +- uint32_t v_ac_bl = 0; +- uint32_t v_ac_code = 0; +- uint32_t v_ac_blm1 = 0; +- uint32_t v_ac_ht_slow = 0; +- uint16_t v_ac_value = 0; +- uint32_t v_ac_rrrr = 0; +- uint32_t v_ac_ssss = 0; +- uint8_t v_unzig = 0; +- bool v_bit = false; +- +- v_bits = self->private_impl.f_bitstream_bits; +- v_n_bits = self->private_impl.f_bitstream_n_bits; +- v_one_lshift_scan_al = (((uint16_t)(1u)) << self->private_impl.f_scan_al); +- if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { +- return 2u; +- } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi), +- ((uint64_t)(self->private_impl.f_bitstream_ri))); +- do { +- do { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- while (true) { +- if (self->private_impl.f_eob_run > 0u) { +- break; +- } +- v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u]; +- v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; +- while (true) { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); +- v_ac_bl = (v_ac_ht_fast >> 8u); +- if (v_n_bits >= v_ac_bl) { +- v_ac_symbol = (255u & v_ac_ht_fast); +- v_bits <<= (v_ac_bl & 63u); +- v_n_bits -= v_ac_bl; +- } else { +- v_ac_code = ((uint32_t)((v_bits >> 55u))); +- v_ac_blm1 = 8u; +- v_bits <<= 9u; +- v_n_bits -= 9u; +- while (true) { +- v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; +- if (v_ac_code < (v_ac_ht_slow >> 8u)) { +- v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); +- break; +- } +- v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); +- if (v_ac_blm1 == 0u) { +- v_ac_symbol = 0u; +- break; +- } +- } +- } +- v_ac_rrrr = (v_ac_symbol >> 4u); +- v_ac_ssss = (v_ac_symbol & 15u); +- v_ac_value = 0u; +- if (v_ac_ssss > 0u) { +- v_ac_value = (((uint16_t)(1u)) << self->private_impl.f_scan_al); +- if ((v_bits >> 63u) == 0u) { +- v_ac_value = ((uint16_t)(((uint16_t)(65535u)) << self->private_impl.f_scan_al)); +- } +- v_bits <<= 1u; +- v_n_bits -= 1u; +- } else if (v_ac_rrrr < 15u) { +- self->private_impl.f_eob_run = (((uint16_t)(1u)) << v_ac_rrrr); +- if (v_ac_rrrr > 0u) { +- self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr)))); +- v_bits <<= v_ac_rrrr; +- v_n_bits -= v_ac_rrrr; +- } +- goto label__goto_do_eob__break; +- } +- while (true) { +- v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]; +- if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) { +- if (v_n_bits == 0u) { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- } +- v_bit = ((v_bits >> 63u) > 0u); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- if (v_bit) { +- if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } +- } +- } else if (v_ac_rrrr <= 0u) { +- break; +- } else { +- v_ac_rrrr -= 1u; +- } +- if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { +- break; +- } +- self->private_impl.f_mcu_zig_index += 1u; +- } +- if (v_ac_value != 0u) { +- self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]] = v_ac_value; +- } +- if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { +- break; +- } +- self->private_impl.f_mcu_zig_index += 1u; +- } +- goto label__block__break; +- } +- label__goto_do_eob__break:; +- if (self->private_impl.f_eob_run <= 0u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- while (true) { +- v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]; +- if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) { +- if (v_n_bits == 0u) { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- } +- v_bit = ((v_bits >> 63u) > 0u); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- if (v_bit) { +- if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } +- } +- } +- if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { +- break; +- } +- self->private_impl.f_mcu_zig_index += 1u; +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_eob_run -= 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } while (0); +- label__block__break:; +- } while (0); +- label__goto_done__break:; +- v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); +- if (v_pos > self->private_impl.f_bitstream_wi) { +- v_ret = 2u; +- } else { +- self->private_impl.f_bitstream_ri = v_pos; ++ if (0u == (v_intermediate[1u] | ++ v_intermediate[2u] | ++ v_intermediate[3u] | ++ v_intermediate[4u] | ++ v_intermediate[5u] | ++ v_intermediate[6u] | ++ v_intermediate[7u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; +- } +- self->private_impl.f_bitstream_bits = v_bits; +- self->private_impl.f_bitstream_n_bits = v_n_bits; +- return v_ret; +-} +- +-// -------- func jpeg.decoder.decode_mcu_progressive_dc_high_bits +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- uint32_t v_ret = 0; +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint8_t v_csel = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint32_t v_pos = 0; +- uint8_t v_dc_h = 0; +- uint32_t v_dc_symbol = 0; +- uint32_t v_dc_ht_fast = 0; +- uint32_t v_dc_bl = 0; +- uint32_t v_dc_code = 0; +- uint32_t v_dc_blm1 = 0; +- uint32_t v_dc_ht_slow = 0; +- uint16_t v_dc_value = 0; +- uint16_t v_dc_extend = 0; +- +- v_bits = self->private_impl.f_bitstream_bits; +- v_n_bits = self->private_impl.f_bitstream_n_bits; +- if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { +- return 2u; +- } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi), +- ((uint64_t)(self->private_impl.f_bitstream_ri))); +- do { +- while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- do { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block]; +- v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)])); +- v_dc_bl = (v_dc_ht_fast >> 8u); +- if (v_n_bits >= v_dc_bl) { +- v_dc_symbol = (15u & v_dc_ht_fast); +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- v_bits <<= (v_dc_bl & 63u); +- v_n_bits -= v_dc_bl; +- } else { +- v_dc_code = ((uint32_t)((v_bits >> 55u))); +- v_dc_blm1 = 8u; +- v_bits <<= 9u; +- v_n_bits -= 9u; +- while (true) { +- v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1]; +- if (v_dc_code < (v_dc_ht_slow >> 8u)) { +- v_dc_symbol = (15u & ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_dc_h][(255u & ((uint32_t)(v_dc_code + v_dc_ht_slow)))]))); +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- break; +- } +- v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); +- v_bits <<= 1u; +- v_n_bits -= 1u; +- v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u); +- if (v_dc_blm1 == 0u) { +- v_dc_symbol = 0u; +- v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; +- break; +- } +- } +- } +- v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol)))); +- v_dc_value += (v_dc_extend & (((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)); +- v_bits <<= v_dc_symbol; +- v_n_bits -= v_dc_symbol; +- v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]]; +- self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value; +- self->private_data.f_mcu_blocks[self->private_impl.f_mcu_current_block][0u] = ((uint16_t)(self->private_impl.f_mcu_previous_dc_values[v_csel] << self->private_impl.f_scan_al)); +- } while (0); +- self->private_impl.f_mcu_current_block += 1u; +- } +- self->private_impl.f_mcu_current_block = 0u; +- } while (0); +- label__goto_done__break:; +- v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); +- if (v_pos > self->private_impl.f_bitstream_wi) { +- v_ret = 2u; +- } else { +- self->private_impl.f_bitstream_ri = v_pos; ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[0u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[2u]; ++ v_in6 = v_intermediate[6u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[0u]; ++ v_in4 = v_intermediate[4u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[1u]; ++ v_in3 = v_intermediate[3u]; ++ v_in5 = v_intermediate[5u]; ++ v_in7 = v_intermediate[7u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; +- } +- self->private_impl.f_bitstream_bits = v_bits; +- self->private_impl.f_bitstream_n_bits = v_n_bits; +- return v_ret; +-} +- +-// -------- func jpeg.decoder.decode_mcu_progressive_dc_low_bit +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit( +- wuffs_jpeg__decoder* self, +- wuffs_base__slice_u8 a_workbuf, +- uint32_t a_mx, +- uint32_t a_my) { +- uint32_t v_ret = 0; +- uint64_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint16_t v_one_lshift_scan_al = 0; +- wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_r = &u_r; +- const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint32_t v_pos = 0; +- +- v_bits = self->private_impl.f_bitstream_bits; +- v_n_bits = self->private_impl.f_bitstream_n_bits; +- v_one_lshift_scan_al = (((uint16_t)(1u)) << self->private_impl.f_scan_al); +- if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { +- return 2u; ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- { +- wuffs_base__io_buffer* o_0_v_r = v_r; +- const uint8_t *o_0_iop_v_r = iop_v_r; +- const uint8_t *o_0_io0_v_r = io0_v_r; +- const uint8_t *o_0_io1_v_r = io1_v_r; +- const uint8_t *o_0_io2_v_r = io2_v_r; +- v_r = wuffs_base__io_reader__set( +- &u_r, +- &iop_v_r, +- &io0_v_r, +- &io1_v_r, +- &io2_v_r, +- wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, +- self->private_impl.f_bitstream_ri, +- self->private_impl.f_bitstream_wi), +- ((uint64_t)(self->private_impl.f_bitstream_ri))); +- do { +- while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { +- v_ret = 1u; +- goto label__goto_done__break; +- } +- do { +- if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { +- v_ret = 2u; +- goto label__goto_done__break; +- } +- v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); +- iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); +- v_n_bits |= 56u; +- if ((v_bits >> 63u) != 0u) { +- self->private_data.f_mcu_blocks[self->private_impl.f_mcu_current_block][0u] |= v_one_lshift_scan_al; +- } +- v_bits <<= 1u; +- v_n_bits -= 1u; +- } while (0); +- self->private_impl.f_mcu_current_block += 1u; +- } +- self->private_impl.f_mcu_current_block = 0u; +- } while (0); +- label__goto_done__break:; +- v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); +- if (v_pos > self->private_impl.f_bitstream_wi) { +- v_ret = 2u; +- } else { +- self->private_impl.f_bitstream_ri = v_pos; ++ if (0u == (v_intermediate[9u] | ++ v_intermediate[10u] | ++ v_intermediate[11u] | ++ v_intermediate[12u] | ++ v_intermediate[13u] | ++ v_intermediate[14u] | ++ v_intermediate[15u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } +- v_r = o_0_v_r; +- iop_v_r = o_0_iop_v_r; +- io0_v_r = o_0_io0_v_r; +- io1_v_r = o_0_io1_v_r; +- io2_v_r = o_0_io2_v_r; +- } +- self->private_impl.f_bitstream_bits = v_bits; +- self->private_impl.f_bitstream_n_bits = v_n_bits; +- return v_ret; +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_json__error__bad_c0_control_code[] = "#json: bad C0 control code"; +-const char wuffs_json__error__bad_utf_8[] = "#json: bad UTF-8"; +-const char wuffs_json__error__bad_backslash_escape[] = "#json: bad backslash-escape"; +-const char wuffs_json__error__bad_input[] = "#json: bad input"; +-const char wuffs_json__error__bad_new_line_in_a_string[] = "#json: bad new-line in a string"; +-const char wuffs_json__error__bad_quirk_combination[] = "#json: bad quirk combination"; +-const char wuffs_json__error__unsupported_number_length[] = "#json: unsupported number length"; +-const char wuffs_json__error__unsupported_recursion_depth[] = "#json: unsupported recursion depth"; +-const char wuffs_json__error__internal_error_inconsistent_i_o[] = "#json: internal error: inconsistent I/O"; +- +-// ---------------- Private Consts +- +-#define WUFFS_JSON__DECODER_NUMBER_LENGTH_MAX_INCL 99 +- +-static const uint8_t +-WUFFS_JSON__LUT_BACKSLASHES[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 3, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 162, 0, 0, 0, 0, 5, +- 0, 0, 0, 0, 0, 0, 0, 175, +- 7, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 4, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 220, 0, 0, 0, +- 0, 1, 136, 0, 0, 2, 140, 0, +- 0, 0, 0, 0, 0, 0, 138, 0, +- 0, 0, 141, 0, 137, 0, 6, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 1, 3, 4, 5, 6, 7, 10, +-}; +- +-static const uint8_t +-WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 7, 27, 10, 63, 39, 11, 0, +-}; +- +-static const uint8_t +-WUFFS_JSON__LUT_CHARS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 128, 129, 130, 131, 132, 133, 134, 135, +- 136, 137, 138, 139, 140, 141, 142, 143, +- 144, 145, 146, 147, 148, 149, 150, 151, +- 152, 153, 154, 155, 156, 157, 158, 159, +- 0, 0, 1, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 2, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 16, 16, 16, 16, 16, 16, 16, 16, +- 32, 32, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, +- 3, 3, 3, 3, 3, 3, 3, 3, +- 4, 4, 4, 4, 4, 4, 4, 4, +- 4, 4, 4, 4, 4, 4, 4, 4, +- 5, 5, 5, 5, 5, 32, 32, 32, +- 32, 32, 32, 32, 32, 32, 32, 32, +-}; +- +-#define WUFFS_JSON__CLASS_WHITESPACE 0 +- +-#define WUFFS_JSON__CLASS_STRING 1 +- +-#define WUFFS_JSON__CLASS_COMMA 2 +- +-#define WUFFS_JSON__CLASS_COLON 3 +- +-#define WUFFS_JSON__CLASS_NUMBER 4 +- +-#define WUFFS_JSON__CLASS_OPEN_CURLY_BRACE 5 +- +-#define WUFFS_JSON__CLASS_CLOSE_CURLY_BRACE 6 +- +-#define WUFFS_JSON__CLASS_OPEN_SQUARE_BRACKET 7 +- +-#define WUFFS_JSON__CLASS_CLOSE_SQUARE_BRACKET 8 +- +-#define WUFFS_JSON__CLASS_FALSE 9 +- +-#define WUFFS_JSON__CLASS_TRUE 10 +- +-#define WUFFS_JSON__CLASS_NULL_NAN_INF 11 +- +-#define WUFFS_JSON__CLASS_COMMENT 12 +- +-#define WUFFS_JSON__EXPECT_VALUE 7858 +- +-#define WUFFS_JSON__EXPECT_NON_STRING_VALUE 7856 +- +-#define WUFFS_JSON__EXPECT_STRING 4098 +- +-#define WUFFS_JSON__EXPECT_COMMA 4100 +- +-#define WUFFS_JSON__EXPECT_COLON 4104 +- +-#define WUFFS_JSON__EXPECT_NUMBER 4112 +- +-#define WUFFS_JSON__EXPECT_CLOSE_CURLY_BRACE 4160 +- +-#define WUFFS_JSON__EXPECT_CLOSE_SQUARE_BRACKET 4352 +- +-static const uint8_t +-WUFFS_JSON__LUT_CLASSES[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 0, 0, 15, 15, 0, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 0, 15, 1, 15, 15, 15, 15, 15, +- 15, 15, 15, 11, 2, 4, 15, 12, +- 4, 4, 4, 4, 4, 4, 4, 4, +- 4, 4, 3, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 11, 15, 15, 15, 15, 11, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 7, 15, 8, 15, 15, +- 15, 15, 15, 15, 15, 15, 9, 15, +- 15, 11, 15, 15, 15, 15, 11, 15, +- 15, 15, 15, 15, 10, 15, 15, 15, +- 15, 15, 15, 5, 15, 6, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +- 15, 15, 15, 15, 15, 15, 15, 15, +-}; +- +-static const uint8_t +-WUFFS_JSON__LUT_DECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 128, 129, 130, 131, 132, 133, 134, 135, +- 136, 137, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 128, 129, 130, 131, 132, 133, 134, 135, +- 136, 137, 0, 0, 0, 0, 0, 0, +- 0, 138, 139, 140, 141, 142, 143, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 138, 139, 140, 141, 142, 143, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +-}; +- +-#define WUFFS_JSON__QUIRKS_BASE 1225364480 +- +-#define WUFFS_JSON__QUIRKS_COUNT 21 +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_json__decoder__decode_number( +- wuffs_json__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_json__decoder__decode_digits( +- wuffs_json__decoder* self, +- wuffs_base__io_buffer* a_src, +- uint32_t a_n); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_leading( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_comment( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_inf_nan( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_trailer( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-// ---------------- VTables +- +-const wuffs_base__token_decoder__func_ptrs +-wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__token_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_json__decoder__decode_tokens), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_json__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_json__decoder__history_retain_length), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_json__decoder__set_quirk), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_json__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_json__decoder__initialize( +- wuffs_json__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[8u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[10u]; ++ v_in6 = v_intermediate[14u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[8u]; ++ v_in4 = v_intermediate[12u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[9u]; ++ v_in3 = v_intermediate[11u]; ++ v_in5 = v_intermediate[13u]; ++ v_in7 = v_intermediate[15u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ if (0u == (v_intermediate[17u] | ++ v_intermediate[18u] | ++ v_intermediate[19u] | ++ v_intermediate[20u] | ++ v_intermediate[21u] | ++ v_intermediate[22u] | ++ v_intermediate[23u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[16u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ v_in2 = v_intermediate[18u]; ++ v_in6 = v_intermediate[22u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[16u]; ++ v_in4 = v_intermediate[20u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[17u]; ++ v_in3 = v_intermediate[19u]; ++ v_in5 = v_intermediate[21u]; ++ v_in7 = v_intermediate[23u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name = +- wuffs_base__token_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers = +- (const void*)(&wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_json__decoder* +-wuffs_json__decoder__alloc(void) { +- wuffs_json__decoder* x = +- (wuffs_json__decoder*)(calloc(sizeof(wuffs_json__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_json__decoder__initialize( +- x, sizeof(wuffs_json__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} +- +-size_t +-sizeof__wuffs_json__decoder(void) { +- return sizeof(wuffs_json__decoder); +-} +- +-// ---------------- Function Implementations +- +-// -------- func json.decoder.get_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_json__decoder__get_quirk( +- const wuffs_json__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- uint32_t v_key = 0; +- +- if (a_key >= 1225364480u) { +- v_key = (a_key - 1225364480u); +- if (v_key < 21u) { +- if (self->private_impl.f_quirks[v_key]) { +- return 1u; +- } ++ if (0u == (v_intermediate[25u] | ++ v_intermediate[26u] | ++ v_intermediate[27u] | ++ v_intermediate[28u] | ++ v_intermediate[29u] | ++ v_intermediate[30u] | ++ v_intermediate[31u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } +- } +- return 0u; +-} +- +-// -------- func json.decoder.set_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_json__decoder__set_quirk( +- wuffs_json__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- if (a_key >= 1225364480u) { +- a_key -= 1225364480u; +- if (a_key < 21u) { +- self->private_impl.f_quirks[a_key] = (a_value > 0u); +- return wuffs_base__make_status(NULL); ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[24u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[26u]; ++ v_in6 = v_intermediate[30u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[24u]; ++ v_in4 = v_intermediate[28u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[25u]; ++ v_in3 = v_intermediate[27u]; ++ v_in5 = v_intermediate[29u]; ++ v_in7 = v_intermediate[31u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); + } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +-} +- +-// -------- func json.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_json__decoder__history_retain_length( +- const wuffs_json__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (0u == (v_intermediate[33u] | ++ v_intermediate[34u] | ++ v_intermediate[35u] | ++ v_intermediate[36u] | ++ v_intermediate[37u] | ++ v_intermediate[38u] | ++ v_intermediate[39u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[32u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[34u]; ++ v_in6 = v_intermediate[38u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[32u]; ++ v_in4 = v_intermediate[36u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[33u]; ++ v_in3 = v_intermediate[35u]; ++ v_in5 = v_intermediate[37u]; ++ v_in7 = v_intermediate[39u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- +- return 0u; +-} +- +-// -------- func json.decoder.workbuf_len +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_json__decoder__workbuf_len( +- const wuffs_json__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ if (0u == (v_intermediate[41u] | ++ v_intermediate[42u] | ++ v_intermediate[43u] | ++ v_intermediate[44u] | ++ v_intermediate[45u] | ++ v_intermediate[46u] | ++ v_intermediate[47u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[40u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[42u]; ++ v_in6 = v_intermediate[46u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[40u]; ++ v_in4 = v_intermediate[44u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[41u]; ++ v_in3 = v_intermediate[43u]; ++ v_in5 = v_intermediate[45u]; ++ v_in7 = v_intermediate[47u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ if (0u == (v_intermediate[49u] | ++ v_intermediate[50u] | ++ v_intermediate[51u] | ++ v_intermediate[52u] | ++ v_intermediate[53u] | ++ v_intermediate[54u] | ++ v_intermediate[55u])) { ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[48u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ } else { ++ v_in2 = v_intermediate[50u]; ++ v_in6 = v_intermediate[54u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[48u]; ++ v_in4 = v_intermediate[52u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[49u]; ++ v_in3 = v_intermediate[51u]; ++ v_in5 = v_intermediate[53u]; ++ v_in7 = v_intermediate[55u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); + } +- +- return wuffs_base__utility__empty_range_ii_u64(); ++ if (0u == (v_intermediate[57u] | ++ v_intermediate[58u] | ++ v_intermediate[59u] | ++ v_intermediate[60u] | ++ v_intermediate[61u] | ++ v_intermediate[62u] | ++ v_intermediate[63u])) { ++ if (8u > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[56u] + 16u)) >> 5u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u]; ++ a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u]; ++ } else { ++ v_in2 = v_intermediate[58u]; ++ v_in6 = v_intermediate[62u]; ++ v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u)); ++ v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u)))); ++ v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u)))); ++ v_in0 = v_intermediate[56u]; ++ v_in4 = v_intermediate[60u]; ++ v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u)); ++ v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u)); ++ v_rd0 = ((uint32_t)(v_rcp + v_rb2)); ++ v_rd1 = ((uint32_t)(v_rcm + v_rb6)); ++ v_rd2 = ((uint32_t)(v_rcm - v_rb6)); ++ v_rd3 = ((uint32_t)(v_rcp - v_rb2)); ++ v_in1 = v_intermediate[57u]; ++ v_in3 = v_intermediate[59u]; ++ v_in5 = v_intermediate[61u]; ++ v_in7 = v_intermediate[63u]; ++ v_ri51 = ((uint32_t)(v_in5 + v_in1)); ++ v_ri53 = ((uint32_t)(v_in5 + v_in3)); ++ v_ri71 = ((uint32_t)(v_in7 + v_in1)); ++ v_ri73 = ((uint32_t)(v_in7 + v_in3)); ++ v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u)); ++ v_rk1 = ((uint32_t)(v_in1 * 12299u)); ++ v_rk3 = ((uint32_t)(v_in3 * 25172u)); ++ v_rk5 = ((uint32_t)(v_in5 * 16819u)); ++ v_rk7 = ((uint32_t)(v_in7 * 2446u)); ++ v_ri51 *= 4294964100u; ++ v_ri53 *= 4294946301u; ++ v_ri71 *= 4294959923u; ++ v_ri73 *= 4294951227u; ++ v_rl51 = ((uint32_t)(v_ri51 + v_rj)); ++ v_rl73 = ((uint32_t)(v_ri73 + v_rj)); ++ v_rk1 += ((uint32_t)(v_ri71 + v_rl51)); ++ v_rk3 += ((uint32_t)(v_ri53 + v_rl73)); ++ v_rk5 += ((uint32_t)(v_ri53 + v_rl51)); ++ v_rk7 += ((uint32_t)(v_ri71 + v_rl73)); ++ if (8u > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)]; ++ } ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func json.decoder.decode_tokens ++// ‼ WUFFS MULTI-FILE SECTION +x86_avx2 ++// -------- func jpeg.decoder.decode_idct_x86_avx2 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2") + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_json__decoder__decode_tokens( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_vminor = 0; +- uint32_t v_number_length = 0; +- uint32_t v_number_status = 0; +- uint32_t v_string_length = 0; +- uint32_t v_whitespace_length = 0; +- uint32_t v_depth = 0; +- uint32_t v_stack_byte = 0; +- uint32_t v_stack_bit = 0; +- uint32_t v_match = 0; +- uint32_t v_c4 = 0; +- uint8_t v_c = 0; +- uint8_t v_backslash = 0; +- uint8_t v_char = 0; +- uint8_t v_class = 0; +- uint32_t v_multi_byte_utf8 = 0; +- uint8_t v_backslash_x_ok = 0; +- uint8_t v_backslash_x_value = 0; +- uint32_t v_backslash_x_string = 0; +- uint8_t v_uni4_ok = 0; +- uint64_t v_uni4_string = 0; +- uint32_t v_uni4_value = 0; +- uint32_t v_uni4_high_surrogate = 0; +- uint8_t v_uni8_ok = 0; +- uint64_t v_uni8_string = 0; +- uint32_t v_uni8_value = 0; +- uint32_t v_expect = 0; +- uint32_t v_expect_after_value = 0; +- +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__decode_idct_x86_avx2( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__slice_u8 a_dst_buffer, ++ uint64_t a_dst_stride, ++ uint32_t a_q) { ++ __m256i v_k_0000 = {0}; ++ __m256i v_k_8080 = {0}; ++ __m256i v_k_0000_0002 = {0}; ++ __m256i v_k_0001_FFFF = {0}; ++ __m256i v_k_0400_0000 = {0}; ++ __m256i v_k_29CF_1151_D630_1151 = {0}; ++ __m256i v_k_E333_133E_ADFD_1051 = {0}; ++ __m256i v_k_E6DC_25A1_1925_25A1 = {0}; ++ __m256i v_k_ECC1_E333_EFB0_ADFD = {0}; ++ __m128i v_az_coeffs = {0}; ++ __m256i v_az_ah00 = {0}; ++ __m256i v_az_ad00 = {0}; ++ __m256i v_az_eh00 = {0}; ++ __m256i v_az_adeh = {0}; ++ __m256i v_rows01 = {0}; ++ __m256i v_rows23 = {0}; ++ __m256i v_rows45 = {0}; ++ __m256i v_rows67 = {0}; ++ __m256i v_quants01 = {0}; ++ __m256i v_quants23 = {0}; ++ __m256i v_quants45 = {0}; ++ __m256i v_quants67 = {0}; ++ __m256i v_rows04 = {0}; ++ __m256i v_rows31 = {0}; ++ __m256i v_rows26 = {0}; ++ __m256i v_rows75 = {0}; ++ __m256i v_fp_rows62 = {0}; ++ __m256i v_fp_bq2662ad = {0}; ++ __m256i v_fp_bq2662eh = {0}; ++ __m256i v_fp_cb26ad = {0}; ++ __m256i v_fp_cb26eh = {0}; ++ __m256i v_fp_rows40pos = {0}; ++ __m256i v_fp_rows04neg = {0}; ++ __m256i v_fp_rows0pm4 = {0}; ++ __m256i v_fp_ccpmad = {0}; ++ __m256i v_fp_ccpmeh = {0}; ++ __m256i v_fp_cd01ad = {0}; ++ __m256i v_fp_cd01eh = {0}; ++ __m256i v_fp_cd32ad = {0}; ++ __m256i v_fp_cd32eh = {0}; ++ __m256i v_fp_sums7351 = {0}; ++ __m256i v_fp_sums5173 = {0}; ++ __m256i v_fp_ci73515173ad = {0}; ++ __m256i v_fp_ci73515173eh = {0}; ++ __m256i v_fp_cl7351ad = {0}; ++ __m256i v_fp_cl7351eh = {0}; ++ __m256i v_fp_rows13 = {0}; ++ __m256i v_fp_bq7153ad = {0}; ++ __m256i v_fp_bq7153eh = {0}; ++ __m256i v_fp_ck75ad = {0}; ++ __m256i v_fp_ck75eh = {0}; ++ __m256i v_fp_cl5173ad = {0}; ++ __m256i v_fp_cl5173eh = {0}; ++ __m256i v_fp_ck13ad = {0}; ++ __m256i v_fp_ck13eh = {0}; ++ __m256i v_intermediate01ad = {0}; ++ __m256i v_intermediate01eh = {0}; ++ __m256i v_intermediate01 = {0}; ++ __m256i v_intermediate32ad = {0}; ++ __m256i v_intermediate32eh = {0}; ++ __m256i v_intermediate32 = {0}; ++ __m256i v_intermediate45ad = {0}; ++ __m256i v_intermediate45eh = {0}; ++ __m256i v_intermediate45 = {0}; ++ __m256i v_intermediate76ad = {0}; ++ __m256i v_intermediate76eh = {0}; ++ __m256i v_intermediate76 = {0}; ++ __m256i v_ita0a1e0e1 = {0}; ++ __m256i v_ita2a3e2e3 = {0}; ++ __m256i v_ita4a5e4e5 = {0}; ++ __m256i v_ita6a7e6e7 = {0}; ++ __m256i v_ita0c0e0g0 = {0}; ++ __m256i v_ita1c1e1g1 = {0}; ++ __m256i v_ita4c4e4g4 = {0}; ++ __m256i v_ita5c5e5g5 = {0}; ++ __m256i v_ita0b0e0f0 = {0}; ++ __m256i v_ita4b4e4f4 = {0}; ++ __m256i v_itc0d0g0h0 = {0}; ++ __m256i v_itc4d4g4h4 = {0}; ++ __m256i v_intermediateae = {0}; ++ __m256i v_intermediatebf = {0}; ++ __m256i v_intermediatecg = {0}; ++ __m256i v_intermediatedh = {0}; ++ __m256i v_intermediatedb = {0}; ++ __m256i v_intermediatehf = {0}; ++ __m256i v_sp_cols62 = {0}; ++ __m256i v_sp_bq2662ad = {0}; ++ __m256i v_sp_bq2662eh = {0}; ++ __m256i v_sp_rb26ad = {0}; ++ __m256i v_sp_rb26eh = {0}; ++ __m256i v_sp_cols40pos = {0}; ++ __m256i v_sp_cols04neg = {0}; ++ __m256i v_sp_cols0pm4 = {0}; ++ __m256i v_sp_rcpmad = {0}; ++ __m256i v_sp_rcpmeh = {0}; ++ __m256i v_sp_rd01ad = {0}; ++ __m256i v_sp_rd01eh = {0}; ++ __m256i v_sp_rd32ad = {0}; ++ __m256i v_sp_rd32eh = {0}; ++ __m256i v_sp_sums7351 = {0}; ++ __m256i v_sp_sums5173 = {0}; ++ __m256i v_sp_ri73515173ad = {0}; ++ __m256i v_sp_ri73515173eh = {0}; ++ __m256i v_sp_rl7351ad = {0}; ++ __m256i v_sp_rl7351eh = {0}; ++ __m256i v_sp_cols13 = {0}; ++ __m256i v_sp_bq7153ad = {0}; ++ __m256i v_sp_bq7153eh = {0}; ++ __m256i v_sp_rk75ad = {0}; ++ __m256i v_sp_rk75eh = {0}; ++ __m256i v_sp_rl5173ad = {0}; ++ __m256i v_sp_rl5173eh = {0}; ++ __m256i v_sp_rk13ad = {0}; ++ __m256i v_sp_rk13eh = {0}; ++ __m256i v_final01ad = {0}; ++ __m256i v_final01eh = {0}; ++ __m256i v_final01 = {0}; ++ __m256i v_final32ad = {0}; ++ __m256i v_final32eh = {0}; ++ __m256i v_final32 = {0}; ++ __m256i v_final45ad = {0}; ++ __m256i v_final45eh = {0}; ++ __m256i v_final45 = {0}; ++ __m256i v_final76ad = {0}; ++ __m256i v_final76eh = {0}; ++ __m256i v_final76 = {0}; ++ __m256i v_fta0a1e0e1 = {0}; ++ __m256i v_fta2a3e2e3 = {0}; ++ __m256i v_fta4a5e4e5 = {0}; ++ __m256i v_fta6a7e6e7 = {0}; ++ __m256i v_fta0c0e0g0 = {0}; ++ __m256i v_fta1c1e1g1 = {0}; ++ __m256i v_fta4c4e4g4 = {0}; ++ __m256i v_fta5c5e5g5 = {0}; ++ __m256i v_fta0b0e0f0 = {0}; ++ __m256i v_ftc0d0g0h0 = {0}; ++ __m256i v_fta4b4e4f4 = {0}; ++ __m256i v_ftc4d4g4h4 = {0}; ++ __m256i v_finalae = {0}; ++ __m256i v_finalbf = {0}; ++ __m256i v_finalcg = {0}; ++ __m256i v_finaldh = {0}; ++ __m256i v_final0145 = {0}; ++ __m256i v_final2367 = {0}; ++ uint64_t v_final0 = 0; ++ uint64_t v_final1 = 0; ++ uint64_t v_final2 = 0; ++ uint64_t v_final3 = 0; ++ uint64_t v_final4 = 0; ++ uint64_t v_final5 = 0; ++ uint64_t v_final6 = 0; ++ uint64_t v_final7 = 0; ++ wuffs_base__slice_u8 v_remaining = {0}; + +- uint32_t coro_susp_point = self->private_impl.p_decode_tokens[0]; +- if (coro_susp_point) { +- v_depth = self->private_data.s_decode_tokens[0].v_depth; +- v_expect = self->private_data.s_decode_tokens[0].v_expect; +- v_expect_after_value = self->private_data.s_decode_tokens[0].v_expect_after_value; ++ if (8u > a_dst_stride) { ++ return wuffs_base__make_empty_struct(); + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if (self->private_impl.f_end_of_data) { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- if (self->private_impl.f_quirks[18u]) { +- if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u] || self->private_impl.f_quirks[17u]) { +- status = wuffs_base__make_status(wuffs_json__error__bad_quirk_combination); +- goto exit; ++ v_k_0000 = _mm256_set_epi16((int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u)); ++ v_k_8080 = _mm256_set_epi16((int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u)); ++ v_k_0000_0002 = _mm256_set_epi16((int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u)); ++ v_k_0001_FFFF = _mm256_set_epi16((int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u)); ++ v_k_0400_0000 = _mm256_set_epi16((int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u)); ++ v_k_29CF_1151_D630_1151 = _mm256_set_epi16((int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u)); ++ v_k_E333_133E_ADFD_1051 = _mm256_set_epi16((int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u)); ++ v_k_E6DC_25A1_1925_25A1 = _mm256_set_epi16((int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u)); ++ v_k_ECC1_E333_EFB0_ADFD = _mm256_set_epi16((int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u)); ++ do { ++ if (0u == (wuffs_base__peek_u64le__no_bounds_check((const uint8_t*)(const void*)(self->private_data.f_mcu_blocks[0u] + 8u)) | wuffs_base__peek_u64le__no_bounds_check((const uint8_t*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u)))) { ++ v_az_coeffs = _mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 8u)), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 24u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 32u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 40u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 48u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 56u))); ++ if (0u == ((uint64_t)(_mm_cvtsi128_si64(_mm_packs_epi16(v_az_coeffs, v_az_coeffs))))) { ++ v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u)); ++ v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u)); ++ v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01); ++ v_az_ah00 = _mm256_slli_epi16(v_rows01, (int32_t)(2u)); ++ v_az_ad00 = _mm256_unpacklo_epi16(v_az_ah00, v_az_ah00); ++ v_az_eh00 = _mm256_unpackhi_epi16(v_az_ah00, v_az_ah00); ++ v_az_adeh = _mm256_inserti128_si256(v_az_ad00, _mm256_castsi256_si128(v_az_eh00), (int32_t)(1u)); ++ v_intermediateae = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(0u)); ++ v_intermediatebf = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(85u)); ++ v_intermediatecg = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(170u)); ++ v_intermediatedh = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(255u)); ++ break; + } + } +- if (self->private_impl.f_quirks[15u] || self->private_impl.f_quirks[16u]) { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_json__decoder__decode_leading(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } ++ v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u)); ++ v_rows23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u)); ++ v_rows45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 32u)); ++ v_rows67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 48u)); ++ v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u)); ++ v_quants23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 16u)); ++ v_quants45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 32u)); ++ v_quants67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 48u)); ++ v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01); ++ v_rows23 = _mm256_mullo_epi16(v_rows23, v_quants23); ++ v_rows45 = _mm256_mullo_epi16(v_rows45, v_quants45); ++ v_rows67 = _mm256_mullo_epi16(v_rows67, v_quants67); ++ v_rows04 = _mm256_permute2x128_si256(v_rows01, v_rows45, (int32_t)(32u)); ++ v_rows31 = _mm256_permute2x128_si256(v_rows23, v_rows01, (int32_t)(49u)); ++ v_rows26 = _mm256_permute2x128_si256(v_rows23, v_rows67, (int32_t)(32u)); ++ v_rows75 = _mm256_permute2x128_si256(v_rows67, v_rows45, (int32_t)(49u)); ++ v_fp_rows62 = _mm256_permute2x128_si256(v_rows26, v_rows26, (int32_t)(1u)); ++ v_fp_bq2662ad = _mm256_unpacklo_epi16(v_rows26, v_fp_rows62); ++ v_fp_bq2662eh = _mm256_unpackhi_epi16(v_rows26, v_fp_rows62); ++ v_fp_cb26ad = _mm256_madd_epi16(v_fp_bq2662ad, v_k_29CF_1151_D630_1151); ++ v_fp_cb26eh = _mm256_madd_epi16(v_fp_bq2662eh, v_k_29CF_1151_D630_1151); ++ v_fp_rows40pos = _mm256_permute2x128_si256(v_rows04, v_rows04, (int32_t)(1u)); ++ v_fp_rows04neg = _mm256_sign_epi16(v_rows04, v_k_0001_FFFF); ++ v_fp_rows0pm4 = _mm256_add_epi16(v_fp_rows40pos, v_fp_rows04neg); ++ v_fp_ccpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u)); ++ v_fp_ccpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u)); ++ v_fp_cd01ad = _mm256_add_epi32(v_fp_ccpmad, v_fp_cb26ad); ++ v_fp_cd01eh = _mm256_add_epi32(v_fp_ccpmeh, v_fp_cb26eh); ++ v_fp_cd32ad = _mm256_sub_epi32(v_fp_ccpmad, v_fp_cb26ad); ++ v_fp_cd32eh = _mm256_sub_epi32(v_fp_ccpmeh, v_fp_cb26eh); ++ v_fp_sums7351 = _mm256_add_epi16(v_rows75, v_rows31); ++ v_fp_sums5173 = _mm256_permute2x128_si256(v_fp_sums7351, v_fp_sums7351, (int32_t)(1u)); ++ v_fp_ci73515173ad = _mm256_unpacklo_epi16(v_fp_sums7351, v_fp_sums5173); ++ v_fp_ci73515173eh = _mm256_unpackhi_epi16(v_fp_sums7351, v_fp_sums5173); ++ v_fp_cl7351ad = _mm256_madd_epi16(v_fp_ci73515173ad, v_k_E6DC_25A1_1925_25A1); ++ v_fp_cl7351eh = _mm256_madd_epi16(v_fp_ci73515173eh, v_k_E6DC_25A1_1925_25A1); ++ v_fp_rows13 = _mm256_permute2x128_si256(v_rows31, v_rows31, (int32_t)(1u)); ++ v_fp_bq7153ad = _mm256_unpacklo_epi16(v_rows75, v_fp_rows13); ++ v_fp_bq7153eh = _mm256_unpackhi_epi16(v_rows75, v_fp_rows13); ++ v_fp_ck75ad = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351ad); ++ v_fp_ck75eh = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351eh); ++ v_fp_cl5173ad = _mm256_permute2x128_si256(v_fp_cl7351ad, v_fp_cl7351ad, (int32_t)(1u)); ++ v_fp_cl5173eh = _mm256_permute2x128_si256(v_fp_cl7351eh, v_fp_cl7351eh, (int32_t)(1u)); ++ v_fp_ck13ad = _mm256_add_epi32(v_fp_cl5173ad, _mm256_madd_epi16(v_fp_bq7153ad, v_k_E333_133E_ADFD_1051)); ++ v_fp_ck13eh = _mm256_add_epi32(v_fp_cl5173eh, _mm256_madd_epi16(v_fp_bq7153eh, v_k_E333_133E_ADFD_1051)); ++ v_intermediate01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate01 = _mm256_packs_epi32(v_intermediate01ad, v_intermediate01eh); ++ v_intermediate32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate32 = _mm256_packs_epi32(v_intermediate32ad, v_intermediate32eh); ++ v_intermediate45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate45 = _mm256_packs_epi32(v_intermediate45ad, v_intermediate45eh); ++ v_intermediate76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u)); ++ v_intermediate76 = _mm256_packs_epi32(v_intermediate76ad, v_intermediate76eh); ++ v_ita0a1e0e1 = _mm256_permute4x64_epi64(v_intermediate01, (int32_t)(216u)); ++ v_ita2a3e2e3 = _mm256_permute4x64_epi64(v_intermediate32, (int32_t)(114u)); ++ v_ita4a5e4e5 = _mm256_permute4x64_epi64(v_intermediate45, (int32_t)(216u)); ++ v_ita6a7e6e7 = _mm256_permute4x64_epi64(v_intermediate76, (int32_t)(114u)); ++ v_ita0c0e0g0 = _mm256_unpacklo_epi16(v_ita0a1e0e1, v_ita2a3e2e3); ++ v_ita1c1e1g1 = _mm256_unpackhi_epi16(v_ita0a1e0e1, v_ita2a3e2e3); ++ v_ita4c4e4g4 = _mm256_unpacklo_epi16(v_ita4a5e4e5, v_ita6a7e6e7); ++ v_ita5c5e5g5 = _mm256_unpackhi_epi16(v_ita4a5e4e5, v_ita6a7e6e7); ++ v_ita0b0e0f0 = _mm256_unpacklo_epi16(v_ita0c0e0g0, v_ita1c1e1g1); ++ v_itc0d0g0h0 = _mm256_unpackhi_epi16(v_ita0c0e0g0, v_ita1c1e1g1); ++ v_ita4b4e4f4 = _mm256_unpacklo_epi16(v_ita4c4e4g4, v_ita5c5e5g5); ++ v_itc4d4g4h4 = _mm256_unpackhi_epi16(v_ita4c4e4g4, v_ita5c5e5g5); ++ v_intermediateae = _mm256_unpacklo_epi64(v_ita0b0e0f0, v_ita4b4e4f4); ++ v_intermediatebf = _mm256_unpackhi_epi64(v_ita0b0e0f0, v_ita4b4e4f4); ++ v_intermediatecg = _mm256_unpacklo_epi64(v_itc0d0g0h0, v_itc4d4g4h4); ++ v_intermediatedh = _mm256_unpackhi_epi64(v_itc0d0g0h0, v_itc4d4g4h4); ++ } while (0); ++ v_intermediatedb = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(32u)); ++ v_intermediatehf = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(49u)); ++ v_sp_cols62 = _mm256_permute2x128_si256(v_intermediatecg, v_intermediatecg, (int32_t)(1u)); ++ v_sp_bq2662ad = _mm256_unpacklo_epi16(v_intermediatecg, v_sp_cols62); ++ v_sp_bq2662eh = _mm256_unpackhi_epi16(v_intermediatecg, v_sp_cols62); ++ v_sp_rb26ad = _mm256_madd_epi16(v_sp_bq2662ad, v_k_29CF_1151_D630_1151); ++ v_sp_rb26eh = _mm256_madd_epi16(v_sp_bq2662eh, v_k_29CF_1151_D630_1151); ++ v_sp_cols40pos = _mm256_permute2x128_si256(v_intermediateae, v_intermediateae, (int32_t)(1u)); ++ v_sp_cols04neg = _mm256_sign_epi16(v_intermediateae, v_k_0001_FFFF); ++ v_sp_cols0pm4 = _mm256_add_epi16(v_sp_cols40pos, v_sp_cols04neg); ++ v_sp_rcpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u)); ++ v_sp_rcpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u)); ++ v_sp_rd01ad = _mm256_add_epi32(v_sp_rcpmad, v_sp_rb26ad); ++ v_sp_rd01eh = _mm256_add_epi32(v_sp_rcpmeh, v_sp_rb26eh); ++ v_sp_rd32ad = _mm256_sub_epi32(v_sp_rcpmad, v_sp_rb26ad); ++ v_sp_rd32eh = _mm256_sub_epi32(v_sp_rcpmeh, v_sp_rb26eh); ++ v_sp_sums7351 = _mm256_add_epi16(v_intermediatehf, v_intermediatedb); ++ v_sp_sums5173 = _mm256_permute2x128_si256(v_sp_sums7351, v_sp_sums7351, (int32_t)(1u)); ++ v_sp_ri73515173ad = _mm256_unpacklo_epi16(v_sp_sums7351, v_sp_sums5173); ++ v_sp_ri73515173eh = _mm256_unpackhi_epi16(v_sp_sums7351, v_sp_sums5173); ++ v_sp_rl7351ad = _mm256_madd_epi16(v_sp_ri73515173ad, v_k_E6DC_25A1_1925_25A1); ++ v_sp_rl7351eh = _mm256_madd_epi16(v_sp_ri73515173eh, v_k_E6DC_25A1_1925_25A1); ++ v_sp_cols13 = _mm256_permute2x128_si256(v_intermediatedb, v_intermediatedb, (int32_t)(1u)); ++ v_sp_bq7153ad = _mm256_unpacklo_epi16(v_intermediatehf, v_sp_cols13); ++ v_sp_bq7153eh = _mm256_unpackhi_epi16(v_intermediatehf, v_sp_cols13); ++ v_sp_rk75ad = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351ad); ++ v_sp_rk75eh = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351eh); ++ v_sp_rl5173ad = _mm256_permute2x128_si256(v_sp_rl7351ad, v_sp_rl7351ad, (int32_t)(1u)); ++ v_sp_rl5173eh = _mm256_permute2x128_si256(v_sp_rl7351eh, v_sp_rl7351eh, (int32_t)(1u)); ++ v_sp_rk13ad = _mm256_add_epi32(v_sp_rl5173ad, _mm256_madd_epi16(v_sp_bq7153ad, v_k_E333_133E_ADFD_1051)); ++ v_sp_rk13eh = _mm256_add_epi32(v_sp_rl5173eh, _mm256_madd_epi16(v_sp_bq7153eh, v_k_E333_133E_ADFD_1051)); ++ v_final01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u)); ++ v_final01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u)); ++ v_final01 = _mm256_packs_epi32(v_final01ad, v_final01eh); ++ v_final32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u)); ++ v_final32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u)); ++ v_final32 = _mm256_packs_epi32(v_final32ad, v_final32eh); ++ v_final45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u)); ++ v_final45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u)); ++ v_final45 = _mm256_packs_epi32(v_final45ad, v_final45eh); ++ v_final76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u)); ++ v_final76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u)); ++ v_final76 = _mm256_packs_epi32(v_final76ad, v_final76eh); ++ v_fta0a1e0e1 = _mm256_permute4x64_epi64(v_final01, (int32_t)(216u)); ++ v_fta2a3e2e3 = _mm256_permute4x64_epi64(v_final32, (int32_t)(114u)); ++ v_fta4a5e4e5 = _mm256_permute4x64_epi64(v_final45, (int32_t)(216u)); ++ v_fta6a7e6e7 = _mm256_permute4x64_epi64(v_final76, (int32_t)(114u)); ++ v_fta0c0e0g0 = _mm256_unpacklo_epi16(v_fta0a1e0e1, v_fta2a3e2e3); ++ v_fta1c1e1g1 = _mm256_unpackhi_epi16(v_fta0a1e0e1, v_fta2a3e2e3); ++ v_fta4c4e4g4 = _mm256_unpacklo_epi16(v_fta4a5e4e5, v_fta6a7e6e7); ++ v_fta5c5e5g5 = _mm256_unpackhi_epi16(v_fta4a5e4e5, v_fta6a7e6e7); ++ v_fta0b0e0f0 = _mm256_unpacklo_epi16(v_fta0c0e0g0, v_fta1c1e1g1); ++ v_ftc0d0g0h0 = _mm256_unpackhi_epi16(v_fta0c0e0g0, v_fta1c1e1g1); ++ v_fta4b4e4f4 = _mm256_unpacklo_epi16(v_fta4c4e4g4, v_fta5c5e5g5); ++ v_ftc4d4g4h4 = _mm256_unpackhi_epi16(v_fta4c4e4g4, v_fta5c5e5g5); ++ v_finalae = _mm256_unpacklo_epi64(v_fta0b0e0f0, v_fta4b4e4f4); ++ v_finalbf = _mm256_unpackhi_epi64(v_fta0b0e0f0, v_fta4b4e4f4); ++ v_finalcg = _mm256_unpacklo_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4); ++ v_finaldh = _mm256_unpackhi_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4); ++ v_final0145 = _mm256_add_epi8(_mm256_packs_epi16(v_finalae, v_finalbf), v_k_8080); ++ v_final2367 = _mm256_add_epi8(_mm256_packs_epi16(v_finalcg, v_finaldh), v_k_8080); ++ v_final0 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(0u)))); ++ v_final1 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(1u)))); ++ v_final2 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(0u)))); ++ v_final3 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(1u)))); ++ v_final4 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(2u)))); ++ v_final5 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(3u)))); ++ v_final6 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(2u)))); ++ v_final7 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(3u)))); ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final0); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final1); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final2); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final3); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final4); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final5); ++ a_dst_buffer = v_remaining; ++ if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride); ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final6); ++ a_dst_buffer = v_remaining; ++ if (8u > ((uint64_t)(a_dst_buffer.len))) { ++ return wuffs_base__make_empty_struct(); ++ } ++ wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final7); ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++// ‼ WUFFS MULTI-FILE SECTION -x86_avx2 ++ ++// -------- func jpeg.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_jpeg__decoder__get_quirk( ++ const wuffs_jpeg__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (a_key == 2u) { ++ if (self->private_impl.f_use_lower_quality) { ++ return 18446744073709551615u; ++ } ++ } else if (a_key == 1220532224u) { ++ if (self->private_impl.f_reject_progressive_jpegs) { ++ return 1u; ++ } ++ } ++ return 0u; ++} ++ ++// -------- func jpeg.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__set_quirk( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (a_key == 2u) { ++ self->private_impl.f_use_lower_quality = (a_value >= 9223372036854775808u); ++ return wuffs_base__make_status(NULL); ++ } else if (a_key == 1220532224u) { ++ self->private_impl.f_reject_progressive_jpegs = (a_value != 0u); ++ return wuffs_base__make_status(NULL); ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func jpeg.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__decode_image_config( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func jpeg.decoder.do_decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__do_decode_image_config( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint8_t v_marker = 0; ++ uint32_t v_pixfmt = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ if (coro_susp_point) { ++ v_marker = self->private_data.s_do_decode_image_config.v_marker; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 255u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (v_c8 != 216u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_header); ++ goto exit; + } +- v_expect = 7858u; +- label__outer__continue:; + while (true) { + while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- goto label__outer__continue; +- } +- v_whitespace_length = 0u; +- v_c = 0u; +- v_class = 0u; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (v_whitespace_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_whitespace_length = 0u; +- } +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- goto label__outer__continue; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- v_class = WUFFS_JSON__LUT_CLASSES[v_c]; +- if (v_class != 0u) { +- break; +- } +- iop_a_src += 1u; +- if (v_whitespace_length >= 65534u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(65535u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_whitespace_length = 0u; +- goto label__outer__continue; ++ goto suspend; + } +- v_whitespace_length += 1u; ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; + } +- if (v_whitespace_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_whitespace_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__outer__continue; ++ if (v_c8 == 255u) { ++ break; ++ } ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; + } +- if (0u == (v_expect & (((uint32_t)(1u)) << v_class))) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; ++ if (v_c8 != 255u) { ++ v_marker = v_c8; ++ break; + } +- if (v_class == 1u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- label__string_loop_outer__continue:; +- while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- continue; +- } +- v_string_length = 0u; ++ } ++ if (v_marker == 0u) { ++ continue; ++ } else if ((208u <= v_marker) && (v_marker <= 217u)) { ++ if (v_marker <= 215u) { ++ continue; ++ } ++ } else { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- } +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- goto label__string_loop_outer__continue; ++ goto suspend; + } +- while (((uint64_t)(io2_a_src - iop_a_src)) > 4u) { +- v_c4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- if (0u != (WUFFS_JSON__LUT_CHARS[(255u & (v_c4 >> 0u))] | +- WUFFS_JSON__LUT_CHARS[(255u & (v_c4 >> 8u))] | +- WUFFS_JSON__LUT_CHARS[(255u & (v_c4 >> 16u))] | +- WUFFS_JSON__LUT_CHARS[(255u & (v_c4 >> 24u))])) { +- break; +- } +- iop_a_src += 4u; +- if (v_string_length > 65527u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- goto label__string_loop_outer__continue; +- } +- v_string_length += 4u; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ if (num_bits_4 == 8) { ++ t_4 = ((uint32_t)(*scratch >> 48)); ++ break; + } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- v_char = WUFFS_JSON__LUT_CHARS[v_c]; +- if (v_char == 0u) { +- iop_a_src += 1u; +- if (v_string_length >= 65531u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(65532u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- goto label__string_loop_outer__continue; +- } +- v_string_length += 1u; +- continue; +- } else if (v_char == 1u) { +- if (v_string_length != 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- } +- goto label__string_loop_outer__break; +- } else if (v_char == 2u) { +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__string_loop_outer__continue; +- } +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- goto label__string_loop_outer__continue; +- } +- v_c = ((uint8_t)((wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u))); +- v_backslash = WUFFS_JSON__LUT_BACKSLASHES[v_c]; +- if ((v_backslash & 128u) != 0u) { +- iop_a_src += 2u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | ((uint32_t)((v_backslash & 127u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } else if (v_backslash != 0u) { +- if (self->private_impl.f_quirks[WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[(v_backslash & 7u)]]) { +- iop_a_src += 2u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | ((uint32_t)(WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[(v_backslash & 7u)]))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- } else if (v_c == 117u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); +- goto label__string_loop_outer__continue; +- } +- v_uni4_string = (((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))) >> 16u); +- v_uni4_value = 0u; +- v_uni4_ok = 128u; +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 12u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 8u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 4u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 0u); +- if (v_uni4_ok == 0u) { +- } else if ((v_uni4_value < 55296u) || (57343u < v_uni4_value)) { +- iop_a_src += 6u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } else if (v_uni4_value >= 56320u) { +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 12u) { +- if (a_src && a_src->meta.closed) { +- if (self->private_impl.f_quirks[20u]) { +- iop_a_src += 6u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- goto label__string_loop_outer__continue; +- } +- v_uni4_string = (wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 4u) >> 16u); +- if (((255u & (v_uni4_string >> 0u)) != 92u) || ((255u & (v_uni4_string >> 8u)) != 117u)) { +- v_uni4_high_surrogate = 0u; +- v_uni4_value = 0u; +- v_uni4_ok = 0u; +- } else { +- v_uni4_high_surrogate = (65536u + ((v_uni4_value - 55296u) << 10u)); +- v_uni4_value = 0u; +- v_uni4_ok = 128u; +- v_uni4_string >>= 16u; +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 12u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 8u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 4u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))]; +- v_uni4_ok &= v_c; +- v_uni4_value |= (((uint32_t)((v_c & 15u))) << 0u); +- } +- if ((v_uni4_ok != 0u) && (56320u <= v_uni4_value) && (v_uni4_value <= 57343u)) { +- v_uni4_value -= 56320u; +- iop_a_src += 12u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | v_uni4_high_surrogate | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(12u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- } +- if (self->private_impl.f_quirks[20u]) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) { +- status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- iop_a_src += 6u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- } else if ((v_c == 85u) && self->private_impl.f_quirks[2u]) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 10u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); +- goto label__string_loop_outer__continue; +- } +- v_uni8_string = wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 2u); +- v_uni8_value = 0u; +- v_uni8_ok = 128u; +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 0u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 28u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 8u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 24u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 16u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 20u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 24u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 16u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 32u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 12u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 40u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 8u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 48u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 4u); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 56u))]; +- v_uni8_ok &= v_c; +- v_uni8_value |= (((uint32_t)((v_c & 15u))) << 0u); +- if (v_uni8_ok == 0u) { +- } else if ((v_uni8_value < 55296u) || ((57343u < v_uni8_value) && (v_uni8_value <= 1114111u))) { +- iop_a_src += 10u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | (v_uni8_value & 2097151u)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } else if (self->private_impl.f_quirks[20u]) { +- iop_a_src += 10u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- } else if ((v_c == 120u) && self->private_impl.f_quirks[9u]) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); +- goto label__string_loop_outer__continue; +- } +- v_backslash_x_string = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- v_backslash_x_ok = 128u; +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 16u))]; +- v_backslash_x_ok &= v_c; +- v_backslash_x_value = ((uint8_t)(((v_c & 15u) << 4u))); +- v_c = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 24u))]; +- v_backslash_x_ok &= v_c; +- v_backslash_x_value = ((uint8_t)((v_backslash_x_value | (v_c & 15u)))); +- if ((v_backslash_x_ok == 0u) || ((v_backslash_x_string & 65535u) != 30812u)) { +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } +- iop_a_src += 4u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | ((uint32_t)(v_backslash_x_value))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); +- goto exit; +- } else if (v_char == 3u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__string_loop_outer__continue; +- } +- } +- if (a_src && a_src->meta.closed) { +- if (self->private_impl.f_quirks[20u]) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); +- goto label__string_loop_outer__continue; +- } +- v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- if ((v_multi_byte_utf8 & 49152u) == 32768u) { +- v_multi_byte_utf8 = ((1984u & ((uint32_t)(v_multi_byte_utf8 << 6u))) | (63u & (v_multi_byte_utf8 >> 8u))); +- iop_a_src += 2u; +- if (v_string_length >= 65528u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_string_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- goto label__string_loop_outer__continue; +- } +- v_string_length += 2u; +- continue; +- } +- } else if (v_char == 4u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__string_loop_outer__continue; +- } +- } +- if (a_src && a_src->meta.closed) { +- if (self->private_impl.f_quirks[20u]) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12); +- goto label__string_loop_outer__continue; +- } +- v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); +- if ((v_multi_byte_utf8 & 12632064u) == 8421376u) { +- v_multi_byte_utf8 = ((61440u & ((uint32_t)(v_multi_byte_utf8 << 12u))) | (4032u & (v_multi_byte_utf8 >> 2u)) | (63u & (v_multi_byte_utf8 >> 16u))); +- if ((2047u < v_multi_byte_utf8) && ((v_multi_byte_utf8 < 55296u) || (57343u < v_multi_byte_utf8))) { +- iop_a_src += 3u; +- if (v_string_length >= 65528u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_string_length + 3u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- goto label__string_loop_outer__continue; +- } +- v_string_length += 3u; +- continue; +- } +- } +- } else if (v_char == 5u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__string_loop_outer__continue; +- } +- } +- if (a_src && a_src->meta.closed) { +- if (self->private_impl.f_quirks[20u]) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(13); +- goto label__string_loop_outer__continue; +- } +- v_multi_byte_utf8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- if ((v_multi_byte_utf8 & 3233857536u) == 2155905024u) { +- v_multi_byte_utf8 = ((1835008u & ((uint32_t)(v_multi_byte_utf8 << 18u))) | +- (258048u & ((uint32_t)(v_multi_byte_utf8 << 4u))) | +- (4032u & (v_multi_byte_utf8 >> 10u)) | +- (63u & (v_multi_byte_utf8 >> 24u))); +- if ((65535u < v_multi_byte_utf8) && (v_multi_byte_utf8 <= 1114111u)) { +- iop_a_src += 4u; +- if (v_string_length >= 65528u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- goto label__string_loop_outer__continue; +- } +- v_string_length += 4u; +- continue; +- } +- } +- } +- if (v_string_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_string_length = 0u; +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- goto label__string_loop_outer__continue; +- } +- } +- if ((v_char & 128u) != 0u) { +- if (self->private_impl.f_quirks[0u]) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((6291456u | ((uint32_t)((v_char & 127u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- goto label__string_loop_outer__continue; +- } +- if (v_char == 138u) { +- status = wuffs_base__make_status(wuffs_json__error__bad_new_line_in_a_string); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_c0_control_code); +- goto exit; +- } +- if (self->private_impl.f_quirks[20u]) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 1u; +- goto label__string_loop_outer__continue; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); +- goto exit; ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)); + } + } +- label__string_loop_outer__break:; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(14); +- continue; +- } +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(15); +- continue; +- } +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- break; ++ self->private_impl.f_payload_length = t_4; ++ } ++ if (self->private_impl.f_payload_length < 2u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= 2u; ++ } ++ if (v_marker < 192u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } else if (v_marker < 208u) { ++ if (v_marker <= 194u) { ++ if ((v_marker == 194u) && self->private_impl.f_reject_progressive_jpegs) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__rejected_progressive_jpeg); ++ goto exit; ++ } else if (self->private_impl.f_sof_marker != 0u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; + } +- if (0u == (v_expect & (((uint32_t)(1u)) << 4u))) { +- v_expect = 4104u; +- goto label__outer__continue; ++ self->private_impl.f_sof_marker = v_marker; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ status = wuffs_jpeg__decoder__decode_sof(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; + } + break; +- } else if (v_class == 2u) { +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (0u == (v_expect & (((uint32_t)(1u)) << 8u))) { +- if (self->private_impl.f_quirks[13u]) { +- v_expect = 4162u; +- } else { +- v_expect = 4098u; +- } +- } else { +- if (self->private_impl.f_quirks[13u]) { +- v_expect = 8114u; +- } else { +- v_expect = 7858u; +- } ++ } else if (v_marker == 195u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_lossless_coding); ++ goto exit; ++ } else if (v_marker == 196u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } else if ((197u <= v_marker) && (v_marker <= 199u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_hierarchical_coding); ++ goto exit; ++ } else if (v_marker == 200u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_arithmetic_coding); ++ goto exit; ++ } ++ } else if (v_marker < 224u) { ++ if (v_marker < 218u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); ++ goto exit; ++ } else if (v_marker == 218u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } else if (v_marker == 219u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- goto label__outer__continue; +- } else if (v_class == 3u) { +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 7858u; +- goto label__outer__continue; +- } else if (v_class == 4u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_jpeg__decoder__decode_dqt(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else if (v_marker == 221u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_jpeg__decoder__decode_dri(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } ++ } else if (v_marker < 240u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ status = wuffs_jpeg__decoder__decode_appn(self, a_src, v_marker); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else { ++ if (v_marker == 254u) { ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } ++ } ++ self->private_data.s_do_decode_image_config.scratch = self->private_impl.f_payload_length; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ self->private_impl.f_payload_length = 0u; ++ } ++ self->private_impl.choosy_decode_idct = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ++ wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_jpeg__decoder__decode_idct_x86_avx2 : ++#endif ++ self->private_impl.choosy_decode_idct); ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ v_pixfmt = 536870920u; ++ if (self->private_impl.f_num_components > 1u) { ++ v_pixfmt = 2415954056u; ++ } ++ wuffs_base__image_config__set( ++ a_dst, ++ v_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ true); ++ } ++ self->private_impl.f_call_sequence = 32u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_image_config.v_marker = v_marker; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_dqt ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dqt( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint8_t v_q = 0; ++ uint32_t v_i = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_dqt; ++ if (coro_susp_point) { ++ v_q = self->private_data.s_decode_dqt.v_q; ++ v_i = self->private_data.s_decode_dqt.v_i; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (self->private_impl.f_payload_length > 0u) { ++ self->private_impl.f_payload_length -= 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (((uint8_t)(v_c8 & 15u)) > 3u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker); ++ goto exit; ++ } ++ v_q = ((uint8_t)(v_c8 & 15u)); ++ if (((uint8_t)(v_c8 >> 4u)) == 1u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision); ++ goto exit; ++ } else if ((((uint8_t)(v_c8 >> 4u)) > 1u) || (self->private_impl.f_payload_length < 64u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= 64u; ++ v_i = 0u; ++ while (v_i < 64u) { ++ v_i += 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint16_t t_1 = *iop_a_src++; ++ self->private_impl.f_quant_tables[v_q][WUFFS_JPEG__UNZIG[v_i]] = t_1; ++ } ++ } ++ self->private_impl.f_seen_dqt[v_q] = true; ++ if (self->private_impl.f_sof_marker == 0u) { ++ v_i = 0u; ++ while (v_i < 64u) { ++ self->private_impl.f_saved_quant_tables[v_q][v_i] = self->private_impl.f_quant_tables[v_q][v_i]; ++ v_i += 1u; ++ } ++ self->private_impl.f_saved_seen_dqt[v_q] = true; ++ } ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_dqt = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_dqt = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_dqt.v_q = v_q; ++ self->private_data.s_decode_dqt.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_dri ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dri( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_dri; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_payload_length != 2u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dri_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint16_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_dri.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_dri.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 8) { ++ t_0 = ((uint16_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ self->private_impl.f_restart_interval = t_0; ++ } ++ if (self->private_impl.f_sof_marker == 0u) { ++ self->private_impl.f_saved_restart_interval = self->private_impl.f_restart_interval; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_dri = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_dri = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_appn ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_appn( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint8_t a_marker) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_c32 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_appn; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ do { ++ if (a_marker == 224u) { ++ if (self->private_impl.f_payload_length >= 5u) { ++ self->private_impl.f_payload_length -= 5u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_appn.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_appn.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_c32 = t_0; ++ } ++ if (v_c32 != 1179207242u) { ++ self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 1u)); ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ self->private_impl.f_is_jfif = (v_c8 == 0u); ++ } ++ } else if (a_marker == 238u) { ++ if (self->private_impl.f_payload_length >= 12u) { ++ self->private_impl.f_payload_length -= 12u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_appn.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_appn.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ v_c32 = t_2; ++ } ++ if (v_c32 != 1651467329u) { ++ self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 8u)); ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_appn.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_appn.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ } ++ } ++ v_c32 = t_3; ++ } ++ if ((255u & v_c32) != 101u) { ++ self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 4u)); ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_appn.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_appn.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 24) { ++ t_4 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; ++ } ++ } ++ v_c32 = t_4; ++ } ++ if ((v_c32 >> 24u) == 0u) { ++ self->private_impl.f_is_adobe = 1u; ++ } else { ++ self->private_impl.f_is_adobe = 2u; ++ } ++ } ++ } ++ } while (0); ++ self->private_data.s_decode_appn.scratch = self->private_impl.f_payload_length; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (self->private_data.s_decode_appn.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_appn.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_appn.scratch; ++ self->private_impl.f_payload_length = 0u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_appn = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_appn = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_sof ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_sof( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint8_t v_comp_h = 0; ++ uint8_t v_comp_v = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ bool v_has_h24 = false; ++ bool v_has_h3 = false; ++ bool v_has_v24 = false; ++ bool v_has_v3 = false; ++ uint32_t v_upper_bound = 0; ++ uint64_t v_wh0 = 0; ++ uint64_t v_wh1 = 0; ++ uint64_t v_wh2 = 0; ++ uint64_t v_wh3 = 0; ++ uint64_t v_progressive = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_sof; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_decode_sof.v_i; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_payload_length < 6u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= 6u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 == 8u) { ++ } else if (v_c8 == 12u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_12_bits); ++ goto exit; ++ } else if (v_c8 == 16u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_16_bits); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_1 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_sof.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_sof.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 8) { ++ t_1 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); ++ } ++ } ++ self->private_impl.f_height = t_1; ++ } ++ if (self->private_impl.f_height == 0u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_implicit_height); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_sof.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_sof.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); ++ if (num_bits_2 == 8) { ++ t_2 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)); ++ } ++ } ++ self->private_impl.f_width = t_2; ++ } ++ if (self->private_impl.f_width == 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if ((v_c8 == 0u) || (v_c8 > 4u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } else if (v_c8 == 2u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_color_model); ++ goto exit; ++ } ++ self->private_impl.f_num_components = ((uint32_t)(v_c8)); ++ if (self->private_impl.f_payload_length != (3u * self->private_impl.f_num_components)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length = 0u; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_components) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ self->private_impl.f_components_c[v_i] = t_4; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ v_comp_h = ((uint8_t)(v_c8 >> 4u)); ++ v_comp_v = ((uint8_t)(v_c8 & 15u)); ++ if ((v_comp_h == 0u) || ++ (v_comp_h > 4u) || ++ (v_comp_v == 0u) || ++ (v_comp_v > 4u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } ++ self->private_impl.f_components_h[v_i] = v_comp_h; ++ if (self->private_impl.f_max_incl_components_h < self->private_impl.f_components_h[v_i]) { ++ self->private_impl.f_max_incl_components_h = self->private_impl.f_components_h[v_i]; ++ } ++ self->private_impl.f_components_v[v_i] = v_comp_v; ++ if (self->private_impl.f_max_incl_components_v < self->private_impl.f_components_v[v_i]) { ++ self->private_impl.f_max_incl_components_v = self->private_impl.f_components_v[v_i]; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ if (v_c8 >= 4u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } ++ self->private_impl.f_components_tq[v_i] = v_c8; ++ v_j = 0u; ++ while (v_j < v_i) { ++ if (self->private_impl.f_components_c[v_j] == self->private_impl.f_components_c[v_i]) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ if (self->private_impl.f_num_components == 1u) { ++ self->private_impl.f_max_incl_components_h = 1u; ++ self->private_impl.f_max_incl_components_v = 1u; ++ self->private_impl.f_components_h[0u] = 1u; ++ self->private_impl.f_components_v[0u] = 1u; ++ } else { ++ v_has_h24 = false; ++ v_has_h3 = false; ++ v_has_v24 = false; ++ v_has_v3 = false; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_num_components) { ++ v_has_h24 = (v_has_h24 || (self->private_impl.f_components_h[v_i] == 2u) || (self->private_impl.f_components_h[v_i] == 4u)); ++ v_has_h3 = (v_has_h3 || (self->private_impl.f_components_h[v_i] == 3u)); ++ v_has_v24 = (v_has_v24 || (self->private_impl.f_components_v[v_i] == 2u) || (self->private_impl.f_components_v[v_i] == 4u)); ++ v_has_v3 = (v_has_v3 || (self->private_impl.f_components_v[v_i] == 3u)); ++ v_i += 1u; ++ } ++ if ((v_has_h24 && v_has_h3) || (v_has_v24 && v_has_v3)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_fractional_sampling); ++ goto exit; ++ } ++ if (self->private_impl.f_num_components == 4u) { ++ self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe < 2u); ++ } else { ++ if (self->private_impl.f_is_jfif) { ++ self->private_impl.f_is_rgb_or_cmyk = false; ++ } else if (self->private_impl.f_is_adobe > 0u) { ++ self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe == 1u); ++ } else { ++ self->private_impl.f_is_rgb_or_cmyk = ((self->private_impl.f_components_c[0u] == 82u) && (self->private_impl.f_components_c[1u] == 71u) && (self->private_impl.f_components_c[2u] == 66u)); ++ } ++ } ++ } ++ self->private_impl.f_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, 1u, self->private_impl.f_max_incl_components_h); ++ self->private_impl.f_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, 1u, self->private_impl.f_max_incl_components_v); ++ v_upper_bound = 65544u; ++ self->private_impl.f_components_workbuf_widths[0u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[0u])))); ++ self->private_impl.f_components_workbuf_widths[1u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[1u])))); ++ self->private_impl.f_components_workbuf_widths[2u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[2u])))); ++ self->private_impl.f_components_workbuf_widths[3u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[3u])))); ++ self->private_impl.f_components_workbuf_heights[0u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[0u])))); ++ self->private_impl.f_components_workbuf_heights[1u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[1u])))); ++ self->private_impl.f_components_workbuf_heights[2u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[2u])))); ++ self->private_impl.f_components_workbuf_heights[3u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[3u])))); ++ v_wh0 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[0u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[0u]))); ++ v_wh1 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[1u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[1u]))); ++ v_wh2 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[2u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[2u]))); ++ v_wh3 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[3u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[3u]))); ++ v_progressive = 0u; ++ if (self->private_impl.f_sof_marker >= 194u) { ++ v_progressive = 2u; ++ v_i = 0u; ++ while (v_i < 4u) { ++ v_j = 0u; ++ while (v_j < 10u) { ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ } ++ self->private_impl.f_components_workbuf_offsets[0u] = 0u; ++ self->private_impl.f_components_workbuf_offsets[1u] = (self->private_impl.f_components_workbuf_offsets[0u] + v_wh0); ++ self->private_impl.f_components_workbuf_offsets[2u] = (self->private_impl.f_components_workbuf_offsets[1u] + v_wh1); ++ self->private_impl.f_components_workbuf_offsets[3u] = (self->private_impl.f_components_workbuf_offsets[2u] + v_wh2); ++ self->private_impl.f_components_workbuf_offsets[4u] = (self->private_impl.f_components_workbuf_offsets[3u] + v_wh3); ++ self->private_impl.f_components_workbuf_offsets[5u] = (self->private_impl.f_components_workbuf_offsets[4u] + (v_wh0 * v_progressive)); ++ self->private_impl.f_components_workbuf_offsets[6u] = (self->private_impl.f_components_workbuf_offsets[5u] + (v_wh1 * v_progressive)); ++ self->private_impl.f_components_workbuf_offsets[7u] = (self->private_impl.f_components_workbuf_offsets[6u] + (v_wh2 * v_progressive)); ++ self->private_impl.f_components_workbuf_offsets[8u] = (self->private_impl.f_components_workbuf_offsets[7u] + (v_wh3 * v_progressive)); ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_sof = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_sof = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_sof.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.quantize_dimension ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__quantize_dimension( ++ const wuffs_jpeg__decoder* self, ++ uint32_t a_width, ++ uint8_t a_h, ++ uint8_t a_max_incl_h) { ++ uint32_t v_ratio = 0; ++ ++ v_ratio = 0u; ++ if (a_h > 0u) { ++ v_ratio = ((uint32_t)(((uint8_t)(a_max_incl_h / a_h)))); ++ } ++ if (v_ratio == 1u) { ++ return ((a_width + 7u) / 8u); ++ } else if (v_ratio == 2u) { ++ return ((a_width + 15u) / 16u); ++ } else if (v_ratio == 3u) { ++ return ((a_width + 23u) / 24u); ++ } ++ return ((a_width + 31u) / 32u); ++} ++ ++// -------- func jpeg.decoder.decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__decode_frame_config( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func jpeg.decoder.do_decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__do_decode_frame_config( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_jpeg__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ self->private_impl.f_frame_config_io_position, ++ 0u, ++ true, ++ false, ++ 4278190080u); ++ } ++ self->private_impl.f_call_sequence = 64u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__decode_frame( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_ddf_status = wuffs_base__make_status(NULL); ++ wuffs_base__status v_swizzle_status = wuffs_base__make_status(NULL); ++ uint32_t v_scan_count = 0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ v_scan_count = self->private_impl.f_scan_count; ++ { ++ wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_ddf_status = t_0; ++ } ++ if ((v_ddf_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ v_ddf_status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input); ++ } ++ if ( ! self->private_impl.f_swizzle_immediately && (wuffs_base__status__is_error(&v_ddf_status) || (v_scan_count < self->private_impl.f_scan_count))) { ++ if (self->private_impl.f_sof_marker >= 194u) { ++ wuffs_jpeg__decoder__apply_progressive_idct(self, a_workbuf); ++ } ++ if (self->private_impl.f_num_components == 1u) { ++ v_swizzle_status = wuffs_jpeg__decoder__swizzle_gray(self, ++ a_dst, ++ a_workbuf, ++ 0u, ++ 4294967295u, ++ 0u, ++ 4294967295u, ++ ((uint64_t)(self->private_impl.f_components_workbuf_widths[0u]))); ++ } else { ++ v_swizzle_status = wuffs_jpeg__decoder__swizzle_colorful(self, ++ a_dst, ++ a_workbuf, ++ 0u, ++ 4294967295u, ++ 0u, ++ 4294967295u); ++ } ++ if (wuffs_base__status__is_error(&v_ddf_status)) { ++ status = v_ddf_status; ++ goto exit; ++ } else if (wuffs_base__status__is_error(&v_swizzle_status)) { ++ status = v_swizzle_status; ++ goto exit; ++ } ++ } ++ status = v_ddf_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func jpeg.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__do_decode_frame( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_pixfmt = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint8_t v_c8 = 0; ++ uint8_t v_marker = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ if (coro_susp_point) { ++ v_marker = self->private_data.s_do_decode_frame.v_marker; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_jpeg__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ v_pixfmt = 536870920u; ++ if (self->private_impl.f_num_components > 1u) { ++ v_pixfmt = 2415954056u; ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), ++ wuffs_base__utility__make_pixel_format(v_pixfmt), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ self->private_impl.f_swizzle_immediately = false; ++ if (self->private_impl.f_components_workbuf_offsets[8u] > ((uint64_t)(a_workbuf.len))) { ++ if (self->private_impl.f_sof_marker >= 194u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ self->private_impl.f_swizzle_immediately = self->private_impl.f_use_lower_quality; ++ self->private_impl.f_swizzle_immediately_status = wuffs_base__make_status(NULL); ++ } else if (self->private_impl.f_components_workbuf_offsets[4u] < self->private_impl.f_components_workbuf_offsets[8u]) { ++ wuffs_private_impl__bulk_memset(a_workbuf.ptr + self->private_impl.f_components_workbuf_offsets[4u], (self->private_impl.f_components_workbuf_offsets[8u] - self->private_impl.f_components_workbuf_offsets[4u]), 0u); ++ } ++ if (self->private_impl.f_components_workbuf_offsets[4u] <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_memset(a_workbuf.ptr, self->private_impl.f_components_workbuf_offsets[4u], 128u); ++ } ++ while (true) { ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 == 255u) { ++ break; ++ } ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (v_c8 != 255u) { ++ v_marker = v_c8; ++ break; ++ } ++ } ++ if (v_marker == 0u) { ++ continue; ++ } else if ((208u <= v_marker) && (v_marker <= 217u)) { ++ if (v_marker <= 215u) { ++ continue; ++ } ++ } else { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_frame.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); ++ if (num_bits_2 == 8) { ++ t_2 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)); ++ } ++ } ++ self->private_impl.f_payload_length = t_2; ++ } ++ if (self->private_impl.f_payload_length < 2u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= 2u; ++ } ++ if (v_marker < 192u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } else if (v_marker < 208u) { ++ if (v_marker == 196u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ status = wuffs_jpeg__decoder__decode_dht(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else if (v_marker == 200u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker); ++ goto exit; ++ } else if (v_marker < 224u) { ++ if (v_marker < 217u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker); ++ goto exit; ++ } else if (v_marker == 217u) { ++ break; ++ } else if (v_marker == 218u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ status = wuffs_jpeg__decoder__decode_sos(self, a_dst, a_src, a_workbuf); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else if (v_marker == 219u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_jpeg__decoder__decode_dqt(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else if (v_marker == 221u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_jpeg__decoder__decode_dri(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ continue; ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } ++ } else if (v_marker < 240u) { ++ } else { ++ if (v_marker == 254u) { ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker); ++ goto exit; ++ } ++ } ++ self->private_data.s_do_decode_frame.scratch = self->private_impl.f_payload_length; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame.scratch; ++ self->private_impl.f_payload_length = 0u; ++ } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_frame.v_marker = v_marker; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.decode_dht ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_dht( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint8_t v_tc = 0; ++ uint8_t v_th = 0; ++ uint8_t v_tc4_th = 0; ++ uint32_t v_working_total_count = 0; ++ uint32_t v_total_count = 0; ++ uint32_t v_i = 0; ++ bool v_failed = false; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_dht; ++ if (coro_susp_point) { ++ v_tc4_th = self->private_data.s_decode_dht.v_tc4_th; ++ v_total_count = self->private_data.s_decode_dht.v_total_count; ++ v_i = self->private_data.s_decode_dht.v_i; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_sof_marker == 0u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ while (self->private_impl.f_payload_length > 0u) { ++ if (self->private_impl.f_payload_length < 17u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= 17u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if ((((uint8_t)(v_c8 >> 4u)) > 1u) || (((uint8_t)(v_c8 & 15u)) > 3u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ v_tc = ((uint8_t)(v_c8 >> 4u)); ++ v_th = ((uint8_t)(v_c8 & 15u)); ++ v_tc4_th = ((uint8_t)(((uint8_t)(((uint8_t)(v_tc * 4u)) | v_th)))); ++ if ((self->private_impl.f_sof_marker == 192u) && (((uint8_t)(v_tc4_th & 3u)) > 1u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ self->private_data.f_dht_temp_counts[v_i] = t_1; ++ } ++ v_i += 1u; ++ } ++ v_working_total_count = 0u; ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_working_total_count = ((v_working_total_count + ((uint32_t)(self->private_data.f_dht_temp_counts[v_i]))) & 65535u); ++ v_i += 1u; ++ } ++ if ((v_working_total_count <= 0u) || (256u < v_working_total_count)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ v_total_count = v_working_total_count; ++ if (self->private_impl.f_payload_length < v_total_count) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length -= v_total_count; ++ v_i = 0u; ++ while (v_i < v_total_count) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = t_2; ++ } ++ v_i += 1u; ++ } ++ while (v_i < 256u) { ++ self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = 0u; ++ v_i += 1u; ++ } ++ if (((uint8_t)(v_tc4_th & 4u)) == 0u) { ++ v_i = 0u; ++ while (v_i < v_total_count) { ++ if (self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] > 15u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ v_i += 1u; ++ } ++ } ++ v_failed = wuffs_jpeg__decoder__calculate_huff_tables(self, v_tc4_th, v_total_count); ++ if (v_failed) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker); ++ goto exit; ++ } ++ self->private_impl.f_seen_dht[v_tc4_th] = true; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_dht = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_dht = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_dht.v_tc4_th = v_tc4_th; ++ self->private_data.s_decode_dht.v_total_count = v_total_count; ++ self->private_data.s_decode_dht.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.calculate_huff_tables ++ ++WUFFS_BASE__GENERATED_C_CODE ++static bool ++wuffs_jpeg__decoder__calculate_huff_tables( ++ wuffs_jpeg__decoder* self, ++ uint8_t a_tc4_th, ++ uint32_t a_total_count) { ++ uint32_t v_i = 0; ++ uint8_t v_j = 0; ++ uint8_t v_k = 0; ++ uint32_t v_bit_length_minus_one = 0; ++ uint8_t v_bit_length = 0; ++ uint32_t v_bit_string = 0; ++ uint32_t v_slow = 0; ++ uint8_t v_prefix = 0; ++ uint16_t v_fast = 0; ++ uint32_t v_reps = 0; ++ ++ v_i = 0u; ++ v_k = 0u; ++ v_bit_length_minus_one = 0u; ++ while (v_i < a_total_count) { ++ while (v_k >= self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) { ++ v_k = 0u; ++ v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u); ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_k += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_data.f_dht_temp_bit_lengths[v_i] = ((uint8_t)((v_bit_length_minus_one + 1u))); ++ v_i += 1u; ++ } ++ v_bit_length = 0u; ++ v_bit_string = 0u; ++ v_i = 0u; ++ while (v_i < a_total_count) { ++ while (v_bit_length < self->private_data.f_dht_temp_bit_lengths[v_i]) { ++ if (v_bit_length >= 16u) { ++ return true; ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_bit_length += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bit_string <<= 1u; ++ } ++ self->private_data.f_dht_temp_bit_strings[v_i] = ((uint16_t)(v_bit_string)); ++ v_bit_string += 1u; ++ if ((v_bit_string >> v_bit_length) > 0u) { ++ return true; ++ } ++ v_i += 1u; ++ } ++ v_k = 0u; ++ v_bit_length_minus_one = 0u; ++ while (true) { ++ if (self->private_data.f_dht_temp_counts[v_bit_length_minus_one] == 0u) { ++ self->private_impl.f_huff_tables_slow[a_tc4_th][v_bit_length_minus_one] = 0u; ++ } else { ++ v_slow = (255u & ((uint32_t)(((uint32_t)(v_k)) - ((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_k]))))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_k += self->private_data.f_dht_temp_counts[v_bit_length_minus_one]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_impl.f_huff_tables_slow[a_tc4_th][v_bit_length_minus_one] = (v_slow | ((((uint32_t)(self->private_data.f_dht_temp_bit_strings[((uint8_t)(v_k - 1u))])) + 1u) << 8u)); ++ } ++ v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u); ++ if (v_bit_length_minus_one == 0u) { ++ break; ++ } ++ } ++ v_i = 0u; ++ while (v_i < 256u) { ++ self->private_impl.f_huff_tables_fast[a_tc4_th][v_i] = 65535u; ++ v_i += 1u; ++ } ++ v_j = 0u; ++ v_bit_length_minus_one = 0u; ++ while (v_bit_length_minus_one < 8u) { ++ v_k = 0u; ++ while (v_k < self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) { ++ v_prefix = ((uint8_t)((((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_j])) << (7u - v_bit_length_minus_one)))); ++ v_fast = ((uint16_t)(((((uint32_t)((v_bit_length_minus_one + 1u))) << 8u) | ((uint32_t)(self->private_impl.f_huff_tables_symbols[a_tc4_th][v_j]))))); ++ v_reps = (((uint32_t)(1u)) << (7u - v_bit_length_minus_one)); ++ while (v_reps > 0u) { ++ self->private_impl.f_huff_tables_fast[a_tc4_th][v_prefix] = v_fast; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_prefix += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_reps -= 1u; ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_k += 1u; ++ v_j += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ v_bit_length_minus_one += 1u; ++ } ++ return false; ++} ++ ++// -------- func jpeg.decoder.decode_sos ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__decode_sos( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_my = 0; ++ uint32_t v_mx = 0; ++ uint32_t v_decode_mcu_result = 0; ++ uint32_t v_bitstream_length = 0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_sos; ++ if (coro_susp_point) { ++ v_my = self->private_data.s_decode_sos.v_my; ++ v_mx = self->private_data.s_decode_sos.v_mx; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_scan_count >= 32u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_scan_count); ++ goto exit; ++ } else if ((self->private_impl.f_scan_count > 0u) && ! self->private_impl.f_expect_multiple_scans) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_scan_count); ++ goto exit; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_jpeg__decoder__prepare_scan(self, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_next_restart_marker = 0u; ++ self->private_impl.f_mcu_previous_dc_values[0u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[1u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[2u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[3u] = 0u; ++ self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval; ++ self->private_impl.f_eob_run = 0u; ++ self->private_impl.f_bitstream_bits = 0u; ++ self->private_impl.f_bitstream_n_bits = 0u; ++ self->private_impl.f_bitstream_ri = 0u; ++ self->private_impl.f_bitstream_wi = 0u; ++ self->private_impl.f_bitstream_padding = 12345u; ++ wuffs_jpeg__decoder__fill_bitstream(self, a_src); ++ v_my = 0u; ++ while (v_my < self->private_impl.f_scan_height_in_mcus) { ++ v_mx = 0u; ++ while (v_mx < self->private_impl.f_scan_width_in_mcus) { ++ self->private_impl.f_mcu_current_block = 0u; ++ self->private_impl.f_mcu_zig_index = ((uint32_t)(self->private_impl.f_scan_ss)); ++ if (self->private_impl.f_sof_marker >= 194u) { ++ wuffs_jpeg__decoder__load_mcu_blocks(self, v_mx, v_my, a_workbuf); ++ } ++ while (true) { ++ v_decode_mcu_result = wuffs_jpeg__decoder__decode_mcu(self, ++ a_dst, ++ a_workbuf, ++ v_mx, ++ v_my); ++ if (v_decode_mcu_result == 0u) { ++ break; ++ } else if (v_decode_mcu_result == 1u) { ++ } else if (v_decode_mcu_result == 2u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__internal_error_inconsistent_decoder_state); ++ goto exit; ++ } else { ++ status = self->private_impl.f_swizzle_immediately_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ while (true) { ++ v_bitstream_length = ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri)); ++ wuffs_jpeg__decoder__fill_bitstream(self, a_src); ++ if (v_bitstream_length < ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri))) { ++ break; ++ } else if (self->private_impl.f_bitstream_padding == 0u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } else if ((a_src && a_src->meta.closed) && ! self->private_impl.f_bitstream_is_closed) { ++ if (self->private_impl.f_bitstream_wi < 1024u) { ++ wuffs_private_impl__bulk_memset(&self->private_data.f_bitstream_buffer[self->private_impl.f_bitstream_wi], 264u, 0u); ++ self->private_impl.f_bitstream_wi += 264u; ++ self->private_impl.f_bitstream_is_closed = true; ++ } ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } ++ } ++ if (self->private_impl.f_sof_marker >= 194u) { ++ wuffs_jpeg__decoder__save_mcu_blocks(self, v_mx, v_my, a_workbuf); ++ } ++ if (self->private_impl.f_restarts_remaining > 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_restarts_remaining -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ if (self->private_impl.f_restarts_remaining == 0u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_jpeg__decoder__skip_past_the_next_restart_marker(self, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_mcu_previous_dc_values[0u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[1u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[2u] = 0u; ++ self->private_impl.f_mcu_previous_dc_values[3u] = 0u; ++ self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval; ++ self->private_impl.f_eob_run = 0u; ++ self->private_impl.f_bitstream_bits = 0u; ++ self->private_impl.f_bitstream_n_bits = 0u; ++ self->private_impl.f_bitstream_ri = 0u; ++ self->private_impl.f_bitstream_wi = 0u; ++ self->private_impl.f_bitstream_padding = 12345u; ++ } ++ } ++ v_mx += 1u; ++ } ++ v_my += 1u; ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_scan_count, 1u); ++ ++ ok: ++ self->private_impl.p_decode_sos = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_sos = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_sos.v_my = v_my; ++ self->private_data.s_decode_sos.v_mx = v_mx; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func jpeg.decoder.prepare_scan ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__prepare_scan( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ uint32_t v_j_max_incl = 0; ++ bool v_failed = false; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_prepare_scan; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_prepare_scan.v_i; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if ((self->private_impl.f_payload_length < 6u) || (self->private_impl.f_payload_length > 12u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if ((v_c8 < 1u) || (v_c8 > 4u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_scan_num_components = ((uint32_t)(v_c8)); ++ if ((self->private_impl.f_scan_num_components > self->private_impl.f_num_components) || (self->private_impl.f_payload_length != (4u + (2u * self->private_impl.f_scan_num_components)))) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_payload_length = 0u; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_scan_num_components) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ v_j = 0u; ++ while (true) { ++ if (v_j >= self->private_impl.f_num_components) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ if (v_c8 == self->private_impl.f_components_c[v_j]) { ++ if ( ! self->private_impl.f_seen_dqt[self->private_impl.f_components_tq[v_j]]) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__missing_quantization_table); ++ goto exit; ++ } ++ self->private_impl.f_scan_comps_cselector[v_i] = ((uint8_t)(v_j)); ++ break; ++ } ++ v_j += 1u; ++ } ++ v_j = 0u; ++ while (v_j < v_i) { ++ if (self->private_impl.f_scan_comps_cselector[v_i] == self->private_impl.f_scan_comps_cselector[v_j]) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ v_j += 1u; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if ((((uint8_t)(v_c8 >> 4u)) > 3u) || (((uint8_t)(v_c8 & 15u)) > 3u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_scan_comps_td[v_i] = ((uint8_t)(v_c8 >> 4u)); ++ self->private_impl.f_scan_comps_ta[v_i] = ((uint8_t)(v_c8 & 15u)); ++ if (self->private_impl.f_sof_marker == 192u) { ++ if ((self->private_impl.f_scan_comps_td[v_i] > 1u) || (self->private_impl.f_scan_comps_ta[v_i] > 1u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ } ++ v_i += 1u; ++ } ++ if (self->private_impl.f_scan_count == 0u) { ++ self->private_impl.f_expect_multiple_scans = ((self->private_impl.f_sof_marker >= 194u) || (self->private_impl.f_scan_num_components < self->private_impl.f_num_components)); ++ } ++ if (self->private_impl.f_sof_marker < 194u) { ++ self->private_data.s_prepare_scan.scratch = 3u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (self->private_data.s_prepare_scan.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_prepare_scan.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_prepare_scan.scratch; ++ self->private_impl.f_scan_ss = 0u; ++ self->private_impl.f_scan_se = 63u; ++ self->private_impl.f_scan_ah = 0u; ++ self->private_impl.f_scan_al = 0u; ++ } else { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if (v_c8 > 63u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_scan_ss = v_c8; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if ((v_c8 > 63u) || (v_c8 < self->private_impl.f_scan_ss)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_scan_se = v_c8; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ if ((((uint8_t)(v_c8 >> 4u)) > 14u) || (((uint8_t)(v_c8 & 15u)) > 13u)) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ self->private_impl.f_scan_ah = ((uint8_t)(v_c8 >> 4u)); ++ self->private_impl.f_scan_al = ((uint8_t)(v_c8 & 15u)); ++ if (self->private_impl.f_scan_ah > 0u) { ++ if (((uint8_t)(self->private_impl.f_scan_ah - 1u)) != self->private_impl.f_scan_al) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ } ++ if (self->private_impl.f_scan_ss == 0u) { ++ if (self->private_impl.f_scan_se != 0u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } else if (self->private_impl.f_scan_ah == 0u) { ++ self->private_impl.choosy_decode_mcu = ( ++ &wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits); ++ } else { ++ self->private_impl.choosy_decode_mcu = ( ++ &wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit); ++ } ++ } else { ++ if (self->private_impl.f_scan_num_components != 1u) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } else if (self->private_impl.f_scan_ah == 0u) { ++ self->private_impl.choosy_decode_mcu = ( ++ &wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits); ++ } else { ++ self->private_impl.choosy_decode_mcu = ( ++ &wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit); ++ } ++ } ++ } ++ v_i = 0u; ++ while (v_i < self->private_impl.f_scan_num_components) { ++ if ((self->private_impl.f_scan_ss == 0u) && ! self->private_impl.f_seen_dht[((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_i]))]) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_jpeg__decoder__use_default_huffman_table(self, ((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_i]))); ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ if ((self->private_impl.f_scan_se != 0u) && ! self->private_impl.f_seen_dht[((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_i]))]) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_jpeg__decoder__use_default_huffman_table(self, ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_i]))); ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ v_j = ((uint32_t)(self->private_impl.f_scan_ss)); ++ v_j_max_incl = ((uint32_t)(wuffs_base__u8__min(self->private_impl.f_scan_se, 9u))); ++ while (v_j <= v_j_max_incl) { ++ self->private_impl.f_block_smoothing_lowest_scan_al[self->private_impl.f_scan_comps_cselector[v_i]][v_j] = self->private_impl.f_scan_al; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ if (self->private_impl.f_scan_num_components == 1u) { ++ wuffs_jpeg__decoder__calculate_single_component_scan_fields(self); ++ } else { ++ v_failed = wuffs_jpeg__decoder__calculate_multiple_component_scan_fields(self); ++ if (v_failed) { ++ status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker); ++ goto exit; ++ } ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_prepare_scan = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_prepare_scan = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_prepare_scan.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.use_default_huffman_table ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__use_default_huffman_table( ++ wuffs_jpeg__decoder* self, ++ uint8_t a_tc4_th) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__slice_u8 v_data = {0}; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ if (a_tc4_th == 0u) { ++ v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA), 29); ++ } else if (a_tc4_th == 1u) { ++ v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA), 29); ++ } else if (a_tc4_th == 4u) { ++ v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA), 179); ++ } else if (a_tc4_th == 5u) { ++ v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA), 179); ++ } else { ++ status = wuffs_base__make_status(wuffs_jpeg__error__missing_huffman_table); ++ goto exit; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ v_data, ++ 0u); ++ self->private_impl.f_payload_length = ((uint32_t)((((uint64_t)(v_data.len)) & 65535u))); ++ { ++ wuffs_base__status t_0 = wuffs_jpeg__decoder__decode_dht(self, v_r); ++ v_status = t_0; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ ++ ok: ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func jpeg.decoder.calculate_single_component_scan_fields ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__calculate_single_component_scan_fields( ++ wuffs_jpeg__decoder* self) { ++ uint8_t v_csel = 0; ++ ++ self->private_impl.f_scan_comps_bx_offset[0u] = 0u; ++ self->private_impl.f_scan_comps_by_offset[0u] = 0u; ++ self->private_impl.f_mcu_num_blocks = 1u; ++ self->private_impl.f_mcu_blocks_sselector[0u] = 0u; ++ v_csel = self->private_impl.f_scan_comps_cselector[0u]; ++ self->private_impl.f_mcu_blocks_offset[0u] = self->private_impl.f_components_workbuf_offsets[v_csel]; ++ self->private_impl.f_mcu_blocks_mx_mul[0u] = 8u; ++ self->private_impl.f_mcu_blocks_my_mul[0u] = (8u * self->private_impl.f_components_workbuf_widths[v_csel]); ++ self->private_impl.f_mcu_blocks_dc_hselector[0u] = ((uint8_t)(0u | self->private_impl.f_scan_comps_td[0u])); ++ self->private_impl.f_mcu_blocks_ac_hselector[0u] = ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[0u])); ++ self->private_impl.f_scan_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, self->private_impl.f_components_h[v_csel], self->private_impl.f_max_incl_components_h); ++ self->private_impl.f_scan_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, self->private_impl.f_components_v[v_csel], self->private_impl.f_max_incl_components_v); ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.calculate_multiple_component_scan_fields ++ ++WUFFS_BASE__GENERATED_C_CODE ++static bool ++wuffs_jpeg__decoder__calculate_multiple_component_scan_fields( ++ wuffs_jpeg__decoder* self) { ++ uint32_t v_i = 0; ++ uint32_t v_h = 0; ++ uint32_t v_v = 0; ++ uint32_t v_hv = 0; ++ uint32_t v_total_hv = 0; ++ uint32_t v_b = 0; ++ uint32_t v_bx_offset = 0; ++ uint32_t v_by_offset = 0; ++ uint32_t v_sibo = 0; ++ uint8_t v_ssel = 0; ++ uint8_t v_csel = 0; ++ ++ v_total_hv = 0u; ++ v_i = 0u; ++ v_b = 0u; ++ v_bx_offset = 0u; ++ v_by_offset = 0u; ++ while (v_i < self->private_impl.f_scan_num_components) { ++ v_h = ((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]])); ++ v_v = ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]])); ++ v_hv = (((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]])) * ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]]))); ++ self->private_impl.f_swizzle_immediately_c_offsets[v_i] = ((uint32_t)(64u * v_total_hv)); ++ v_total_hv += v_hv; ++ while (v_hv > 0u) { ++ self->private_impl.f_scan_comps_bx_offset[(v_b & 15u)] = ((uint8_t)((v_bx_offset & 3u))); ++ self->private_impl.f_scan_comps_by_offset[(v_b & 15u)] = ((uint8_t)((v_by_offset & 3u))); ++ self->private_impl.f_mcu_blocks_sselector[(v_b & 15u)] = ((uint8_t)(v_i)); ++ v_b += 1u; ++ v_bx_offset += 1u; ++ if (v_bx_offset == v_h) { ++ v_bx_offset = 0u; ++ v_by_offset += 1u; ++ if (v_by_offset == v_v) { ++ v_by_offset = 0u; ++ } ++ } ++ v_hv -= 1u; ++ } ++ v_i += 1u; ++ } ++ if (v_total_hv > 10u) { ++ return true; ++ } ++ self->private_impl.f_mcu_num_blocks = v_total_hv; ++ self->private_impl.f_swizzle_immediately_c_offsets[self->private_impl.f_scan_num_components] = ((uint32_t)(64u * v_total_hv)); ++ v_b = 0u; ++ while (v_b < self->private_impl.f_mcu_num_blocks) { ++ v_ssel = self->private_impl.f_mcu_blocks_sselector[v_b]; ++ v_csel = self->private_impl.f_scan_comps_cselector[v_ssel]; ++ self->private_impl.f_mcu_blocks_offset[v_b] = (self->private_impl.f_components_workbuf_offsets[v_csel] + (8u * ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) + (8u * ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b])) * ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])))); ++ self->private_impl.f_mcu_blocks_mx_mul[v_b] = (8u * ((uint32_t)(self->private_impl.f_components_h[v_csel]))); ++ self->private_impl.f_mcu_blocks_my_mul[v_b] = (8u * ((uint32_t)(self->private_impl.f_components_v[v_csel])) * self->private_impl.f_components_workbuf_widths[v_csel]); ++ self->private_impl.f_mcu_blocks_dc_hselector[v_b] = ((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_ssel])); ++ self->private_impl.f_mcu_blocks_ac_hselector[v_b] = ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_ssel])); ++ v_sibo = ((uint32_t)(self->private_impl.f_swizzle_immediately_c_offsets[v_csel] + ((8u * ((uint32_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) + (64u * ((uint32_t)(self->private_impl.f_scan_comps_by_offset[v_b])) * ((uint32_t)(self->private_impl.f_components_h[v_csel])))))); ++ self->private_impl.f_swizzle_immediately_b_offsets[v_b] = wuffs_base__u32__min(v_sibo, 576u); ++ v_b += 1u; ++ } ++ self->private_impl.f_scan_width_in_mcus = self->private_impl.f_width_in_mcus; ++ self->private_impl.f_scan_height_in_mcus = self->private_impl.f_height_in_mcus; ++ return false; ++} ++ ++// -------- func jpeg.decoder.fill_bitstream ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__fill_bitstream( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ uint32_t v_wi = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_new_wi = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ if (self->private_impl.f_bitstream_ri <= 0u) { ++ } else if (self->private_impl.f_bitstream_ri >= self->private_impl.f_bitstream_wi) { ++ self->private_impl.f_bitstream_ri = 0u; ++ self->private_impl.f_bitstream_wi = 0u; ++ } else { ++ v_wi = (self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri); ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_bitstream_buffer, 2048), wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi)); ++ self->private_impl.f_bitstream_ri = 0u; ++ self->private_impl.f_bitstream_wi = v_wi; ++ } ++ v_wi = self->private_impl.f_bitstream_wi; ++ while ((v_wi < 2048u) && (((uint64_t)(io2_a_src - iop_a_src)) > 0u)) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (v_c8 < 255u) { ++ self->private_data.f_bitstream_buffer[v_wi] = v_c8; ++ v_wi += 1u; ++ iop_a_src += 1u; ++ continue; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) { ++ break; ++ } else if (((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u)) > 0u) { ++ break; ++ } else { ++ self->private_data.f_bitstream_buffer[v_wi] = 255u; ++ v_wi += 1u; ++ iop_a_src += 2u; ++ } ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) > 1u) { ++ if ((wuffs_base__peek_u8be__no_bounds_check(iop_a_src) >= 255u) && (((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u)) > 0u)) { ++ v_new_wi = (wuffs_base__u32__min(v_wi, 1784u) + 264u); ++ v_new_wi = wuffs_base__u32__min(v_new_wi, (v_wi + self->private_impl.f_bitstream_padding)); ++ if (v_wi < v_new_wi) { ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_bitstream_padding, (v_new_wi - v_wi)); ++ wuffs_private_impl__bulk_memset(&self->private_data.f_bitstream_buffer[v_wi], (v_new_wi - v_wi), 0u); ++ v_wi = v_new_wi; ++ } ++ } ++ } ++ self->private_impl.f_bitstream_wi = v_wi; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.load_mcu_blocks_for_single_component ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__load_mcu_blocks_for_single_component( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_csel) { ++ return (*self->private_impl.choosy_load_mcu_blocks_for_single_component)(self, a_mx, a_my, a_workbuf, a_csel); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_csel) { ++ uint64_t v_stride16 = 0; ++ uint64_t v_offset = 0; ++ ++ v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u))); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16)); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.load_mcu_blocks ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__load_mcu_blocks( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf) { ++ uint32_t v_b = 0; ++ uint8_t v_csel = 0; ++ uint64_t v_h = 0; ++ uint64_t v_v = 0; ++ uint64_t v_stride16 = 0; ++ uint64_t v_offset = 0; ++ ++ v_h = 1u; ++ v_v = 1u; ++ v_b = 0u; ++ while (v_b < self->private_impl.f_mcu_num_blocks) { ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]]; ++ if (self->private_impl.f_scan_num_components > 1u) { ++ v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel])); ++ v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel])); ++ } ++ v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u))); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[((uint8_t)(v_csel | 4u))] + (((v_h * ((uint64_t)(a_mx))) + ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) * 128u) + (((v_v * ((uint64_t)(a_my))) + ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b]))) * v_stride16)); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_load_host_endian(&self->private_data.f_mcu_blocks[v_b], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ } ++ v_b += 1u; ++ } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.save_mcu_blocks ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__save_mcu_blocks( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf) { ++ uint32_t v_b = 0; ++ uint8_t v_csel = 0; ++ uint64_t v_h = 0; ++ uint64_t v_v = 0; ++ uint64_t v_stride16 = 0; ++ uint64_t v_offset = 0; ++ ++ v_h = 1u; ++ v_v = 1u; ++ v_b = 0u; ++ while (v_b < self->private_impl.f_mcu_num_blocks) { ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]]; ++ if (self->private_impl.f_scan_num_components > 1u) { ++ v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel])); ++ v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel])); ++ } ++ v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u))); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[((uint8_t)(v_csel | 4u))] + (((v_h * ((uint64_t)(a_mx))) + ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) * 128u) + (((v_v * ((uint64_t)(a_my))) + ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b]))) * v_stride16)); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_save_host_endian(&self->private_data.f_mcu_blocks[v_b], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ } ++ v_b += 1u; ++ } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.skip_past_the_next_restart_marker ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__skip_past_the_next_restart_marker( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_skip_past_the_next_restart_marker; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } else if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) < 255u) { ++ iop_a_src += 1u; ++ continue; ++ } ++ v_c8 = ((uint8_t)(((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u)))); ++ if (v_c8 < 192u) { ++ iop_a_src += 2u; ++ continue; ++ } else if ((v_c8 < 208u) || (215u < v_c8)) { ++ break; ++ } ++ v_c8 &= 7u; ++ if ((self->private_impl.f_next_restart_marker == ((uint8_t)(((uint8_t)(v_c8 + 1u)) & 7u))) || (self->private_impl.f_next_restart_marker == ((uint8_t)(((uint8_t)(v_c8 + 2u)) & 7u)))) { ++ break; ++ } else if ((self->private_impl.f_next_restart_marker == ((uint8_t)(((uint8_t)(v_c8 + 7u)) & 7u))) || (self->private_impl.f_next_restart_marker == ((uint8_t)(((uint8_t)(v_c8 + 6u)) & 7u)))) { ++ iop_a_src += 2u; ++ continue; ++ } else { ++ iop_a_src += 2u; ++ break; ++ } ++ } ++ self->private_impl.f_next_restart_marker = ((uint8_t)(((uint8_t)(self->private_impl.f_next_restart_marker + 1u)) & 7u)); ++ ++ ok: ++ self->private_impl.p_skip_past_the_next_restart_marker = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_skip_past_the_next_restart_marker = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func jpeg.decoder.apply_progressive_idct ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__apply_progressive_idct( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__slice_u8 a_workbuf) { ++ uint32_t v_csel = 0; ++ bool v_block_smoothing_applicable = false; ++ uint32_t v_scan_width_in_mcus = 0; ++ uint32_t v_scan_height_in_mcus = 0; ++ uint32_t v_mcu_blocks_mx_mul_0 = 0; ++ uint32_t v_mcu_blocks_my_mul_0 = 0; ++ uint32_t v_my = 0; ++ uint32_t v_mx = 0; ++ uint64_t v_stride = 0; ++ uint64_t v_offset = 0; ++ uint8_t v_stashed_mcu_blocks_0[128] = {0}; ++ ++ wuffs_private_impl__bulk_save_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__make_slice_u8(v_stashed_mcu_blocks_0, 128)); ++ v_block_smoothing_applicable = true; ++ v_csel = 0u; ++ while (v_csel < self->private_impl.f_num_components) { ++ if ((self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][0u] >= 16u) || wuffs_jpeg__decoder__top_left_quants_has_zero(self, ((uint32_t)(self->private_impl.f_components_tq[v_csel])))) { ++ v_block_smoothing_applicable = false; ++ } ++ v_csel += 1u; ++ } ++ v_csel = 0u; ++ while (v_csel < self->private_impl.f_num_components) { ++ v_scan_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, self->private_impl.f_components_h[v_csel], self->private_impl.f_max_incl_components_h); ++ v_scan_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, self->private_impl.f_components_v[v_csel], self->private_impl.f_max_incl_components_v); ++ v_mcu_blocks_mx_mul_0 = 8u; ++ v_mcu_blocks_my_mul_0 = (8u * self->private_impl.f_components_workbuf_widths[v_csel]); ++ if (v_block_smoothing_applicable && (0u != (self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][1u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][2u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][3u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][4u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][5u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][6u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] | ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][9u]))) { ++ self->private_impl.choosy_load_mcu_blocks_for_single_component = ( ++ &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth); ++ self->private_impl.f_block_smoothing_mx_max_incl = wuffs_base__u32__sat_sub(v_scan_width_in_mcus, 1u); ++ self->private_impl.f_block_smoothing_my_max_incl = wuffs_base__u32__sat_sub(v_scan_height_in_mcus, 1u); ++ } else { ++ self->private_impl.choosy_load_mcu_blocks_for_single_component = ( ++ &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default); ++ } ++ v_my = 0u; ++ while (v_my < v_scan_height_in_mcus) { ++ v_mx = 0u; ++ while (v_mx < v_scan_width_in_mcus) { ++ wuffs_jpeg__decoder__load_mcu_blocks_for_single_component(self, ++ v_mx, ++ v_my, ++ a_workbuf, ++ v_csel); ++ v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[v_csel] + (((uint64_t)(v_mcu_blocks_mx_mul_0)) * ((uint64_t)(v_mx))) + (((uint64_t)(v_mcu_blocks_my_mul_0)) * ((uint64_t)(v_my)))); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_jpeg__decoder__decode_idct(self, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); ++ } ++ v_mx += 1u; ++ } ++ v_my += 1u; ++ } ++ v_csel += 1u; ++ } ++ wuffs_private_impl__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__make_slice_u8(v_stashed_mcu_blocks_0, 128)); ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.swizzle_gray ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__swizzle_gray( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_x0, ++ uint32_t a_x1, ++ uint32_t a_y0, ++ uint32_t a_y1, ++ uint64_t a_stride) { ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_x0 = 0; ++ uint64_t v_x1 = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint32_t v_y = 0; ++ uint32_t v_y1 = 0; ++ ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_x0 = ((uint64_t)((v_dst_bytes_per_pixel * wuffs_base__u32__min(a_x0, self->private_impl.f_width)))); ++ v_x1 = ((uint64_t)((v_dst_bytes_per_pixel * wuffs_base__u32__min(a_x1, self->private_impl.f_width)))); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_y = a_y0; ++ v_y1 = wuffs_base__u32__min(a_y1, self->private_impl.f_height); ++ while (v_y < v_y1) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y); ++ if (v_x1 < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_x1); ++ } ++ if (v_x0 < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_x0); ++ } else { ++ v_dst = wuffs_base__utility__empty_slice_u8(); ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), a_workbuf); ++ if (a_stride <= ((uint64_t)(a_workbuf.len))) { ++ a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, a_stride); ++ } else { ++ a_workbuf = wuffs_base__utility__empty_slice_u8(); ++ } ++ v_y += 1u; ++ } ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func jpeg.decoder.swizzle_colorful ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_jpeg__decoder__swizzle_colorful( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_x0, ++ uint32_t a_x1, ++ uint32_t a_y0, ++ uint32_t a_y1) { ++ uint64_t v_i = 0; ++ uint64_t v_j = 0; ++ wuffs_base__slice_u8 v_src0 = {0}; ++ wuffs_base__slice_u8 v_src1 = {0}; ++ wuffs_base__slice_u8 v_src2 = {0}; ++ wuffs_base__slice_u8 v_src3 = {0}; ++ uint32_t v_width0 = 0; ++ uint32_t v_width1 = 0; ++ uint32_t v_width2 = 0; ++ uint32_t v_width3 = 0; ++ uint32_t v_height0 = 0; ++ uint32_t v_height1 = 0; ++ uint32_t v_height2 = 0; ++ uint32_t v_height3 = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ if (self->private_impl.f_swizzle_immediately) { ++ v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[0u])); ++ v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[1u])); ++ if ((v_i <= v_j) && (v_j <= 640u)) { ++ v_src0 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j); ++ v_width0 = (8u * ((uint32_t)(self->private_impl.f_components_h[0u]))); ++ v_height0 = (8u * ((uint32_t)(self->private_impl.f_components_v[0u]))); ++ } ++ v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[1u])); ++ v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[2u])); ++ if ((v_i <= v_j) && (v_j <= 640u)) { ++ v_src1 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j); ++ v_width1 = (8u * ((uint32_t)(self->private_impl.f_components_h[1u]))); ++ v_height1 = (8u * ((uint32_t)(self->private_impl.f_components_v[1u]))); ++ } ++ v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[2u])); ++ v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[3u])); ++ if ((v_i <= v_j) && (v_j <= 640u)) { ++ v_src2 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j); ++ v_width2 = (8u * ((uint32_t)(self->private_impl.f_components_h[2u]))); ++ v_height2 = (8u * ((uint32_t)(self->private_impl.f_components_v[2u]))); ++ } ++ v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[3u])); ++ v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[4u])); ++ if ((v_i <= v_j) && (v_j <= 640u)) { ++ v_src3 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j); ++ v_width3 = (8u * ((uint32_t)(self->private_impl.f_components_h[3u]))); ++ v_height3 = (8u * ((uint32_t)(self->private_impl.f_components_v[3u]))); ++ } ++ } else { ++ if ((self->private_impl.f_components_workbuf_offsets[0u] <= self->private_impl.f_components_workbuf_offsets[1u]) && (self->private_impl.f_components_workbuf_offsets[1u] <= ((uint64_t)(a_workbuf.len)))) { ++ v_src0 = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ self->private_impl.f_components_workbuf_offsets[0u], ++ self->private_impl.f_components_workbuf_offsets[1u]); ++ v_width0 = self->private_impl.f_components_workbuf_widths[0u]; ++ v_height0 = self->private_impl.f_components_workbuf_heights[0u]; ++ } ++ if ((self->private_impl.f_components_workbuf_offsets[1u] <= self->private_impl.f_components_workbuf_offsets[2u]) && (self->private_impl.f_components_workbuf_offsets[2u] <= ((uint64_t)(a_workbuf.len)))) { ++ v_src1 = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ self->private_impl.f_components_workbuf_offsets[1u], ++ self->private_impl.f_components_workbuf_offsets[2u]); ++ v_width1 = self->private_impl.f_components_workbuf_widths[1u]; ++ v_height1 = self->private_impl.f_components_workbuf_heights[1u]; ++ } ++ if ((self->private_impl.f_components_workbuf_offsets[2u] <= self->private_impl.f_components_workbuf_offsets[3u]) && (self->private_impl.f_components_workbuf_offsets[3u] <= ((uint64_t)(a_workbuf.len)))) { ++ v_src2 = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ self->private_impl.f_components_workbuf_offsets[2u], ++ self->private_impl.f_components_workbuf_offsets[3u]); ++ v_width2 = self->private_impl.f_components_workbuf_widths[2u]; ++ v_height2 = self->private_impl.f_components_workbuf_heights[2u]; ++ } ++ if ((self->private_impl.f_components_workbuf_offsets[3u] <= self->private_impl.f_components_workbuf_offsets[4u]) && (self->private_impl.f_components_workbuf_offsets[4u] <= ((uint64_t)(a_workbuf.len)))) { ++ v_src3 = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ self->private_impl.f_components_workbuf_offsets[3u], ++ self->private_impl.f_components_workbuf_offsets[4u]); ++ v_width3 = self->private_impl.f_components_workbuf_widths[3u]; ++ v_height3 = self->private_impl.f_components_workbuf_heights[3u]; ++ } ++ } ++ v_status = wuffs_base__pixel_swizzler__swizzle_ycck(&self->private_impl.f_swizzler, ++ a_dst, ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), ++ (a_x0 & 65535u), ++ wuffs_base__u32__min(a_x1, self->private_impl.f_width), ++ (a_y0 & 65535u), ++ wuffs_base__u32__min(a_y1, self->private_impl.f_height), ++ v_src0, ++ v_src1, ++ v_src2, ++ v_src3, ++ v_width0, ++ v_width1, ++ v_width2, ++ v_width3, ++ v_height0, ++ v_height1, ++ v_height2, ++ v_height3, ++ v_width0, ++ v_width1, ++ v_width2, ++ v_width3, ++ self->private_impl.f_components_h[0u], ++ self->private_impl.f_components_h[1u], ++ self->private_impl.f_components_h[2u], ++ self->private_impl.f_components_h[3u], ++ self->private_impl.f_components_v[0u], ++ self->private_impl.f_components_v[1u], ++ self->private_impl.f_components_v[2u], ++ self->private_impl.f_components_v[3u], ++ self->private_impl.f_is_rgb_or_cmyk, ++ ! self->private_impl.f_use_lower_quality, ++ wuffs_base__make_slice_u8(self->private_data.f_swizzle_ycck_scratch_buffer_2k, 2048)); ++ return wuffs_private_impl__status__ensure_not_a_suspension(v_status); ++} ++ ++// -------- func jpeg.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_jpeg__decoder__frame_dirty_rect( ++ const wuffs_jpeg__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); ++} ++ ++// -------- func jpeg.decoder.num_animation_loops ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_jpeg__decoder__num_animation_loops( ++ const wuffs_jpeg__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func jpeg.decoder.num_decoded_frame_configs ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_jpeg__decoder__num_decoded_frame_configs( ++ const wuffs_jpeg__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func jpeg.decoder.num_decoded_frames ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_jpeg__decoder__num_decoded_frames( ++ const wuffs_jpeg__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func jpeg.decoder.restart_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__restart_frame( ++ wuffs_jpeg__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if (a_index != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ self->private_impl.f_bitstream_is_closed = false; ++ self->private_impl.f_expect_multiple_scans = false; ++ self->private_impl.f_frame_config_io_position = a_io_position; ++ self->private_impl.f_scan_count = 0u; ++ self->private_impl.f_restart_interval = self->private_impl.f_saved_restart_interval; ++ v_i = 0u; ++ while (v_i < 4u) { ++ self->private_impl.f_seen_dqt[v_i] = self->private_impl.f_saved_seen_dqt[v_i]; ++ v_j = 0u; ++ while (v_j < 64u) { ++ self->private_impl.f_quant_tables[v_i][v_j] = self->private_impl.f_saved_quant_tables[v_i][v_j]; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 4u) { ++ v_j = 0u; ++ while (v_j < 10u) { ++ self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 8u) { ++ self->private_impl.f_seen_dht[v_i] = false; ++ v_i += 1u; ++ } ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func jpeg.decoder.set_report_metadata ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_jpeg__decoder__set_report_metadata( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_jpeg__decoder__tell_me_more( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func jpeg.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_jpeg__decoder__workbuf_len( ++ const wuffs_jpeg__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ if (self->private_impl.f_use_lower_quality && (self->private_impl.f_sof_marker < 194u)) { ++ return wuffs_base__utility__make_range_ii_u64(0u, self->private_impl.f_components_workbuf_offsets[8u]); ++ } ++ return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_components_workbuf_offsets[8u], self->private_impl.f_components_workbuf_offsets[8u]); ++} ++ ++// -------- func jpeg.decoder.top_left_quants_has_zero ++ ++WUFFS_BASE__GENERATED_C_CODE ++static bool ++wuffs_jpeg__decoder__top_left_quants_has_zero( ++ const wuffs_jpeg__decoder* self, ++ uint32_t a_q) { ++ return ((self->private_impl.f_quant_tables[a_q][0u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][1u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][2u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][3u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][8u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][9u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][10u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][16u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][17u] == 0u) || ++ (self->private_impl.f_quant_tables[a_q][24u] == 0u)); ++} ++ ++// -------- func jpeg.decoder.load_mcu_blocks_for_single_component_smooth ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth( ++ wuffs_jpeg__decoder* self, ++ uint32_t a_mx, ++ uint32_t a_my, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_csel) { ++ uint64_t v_stride16 = 0; ++ uint64_t v_offset = 0; ++ uint32_t v_dx = 0; ++ uint32_t v_dy = 0; ++ uint32_t v_mx = 0; ++ uint32_t v_my = 0; ++ uint8_t v_q = 0; ++ uint32_t v_q_00 = 0; ++ uint32_t v_q_xy = 0; ++ uint8_t v_al = 0; ++ uint32_t v_scratch = 0; ++ uint32_t v_limit = 0; ++ ++ v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u))); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16)); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ } ++ v_dy = 0u; ++ while (v_dy < 5u) { ++ v_my = wuffs_base__u32__min(self->private_impl.f_block_smoothing_my_max_incl, wuffs_base__u32__sat_sub((a_my + v_dy), 2u)); ++ v_dx = 0u; ++ while (v_dx < 5u) { ++ v_mx = wuffs_base__u32__min(self->private_impl.f_block_smoothing_mx_max_incl, wuffs_base__u32__sat_sub((a_mx + v_dx), 2u)); ++ v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(v_mx)) * 128u) + (((uint64_t)(v_my)) * v_stride16)); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_private_impl__bulk_load_host_endian(&self->private_impl.f_block_smoothing_dc_values[v_dy][v_dx], 1u * (size_t)2u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset)); ++ } ++ v_dx += 1u; ++ } ++ v_dy += 1u; ++ } ++ v_q = self->private_impl.f_components_tq[a_csel]; ++ v_q_00 = ((uint32_t)(self->private_impl.f_quant_tables[v_q][0u])); ++ if (v_q_00 <= 0u) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (0u != (16u & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][6u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][7u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][8u] & ++ self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][9u])) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(152u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + 128u)) / 256u))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + 128u)) / 256u))); ++ } ++ self->private_data.f_mcu_blocks[0u][0u] = ((uint16_t)(v_scratch)); ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][3u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][3u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][3u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][10u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][10u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][10u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][17u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][17u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][17u] = ((uint16_t)(v_scratch)); ++ } ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][24u])); ++ if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][24u] == 0u)) { ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } else { ++ v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))); ++ } ++ self->private_data.f_mcu_blocks[0u][24u] = ((uint16_t)(v_scratch)); ++ } ++ } else { ++ v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u]; ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u])); ++ if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) { ++ v_limit = ((((uint32_t)(1u)) << v_al) - 1u); ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } else { ++ v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } ++ self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch)); ++ } ++ v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u]; ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u])); ++ if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) { ++ v_limit = ((((uint32_t)(1u)) << v_al) - 1u); ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } else { ++ v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } ++ self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch)); ++ } ++ v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u]; ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u])); ++ if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) { ++ v_limit = ((((uint32_t)(1u)) << v_al) - 1u); ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } else { ++ v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } ++ self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch)); ++ } ++ v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u]; ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u])); ++ if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) { ++ v_limit = ((((uint32_t)(1u)) << v_al) - 1u); ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } else { ++ v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } ++ self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch)); ++ } ++ v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u]; ++ v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u])); ++ if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) { ++ v_limit = ((((uint32_t)(1u)) << v_al) - 1u); ++ v_scratch = 0u; ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u]))); ++ v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u]))); ++ v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u]))); ++ v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u]))); ++ v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u]))); ++ v_scratch *= v_q_00; ++ if (v_scratch < 2147483648u) { ++ v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } else { ++ v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))))); ++ } ++ self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch)); ++ } ++ } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func jpeg.decoder.decode_mcu ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ return (*self->private_impl.choosy_decode_mcu)(self, a_dst, a_workbuf, a_mx, a_my); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu__choosy_default( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ uint32_t v_ret = 0; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint8_t v_csel = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint32_t v_pos = 0; ++ uint8_t v_dc_h = 0; ++ uint32_t v_dc_symbol = 0; ++ uint32_t v_dc_ht_fast = 0; ++ uint32_t v_dc_bl = 0; ++ uint32_t v_dc_code = 0; ++ uint32_t v_dc_blm1 = 0; ++ uint32_t v_dc_ht_slow = 0; ++ uint16_t v_dc_value = 0; ++ uint16_t v_dc_extend = 0; ++ const uint16_t* v_ac_huff_table_fast = NULL; ++ uint8_t v_ac_h = 0; ++ uint32_t v_ac_symbol = 0; ++ uint32_t v_ac_ht_fast = 0; ++ uint32_t v_ac_bl = 0; ++ uint32_t v_ac_code = 0; ++ uint32_t v_ac_blm1 = 0; ++ uint32_t v_ac_ht_slow = 0; ++ uint16_t v_ac_value = 0; ++ uint16_t v_ac_extend = 0; ++ uint32_t v_ac_rrrr = 0; ++ uint32_t v_ac_ssss = 0; ++ uint32_t v_z = 0; ++ uint32_t v_mcb = 0; ++ uint64_t v_stride = 0; ++ uint64_t v_offset = 0; ++ ++ v_bits = self->private_impl.f_bitstream_bits; ++ v_n_bits = self->private_impl.f_bitstream_n_bits; ++ if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { ++ return 2u; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi), ++ ((uint64_t)(self->private_impl.f_bitstream_ri))); ++ do { ++ while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { ++ while (self->private_impl.f_mcu_zig_index <= 0u) { ++ wuffs_private_impl__bulk_memset(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, 0u); ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block]; ++ v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)])); ++ v_dc_bl = (v_dc_ht_fast >> 8u); ++ if (v_n_bits >= v_dc_bl) { ++ v_dc_symbol = (15u & v_dc_ht_fast); ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ v_bits <<= (v_dc_bl & 63u); ++ v_n_bits -= v_dc_bl; ++ } else { ++ v_dc_code = ((uint32_t)((v_bits >> 55u))); ++ v_dc_blm1 = 8u; ++ v_bits <<= 9u; ++ v_n_bits -= 9u; ++ while (true) { ++ v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1]; ++ if (v_dc_code < (v_dc_ht_slow >> 8u)) { ++ v_dc_symbol = (15u & ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_dc_h][(255u & ((uint32_t)(v_dc_code + v_dc_ht_slow)))]))); ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ break; ++ } ++ v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u); ++ if (v_dc_blm1 == 0u) { ++ v_dc_symbol = 0u; ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ break; ++ } ++ } ++ } ++ v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_dc_value += ((uint16_t)(v_dc_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_dc_symbol; ++ v_n_bits -= v_dc_symbol; ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_data.f_mcu_blocks[0u][0u] = self->private_impl.f_mcu_previous_dc_values[v_csel]; ++ self->private_impl.f_mcu_zig_index = 1u; ++ break; ++ } ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ if (v_n_bits < 16u) { ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ } ++ v_z = 1u; ++ self->private_impl.f_mcu_zig_index = 0u; ++ v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[self->private_impl.f_mcu_current_block]; ++ v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; ++ while (v_z < 64u) { ++ v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_ac_bl = (v_ac_ht_fast >> 8u); ++ if (v_n_bits >= v_ac_bl) { ++ v_ac_symbol = (255u & v_ac_ht_fast); ++ v_bits <<= (v_ac_bl & 63u); ++ v_n_bits -= v_ac_bl; ++ } else { ++ v_ac_code = ((uint32_t)((v_bits >> 55u))); ++ v_ac_blm1 = 8u; ++ v_bits <<= 9u; ++ v_n_bits -= 9u; ++ while (true) { ++ v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; ++ if (v_ac_code < (v_ac_ht_slow >> 8u)) { ++ v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); ++ break; ++ } ++ v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); ++ if (v_ac_blm1 == 0u) { ++ v_ac_symbol = 0u; ++ break; ++ } ++ } ++ } ++ v_ac_rrrr = (v_ac_symbol >> 4u); ++ v_z += (v_ac_rrrr + 1u); ++ v_ac_ssss = (v_ac_symbol & 15u); ++ v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss]; ++ if (v_ac_ssss > 0u) { ++ v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_ac_value += ((uint16_t)(v_ac_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_ac_ssss; ++ v_n_bits -= v_ac_ssss; ++ self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[v_z]] = v_ac_value; ++ } else if (v_ac_rrrr < 15u) { ++ break; ++ } ++ } ++ v_mcb = self->private_impl.f_mcu_current_block; ++ self->private_impl.f_mcu_current_block += 1u; ++ if (self->private_impl.f_test_only_interrupt_decode_mcu) { ++ goto label__goto_done__break; ++ } ++ if ( ! self->private_impl.f_swizzle_immediately) { ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]]; ++ v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel])); ++ v_offset = (self->private_impl.f_mcu_blocks_offset[v_mcb] + (((uint64_t)(self->private_impl.f_mcu_blocks_mx_mul[v_mcb])) * ((uint64_t)(a_mx))) + (((uint64_t)(self->private_impl.f_mcu_blocks_my_mul[v_mcb])) * ((uint64_t)(a_my)))); ++ if (v_offset <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_jpeg__decoder__decode_idct(self, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); ++ } ++ } else if (self->private_impl.f_num_components == 1u) { ++ wuffs_jpeg__decoder__decode_idct(self, wuffs_base__make_slice_u8(self->private_data.f_swizzle_immediately_buffer, 64), 8u, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); ++ self->private_impl.f_swizzle_immediately_status = wuffs_jpeg__decoder__swizzle_gray(self, ++ a_dst, ++ wuffs_base__make_slice_u8(self->private_data.f_swizzle_immediately_buffer, 64), ++ ((a_mx + 0u) * 8u), ++ ((a_mx + 1u) * 8u), ++ ((a_my + 0u) * 8u), ++ ((a_my + 1u) * 8u), ++ 8u); ++ if ( ! wuffs_base__status__is_ok(&self->private_impl.f_swizzle_immediately_status)) { ++ v_ret = 3u; ++ goto label__goto_done__break; ++ } ++ break; ++ } else { ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]]; ++ v_stride = (8u * ((uint64_t)(self->private_impl.f_components_h[v_csel]))); ++ wuffs_jpeg__decoder__decode_idct(self, wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, self->private_impl.f_swizzle_immediately_b_offsets[v_mcb], 640), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel]))); ++ if (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { ++ continue; ++ } ++ self->private_impl.f_swizzle_immediately_status = wuffs_jpeg__decoder__swizzle_colorful(self, ++ a_dst, ++ wuffs_base__utility__empty_slice_u8(), ++ ((a_mx + 0u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_h))), ++ ((a_mx + 1u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_h))), ++ ((a_my + 0u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_v))), ++ ((a_my + 1u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_v)))); ++ if ( ! wuffs_base__status__is_ok(&self->private_impl.f_swizzle_immediately_status)) { ++ v_ret = 3u; ++ goto label__goto_done__break; ++ } ++ break; ++ } ++ } ++ self->private_impl.f_mcu_current_block = 0u; ++ } while (0); ++ label__goto_done__break:; ++ v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); ++ if (v_pos > self->private_impl.f_bitstream_wi) { ++ v_ret = 2u; ++ } else { ++ self->private_impl.f_bitstream_ri = v_pos; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ self->private_impl.f_bitstream_bits = v_bits; ++ self->private_impl.f_bitstream_n_bits = v_n_bits; ++ return v_ret; ++} ++ ++// -------- func jpeg.decoder.decode_mcu_progressive_ac_high_bits ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ uint32_t v_ret = 0; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint32_t v_pos = 0; ++ const uint16_t* v_ac_huff_table_fast = NULL; ++ uint8_t v_ac_h = 0; ++ uint32_t v_ac_symbol = 0; ++ uint32_t v_ac_ht_fast = 0; ++ uint32_t v_ac_bl = 0; ++ uint32_t v_ac_code = 0; ++ uint32_t v_ac_blm1 = 0; ++ uint32_t v_ac_ht_slow = 0; ++ uint16_t v_ac_value = 0; ++ uint16_t v_ac_extend = 0; ++ uint32_t v_ac_rrrr = 0; ++ uint32_t v_ac_ssss = 0; ++ uint32_t v_z = 0; ++ ++ if (self->private_impl.f_eob_run > 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_eob_run -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ return 0u; ++ } ++ v_bits = self->private_impl.f_bitstream_bits; ++ v_n_bits = self->private_impl.f_bitstream_n_bits; ++ if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { ++ return 2u; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi), ++ ((uint64_t)(self->private_impl.f_bitstream_ri))); ++ do { ++ do { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ if (v_n_bits < 16u) { ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ } ++ v_z = self->private_impl.f_mcu_zig_index; ++ self->private_impl.f_mcu_zig_index = 0u; ++ v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u]; ++ v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; ++ while (v_z <= ((uint32_t)(self->private_impl.f_scan_se))) { ++ v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_ac_bl = (v_ac_ht_fast >> 8u); ++ if (v_n_bits >= v_ac_bl) { ++ v_ac_symbol = (255u & v_ac_ht_fast); ++ v_bits <<= (v_ac_bl & 63u); ++ v_n_bits -= v_ac_bl; ++ } else { ++ v_ac_code = ((uint32_t)((v_bits >> 55u))); ++ v_ac_blm1 = 8u; ++ v_bits <<= 9u; ++ v_n_bits -= 9u; ++ while (true) { ++ v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; ++ if (v_ac_code < (v_ac_ht_slow >> 8u)) { ++ v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); ++ break; ++ } ++ v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); ++ if (v_ac_blm1 == 0u) { ++ v_ac_symbol = 0u; ++ break; ++ } ++ } ++ } ++ v_ac_rrrr = (v_ac_symbol >> 4u); ++ v_z += (v_ac_rrrr + 1u); ++ v_ac_ssss = (v_ac_symbol & 15u); ++ v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss]; ++ if (v_ac_ssss > 0u) { ++ v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_ac_value += ((uint16_t)(v_ac_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_ac_ssss; ++ v_n_bits -= v_ac_ssss; ++ self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[v_z]] = ((uint16_t)(((uint16_t)(v_ac_value << self->private_impl.f_scan_al)))); ++ } else if (v_ac_rrrr < 15u) { ++ self->private_impl.f_eob_run = ((uint16_t)(((uint16_t)(((uint16_t)(((uint16_t)(1u)) << v_ac_rrrr)) - 1u)))); ++ if (v_ac_rrrr > 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_ac_rrrr; ++ v_n_bits -= v_ac_rrrr; ++ } ++ break; ++ } ++ } ++ } while (0); ++ } while (0); ++ label__goto_done__break:; ++ v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); ++ if (v_pos > self->private_impl.f_bitstream_wi) { ++ v_ret = 2u; ++ } else { ++ self->private_impl.f_bitstream_ri = v_pos; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ self->private_impl.f_bitstream_bits = v_bits; ++ self->private_impl.f_bitstream_n_bits = v_n_bits; ++ return v_ret; ++} ++ ++// -------- func jpeg.decoder.decode_mcu_progressive_ac_low_bit ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ uint32_t v_ret = 0; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint16_t v_one_lshift_scan_al = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint32_t v_pos = 0; ++ const uint16_t* v_ac_huff_table_fast = NULL; ++ uint8_t v_ac_h = 0; ++ uint32_t v_ac_symbol = 0; ++ uint32_t v_ac_ht_fast = 0; ++ uint32_t v_ac_bl = 0; ++ uint32_t v_ac_code = 0; ++ uint32_t v_ac_blm1 = 0; ++ uint32_t v_ac_ht_slow = 0; ++ uint16_t v_ac_value = 0; ++ uint32_t v_ac_rrrr = 0; ++ uint32_t v_ac_ssss = 0; ++ uint8_t v_unzig = 0; ++ bool v_bit = false; ++ ++ v_bits = self->private_impl.f_bitstream_bits; ++ v_n_bits = self->private_impl.f_bitstream_n_bits; ++ v_one_lshift_scan_al = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al)); ++ if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { ++ return 2u; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi), ++ ((uint64_t)(self->private_impl.f_bitstream_ri))); ++ do { ++ do { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ while (true) { ++ if (self->private_impl.f_eob_run > 0u) { ++ break; ++ } ++ v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u]; ++ v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u]; ++ while (true) { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)])); ++ v_ac_bl = (v_ac_ht_fast >> 8u); ++ if (v_n_bits >= v_ac_bl) { ++ v_ac_symbol = (255u & v_ac_ht_fast); ++ v_bits <<= (v_ac_bl & 63u); ++ v_n_bits -= v_ac_bl; ++ } else { ++ v_ac_code = ((uint32_t)((v_bits >> 55u))); ++ v_ac_blm1 = 8u; ++ v_bits <<= 9u; ++ v_n_bits -= 9u; ++ while (true) { ++ v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1]; ++ if (v_ac_code < (v_ac_ht_slow >> 8u)) { ++ v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))])); ++ break; ++ } ++ v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u); ++ if (v_ac_blm1 == 0u) { ++ v_ac_symbol = 0u; ++ break; ++ } ++ } ++ } ++ v_ac_rrrr = (v_ac_symbol >> 4u); ++ v_ac_ssss = (v_ac_symbol & 15u); ++ v_ac_value = 0u; ++ if (v_ac_ssss > 0u) { ++ v_ac_value = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al)); ++ if ((v_bits >> 63u) == 0u) { ++ v_ac_value = ((uint16_t)(((uint16_t)(65535u)) << self->private_impl.f_scan_al)); ++ } ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ } else if (v_ac_rrrr < 15u) { ++ self->private_impl.f_eob_run = ((uint16_t)(((uint16_t)(1u)) << v_ac_rrrr)); ++ if (v_ac_rrrr > 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_ac_rrrr; ++ v_n_bits -= v_ac_rrrr; ++ } ++ goto label__goto_do_eob__break; ++ } ++ while (true) { ++ v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]; ++ if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) { ++ if (v_n_bits == 0u) { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ } ++ v_bit = ((v_bits >> 63u) > 0u); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ if (v_bit) { ++ if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ } ++ } else if (v_ac_rrrr <= 0u) { ++ break; ++ } else { ++ v_ac_rrrr -= 1u; ++ } ++ if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { ++ break; ++ } ++ self->private_impl.f_mcu_zig_index += 1u; ++ } ++ if (v_ac_value != 0u) { ++ self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]] = v_ac_value; ++ } ++ if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { ++ break; ++ } ++ self->private_impl.f_mcu_zig_index += 1u; ++ } ++ goto label__block__break; ++ } ++ label__goto_do_eob__break:; ++ if (self->private_impl.f_eob_run <= 0u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ while (true) { ++ v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]; ++ if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) { ++ if (v_n_bits == 0u) { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ } ++ v_bit = ((v_bits >> 63u) > 0u); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ if (v_bit) { ++ if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ } ++ } ++ if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) { ++ break; ++ } ++ self->private_impl.f_mcu_zig_index += 1u; ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_eob_run -= 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } while (0); ++ label__block__break:; ++ } while (0); ++ label__goto_done__break:; ++ v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); ++ if (v_pos > self->private_impl.f_bitstream_wi) { ++ v_ret = 2u; ++ } else { ++ self->private_impl.f_bitstream_ri = v_pos; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ self->private_impl.f_bitstream_bits = v_bits; ++ self->private_impl.f_bitstream_n_bits = v_n_bits; ++ return v_ret; ++} ++ ++// -------- func jpeg.decoder.decode_mcu_progressive_dc_high_bits ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ uint32_t v_ret = 0; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint8_t v_csel = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint32_t v_pos = 0; ++ uint8_t v_dc_h = 0; ++ uint32_t v_dc_symbol = 0; ++ uint32_t v_dc_ht_fast = 0; ++ uint32_t v_dc_bl = 0; ++ uint32_t v_dc_code = 0; ++ uint32_t v_dc_blm1 = 0; ++ uint32_t v_dc_ht_slow = 0; ++ uint16_t v_dc_value = 0; ++ uint16_t v_dc_extend = 0; ++ ++ v_bits = self->private_impl.f_bitstream_bits; ++ v_n_bits = self->private_impl.f_bitstream_n_bits; ++ if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { ++ return 2u; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi), ++ ((uint64_t)(self->private_impl.f_bitstream_ri))); ++ do { ++ while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ do { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block]; ++ v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)])); ++ v_dc_bl = (v_dc_ht_fast >> 8u); ++ if (v_n_bits >= v_dc_bl) { ++ v_dc_symbol = (15u & v_dc_ht_fast); ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ v_bits <<= (v_dc_bl & 63u); ++ v_n_bits -= v_dc_bl; ++ } else { ++ v_dc_code = ((uint32_t)((v_bits >> 55u))); ++ v_dc_blm1 = 8u; ++ v_bits <<= 9u; ++ v_n_bits -= 9u; ++ while (true) { ++ v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1]; ++ if (v_dc_code < (v_dc_ht_slow >> 8u)) { ++ v_dc_symbol = (15u & ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_dc_h][(255u & ((uint32_t)(v_dc_code + v_dc_ht_slow)))]))); ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ break; ++ } ++ v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u)))); ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u); ++ if (v_dc_blm1 == 0u) { ++ v_dc_symbol = 0u; ++ v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol]; ++ break; ++ } ++ } ++ } ++ v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_dc_value += ((uint16_t)(v_dc_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_bits <<= v_dc_symbol; ++ v_n_bits -= v_dc_symbol; ++ v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_data.f_mcu_blocks[self->private_impl.f_mcu_current_block][0u] = ((uint16_t)(self->private_impl.f_mcu_previous_dc_values[v_csel] << self->private_impl.f_scan_al)); ++ } while (0); ++ self->private_impl.f_mcu_current_block += 1u; ++ } ++ self->private_impl.f_mcu_current_block = 0u; ++ } while (0); ++ label__goto_done__break:; ++ v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); ++ if (v_pos > self->private_impl.f_bitstream_wi) { ++ v_ret = 2u; ++ } else { ++ self->private_impl.f_bitstream_ri = v_pos; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ self->private_impl.f_bitstream_bits = v_bits; ++ self->private_impl.f_bitstream_n_bits = v_n_bits; ++ return v_ret; ++} ++ ++// -------- func jpeg.decoder.decode_mcu_progressive_dc_low_bit ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit( ++ wuffs_jpeg__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf, ++ uint32_t a_mx, ++ uint32_t a_my) { ++ uint32_t v_ret = 0; ++ uint64_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint16_t v_one_lshift_scan_al = 0; ++ wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_r = &u_r; ++ const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint32_t v_pos = 0; ++ ++ v_bits = self->private_impl.f_bitstream_bits; ++ v_n_bits = self->private_impl.f_bitstream_n_bits; ++ v_one_lshift_scan_al = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al)); ++ if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) { ++ return 2u; ++ } ++ { ++ wuffs_base__io_buffer* o_0_v_r = v_r; ++ const uint8_t* o_0_iop_v_r = iop_v_r; ++ const uint8_t* o_0_io0_v_r = io0_v_r; ++ const uint8_t* o_0_io1_v_r = io1_v_r; ++ const uint8_t* o_0_io2_v_r = io2_v_r; ++ v_r = wuffs_private_impl__io_reader__set( ++ &u_r, ++ &iop_v_r, ++ &io0_v_r, ++ &io1_v_r, ++ &io2_v_r, ++ wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, ++ self->private_impl.f_bitstream_ri, ++ self->private_impl.f_bitstream_wi), ++ ((uint64_t)(self->private_impl.f_bitstream_ri))); ++ do { ++ while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) { ++ v_ret = 1u; ++ goto label__goto_done__break; ++ } ++ do { ++ if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) { ++ v_ret = 2u; ++ goto label__goto_done__break; ++ } ++ v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u)); ++ iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u); ++ v_n_bits |= 56u; ++ if ((v_bits >> 63u) != 0u) { ++ self->private_data.f_mcu_blocks[self->private_impl.f_mcu_current_block][0u] |= v_one_lshift_scan_al; ++ } ++ v_bits <<= 1u; ++ v_n_bits -= 1u; ++ } while (0); ++ self->private_impl.f_mcu_current_block += 1u; ++ } ++ self->private_impl.f_mcu_current_block = 0u; ++ } while (0); ++ label__goto_done__break:; ++ v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r))))); ++ if (v_pos > self->private_impl.f_bitstream_wi) { ++ v_ret = 2u; ++ } else { ++ self->private_impl.f_bitstream_ri = v_pos; ++ } ++ v_r = o_0_v_r; ++ iop_v_r = o_0_iop_v_r; ++ io0_v_r = o_0_io0_v_r; ++ io1_v_r = o_0_io1_v_r; ++ io2_v_r = o_0_io2_v_r; ++ } ++ self->private_impl.f_bitstream_bits = v_bits; ++ self->private_impl.f_bitstream_n_bits = v_n_bits; ++ return v_ret; ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_json__error__bad_c0_control_code[] = "#json: bad C0 control code"; ++const char wuffs_json__error__bad_utf_8[] = "#json: bad UTF-8"; ++const char wuffs_json__error__bad_backslash_escape[] = "#json: bad backslash-escape"; ++const char wuffs_json__error__bad_input[] = "#json: bad input"; ++const char wuffs_json__error__bad_new_line_in_a_string[] = "#json: bad new-line in a string"; ++const char wuffs_json__error__bad_quirk_combination[] = "#json: bad quirk combination"; ++const char wuffs_json__error__unsupported_number_length[] = "#json: unsupported number length"; ++const char wuffs_json__error__unsupported_recursion_depth[] = "#json: unsupported recursion depth"; ++const char wuffs_json__error__internal_error_inconsistent_i_o[] = "#json: internal error: inconsistent I/O"; ++ ++// ---------------- Private Consts ++ ++#define WUFFS_JSON__DECODER_NUMBER_LENGTH_MAX_INCL 99u ++ ++static const uint8_t ++WUFFS_JSON__LUT_BACKSLASHES[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 3u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 162u, 0u, 0u, 0u, 0u, 5u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 175u, ++ 7u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 4u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 220u, 0u, 0u, 0u, ++ 0u, 1u, 136u, 0u, 0u, 2u, 140u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 138u, 0u, ++ 0u, 0u, 141u, 0u, 137u, 0u, 6u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 1u, 3u, 4u, 5u, 6u, 7u, 10u, ++}; ++ ++static const uint8_t ++WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 7u, 27u, 10u, 63u, 39u, 11u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_JSON__LUT_CHARS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u, ++ 136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u, ++ 144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u, ++ 152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u, ++ 0u, 0u, 1u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 2u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, ++ 32u, 32u, 3u, 3u, 3u, 3u, 3u, 3u, ++ 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, ++ 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, ++ 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, ++ 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, ++ 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, ++ 5u, 5u, 5u, 5u, 5u, 32u, 32u, 32u, ++ 32u, 32u, 32u, 32u, 32u, 32u, 32u, 32u, ++}; ++ ++#define WUFFS_JSON__CLASS_WHITESPACE 0u ++ ++#define WUFFS_JSON__CLASS_STRING 1u ++ ++#define WUFFS_JSON__CLASS_COMMA 2u ++ ++#define WUFFS_JSON__CLASS_COLON 3u ++ ++#define WUFFS_JSON__CLASS_NUMBER 4u ++ ++#define WUFFS_JSON__CLASS_OPEN_CURLY_BRACE 5u ++ ++#define WUFFS_JSON__CLASS_CLOSE_CURLY_BRACE 6u ++ ++#define WUFFS_JSON__CLASS_OPEN_SQUARE_BRACKET 7u ++ ++#define WUFFS_JSON__CLASS_CLOSE_SQUARE_BRACKET 8u ++ ++#define WUFFS_JSON__CLASS_FALSE 9u ++ ++#define WUFFS_JSON__CLASS_TRUE 10u ++ ++#define WUFFS_JSON__CLASS_NULL_NAN_INF 11u ++ ++#define WUFFS_JSON__CLASS_COMMENT 12u ++ ++#define WUFFS_JSON__EXPECT_VALUE 7858u ++ ++#define WUFFS_JSON__EXPECT_NON_STRING_VALUE 7856u ++ ++#define WUFFS_JSON__EXPECT_STRING 4098u ++ ++#define WUFFS_JSON__EXPECT_COMMA 4100u ++ ++#define WUFFS_JSON__EXPECT_COLON 4104u ++ ++#define WUFFS_JSON__EXPECT_NUMBER 4112u ++ ++#define WUFFS_JSON__EXPECT_CLOSE_CURLY_BRACE 4160u ++ ++#define WUFFS_JSON__EXPECT_CLOSE_SQUARE_BRACKET 4352u ++ ++static const uint8_t ++WUFFS_JSON__LUT_CLASSES[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 0u, 0u, 15u, 15u, 0u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 0u, 15u, 1u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 11u, 2u, 4u, 15u, 12u, ++ 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, ++ 4u, 4u, 3u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 11u, 15u, 15u, 15u, 15u, 11u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 7u, 15u, 8u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 9u, 15u, ++ 15u, 11u, 15u, 15u, 15u, 15u, 11u, 15u, ++ 15u, 15u, 15u, 15u, 10u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 5u, 15u, 6u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++ 15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u, ++}; ++ ++static const uint8_t ++WUFFS_JSON__LUT_DECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u, ++ 136u, 137u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u, ++ 136u, 137u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 138u, 139u, 140u, 141u, 142u, 143u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 138u, 139u, 140u, 141u, 142u, 143u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++}; ++ ++#define WUFFS_JSON__QUIRKS_BASE 1225364480u ++ ++#define WUFFS_JSON__QUIRKS_COUNT 21u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_json__decoder__decode_number( ++ wuffs_json__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_json__decoder__decode_digits( ++ wuffs_json__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_n); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_leading( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_comment( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_inf_nan( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_trailer( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++// ---------------- VTables ++ ++const wuffs_base__token_decoder__func_ptrs ++wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__token_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_json__decoder__decode_tokens), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_json__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_json__decoder__set_quirk), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_json__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_json__decoder__initialize( ++ wuffs_json__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name = ++ wuffs_base__token_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers = ++ (const void*)(&wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_json__decoder* ++wuffs_json__decoder__alloc(void) { ++ wuffs_json__decoder* x = ++ (wuffs_json__decoder*)(calloc(1, sizeof(wuffs_json__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_json__decoder__initialize( ++ x, sizeof(wuffs_json__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_json__decoder(void) { ++ return sizeof(wuffs_json__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func json.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_json__decoder__get_quirk( ++ const wuffs_json__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ uint32_t v_key = 0; ++ ++ if (a_key >= 1225364480u) { ++ v_key = (a_key - 1225364480u); ++ if (v_key < 21u) { ++ if (self->private_impl.f_quirks[v_key]) { ++ return 1u; ++ } ++ } ++ } ++ return 0u; ++} ++ ++// -------- func json.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_json__decoder__set_quirk( ++ wuffs_json__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (a_key >= 1225364480u) { ++ a_key -= 1225364480u; ++ if (a_key < 21u) { ++ self->private_impl.f_quirks[a_key] = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func json.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_json__decoder__workbuf_len( ++ const wuffs_json__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__empty_range_ii_u64(); ++} ++ ++// -------- func json.decoder.decode_tokens ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_json__decoder__decode_tokens( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_vminor = 0; ++ uint32_t v_number_length = 0; ++ uint32_t v_number_status = 0; ++ uint32_t v_string_length = 0; ++ uint32_t v_whitespace_length = 0; ++ uint32_t v_depth = 0; ++ uint32_t v_stack_byte = 0; ++ uint32_t v_stack_bit = 0; ++ uint32_t v_match = 0; ++ uint32_t v_c32 = 0; ++ uint8_t v_c8 = 0; ++ uint8_t v_backslash = 0; ++ uint8_t v_char = 0; ++ uint8_t v_class = 0; ++ uint32_t v_multi_byte_utf8 = 0; ++ uint8_t v_backslash_x_ok = 0; ++ uint8_t v_backslash_x_value = 0; ++ uint32_t v_backslash_x_string = 0; ++ uint8_t v_uni4_ok = 0; ++ uint64_t v_uni4_string = 0; ++ uint32_t v_uni4_value = 0; ++ uint32_t v_uni4_high_surrogate = 0; ++ uint8_t v_uni8_ok = 0; ++ uint64_t v_uni8_string = 0; ++ uint32_t v_uni8_value = 0; ++ uint32_t v_expect = 0; ++ uint32_t v_expect_after_value = 0; ++ ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_tokens; ++ if (coro_susp_point) { ++ v_depth = self->private_data.s_decode_tokens.v_depth; ++ v_expect = self->private_data.s_decode_tokens.v_expect; ++ v_expect_after_value = self->private_data.s_decode_tokens.v_expect_after_value; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_end_of_data) { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (self->private_impl.f_quirks[18u]) { ++ if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u] || self->private_impl.f_quirks[17u]) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_quirk_combination); ++ goto exit; ++ } ++ } ++ if (self->private_impl.f_quirks[15u] || self->private_impl.f_quirks[16u]) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_json__decoder__decode_leading(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ v_expect = 7858u; ++ label__outer__continue:; ++ while (true) { ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ goto label__outer__continue; ++ } ++ v_whitespace_length = 0u; ++ v_c8 = 0u; ++ v_class = 0u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (v_whitespace_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_whitespace_length = 0u; ++ } ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ goto label__outer__continue; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ v_class = WUFFS_JSON__LUT_CLASSES[v_c8]; ++ if (v_class != 0u) { ++ break; ++ } ++ iop_a_src += 1u; ++ if (v_whitespace_length >= 65534u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(65535u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_whitespace_length = 0u; ++ goto label__outer__continue; ++ } ++ v_whitespace_length += 1u; ++ } ++ if (v_whitespace_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_whitespace_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__outer__continue; ++ } ++ } ++ if (0u == (v_expect & (((uint32_t)(1u)) << v_class))) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ if (v_class == 1u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ label__string_loop_outer__continue:; ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ continue; ++ } ++ v_string_length = 0u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ } ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ goto label__string_loop_outer__continue; ++ } ++ while (((uint64_t)(io2_a_src - iop_a_src)) > 4u) { ++ v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ if (0u != (WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 0u))] | ++ WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 8u))] | ++ WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 16u))] | ++ WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 24u))])) { ++ break; ++ } ++ iop_a_src += 4u; ++ if (v_string_length > 65527u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ goto label__string_loop_outer__continue; ++ } ++ v_string_length += 4u; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ v_char = WUFFS_JSON__LUT_CHARS[v_c8]; ++ if (v_char == 0u) { ++ iop_a_src += 1u; ++ if (v_string_length >= 65531u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(65532u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ goto label__string_loop_outer__continue; ++ } ++ v_string_length += 1u; ++ continue; ++ } else if (v_char == 1u) { ++ if (v_string_length != 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ } ++ goto label__string_loop_outer__break; ++ } else if (v_char == 2u) { ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ goto label__string_loop_outer__continue; ++ } ++ v_c8 = ((uint8_t)(((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u)))); ++ v_backslash = WUFFS_JSON__LUT_BACKSLASHES[v_c8]; ++ if (((uint8_t)(v_backslash & 128u)) != 0u) { ++ iop_a_src += 2u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | ((uint32_t)(((uint8_t)(v_backslash & 127u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } else if (v_backslash != 0u) { ++ if (self->private_impl.f_quirks[WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[((uint8_t)(v_backslash & 7u))]]) { ++ iop_a_src += 2u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | ((uint32_t)(WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[((uint8_t)(v_backslash & 7u))]))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ } else if (v_c8 == 117u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ goto label__string_loop_outer__continue; ++ } ++ v_uni4_string = (((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))) >> 16u); ++ v_uni4_value = 0u; ++ v_uni4_ok = 128u; ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u); ++ if (v_uni4_ok == 0u) { ++ } else if ((v_uni4_value < 55296u) || (57343u < v_uni4_value)) { ++ iop_a_src += 6u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } else if (v_uni4_value >= 56320u) { ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 12u) { ++ if (a_src && a_src->meta.closed) { ++ if (self->private_impl.f_quirks[20u]) { ++ iop_a_src += 6u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ goto label__string_loop_outer__continue; ++ } ++ v_uni4_string = (wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 4u) >> 16u); ++ if (((255u & (v_uni4_string >> 0u)) != 92u) || ((255u & (v_uni4_string >> 8u)) != 117u)) { ++ v_uni4_high_surrogate = 0u; ++ v_uni4_value = 0u; ++ v_uni4_ok = 0u; ++ } else { ++ v_uni4_high_surrogate = (65536u + ((v_uni4_value - 55296u) << 10u)); ++ v_uni4_value = 0u; ++ v_uni4_ok = 128u; ++ v_uni4_string >>= 16u; ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))]; ++ v_uni4_ok &= v_c8; ++ v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u); ++ } ++ if ((v_uni4_ok != 0u) && (56320u <= v_uni4_value) && (v_uni4_value <= 57343u)) { ++ v_uni4_value -= 56320u; ++ iop_a_src += 12u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | v_uni4_high_surrogate | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(12u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (self->private_impl.f_quirks[20u]) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) { ++ status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ iop_a_src += 6u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ } else if ((v_c8 == 85u) && self->private_impl.f_quirks[2u]) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 10u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ goto label__string_loop_outer__continue; ++ } ++ v_uni8_string = wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 2u); ++ v_uni8_value = 0u; ++ v_uni8_ok = 128u; ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 0u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 28u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 8u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 24u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 16u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 20u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 24u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 16u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 32u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 40u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 48u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 56u))]; ++ v_uni8_ok &= v_c8; ++ v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u); ++ if (v_uni8_ok == 0u) { ++ } else if ((v_uni8_value < 55296u) || ((57343u < v_uni8_value) && (v_uni8_value <= 1114111u))) { ++ iop_a_src += 10u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | (v_uni8_value & 2097151u)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } else if (self->private_impl.f_quirks[20u]) { ++ iop_a_src += 10u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ } else if ((v_c8 == 120u) && self->private_impl.f_quirks[9u]) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ goto label__string_loop_outer__continue; ++ } ++ v_backslash_x_string = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ v_backslash_x_ok = 128u; ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 16u))]; ++ v_backslash_x_ok &= v_c8; ++ v_backslash_x_value = ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 & 15u)) << 4u)))); ++ v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 24u))]; ++ v_backslash_x_ok &= v_c8; ++ v_backslash_x_value = ((uint8_t)(((uint8_t)(v_backslash_x_value | ((uint8_t)(v_c8 & 15u)))))); ++ if ((v_backslash_x_ok == 0u) || ((v_backslash_x_string & 65535u) != 30812u)) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } ++ iop_a_src += 4u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | ((uint32_t)(v_backslash_x_value))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape); ++ goto exit; ++ } else if (v_char == 3u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (a_src && a_src->meta.closed) { ++ if (self->private_impl.f_quirks[20u]) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); ++ goto label__string_loop_outer__continue; ++ } ++ v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ if ((v_multi_byte_utf8 & 49152u) == 32768u) { ++ v_multi_byte_utf8 = ((1984u & ((uint32_t)(v_multi_byte_utf8 << 6u))) | (63u & (v_multi_byte_utf8 >> 8u))); ++ iop_a_src += 2u; ++ if (v_string_length >= 65528u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_string_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ goto label__string_loop_outer__continue; ++ } ++ v_string_length += 2u; ++ continue; ++ } ++ } else if (v_char == 4u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (a_src && a_src->meta.closed) { ++ if (self->private_impl.f_quirks[20u]) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12); ++ goto label__string_loop_outer__continue; ++ } ++ v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); ++ if ((v_multi_byte_utf8 & 12632064u) == 8421376u) { ++ v_multi_byte_utf8 = ((61440u & ((uint32_t)(v_multi_byte_utf8 << 12u))) | (4032u & (v_multi_byte_utf8 >> 2u)) | (63u & (v_multi_byte_utf8 >> 16u))); ++ if ((2047u < v_multi_byte_utf8) && ((v_multi_byte_utf8 < 55296u) || (57343u < v_multi_byte_utf8))) { ++ iop_a_src += 3u; ++ if (v_string_length >= 65528u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_string_length + 3u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ goto label__string_loop_outer__continue; ++ } ++ v_string_length += 3u; ++ continue; ++ } ++ } ++ } else if (v_char == 5u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (a_src && a_src->meta.closed) { ++ if (self->private_impl.f_quirks[20u]) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(13); ++ goto label__string_loop_outer__continue; ++ } ++ v_multi_byte_utf8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ if ((v_multi_byte_utf8 & 3233857536u) == 2155905024u) { ++ v_multi_byte_utf8 = ((1835008u & ((uint32_t)(v_multi_byte_utf8 << 18u))) | ++ (258048u & ((uint32_t)(v_multi_byte_utf8 << 4u))) | ++ (4032u & (v_multi_byte_utf8 >> 10u)) | ++ (63u & (v_multi_byte_utf8 >> 24u))); ++ if ((65535u < v_multi_byte_utf8) && (v_multi_byte_utf8 <= 1114111u)) { ++ iop_a_src += 4u; ++ if (v_string_length >= 65528u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ goto label__string_loop_outer__continue; ++ } ++ v_string_length += 4u; ++ continue; ++ } ++ } ++ } ++ if (v_string_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_string_length = 0u; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ goto label__string_loop_outer__continue; ++ } ++ } ++ if (((uint8_t)(v_char & 128u)) != 0u) { ++ if (self->private_impl.f_quirks[0u]) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((6291456u | ((uint32_t)(((uint8_t)(v_char & 127u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ goto label__string_loop_outer__continue; ++ } ++ if (v_char == 138u) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_new_line_in_a_string); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_c0_control_code); ++ goto exit; ++ } ++ if (self->private_impl.f_quirks[20u]) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 1u; ++ goto label__string_loop_outer__continue; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_utf_8); ++ goto exit; ++ } ++ } ++ label__string_loop_outer__break:; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(14); ++ continue; ++ } ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(15); ++ continue; ++ } ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ break; ++ } ++ if (0u == (v_expect & (((uint32_t)(1u)) << 4u))) { ++ v_expect = 4104u; ++ goto label__outer__continue; ++ } ++ break; ++ } else if (v_class == 2u) { ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (0u == (v_expect & (((uint32_t)(1u)) << 8u))) { ++ if (self->private_impl.f_quirks[13u]) { ++ v_expect = 4162u; ++ } else { ++ v_expect = 4098u; ++ } ++ } else { ++ if (self->private_impl.f_quirks[13u]) { ++ v_expect = 8114u; ++ } else { ++ v_expect = 7858u; ++ } ++ } ++ goto label__outer__continue; ++ } else if (v_class == 3u) { ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 7858u; ++ goto label__outer__continue; ++ } else if (v_class == 4u) { ++ while (true) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_number_length = wuffs_json__decoder__decode_number(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ v_number_status = (v_number_length >> 8u); ++ v_vminor = 10486787u; ++ if ((v_number_length & 128u) != 0u) { ++ v_vminor = 10486785u; ++ } ++ v_number_length = (v_number_length & 127u); ++ if (v_number_status == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_number_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ break; ++ } ++ while (v_number_length > 0u) { ++ v_number_length -= 1u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ } ++ if (v_number_status == 1u) { ++ if (self->private_impl.f_quirks[14u]) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } else if (v_number_status == 2u) { ++ status = wuffs_base__make_status(wuffs_json__error__unsupported_number_length); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(17); ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(18); ++ } ++ } ++ } ++ break; ++ } else if (v_class == 5u) { ++ v_vminor = 2113553u; ++ if (v_depth == 0u) { ++ } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) { ++ v_vminor = 2113601u; ++ } else { ++ v_vminor = 2113569u; ++ } ++ if (v_depth >= 1024u) { ++ status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth); ++ goto exit; ++ } ++ v_stack_byte = (v_depth / 32u); ++ v_stack_bit = (v_depth & 31u); ++ self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(1u)) << v_stack_bit); ++ v_depth += 1u; ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 4162u; ++ v_expect_after_value = 4164u; ++ goto label__outer__continue; ++ } else if (v_class == 6u) { ++ iop_a_src += 1u; ++ if (v_depth <= 1u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2101314u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__outer__break; ++ } ++ v_depth -= 1u; ++ v_stack_byte = ((v_depth - 1u) / 32u); ++ v_stack_bit = ((v_depth - 1u) & 31u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2105410u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 4356u; ++ v_expect_after_value = 4356u; ++ } else { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2113602u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 4164u; ++ v_expect_after_value = 4164u; ++ } ++ goto label__outer__continue; ++ } else if (v_class == 7u) { ++ v_vminor = 2105361u; ++ if (v_depth == 0u) { ++ } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) { ++ v_vminor = 2105409u; ++ } else { ++ v_vminor = 2105377u; ++ } ++ if (v_depth >= 1024u) { ++ status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth); ++ goto exit; ++ } ++ v_stack_byte = (v_depth / 32u); ++ v_stack_bit = (v_depth & 31u); ++ self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(1u)) << v_stack_bit)); ++ v_depth += 1u; ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 8114u; ++ v_expect_after_value = 4356u; ++ goto label__outer__continue; ++ } else if (v_class == 8u) { ++ iop_a_src += 1u; ++ if (v_depth <= 1u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2101282u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ goto label__outer__break; ++ } ++ v_depth -= 1u; ++ v_stack_byte = ((v_depth - 1u) / 32u); ++ v_stack_bit = ((v_depth - 1u) & 31u); ++ if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2105378u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 4356u; ++ v_expect_after_value = 4356u; ++ } else { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2113570u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ v_expect = 4164u; ++ v_expect_after_value = 4164u; ++ } ++ goto label__outer__continue; ++ } else if (v_class == 9u) { ++ v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 111546413966853u); ++ if (v_match == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(8388612u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(5u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) { ++ status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ iop_a_src += 5u; ++ break; ++ } else if (v_match == 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(19); ++ goto label__outer__continue; ++ } ++ } else if (v_class == 10u) { ++ v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 435762131972u); ++ if (v_match == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(8388616u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ iop_a_src += 4u; ++ break; ++ } else if (v_match == 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(20); ++ goto label__outer__continue; ++ } ++ } else if (v_class == 11u) { ++ v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 465676103172u); ++ if (v_match == 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(8388610u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ iop_a_src += 4u; ++ break; ++ } else if (v_match == 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(21); ++ goto label__outer__continue; ++ } ++ if (self->private_impl.f_quirks[14u]) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); ++ status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ break; ++ } ++ } else if (v_class == 12u) { ++ if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u]) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); ++ status = wuffs_json__decoder__decode_comment(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_comment_type > 0u) { ++ goto label__outer__continue; ++ } ++ } ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ if (v_depth == 0u) { ++ break; ++ } ++ v_expect = v_expect_after_value; ++ } ++ label__outer__break:; ++ if (self->private_impl.f_quirks[17u] || self->private_impl.f_quirks[18u]) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); ++ status = wuffs_json__decoder__decode_trailer(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ self->private_impl.f_end_of_data = true; ++ ++ ok: ++ self->private_impl.p_decode_tokens = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_tokens = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_data.s_decode_tokens.v_depth = v_depth; ++ self->private_data.s_decode_tokens.v_expect = v_expect; ++ self->private_data.s_decode_tokens.v_expect_after_value = v_expect_after_value; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func json.decoder.decode_number ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_json__decoder__decode_number( ++ wuffs_json__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ uint8_t v_c8 = 0; ++ uint32_t v_n = 0; ++ uint32_t v_floating_point = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ do { ++ v_n = 0u; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (v_c8 != 45u) { ++ } else { ++ v_n += 1u; ++ iop_a_src += 1u; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ v_n |= 256u; ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ } ++ if (v_c8 == 48u) { ++ v_n += 1u; ++ iop_a_src += 1u; ++ } else { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (v_n > 99u) { ++ break; ++ } ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (v_c8 != 46u) { ++ } else { ++ if (v_n >= 99u) { ++ v_n |= 512u; ++ break; ++ } ++ v_n += 1u; ++ iop_a_src += 1u; ++ v_floating_point = 128u; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (v_n > 99u) { ++ break; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ } ++ if ((v_c8 != 69u) && (v_c8 != 101u)) { ++ break; ++ } ++ if (v_n >= 99u) { ++ v_n |= 512u; ++ break; ++ } ++ v_n += 1u; ++ iop_a_src += 1u; ++ v_floating_point = 128u; ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ v_n |= 256u; ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if ((v_c8 != 43u) && (v_c8 != 45u)) { ++ } else { ++ if (v_n >= 99u) { ++ v_n |= 512u; ++ break; ++ } ++ v_n += 1u; ++ iop_a_src += 1u; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } while (0); ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ return (v_n | v_floating_point); ++} ++ ++// -------- func json.decoder.decode_digits ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_json__decoder__decode_digits( ++ wuffs_json__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_n) { ++ uint8_t v_c8 = 0; ++ uint32_t v_n = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ v_n = a_n; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if ( ! (a_src && a_src->meta.closed)) { ++ v_n |= 768u; ++ } ++ break; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (0u == WUFFS_JSON__LUT_DECIMAL_DIGITS[v_c8]) { ++ break; ++ } ++ if (v_n >= 99u) { ++ v_n |= 512u; ++ break; ++ } ++ v_n += 1u; ++ iop_a_src += 1u; ++ } ++ if (v_n == a_n) { ++ v_n |= 256u; ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ return v_n; ++} ++ ++// -------- func json.decoder.decode_leading ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_leading( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_u = 0; ++ ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_leading; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_allow_leading_ars = self->private_impl.f_quirks[15u]; ++ self->private_impl.f_allow_leading_ubom = self->private_impl.f_quirks[16u]; ++ while (self->private_impl.f_allow_leading_ars || self->private_impl.f_allow_leading_ubom) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ continue; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if ((v_c8 == 30u) && self->private_impl.f_allow_leading_ars) { ++ self->private_impl.f_allow_leading_ars = false; ++ iop_a_src += 1u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ continue; ++ } else if ((v_c8 == 239u) && self->private_impl.f_allow_leading_ubom) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { ++ if (a_src && a_src->meta.closed) { ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ continue; ++ } ++ v_u = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); ++ if (v_u == 12565487u) { ++ self->private_impl.f_allow_leading_ubom = false; ++ iop_a_src += 3u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ continue; ++ } ++ } ++ break; ++ } ++ ++ ok: ++ self->private_impl.p_decode_leading = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_leading = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func json.decoder.decode_comment ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_comment( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint16_t v_c16 = 0; ++ uint32_t v_length = 0; ++ ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_comment; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_comment_type = 0u; ++ while ((((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) || (((uint64_t)(io2_a_src - iop_a_src)) <= 1u)) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } ++ v_c16 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ if ((v_c16 == 10799u) && self->private_impl.f_quirks[11u]) { ++ iop_a_src += 2u; ++ v_length = 2u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) { ++ if (v_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ } ++ v_length = 0u; ++ continue; ++ } ++ v_c16 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ if (v_c16 == 12074u) { ++ iop_a_src += 2u; ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)((v_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ self->private_impl.f_comment_type = 1u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ iop_a_src += 1u; ++ if (v_length >= 65533u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ } ++ v_length = 0u; ++ continue; ++ } ++ v_length += 1u; ++ } ++ } else if ((v_c16 == 12079u) && self->private_impl.f_quirks[12u]) { ++ iop_a_src += 2u; ++ v_length = 2u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ self->private_impl.f_comment_type = 2u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } else if (v_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ } ++ v_length = 0u; ++ continue; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (v_c8 == 10u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ self->private_impl.f_comment_type = 2u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ iop_a_src += 1u; ++ if (v_length >= 65533u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | ++ (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ } ++ v_length = 0u; ++ continue; ++ } ++ v_length += 1u; ++ } ++ } ++ ++ ok: ++ self->private_impl.p_decode_comment = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_comment = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func json.decoder.decode_inf_nan ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_inf_nan( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_c32 = 0; ++ uint32_t v_neg = 0; ++ ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_inf_nan; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 2u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ continue; ++ } ++ v_c32 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); ++ if ((v_c32 | 2105376u) == 6712937u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) > 7u) { ++ if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) | 2314885530818453536u) == 8751735898823356009u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(8u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 8u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ } else if ( ! (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ continue; ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 3u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } else if ((v_c32 | 2105376u) == 7233902u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(10485888u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 3u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } else if ((v_c32 & 255u) == 43u) { ++ v_neg = 0u; ++ } else if ((v_c32 & 255u) == 45u) { ++ v_neg = 1u; ++ } else { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 3u) { ++ if (a_src && a_src->meta.closed) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ continue; ++ } ++ v_c32 = (wuffs_base__peek_u32le__no_bounds_check(iop_a_src) >> 8u); ++ if ((v_c32 | 2105376u) == 6712937u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) > 8u) { ++ if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 1u) | 2314885530818453536u) == 8751735898823356009u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 9u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ } else if ( ! (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ continue; ++ } ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 4u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } else if ((v_c32 | 2105376u) == 7233902u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)((10485760u | (((uint32_t)(128u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ iop_a_src += 4u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ ++ ok: ++ self->private_impl.p_decode_inf_nan = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_inf_nan = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func json.decoder.decode_trailer ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_json__decoder__decode_trailer( ++ wuffs_json__decoder* self, ++ wuffs_base__token_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_whitespace_length = 0; ++ ++ wuffs_base__token* iop_a_dst = NULL; ++ wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_trailer; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_quirks[18u]) { ++ self->private_impl.f_trailer_stop = 10u; ++ } else { ++ self->private_impl.f_trailer_stop = 0u; ++ } ++ label__outer__continue:; ++ while (true) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } ++ v_whitespace_length = 0u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (v_whitespace_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ if (a_src && a_src->meta.closed) { ++ goto label__outer__break; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ goto label__outer__continue; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (WUFFS_JSON__LUT_CLASSES[v_c8] != 0u) { ++ if (v_whitespace_length > 0u) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ } ++ if (self->private_impl.f_trailer_stop > 0u) { ++ status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ goto exit; ++ } ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_json__decoder__decode_comment(self, a_dst, a_src); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_comment_type > 0u) { ++ goto label__outer__continue; ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ iop_a_src += 1u; ++ if ((v_whitespace_length >= 65534u) || (v_c8 == self->private_impl.f_trailer_stop)) { ++ *iop_a_dst++ = wuffs_base__make_token( ++ (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | ++ (((uint64_t)((v_whitespace_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ if (v_c8 == self->private_impl.f_trailer_stop) { ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ goto label__outer__continue; ++ } ++ v_whitespace_length += 1u; ++ } ++ } ++ label__outer__break:; ++ ++ ok: ++ self->private_impl.p_decode_trailer = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_trailer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_lzma__error__bad_lzma2_header[] = "#lzma: bad LZMA2 header"; ++const char wuffs_lzma__error__bad_bitstream_trailer[] = "#lzma: bad bitstream trailer"; ++const char wuffs_lzma__error__bad_code[] = "#lzma: bad code"; ++const char wuffs_lzma__error__bad_decoded_length[] = "#lzma: bad decoded length"; ++const char wuffs_lzma__error__bad_distance[] = "#lzma: bad distance"; ++const char wuffs_lzma__error__bad_header[] = "#lzma: bad header"; ++const char wuffs_lzma__error__truncated_input[] = "#lzma: truncated input"; ++const char wuffs_lzma__error__unsupported_decoded_length[] = "#lzma: unsupported decoded length"; ++const char wuffs_lzma__error__unsupported_properties[] = "#lzma: unsupported properties"; ++const char wuffs_lzma__error__internal_error_inconsistent_i_o[] = "#lzma: internal error: inconsistent I/O"; ++const char wuffs_lzma__error__internal_error_inconsistent_dictionary_state[] = "#lzma: internal error: inconsistent dictionary state"; ++ ++// ---------------- Private Consts ++ ++static const uint8_t ++WUFFS_LZMA__STATE_TRANSITION_LITERAL[12] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 1u, 2u, 3u, 4u, ++ 5u, 6u, 4u, 5u, ++}; ++ ++static const uint8_t ++WUFFS_LZMA__STATE_TRANSITION_MATCH[12] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 7u, 7u, 7u, 7u, 7u, 7u, 7u, 10u, ++ 10u, 10u, 10u, 10u, ++}; ++ ++static const uint8_t ++WUFFS_LZMA__STATE_TRANSITION_LONGREP[12] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 8u, 8u, 8u, 8u, 8u, 8u, 8u, 11u, ++ 11u, 11u, 11u, 11u, ++}; ++ ++static const uint8_t ++WUFFS_LZMA__STATE_TRANSITION_SHORTREP[12] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 9u, 9u, 9u, 9u, 9u, 9u, 9u, 11u, ++ 11u, 11u, 11u, 11u, ++}; ++ ++static const uint8_t ++WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 1u, 2u, 3u, 3u, 3u, 3u, 3u, ++}; ++ ++#define WUFFS_LZMA__QUIRKS_BASE 1348001792u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream_fast( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream_slow( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__add_history( ++ wuffs_lzma__decoder* self, ++ wuffs_base__slice_u8 a_hist, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__do_transform_io( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__update_stashed_bytes( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_optional_end_of_stream( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzma__decoder__initialize_dict( ++ wuffs_lzma__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzma__decoder__initialize_probs( ++ wuffs_lzma__decoder* self); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_lzma__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzma__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_lzma__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_lzma__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_lzma__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzma__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_lzma__decoder__initialize( ++ wuffs_lzma__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_lzma__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_lzma__decoder* ++wuffs_lzma__decoder__alloc(void) { ++ wuffs_lzma__decoder* x = ++ (wuffs_lzma__decoder*)(calloc(1, sizeof(wuffs_lzma__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_lzma__decoder__initialize( ++ x, sizeof(wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_lzma__decoder(void) { ++ return sizeof(wuffs_lzma__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func lzma.decoder.decode_bitstream_fast ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream_fast( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_range = 0; ++ uint32_t v_state = 0; ++ uint32_t v_rep0 = 0; ++ uint32_t v_rep1 = 0; ++ uint32_t v_rep2 = 0; ++ uint32_t v_rep3 = 0; ++ uint32_t v_reptmp = 0; ++ uint32_t v_rep = 0; ++ uint64_t v_pos = 0; ++ uint64_t v_pos_end = 0; ++ uint32_t v_lc = 0; ++ uint64_t v_lp_mask = 0; ++ uint64_t v_pb_mask = 0; ++ uint32_t v_prob = 0; ++ uint32_t v_threshold = 0; ++ uint32_t v_tree_node = 0; ++ uint8_t v_prev_byte = 0; ++ uint32_t v_match_byte = 0; ++ uint32_t v_match_cusp = 0; ++ uint32_t v_len_state = 0; ++ uint32_t v_slot = 0; ++ uint32_t v_len = 0; ++ uint32_t v_lanl_offset = 0; ++ uint32_t v_lanl_old_offset = 0; ++ uint32_t v_lanl_index = 0; ++ uint32_t v_num_extra_bits = 0; ++ uint32_t v_dist_extra_bits = 0; ++ uint32_t v_high_bit_was_on = 0; ++ uint32_t v_i = 0; ++ uint32_t v_index_ao00 = 0; ++ uint32_t v_index_ao41 = 0; ++ uint32_t v_index_lit = 0; ++ uint32_t v_index_len = 0; ++ uint32_t v_index_small_dist_base = 0; ++ uint32_t v_index_small_dist_extra = 0; ++ uint32_t v_index_small_dist = 0; ++ uint32_t v_index_large_dist = 0; ++ uint32_t v_dist = 0; ++ uint32_t v_adj_dist = 0; ++ uint64_t v_wb_index = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ v_prev_byte = self->private_impl.f_stashed_bytes[0u]; ++ v_match_byte = ((uint32_t)(self->private_impl.f_stashed_bytes[1u])); ++ v_bits = self->private_impl.f_stashed_bits; ++ v_range = self->private_impl.f_stashed_range; ++ v_state = self->private_impl.f_stashed_state; ++ v_rep0 = self->private_impl.f_stashed_rep0; ++ v_rep1 = self->private_impl.f_stashed_rep1; ++ v_rep2 = self->private_impl.f_stashed_rep2; ++ v_rep3 = self->private_impl.f_stashed_rep3; ++ v_pos = self->private_impl.f_stashed_pos; ++ v_pos_end = self->private_impl.f_stashed_pos_end; ++ v_lc = self->private_impl.f_lc; ++ v_lp_mask = ((((uint64_t)(1u)) << self->private_impl.f_lp) - 1u); ++ v_pb_mask = ((((uint64_t)(1u)) << self->private_impl.f_pb) - 1u); ++ while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 282u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 48u)) { ++ if (v_pos >= v_pos_end) { ++ self->private_impl.f_end_of_chunk = true; ++ break; ++ } ++ v_index_ao00 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask)))); ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao00[v_index_ao00])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_lit = (15u & ((((uint32_t)((v_pos & v_lp_mask))) << v_lc) | (((uint32_t)(v_prev_byte)) >> (8u - v_lc)))); ++ v_lanl_offset = 0u; ++ if (v_state >= 7u) { ++ v_lanl_offset = 256u; ++ } ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_match_byte <<= 1u; ++ v_lanl_old_offset = v_lanl_offset; ++ v_lanl_offset &= v_match_byte; ++ v_lanl_index = (v_lanl_offset + v_lanl_old_offset + v_tree_node); ++ v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_lanl_index])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_lanl_offset = ((v_lanl_offset ^ v_lanl_old_offset) & 256u); ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_prev_byte = ((uint8_t)(v_tree_node)); ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_prev_byte), iop_a_dst += 1); ++ v_pos += 1u; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LITERAL[v_state])); ++ continue; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao20[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len_state = ((uint32_t)(WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[(v_tree_node & 7u)])); ++ v_len = ((v_tree_node & 7u) + 2u); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 10u); ++ v_len_state = 3u; ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_high[0u][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 255u) + 18u); ++ v_len_state = 3u; ++ } while (0); ++ v_slot = 1u; ++ while (v_slot < 64u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_slot[v_len_state][v_slot])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob)); ++ v_slot = (v_slot << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob)); ++ v_slot = ((v_slot << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_slot &= 63u; ++ v_rep = v_slot; ++ if (v_slot < 4u) { ++ } else if (v_slot < 14u) { ++ v_num_extra_bits = ((v_slot >> 1u) - 1u); ++ v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits); ++ v_index_small_dist_base = ((uint32_t)(v_rep - v_slot)); ++ v_index_small_dist_extra = 1u; ++ v_dist_extra_bits = 0u; ++ v_i = 0u; ++ while (v_i < v_num_extra_bits) { ++ v_index_small_dist = (((uint32_t)(v_index_small_dist_base + v_index_small_dist_extra)) & 127u); ++ v_prob = ((uint32_t)(self->private_data.f_probs_small_dist[v_index_small_dist])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob)); ++ v_index_small_dist_extra = ((uint32_t)(v_index_small_dist_extra << 1u)); ++ v_i += 1u; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob)); ++ v_index_small_dist_extra = (((uint32_t)(v_index_small_dist_extra << 1u)) | 1u); ++ v_dist_extra_bits |= (((uint32_t)(1u)) << v_i); ++ v_i += 1u; ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_rep += v_dist_extra_bits; ++ } else { ++ v_num_extra_bits = ((v_slot >> 1u) - 1u); ++ v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits); ++ v_dist_extra_bits = 0u; ++ while (true) { ++ v_range >>= 1u; ++ v_bits -= v_range; ++ v_high_bit_was_on = ((uint32_t)(0u - (v_bits >> 31u))); ++ v_bits += (v_range & v_high_bit_was_on); ++ v_dist_extra_bits = (((uint32_t)(v_dist_extra_bits << 1u)) | (((uint32_t)(v_high_bit_was_on + 1u)) & 1u)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_num_extra_bits -= 1u; ++ if (v_num_extra_bits <= 4u) { ++ break; ++ } ++ } ++ v_dist_extra_bits <<= 4u; ++ v_index_large_dist = 1u; ++ while (true) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_large_dist[v_index_large_dist])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob)); ++ v_index_large_dist = (15u & ((uint32_t)(v_index_large_dist << 1u))); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob)); ++ v_index_large_dist = (15u & (((uint32_t)(v_index_large_dist << 1u)) | 1u)); ++ v_dist_extra_bits |= (((uint32_t)(1u)) << (4u - v_num_extra_bits)); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_num_extra_bits -= 1u; ++ if (v_num_extra_bits <= 0u) { ++ break; ++ } ++ } ++ v_rep += v_dist_extra_bits; ++ } ++ if (v_rep >= 4294967295u) { ++ self->private_impl.f_end_of_chunk = true; ++ goto label__outer__break; ++ } ++ v_rep3 = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_rep; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_MATCH[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao40[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ v_index_ao41 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask)))); ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao41[v_index_ao41])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_len = 1u; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_SHORTREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao60[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } else { ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao63[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep3; ++ v_rep3 = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } ++ } ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 2u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 10u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_high[0u][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 255u) + 18u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ } while (0); ++ } while (0); ++ v_dist = (v_rep0 + 1u); ++ if ((((uint64_t)(v_dist)) > v_pos) || (((uint64_t)(v_dist)) > ((uint64_t)(self->private_impl.f_dict_size)))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_distance); ++ goto exit; ++ } ++ v_pos += ((uint64_t)(v_len)); ++ if (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_adj_dist > self->private_impl.f_dict_seen) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_distance); ++ goto exit; ++ } ++ v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist)))); ++ while (v_wb_index >= 9223372036854775808u) { ++ v_wb_index += ((uint64_t)(self->private_impl.f_dict_size)); ++ } ++ if (v_wb_index >= ((uint64_t)(a_workbuf.len))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ if (v_len < v_adj_dist) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,(v_len + 1u), wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_match_byte = ((uint32_t)(iop_a_dst[-1])); ++ iop_a_dst--; ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_prev_byte = iop_a_dst[-1]; ++ continue; ++ } else if (v_len == v_adj_dist) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_len, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history( ++ &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist); ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_match_byte = ((uint32_t)(iop_a_dst[-1])); ++ iop_a_dst--; ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_prev_byte = iop_a_dst[-1]; ++ continue; ++ } ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_adj_dist, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ v_len -= v_adj_dist; ++ if ((((uint64_t)(v_len)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_len + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst)))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ } ++ if (v_dist >= 8u) { ++ v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist); ++ v_match_byte = (v_match_cusp >> 8u); ++ v_prev_byte = ((uint8_t)(v_match_cusp)); ++ } else { ++ v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist); ++ v_match_byte = (v_match_cusp >> 8u); ++ v_prev_byte = ((uint8_t)(v_match_cusp)); ++ } ++ } ++ label__outer__break:; ++ self->private_impl.f_stashed_bytes[0u] = v_prev_byte; ++ self->private_impl.f_stashed_bytes[1u] = ((uint8_t)(v_match_byte)); ++ self->private_impl.f_stashed_bits = v_bits; ++ self->private_impl.f_stashed_range = v_range; ++ self->private_impl.f_stashed_state = v_state; ++ self->private_impl.f_stashed_rep0 = v_rep0; ++ self->private_impl.f_stashed_rep1 = v_rep1; ++ self->private_impl.f_stashed_rep2 = v_rep2; ++ self->private_impl.f_stashed_rep3 = v_rep3; ++ self->private_impl.f_stashed_pos = v_pos; ++ self->private_impl.f_stashed_pos_end = v_pos_end; ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func lzma.decoder.decode_bitstream_slow ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream_slow( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_range = 0; ++ uint32_t v_state = 0; ++ uint32_t v_rep0 = 0; ++ uint32_t v_rep1 = 0; ++ uint32_t v_rep2 = 0; ++ uint32_t v_rep3 = 0; ++ uint32_t v_reptmp = 0; ++ uint32_t v_rep = 0; ++ uint64_t v_pos = 0; ++ uint64_t v_pos_end = 0; ++ uint32_t v_lc = 0; ++ uint64_t v_lp_mask = 0; ++ uint64_t v_pb_mask = 0; ++ uint32_t v_prob = 0; ++ uint32_t v_threshold = 0; ++ uint32_t v_tree_node = 0; ++ uint8_t v_prev_byte = 0; ++ uint32_t v_match_byte = 0; ++ uint32_t v_match_cusp = 0; ++ uint32_t v_len_state = 0; ++ uint32_t v_slot = 0; ++ uint32_t v_len = 0; ++ uint32_t v_lanl_offset = 0; ++ uint32_t v_lanl_old_offset = 0; ++ uint32_t v_lanl_index = 0; ++ uint32_t v_num_extra_bits = 0; ++ uint32_t v_dist_extra_bits = 0; ++ uint32_t v_high_bit_was_on = 0; ++ uint32_t v_i = 0; ++ uint32_t v_index_ao00 = 0; ++ uint32_t v_index_ao41 = 0; ++ uint32_t v_index_lit = 0; ++ uint32_t v_index_len = 0; ++ uint32_t v_index_small_dist_base = 0; ++ uint32_t v_index_small_dist_extra = 0; ++ uint32_t v_index_small_dist = 0; ++ uint32_t v_index_large_dist = 0; ++ uint32_t v_dist = 0; ++ uint32_t v_adj_dist = 0; ++ uint64_t v_wb_index = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_bitstream_slow; ++ if (coro_susp_point) { ++ v_bits = self->private_data.s_decode_bitstream_slow.v_bits; ++ v_range = self->private_data.s_decode_bitstream_slow.v_range; ++ v_state = self->private_data.s_decode_bitstream_slow.v_state; ++ v_rep0 = self->private_data.s_decode_bitstream_slow.v_rep0; ++ v_rep1 = self->private_data.s_decode_bitstream_slow.v_rep1; ++ v_rep2 = self->private_data.s_decode_bitstream_slow.v_rep2; ++ v_rep3 = self->private_data.s_decode_bitstream_slow.v_rep3; ++ v_rep = self->private_data.s_decode_bitstream_slow.v_rep; ++ v_pos = self->private_data.s_decode_bitstream_slow.v_pos; ++ v_pos_end = self->private_data.s_decode_bitstream_slow.v_pos_end; ++ v_lc = self->private_data.s_decode_bitstream_slow.v_lc; ++ v_lp_mask = self->private_data.s_decode_bitstream_slow.v_lp_mask; ++ v_pb_mask = self->private_data.s_decode_bitstream_slow.v_pb_mask; ++ v_tree_node = self->private_data.s_decode_bitstream_slow.v_tree_node; ++ v_prev_byte = self->private_data.s_decode_bitstream_slow.v_prev_byte; ++ v_match_byte = self->private_data.s_decode_bitstream_slow.v_match_byte; ++ v_len_state = self->private_data.s_decode_bitstream_slow.v_len_state; ++ v_slot = self->private_data.s_decode_bitstream_slow.v_slot; ++ v_len = self->private_data.s_decode_bitstream_slow.v_len; ++ v_lanl_offset = self->private_data.s_decode_bitstream_slow.v_lanl_offset; ++ v_num_extra_bits = self->private_data.s_decode_bitstream_slow.v_num_extra_bits; ++ v_dist_extra_bits = self->private_data.s_decode_bitstream_slow.v_dist_extra_bits; ++ v_i = self->private_data.s_decode_bitstream_slow.v_i; ++ v_index_lit = self->private_data.s_decode_bitstream_slow.v_index_lit; ++ v_index_len = self->private_data.s_decode_bitstream_slow.v_index_len; ++ v_index_small_dist_base = self->private_data.s_decode_bitstream_slow.v_index_small_dist_base; ++ v_index_small_dist_extra = self->private_data.s_decode_bitstream_slow.v_index_small_dist_extra; ++ v_index_large_dist = self->private_data.s_decode_bitstream_slow.v_index_large_dist; ++ v_dist = self->private_data.s_decode_bitstream_slow.v_dist; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ v_prev_byte = self->private_impl.f_stashed_bytes[0u]; ++ v_match_byte = ((uint32_t)(self->private_impl.f_stashed_bytes[1u])); ++ v_bits = self->private_impl.f_stashed_bits; ++ v_range = self->private_impl.f_stashed_range; ++ v_state = self->private_impl.f_stashed_state; ++ v_rep0 = self->private_impl.f_stashed_rep0; ++ v_rep1 = self->private_impl.f_stashed_rep1; ++ v_rep2 = self->private_impl.f_stashed_rep2; ++ v_rep3 = self->private_impl.f_stashed_rep3; ++ v_pos = self->private_impl.f_stashed_pos; ++ v_pos_end = self->private_impl.f_stashed_pos_end; ++ v_lc = self->private_impl.f_lc; ++ v_lp_mask = ((((uint64_t)(1u)) << self->private_impl.f_lp) - 1u); ++ v_pb_mask = ((((uint64_t)(1u)) << self->private_impl.f_pb) - 1u); ++ while ( ! (self->private_impl.p_decode_bitstream_slow != 0)) { ++ if (v_pos >= v_pos_end) { ++ self->private_impl.f_end_of_chunk = true; ++ break; ++ } ++ v_index_ao00 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask)))); ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao00[v_index_ao00])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_lit = (15u & ((((uint32_t)((v_pos & v_lp_mask))) << v_lc) | (((uint32_t)(v_prev_byte)) >> (8u - v_lc)))); ++ if (v_state >= 7u) { ++ v_lanl_offset = 256u; ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_match_byte <<= 1u; ++ v_lanl_old_offset = v_lanl_offset; ++ v_lanl_offset &= v_match_byte; ++ v_lanl_index = (v_lanl_offset + v_lanl_old_offset + v_tree_node); ++ v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_lanl_index])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_lanl_offset = ((v_lanl_offset ^ v_lanl_old_offset) & 256u); ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ } else { ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_lit[v_index_lit][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ } ++ v_prev_byte = ((uint8_t)(v_tree_node)); ++ self->private_data.s_decode_bitstream_slow.scratch = v_prev_byte; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (iop_a_dst == io2_a_dst) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ goto suspend; ++ } ++ *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_bitstream_slow.scratch)); ++ v_pos += 1u; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LITERAL[v_state])); ++ continue; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao20[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len_state = ((uint32_t)(WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[(v_tree_node & 7u)])); ++ v_len = ((v_tree_node & 7u) + 2u); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_7 = *iop_a_src++; ++ v_c8 = t_7; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_8 = *iop_a_src++; ++ v_c8 = t_8; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_9 = *iop_a_src++; ++ v_c8 = t_9; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 10u); ++ v_len_state = 3u; ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_10 = *iop_a_src++; ++ v_c8 = t_10; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_match_len_high[0u][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_11 = *iop_a_src++; ++ v_c8 = t_11; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 255u) + 18u); ++ v_len_state = 3u; ++ } while (0); ++ v_slot = 1u; ++ while (v_slot < 64u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_slot[v_len_state][v_slot])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob)); ++ v_slot = (v_slot << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob)); ++ v_slot = ((v_slot << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_12 = *iop_a_src++; ++ v_c8 = t_12; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_slot &= 63u; ++ v_rep = v_slot; ++ if (v_slot < 4u) { ++ } else if (v_slot < 14u) { ++ v_num_extra_bits = ((v_slot >> 1u) - 1u); ++ v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits); ++ v_index_small_dist_base = ((uint32_t)(v_rep - v_slot)); ++ v_index_small_dist_extra = 1u; ++ v_dist_extra_bits = 0u; ++ v_i = 0u; ++ while (v_i < v_num_extra_bits) { ++ v_index_small_dist = (((uint32_t)(v_index_small_dist_base + v_index_small_dist_extra)) & 127u); ++ v_prob = ((uint32_t)(self->private_data.f_probs_small_dist[v_index_small_dist])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob)); ++ v_index_small_dist_extra = ((uint32_t)(v_index_small_dist_extra << 1u)); ++ v_i += 1u; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob)); ++ v_index_small_dist_extra = (((uint32_t)(v_index_small_dist_extra << 1u)) | 1u); ++ v_dist_extra_bits |= (((uint32_t)(1u)) << v_i); ++ v_i += 1u; ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_13 = *iop_a_src++; ++ v_c8 = t_13; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_rep += v_dist_extra_bits; ++ } else { ++ v_num_extra_bits = ((v_slot >> 1u) - 1u); ++ v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits); ++ v_dist_extra_bits = 0u; ++ while (true) { ++ v_range >>= 1u; ++ v_bits -= v_range; ++ v_high_bit_was_on = ((uint32_t)(0u - (v_bits >> 31u))); ++ v_bits += (v_range & v_high_bit_was_on); ++ v_dist_extra_bits = (((uint32_t)(v_dist_extra_bits << 1u)) | (((uint32_t)(v_high_bit_was_on + 1u)) & 1u)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_14 = *iop_a_src++; ++ v_c8 = t_14; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_num_extra_bits -= 1u; ++ if (v_num_extra_bits <= 4u) { ++ break; ++ } ++ } ++ v_dist_extra_bits <<= 4u; ++ v_index_large_dist = 1u; ++ while (true) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_large_dist[v_index_large_dist])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob)); ++ v_index_large_dist = (15u & ((uint32_t)(v_index_large_dist << 1u))); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob)); ++ v_index_large_dist = (15u & (((uint32_t)(v_index_large_dist << 1u)) | 1u)); ++ v_dist_extra_bits |= (((uint32_t)(1u)) << (4u - v_num_extra_bits)); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_15 = *iop_a_src++; ++ v_c8 = t_15; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_num_extra_bits -= 1u; ++ if (v_num_extra_bits <= 0u) { ++ break; ++ } ++ } ++ v_rep += v_dist_extra_bits; ++ } ++ if (v_rep >= 4294967295u) { ++ self->private_impl.f_end_of_chunk = true; ++ goto label__outer__break; ++ } ++ v_rep3 = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_rep; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_MATCH[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_16 = *iop_a_src++; ++ v_c8 = t_16; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao40[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_17 = *iop_a_src++; ++ v_c8 = t_17; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_ao41 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask)))); ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao41[v_index_ao41])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_18 = *iop_a_src++; ++ v_c8 = t_18; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_len = 1u; ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_SHORTREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_19 = *iop_a_src++; ++ v_c8 = t_19; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_20 = *iop_a_src++; ++ v_c8 = t_20; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao60[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_21 = *iop_a_src++; ++ v_c8 = t_21; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_22 = *iop_a_src++; ++ v_c8 = t_22; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_ao63[v_state])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(25); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_23 = *iop_a_src++; ++ v_c8 = t_23; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_24 = *iop_a_src++; ++ v_c8 = t_24; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_reptmp = v_rep3; ++ v_rep3 = v_rep2; ++ v_rep2 = v_rep1; ++ v_rep1 = v_rep0; ++ v_rep0 = v_reptmp; ++ } ++ } ++ } ++ do { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_25 = *iop_a_src++; ++ v_c8 = t_25; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_26 = *iop_a_src++; ++ v_c8 = t_26; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 2u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_27 = *iop_a_src++; ++ v_c8 = t_27; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[0u][0u])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_28 = *iop_a_src++; ++ v_c8 = t_28; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_index_len = ((uint32_t)((v_pos & v_pb_mask))); ++ v_tree_node = 1u; ++ while (v_tree_node < 8u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(31); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_29 = *iop_a_src++; ++ v_c8 = t_29; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 7u) + 10u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ break; ++ } ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob)); ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_30 = *iop_a_src++; ++ v_c8 = t_30; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ v_tree_node = 1u; ++ while (v_tree_node < 256u) { ++ v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_high[0u][v_tree_node])); ++ v_threshold = ((uint32_t)((v_range >> 11u) * v_prob)); ++ if (v_bits < v_threshold) { ++ v_range = v_threshold; ++ v_prob += (((uint32_t)(2048u - v_prob)) >> 5u); ++ self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = (v_tree_node << 1u); ++ } else { ++ v_bits -= v_threshold; ++ v_range -= v_threshold; ++ v_prob -= (v_prob >> 5u); ++ self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob)); ++ v_tree_node = ((v_tree_node << 1u) | 1u); ++ } ++ if ((v_range >> 24u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_31 = *iop_a_src++; ++ v_c8 = t_31; ++ } ++ v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8))); ++ v_range <<= 8u; ++ } ++ } ++ v_len = ((v_tree_node & 255u) + 18u); ++ v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state])); ++ } while (0); ++ } while (0); ++ v_dist = (v_rep0 + 1u); ++ if ((((uint64_t)(v_dist)) > v_pos) || (((uint64_t)(v_dist)) > ((uint64_t)(self->private_impl.f_dict_size)))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_distance); ++ goto exit; ++ } ++ v_pos += ((uint64_t)(v_len)); ++ while (274u > ((uint64_t)(io2_a_dst - iop_a_dst))) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(34); ++ } ++ if (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ if (v_adj_dist > self->private_impl.f_dict_seen) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_distance); ++ goto exit; ++ } ++ v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist)))); ++ while (v_wb_index >= 9223372036854775808u) { ++ v_wb_index += ((uint64_t)(self->private_impl.f_dict_size)); ++ } ++ if (v_wb_index >= ((uint64_t)(a_workbuf.len))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ if (v_len < v_adj_dist) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,(v_len + 1u), wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_match_byte = ((uint32_t)(iop_a_dst[-1])); ++ iop_a_dst--; ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_prev_byte = iop_a_dst[-1]; ++ continue; ++ } else if (v_len == v_adj_dist) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_len, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history( ++ &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist); ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_match_byte = ((uint32_t)(iop_a_dst[-1])); ++ iop_a_dst--; ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ v_prev_byte = iop_a_dst[-1]; ++ continue; ++ } ++ wuffs_private_impl__io_writer__limited_copy_u32_from_slice( ++ &iop_a_dst, io2_a_dst,v_adj_dist, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index)); ++ v_len -= v_adj_dist; ++ if ((((uint64_t)(v_len)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst)))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ } ++ v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp( ++ &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist); ++ v_match_byte = (v_match_cusp >> 8u); ++ v_prev_byte = ((uint8_t)(v_match_cusp)); ++ } ++ label__outer__break:; ++ self->private_impl.f_stashed_bytes[0u] = v_prev_byte; ++ self->private_impl.f_stashed_bytes[1u] = ((uint8_t)(v_match_byte)); ++ self->private_impl.f_stashed_bits = v_bits; ++ self->private_impl.f_stashed_range = v_range; ++ self->private_impl.f_stashed_state = v_state; ++ self->private_impl.f_stashed_rep0 = v_rep0; ++ self->private_impl.f_stashed_rep1 = v_rep1; ++ self->private_impl.f_stashed_rep2 = v_rep2; ++ self->private_impl.f_stashed_rep3 = v_rep3; ++ self->private_impl.f_stashed_pos = v_pos; ++ self->private_impl.f_stashed_pos_end = v_pos_end; ++ ++ ok: ++ self->private_impl.p_decode_bitstream_slow = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_bitstream_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_bitstream_slow.v_bits = v_bits; ++ self->private_data.s_decode_bitstream_slow.v_range = v_range; ++ self->private_data.s_decode_bitstream_slow.v_state = v_state; ++ self->private_data.s_decode_bitstream_slow.v_rep0 = v_rep0; ++ self->private_data.s_decode_bitstream_slow.v_rep1 = v_rep1; ++ self->private_data.s_decode_bitstream_slow.v_rep2 = v_rep2; ++ self->private_data.s_decode_bitstream_slow.v_rep3 = v_rep3; ++ self->private_data.s_decode_bitstream_slow.v_rep = v_rep; ++ self->private_data.s_decode_bitstream_slow.v_pos = v_pos; ++ self->private_data.s_decode_bitstream_slow.v_pos_end = v_pos_end; ++ self->private_data.s_decode_bitstream_slow.v_lc = v_lc; ++ self->private_data.s_decode_bitstream_slow.v_lp_mask = v_lp_mask; ++ self->private_data.s_decode_bitstream_slow.v_pb_mask = v_pb_mask; ++ self->private_data.s_decode_bitstream_slow.v_tree_node = v_tree_node; ++ self->private_data.s_decode_bitstream_slow.v_prev_byte = v_prev_byte; ++ self->private_data.s_decode_bitstream_slow.v_match_byte = v_match_byte; ++ self->private_data.s_decode_bitstream_slow.v_len_state = v_len_state; ++ self->private_data.s_decode_bitstream_slow.v_slot = v_slot; ++ self->private_data.s_decode_bitstream_slow.v_len = v_len; ++ self->private_data.s_decode_bitstream_slow.v_lanl_offset = v_lanl_offset; ++ self->private_data.s_decode_bitstream_slow.v_num_extra_bits = v_num_extra_bits; ++ self->private_data.s_decode_bitstream_slow.v_dist_extra_bits = v_dist_extra_bits; ++ self->private_data.s_decode_bitstream_slow.v_i = v_i; ++ self->private_data.s_decode_bitstream_slow.v_index_lit = v_index_lit; ++ self->private_data.s_decode_bitstream_slow.v_index_len = v_index_len; ++ self->private_data.s_decode_bitstream_slow.v_index_small_dist_base = v_index_small_dist_base; ++ self->private_data.s_decode_bitstream_slow.v_index_small_dist_extra = v_index_small_dist_extra; ++ self->private_data.s_decode_bitstream_slow.v_index_large_dist = v_index_large_dist; ++ self->private_data.s_decode_bitstream_slow.v_dist = v_dist; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func lzma.decoder.add_history ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__add_history( ++ wuffs_lzma__decoder* self, ++ wuffs_base__slice_u8 a_hist, ++ wuffs_base__slice_u8 a_workbuf) { ++ uint64_t v_dict_workbuf_index = 0; ++ uint64_t v_dict_size = 0; ++ uint64_t v_hist_length = 0; ++ wuffs_base__slice_u8 v_s = {0}; ++ uint64_t v_n_copied = 0; ++ uint64_t v_n = 0; ++ ++ v_dict_workbuf_index = ((uint64_t)(self->private_impl.f_dict_workbuf_index)); ++ v_dict_size = ((uint64_t)(self->private_impl.f_dict_size)); ++ if (((uint64_t)(a_hist.len)) == 0u) { ++ return wuffs_base__make_status(NULL); ++ } ++ if (((uint64_t)(a_workbuf.len)) < (v_dict_size + 273u)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ } ++ v_hist_length = ((uint64_t)(a_hist.len)); ++ if (v_hist_length > 4294967295u) { ++ self->private_impl.f_dict_seen = 4294967295u; ++ } else { ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dict_seen, ((uint32_t)(v_hist_length))); ++ } ++ v_s = a_hist; ++ if (((uint64_t)(v_s.len)) >= v_dict_size) { ++ v_s = wuffs_private_impl__slice_u8__suffix(v_s, v_dict_size); ++ wuffs_private_impl__slice_u8__copy_from_slice(a_workbuf, v_s); ++ self->private_impl.f_dict_workbuf_index = 0u; ++ } else if (v_dict_workbuf_index > v_dict_size) { ++ return wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ } else { ++ v_n_copied = wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__slice_u8__subslice_ij(a_workbuf, v_dict_workbuf_index, v_dict_size), v_s); ++ if (v_n_copied < ((uint64_t)(v_s.len))) { ++ v_n = wuffs_private_impl__slice_u8__copy_from_slice(a_workbuf, wuffs_base__slice_u8__subslice_i(v_s, v_n_copied)); ++ self->private_impl.f_dict_workbuf_index = ((uint32_t)(v_n)); ++ } else { ++ v_n = ((uint64_t)(v_dict_workbuf_index + v_n_copied)); ++ if (v_n < v_dict_size) { ++ self->private_impl.f_dict_workbuf_index = ((uint32_t)(v_n)); ++ } else { ++ self->private_impl.f_dict_workbuf_index = 0u; ++ } ++ } ++ } ++ if ((273u > v_dict_size) || (v_dict_size > ((uint64_t)(a_workbuf.len)))) { ++ return wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ } ++ wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__slice_u8__subslice_i(a_workbuf, v_dict_size), wuffs_base__slice_u8__subslice_j(a_workbuf, 273u)); ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func lzma.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_lzma__decoder__get_quirk( ++ const wuffs_lzma__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (a_key == 1348001792u) { ++ if (self->private_impl.f_allow_non_zero_initial_byte) { ++ return 1u; ++ } ++ } else if (a_key == 1348001793u) { ++ return ((uint64_t)(self->private_impl.f_format_extension)); ++ } ++ return 0u; ++} ++ ++// -------- func lzma.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzma__decoder__set_quirk( ++ wuffs_lzma__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ uint32_t v_v = 0; ++ uint32_t v_n = 0; ++ ++ if (a_key == 1348001792u) { ++ self->private_impl.f_allow_non_zero_initial_byte = (a_value > 0u); ++ } else if (a_key == 1348001793u) { ++ if (a_value == 0u) { ++ self->private_impl.f_format_extension = 0u; ++ return wuffs_base__make_status(NULL); ++ } else if ((a_value & 255u) == 1u) { ++ if ((a_value >> 8u) <= 255u) { ++ self->private_impl.f_format_extension = ((uint32_t)(a_value)); ++ v_v = (self->private_impl.f_format_extension >> 8u); ++ v_n = (((uint32_t)(1u)) << (v_v & 31u)); ++ wuffs_private_impl__u32__sat_sub_indirect(&v_n, ((v_n >> 4u) * ((v_v >> 5u) & 7u))); ++ if ((v_n < 4096u) || (536870912u < v_n)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_dict_size = v_n; ++ return wuffs_base__make_status(NULL); ++ } ++ } else if ((a_value & 255u) == 2u) { ++ if ((a_value >> 8u) <= 40u) { ++ self->private_impl.f_format_extension = ((uint32_t)(a_value)); ++ v_v = (self->private_impl.f_format_extension >> 8u); ++ if (v_v < 40u) { ++ self->private_impl.f_dict_size = ((2u | (v_v & 1u)) << ((v_v >> 1u) + 11u)); ++ } else { ++ self->private_impl.f_dict_size = 4294967295u; ++ } ++ return wuffs_base__make_status(NULL); ++ } ++ } ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func lzma.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzma__decoder__dst_history_retain_length( ++ const wuffs_lzma__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_base__utility__make_optional_u63(true, 0u); ++} ++ ++// -------- func lzma.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_lzma__decoder__workbuf_len( ++ const wuffs_lzma__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ uint64_t v_m = 0; ++ ++ if (self->private_impl.f_dict_size == 0u) { ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ } ++ v_m = (((uint64_t)(self->private_impl.f_dict_size)) + 273u); ++ return wuffs_base__utility__make_range_ii_u64(v_m, v_m); ++} ++ ++// -------- func lzma.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzma__decoder__transform_io( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint64_t v_mark = 0; ++ wuffs_base__status v_dti_status = wuffs_base__make_status(NULL); ++ wuffs_base__status v_ah_status = wuffs_base__make_status(NULL); ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ wuffs_base__status t_0 = wuffs_lzma__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ v_dti_status = t_0; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ } ++ if ( ! wuffs_base__status__is_suspension(&v_dti_status)) { ++ status = v_dti_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } else if ((v_dti_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__truncated_input); ++ goto exit; ++ } ++ v_ah_status = wuffs_lzma__decoder__add_history(self, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst), a_workbuf); ++ if (wuffs_base__status__is_error(&v_ah_status)) { ++ status = v_ah_status; ++ goto exit; ++ } ++ status = v_dti_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func lzma.decoder.do_transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__do_transform_io( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_header_byte = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_c32 = 0; ++ uint8_t v_prop_byte = 0; ++ uint32_t v_lc = 0; ++ uint32_t v_lp = 0; ++ uint32_t v_pb = 0; ++ uint32_t v_length = 0; ++ uint32_t v_n_copied = 0; ++ uint64_t v_smark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; ++ if (coro_susp_point) { ++ v_header_byte = self->private_data.s_do_transform_io.v_header_byte; ++ v_length = self->private_data.s_do_transform_io.v_length; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_lzma2_need_prob_reset = true; ++ self->private_impl.f_lzma2_need_properties = true; ++ self->private_impl.f_lzma2_need_dict_reset = true; ++ while (true) { ++ if ((self->private_impl.f_format_extension & 255u) == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_prop_byte = t_0; ++ } ++ if (v_prop_byte >= 225u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_header); ++ goto exit; ++ } ++ v_lc = ((uint32_t)(((uint8_t)(v_prop_byte % 9u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_prop_byte /= 9u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_lp = ((uint32_t)(((uint8_t)(v_prop_byte % 5u)))); ++ v_pb = ((uint32_t)(((uint8_t)(v_prop_byte / 5u)))); ++ if ((v_lc + v_lp) > 4u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__unsupported_properties); ++ goto exit; ++ } ++ self->private_impl.f_lc = wuffs_base__u32__min(v_lc, 4u); ++ self->private_impl.f_lp = v_lp; ++ self->private_impl.f_pb = v_pb; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_c32 = t_1; ++ } ++ self->private_impl.f_dict_size = wuffs_base__u32__max(v_c32, 4096u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint64_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_2 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 56) { ++ t_2 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ self->private_impl.f_decoded_length = t_2; ++ } ++ if ((self->private_impl.f_decoded_length >= 9223372036854775808u) && (self->private_impl.f_decoded_length != 18446744073709551615u)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__unsupported_decoded_length); ++ goto exit; ++ } ++ wuffs_lzma__decoder__initialize_probs(self); ++ } else if ((self->private_impl.f_format_extension & 255u) == 1u) { ++ self->private_impl.f_lc = 3u; ++ self->private_impl.f_lp = 0u; ++ self->private_impl.f_pb = 2u; ++ self->private_impl.f_decoded_length = 18446744073709551615u; ++ wuffs_lzma__decoder__initialize_probs(self); ++ } else { ++ while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ } ++ if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) == 0u) { ++ iop_a_src += 1u; ++ break; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_header_byte = t_3; ++ } ++ if (v_header_byte < 128u) { ++ if (v_header_byte < 2u) { ++ self->private_impl.f_lzma2_need_prob_reset = true; ++ self->private_impl.f_lzma2_need_properties = true; ++ self->private_impl.f_lzma2_need_dict_reset = false; ++ wuffs_lzma__decoder__initialize_dict(self); ++ } else if ((v_header_byte > 2u) || self->private_impl.f_lzma2_need_dict_reset) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header); ++ goto exit; ++ } ++ self->private_impl.f_prev_lzma2_chunk_was_uncompressed = true; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ if (num_bits_4 == 8) { ++ t_4 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)); ++ } ++ } ++ v_c32 = t_4; ++ } ++ v_length = (1u + v_c32); ++ while (true) { ++ v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_reader( ++ &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src); ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_stashed_pos, ((uint64_t)(v_n_copied))); ++ if (v_length <= v_n_copied) { ++ break; ++ } ++ v_length -= v_n_copied; ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ } else { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); ++ } ++ } ++ continue; ++ } ++ self->private_impl.f_decoded_length = ((uint64_t)(v_header_byte)); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ uint32_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); ++ if (num_bits_5 == 8) { ++ t_5 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)); ++ } ++ } ++ v_c32 = t_5; ++ } ++ self->private_impl.f_decoded_length = (((self->private_impl.f_decoded_length & 31u) << 16u) + ((uint64_t)((1u + v_c32)))); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ uint32_t t_6; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_6 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); ++ if (num_bits_6 == 8) { ++ t_6 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_6 += 8u; ++ *scratch |= ((uint64_t)(num_bits_6)); ++ } ++ } ++ v_c32 = t_6; ++ } ++ self->private_impl.f_lzma2_encoded_length_want = ((uint64_t)((1u + v_c32))); ++ if (v_header_byte >= 160u) { ++ wuffs_lzma__decoder__initialize_probs(self); ++ self->private_impl.f_lzma2_need_prob_reset = false; ++ } ++ if (v_header_byte >= 192u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_7 = *iop_a_src++; ++ v_prop_byte = t_7; ++ } ++ if (v_prop_byte >= 225u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header); ++ goto exit; ++ } ++ v_lc = ((uint32_t)(((uint8_t)(v_prop_byte % 9u)))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_prop_byte /= 9u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_lp = ((uint32_t)(((uint8_t)(v_prop_byte % 5u)))); ++ v_pb = ((uint32_t)(((uint8_t)(v_prop_byte / 5u)))); ++ if ((v_lc + v_lp) > 4u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header); ++ goto exit; ++ } ++ self->private_impl.f_lc = wuffs_base__u32__min(v_lc, 4u); ++ self->private_impl.f_lp = v_lp; ++ self->private_impl.f_pb = v_pb; ++ self->private_impl.f_lzma2_need_properties = false; ++ } ++ if (v_header_byte >= 224u) { ++ self->private_impl.f_lzma2_need_dict_reset = false; ++ wuffs_lzma__decoder__initialize_dict(self); ++ } else if (self->private_impl.f_prev_lzma2_chunk_was_uncompressed) { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); ++ status = wuffs_lzma__decoder__update_stashed_bytes(self, a_dst, a_workbuf); ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ self->private_impl.f_prev_lzma2_chunk_was_uncompressed = false; ++ if (self->private_impl.f_lzma2_need_prob_reset || self->private_impl.f_lzma2_need_properties || self->private_impl.f_lzma2_need_dict_reset) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header); ++ goto exit; ++ } ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_8 = *iop_a_src++; ++ v_c8 = t_8; ++ } ++ if ((v_c8 != 0u) && ! self->private_impl.f_allow_non_zero_initial_byte) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_code); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); ++ uint32_t t_9; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_9 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_9 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_9); ++ if (num_bits_9 == 24) { ++ t_9 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_9 += 8u; ++ *scratch |= ((uint64_t)(num_bits_9)); ++ } ++ } ++ self->private_impl.f_stashed_bits = t_9; ++ } ++ if (self->private_impl.f_stashed_bits == 4294967295u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_code); ++ goto exit; ++ } ++ self->private_impl.f_stashed_range = 4294967295u; ++ self->private_impl.f_stashed_pos_end = wuffs_base__u64__sat_add(self->private_impl.f_stashed_pos, self->private_impl.f_decoded_length); ++ if ((self->private_impl.f_stashed_pos_end == 18446744073709551615u) && (self->private_impl.f_decoded_length != 18446744073709551615u)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__unsupported_decoded_length); ++ goto exit; ++ } ++ self->private_impl.f_lzma2_encoded_length_have = 5u; ++ while (((uint64_t)(a_workbuf.len)) < (((uint64_t)(self->private_impl.f_dict_size)) + 273u)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_workbuf); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(21); ++ } ++ while (true) { ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_10 = wuffs_lzma__decoder__decode_bitstream(self, a_dst, a_src, a_workbuf); ++ v_status = t_10; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_lzma2_encoded_length_have, wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)))); ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(22); ++ } ++ if (self->private_impl.f_decoded_length == 18446744073709551615u) { ++ if (self->private_impl.f_stashed_bits != 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer); ++ goto exit; ++ } ++ } else if (self->private_impl.f_stashed_pos != self->private_impl.f_stashed_pos_end) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_decoded_length); ++ goto exit; ++ } else if (self->private_impl.f_stashed_bits != 0u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); ++ status = wuffs_lzma__decoder__decode_optional_end_of_stream(self, a_src, a_workbuf); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_stashed_bits != 0u) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer); ++ goto exit; ++ } ++ } ++ if ((self->private_impl.f_format_extension & 255u) < 2u) { ++ break; ++ } else if (self->private_impl.f_lzma2_encoded_length_have != self->private_impl.f_lzma2_encoded_length_want) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header); ++ goto exit; ++ } ++ } ++ ++ ok: ++ self->private_impl.p_do_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_transform_io.v_header_byte = v_header_byte; ++ self->private_data.s_do_transform_io.v_length = v_length; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func lzma.decoder.decode_bitstream ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_bitstream( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_bitstream; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_end_of_chunk = false; ++ while (true) { ++ v_status = wuffs_lzma__decoder__decode_bitstream_fast(self, a_dst, a_src, a_workbuf); ++ if (wuffs_base__status__is_error(&v_status)) { ++ status = v_status; ++ goto exit; ++ } ++ if (self->private_impl.f_end_of_chunk) { ++ break; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_lzma__decoder__decode_bitstream_slow(self, a_dst, a_src, a_workbuf); ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_end_of_chunk) { ++ break; ++ } ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_bitstream = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_bitstream = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func lzma.decoder.update_stashed_bytes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__update_stashed_bytes( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_dist = 0; ++ uint32_t v_which = 0; ++ uint32_t v_adj_dist = 0; ++ uint64_t v_wb_index = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_update_stashed_bytes; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ v_dist = 1u; ++ v_which = 0u; ++ while (v_which < 2u) { ++ if (((uint64_t)(v_dist)) <= ((uint64_t)(iop_a_dst - io0_a_dst))) { ++ wuffs_private_impl__io_writer__limited_copy_u32_from_history( ++ &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist); ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ self->private_impl.f_stashed_bytes[v_which] = iop_a_dst[-1]; ++ iop_a_dst--; ++ } else { ++ v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst))))); ++ v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist)))); ++ while (v_wb_index >= 9223372036854775808u) { ++ v_wb_index += ((uint64_t)(self->private_impl.f_dict_size)); ++ } ++ if (v_wb_index >= ((uint64_t)(a_workbuf.len))) { ++ status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state); ++ goto exit; ++ } ++ self->private_impl.f_stashed_bytes[v_which] = a_workbuf.ptr[v_wb_index]; ++ } ++ v_dist = (1u + self->private_impl.f_stashed_rep0); ++ v_which += 1u; ++ } ++ ++ ok: ++ self->private_impl.p_update_stashed_bytes = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_update_stashed_bytes = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func lzma.decoder.decode_optional_end_of_stream ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzma__decoder__decode_optional_end_of_stream( ++ wuffs_lzma__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_w = &u_w; ++ uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_optional_end_of_stream; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_stashed_pos_end = 18446744073709551615u; ++ while (true) { ++ { ++ wuffs_base__io_buffer* o_0_v_w = v_w; ++ uint8_t* o_0_iop_v_w = iop_v_w; ++ uint8_t* o_0_io0_v_w = io0_v_w; ++ uint8_t* o_0_io1_v_w = io1_v_w; ++ uint8_t* o_0_io2_v_w = io2_v_w; ++ v_w = wuffs_private_impl__io_writer__set( ++ &u_w, ++ &iop_v_w, ++ &io0_v_w, ++ &io1_v_w, ++ &io2_v_w, ++ wuffs_base__utility__empty_slice_u8(), ++ 0u); ++ { ++ wuffs_base__status t_0 = wuffs_lzma__decoder__decode_bitstream_slow(self, v_w, a_src, a_workbuf); ++ v_status = t_0; ++ } ++ v_w = o_0_v_w; ++ iop_v_w = o_0_iop_v_w; ++ io0_v_w = o_0_io0_v_w; ++ io1_v_w = o_0_io1_v_w; ++ io2_v_w = o_0_io2_v_w; ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if (v_status.repr == wuffs_base__suspension__short_write) { ++ status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ self->private_impl.f_stashed_pos_end = self->private_impl.f_stashed_pos; ++ ++ ok: ++ self->private_impl.p_decode_optional_end_of_stream = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_optional_end_of_stream = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func lzma.decoder.initialize_dict ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzma__decoder__initialize_dict( ++ wuffs_lzma__decoder* self) { ++ self->private_impl.f_dict_workbuf_index = 0u; ++ self->private_impl.f_dict_seen = 0u; ++ self->private_impl.f_stashed_bytes[0u] = 0u; ++ self->private_impl.f_stashed_bytes[1u] = 0u; ++ self->private_impl.f_stashed_pos = 0u; ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func lzma.decoder.initialize_probs ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzma__decoder__initialize_probs( ++ wuffs_lzma__decoder* self) { ++ uint32_t v_i = 0; ++ uint32_t v_j = 0; ++ ++ v_i = 0u; ++ while (v_i < 192u) { ++ self->private_data.f_probs_ao00[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 12u) { ++ self->private_data.f_probs_ao20[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 12u) { ++ self->private_data.f_probs_ao40[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 192u) { ++ self->private_data.f_probs_ao41[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 12u) { ++ self->private_data.f_probs_ao60[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 12u) { ++ self->private_data.f_probs_ao63[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_j = 0u; ++ while (v_j < 8u) { ++ self->private_data.f_probs_match_len_low[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_j = 0u; ++ while (v_j < 8u) { ++ self->private_data.f_probs_match_len_mid[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 256u) { ++ self->private_data.f_probs_match_len_high[0u][v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_j = 0u; ++ while (v_j < 8u) { ++ self->private_data.f_probs_longrep_len_low[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_j = 0u; ++ while (v_j < 8u) { ++ self->private_data.f_probs_longrep_len_mid[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 256u) { ++ self->private_data.f_probs_longrep_len_high[0u][v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 4u) { ++ v_j = 0u; ++ while (v_j < 64u) { ++ self->private_data.f_probs_slot[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 128u) { ++ self->private_data.f_probs_small_dist[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ self->private_data.f_probs_large_dist[v_i] = 1024u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 16u) { ++ v_j = 0u; ++ while (v_j < 768u) { ++ self->private_data.f_probs_lit[v_i][v_j] = 1024u; ++ v_j += 1u; ++ } ++ v_i += 1u; ++ } ++ self->private_impl.f_stashed_state = 0u; ++ self->private_impl.f_stashed_rep0 = 0u; ++ self->private_impl.f_stashed_rep1 = 0u; ++ self->private_impl.f_stashed_rep2 = 0u; ++ self->private_impl.f_stashed_rep3 = 0u; ++ return wuffs_base__make_empty_struct(); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_lzip__error__bad_checksum[] = "#lzip: bad checksum"; ++const char wuffs_lzip__error__bad_footer[] = "#lzip: bad footer"; ++const char wuffs_lzip__error__bad_header[] = "#lzip: bad header"; ++const char wuffs_lzip__error__truncated_input[] = "#lzip: truncated input"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzip__decoder__do_transform_io( ++ wuffs_lzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_lzip__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzip__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_lzip__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_lzip__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_lzip__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzip__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_lzip__decoder__initialize( ++ wuffs_lzip__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ { ++ wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( ++ &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_lzma__decoder__initialize( ++ &self->private_data.f_lzma, sizeof(self->private_data.f_lzma), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_lzip__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_lzip__decoder* ++wuffs_lzip__decoder__alloc(void) { ++ wuffs_lzip__decoder* x = ++ (wuffs_lzip__decoder*)(calloc(1, sizeof(wuffs_lzip__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_lzip__decoder__initialize( ++ x, sizeof(wuffs_lzip__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_lzip__decoder(void) { ++ return sizeof(wuffs_lzip__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func lzip.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_lzip__decoder__get_quirk( ++ const wuffs_lzip__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func lzip.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzip__decoder__set_quirk( ++ wuffs_lzip__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func lzip.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzip__decoder__dst_history_retain_length( ++ const wuffs_lzip__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_lzma__decoder__dst_history_retain_length(&self->private_data.f_lzma); ++} ++ ++// -------- func lzip.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_lzip__decoder__workbuf_len( ++ const wuffs_lzip__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_lzma__decoder__workbuf_len(&self->private_data.f_lzma); ++} ++ ++// -------- func lzip.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzip__decoder__transform_io( ++ wuffs_lzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_lzip__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_lzip__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func lzip.decoder.do_transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzip__decoder__do_transform_io( ++ wuffs_lzip__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_c32 = 0; ++ uint64_t v_c64 = 0; ++ uint64_t v_dmark = 0; ++ uint64_t v_smark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_checksum_want = 0; ++ uint32_t v_checksum_have = 0; ++ uint64_t v_size_want = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 5)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u40le__no_bounds_check(iop_a_src))); ++ iop_a_src += 5; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 32) { ++ t_0 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_c64 = t_0; ++ } ++ if (v_c64 != 5641951820u) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ v_status = wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1348001793u, (1u | (((uint64_t)(v_c8)) << 8u))); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ if (v_status.repr == wuffs_base__error__bad_argument) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_header); ++ goto exit; ++ } ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ self->private_impl.f_ssize_have = 0u; ++ self->private_impl.f_dsize_have = 0u; ++ wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1348001792u, 1u); ++ while (true) { ++ v_dmark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf); ++ v_status = t_2; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ self->private_impl.f_ssize_have += wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src))); ++ self->private_impl.f_dsize_have += wuffs_private_impl__io__count_since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst))); ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ } ++ } ++ v_checksum_want = t_3; ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32); ++ if (v_checksum_have != v_checksum_want) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_checksum); ++ goto exit; ++ } ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint64_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_4 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 56) { ++ t_4 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; ++ } ++ } ++ v_size_want = t_4; ++ } ++ if (self->private_impl.f_dsize_have != v_size_want) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_footer); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ uint64_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_5 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5; ++ if (num_bits_5 == 56) { ++ t_5 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)) << 56; ++ } ++ } ++ v_size_want = t_5; ++ } ++ if ((v_size_want < 26u) || (2251799813685248u < v_size_want)) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_footer); ++ goto exit; ++ } else if (self->private_impl.f_ssize_have != (v_size_want - 26u)) { ++ status = wuffs_base__make_status(wuffs_lzip__error__bad_footer); ++ goto exit; ++ } ++ while (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ if (a_src && a_src->meta.closed) { ++ goto label__outer__break; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); ++ } ++ v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ if (v_c32 != 1346984524u) { ++ break; ++ } ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_private_impl__ignore_status(wuffs_lzma__decoder__initialize(&self->private_data.f_lzma, ++ sizeof (wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ label__outer__break:; ++ ++ ok: ++ self->private_impl.p_do_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_lzw__error__bad_code[] = "#lzw: bad code"; ++const char wuffs_lzw__error__truncated_input[] = "#lzw: truncated input"; ++const char wuffs_lzw__error__internal_error_inconsistent_i_o[] = "#lzw: internal error: inconsistent I/O"; ++ ++// ---------------- Private Consts ++ ++#define WUFFS_LZW__QUIRKS_BASE 1348378624u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzw__decoder__read_from( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzw__decoder__write_to( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_dst); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzw__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_lzw__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_lzw__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_lzw__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzw__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_lzw__decoder__initialize( ++ wuffs_lzw__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_lzw__decoder* ++wuffs_lzw__decoder__alloc(void) { ++ wuffs_lzw__decoder* x = ++ (wuffs_lzw__decoder*)(calloc(1, sizeof(wuffs_lzw__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_lzw__decoder__initialize( ++ x, sizeof(wuffs_lzw__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_lzw__decoder(void) { ++ return sizeof(wuffs_lzw__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func lzw.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_lzw__decoder__get_quirk( ++ const wuffs_lzw__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (a_key == 1348378624u) { ++ return ((uint64_t)(self->private_impl.f_pending_literal_width_plus_one)); ++ } ++ return 0u; ++} ++ ++// -------- func lzw.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzw__decoder__set_quirk( ++ wuffs_lzw__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (a_key == 1348378624u) { ++ if (a_value > 9u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_pending_literal_width_plus_one = ((uint32_t)(a_value)); ++ return wuffs_base__make_status(NULL); ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func lzw.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_lzw__decoder__dst_history_retain_length( ++ const wuffs_lzw__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_base__utility__make_optional_u63(true, 0u); ++} ++ ++// -------- func lzw.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_lzw__decoder__workbuf_len( ++ const wuffs_lzw__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} ++ ++// -------- func lzw.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_lzw__decoder__transform_io( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_i = 0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ self->private_impl.f_literal_width = 8u; ++ if (self->private_impl.f_pending_literal_width_plus_one > 0u) { ++ self->private_impl.f_literal_width = (self->private_impl.f_pending_literal_width_plus_one - 1u); ++ } ++ self->private_impl.f_clear_code = (((uint32_t)(1u)) << self->private_impl.f_literal_width); ++ self->private_impl.f_end_code = (self->private_impl.f_clear_code + 1u); ++ self->private_impl.f_save_code = self->private_impl.f_end_code; ++ self->private_impl.f_prev_code = self->private_impl.f_end_code; ++ self->private_impl.f_width = (self->private_impl.f_literal_width + 1u); ++ self->private_impl.f_bits = 0u; ++ self->private_impl.f_n_bits = 0u; ++ self->private_impl.f_output_ri = 0u; ++ self->private_impl.f_output_wi = 0u; ++ v_i = 0u; ++ while (v_i < self->private_impl.f_clear_code) { ++ self->private_data.f_lm1s[v_i] = 0u; ++ self->private_data.f_suffixes[v_i][0u] = ((uint8_t)(v_i)); ++ v_i += 1u; ++ } ++ while (true) { ++ wuffs_lzw__decoder__read_from(self, a_src); ++ if (self->private_impl.f_output_wi > 0u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_lzw__decoder__write_to(self, a_dst); ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ if (self->private_impl.f_read_from_return_value == 0u) { ++ break; ++ } else if (self->private_impl.f_read_from_return_value == 1u) { ++ continue; ++ } else if (self->private_impl.f_read_from_return_value == 2u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } else if (self->private_impl.f_read_from_return_value == 3u) { ++ status = wuffs_base__make_status(wuffs_lzw__error__truncated_input); ++ goto exit; ++ } else if (self->private_impl.f_read_from_return_value == 4u) { ++ status = wuffs_base__make_status(wuffs_lzw__error__bad_code); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ } ++ ++ ok: ++ self->private_impl.p_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func lzw.decoder.read_from ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_lzw__decoder__read_from( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ uint32_t v_clear_code = 0; ++ uint32_t v_end_code = 0; ++ uint32_t v_save_code = 0; ++ uint32_t v_prev_code = 0; ++ uint32_t v_width = 0; ++ uint32_t v_bits = 0; ++ uint32_t v_n_bits = 0; ++ uint32_t v_output_wi = 0; ++ uint32_t v_code = 0; ++ uint32_t v_c = 0; ++ uint32_t v_o = 0; ++ uint32_t v_steps = 0; ++ uint8_t v_first_byte = 0; ++ uint16_t v_lm1_b = 0; ++ uint16_t v_lm1_a = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ v_clear_code = self->private_impl.f_clear_code; ++ v_end_code = self->private_impl.f_end_code; ++ v_save_code = self->private_impl.f_save_code; ++ v_prev_code = self->private_impl.f_prev_code; ++ v_width = self->private_impl.f_width; ++ v_bits = self->private_impl.f_bits; ++ v_n_bits = self->private_impl.f_n_bits; ++ v_output_wi = self->private_impl.f_output_wi; ++ while (true) { ++ if (v_n_bits < v_width) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { ++ v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits)); ++ iop_a_src += ((31u - v_n_bits) >> 3u); ++ v_n_bits |= 24u; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ self->private_impl.f_read_from_return_value = 3u; ++ } else { ++ self->private_impl.f_read_from_return_value = 2u; ++ } ++ break; ++ } else { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ if (v_n_bits >= v_width) { ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ if (a_src && a_src->meta.closed) { ++ self->private_impl.f_read_from_return_value = 3u; ++ } else { ++ self->private_impl.f_read_from_return_value = 2u; ++ } ++ break; ++ } else { ++ v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); ++ iop_a_src += 1u; ++ v_n_bits += 8u; ++ if (v_n_bits < v_width) { ++ self->private_impl.f_read_from_return_value = 5u; ++ break; ++ } ++ } ++ } ++ } ++ v_code = ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_width)); ++ v_bits >>= v_width; ++ v_n_bits -= v_width; ++ if (v_code < v_clear_code) { ++ self->private_data.f_output[v_output_wi] = ((uint8_t)(v_code)); ++ v_output_wi = ((v_output_wi + 1u) & 8191u); ++ if (v_save_code <= 4095u) { ++ v_lm1_a = ((uint16_t)(((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u)); ++ self->private_data.f_lm1s[v_save_code] = v_lm1_a; ++ if (((uint16_t)(v_lm1_a % 8u)) != 0u) { ++ self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code]; ++ memcpy(self->private_data.f_suffixes[v_save_code],self->private_data.f_suffixes[v_prev_code], sizeof(self->private_data.f_suffixes[v_save_code])); ++ self->private_data.f_suffixes[v_save_code][((uint16_t)(v_lm1_a % 8u))] = ((uint8_t)(v_code)); ++ } else { ++ self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); ++ self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_code)); ++ } ++ v_save_code += 1u; ++ if (v_width < 12u) { ++ v_width += (1u & (v_save_code >> v_width)); ++ } ++ v_prev_code = v_code; ++ } ++ } else if (v_code <= v_end_code) { ++ if (v_code == v_end_code) { ++ self->private_impl.f_read_from_return_value = 0u; ++ break; ++ } ++ v_save_code = v_end_code; ++ v_prev_code = v_end_code; ++ v_width = (self->private_impl.f_literal_width + 1u); ++ } else if (v_code <= v_save_code) { ++ v_c = v_code; ++ if (v_code == v_save_code) { ++ v_c = v_prev_code; ++ } ++ v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lm1s[v_c])) & 4294967288u)) & 8191u); ++ v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lm1s[v_c]))) & 8191u); ++ v_steps = (((uint32_t)(self->private_data.f_lm1s[v_c])) >> 3u); ++ while (true) { ++ memcpy((self->private_data.f_output)+(v_o), (self->private_data.f_suffixes[v_c]), 8u); ++ if (v_steps <= 0u) { ++ break; ++ } ++ v_steps -= 1u; ++ v_o = (((uint32_t)(v_o - 8u)) & 8191u); ++ v_c = ((uint32_t)(self->private_impl.f_prefixes[v_c])); ++ } ++ v_first_byte = self->private_data.f_suffixes[v_c][0u]; ++ if (v_code == v_save_code) { ++ self->private_data.f_output[v_output_wi] = v_first_byte; ++ v_output_wi = ((v_output_wi + 1u) & 8191u); ++ } ++ if (v_save_code <= 4095u) { ++ v_lm1_b = ((uint16_t)(((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u)); ++ self->private_data.f_lm1s[v_save_code] = v_lm1_b; ++ if (((uint16_t)(v_lm1_b % 8u)) != 0u) { ++ self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code]; ++ memcpy(self->private_data.f_suffixes[v_save_code],self->private_data.f_suffixes[v_prev_code], sizeof(self->private_data.f_suffixes[v_save_code])); ++ self->private_data.f_suffixes[v_save_code][((uint16_t)(v_lm1_b % 8u))] = v_first_byte; ++ } else { ++ self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); ++ self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte)); ++ } ++ v_save_code += 1u; ++ if (v_width < 12u) { ++ v_width += (1u & (v_save_code >> v_width)); ++ } ++ v_prev_code = v_code; ++ } ++ } else { ++ self->private_impl.f_read_from_return_value = 4u; ++ break; ++ } ++ if (v_output_wi > 4095u) { ++ self->private_impl.f_read_from_return_value = 1u; ++ break; ++ } ++ } ++ if (self->private_impl.f_read_from_return_value != 2u) { ++ while (v_n_bits >= 8u) { ++ v_n_bits -= 8u; ++ if (iop_a_src > io1_a_src) { ++ iop_a_src--; ++ } else { ++ self->private_impl.f_read_from_return_value = 5u; ++ break; ++ } ++ } ++ } ++ self->private_impl.f_save_code = v_save_code; ++ self->private_impl.f_prev_code = v_prev_code; ++ self->private_impl.f_width = v_width; ++ self->private_impl.f_bits = v_bits; ++ self->private_impl.f_n_bits = v_n_bits; ++ self->private_impl.f_output_wi = v_output_wi; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func lzw.decoder.write_to ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_lzw__decoder__write_to( ++ wuffs_lzw__decoder* self, ++ wuffs_base__io_buffer* a_dst) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__slice_u8 v_s = {0}; ++ uint64_t v_n = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_write_to; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (self->private_impl.f_output_wi > 0u) { ++ if (self->private_impl.f_output_ri > self->private_impl.f_output_wi) { ++ status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ v_s = wuffs_base__make_slice_u8_ij(self->private_data.f_output, ++ self->private_impl.f_output_ri, ++ self->private_impl.f_output_wi); ++ v_n = wuffs_private_impl__io_writer__copy_from_slice(&iop_a_dst, io2_a_dst,v_s); ++ if (v_n == ((uint64_t)(v_s.len))) { ++ self->private_impl.f_output_ri = 0u; ++ self->private_impl.f_output_wi = 0u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ } ++ self->private_impl.f_output_ri = (((uint32_t)(self->private_impl.f_output_ri + ((uint32_t)(v_n)))) & 8191u); ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_write_to = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_write_to = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func lzw.decoder.flush ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8 ++wuffs_lzw__decoder__flush( ++ wuffs_lzw__decoder* self) { ++ if (!self) { ++ return wuffs_base__empty_slice_u8(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__empty_slice_u8(); ++ } ++ ++ uint32_t v_ri = 0; ++ uint32_t v_wi = 0; ++ ++ v_ri = self->private_impl.f_output_ri; ++ v_wi = self->private_impl.f_output_wi; ++ self->private_impl.f_output_ri = 0u; ++ self->private_impl.f_output_wi = 0u; ++ if (v_ri <= v_wi) { ++ return wuffs_base__make_slice_u8_ij(self->private_data.f_output, v_ri, v_wi); ++ } ++ return wuffs_base__make_slice_u8(self->private_data.f_output, 0); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_netpbm__error__bad_header[] = "#netpbm: bad header"; ++const char wuffs_netpbm__error__truncated_input[] = "#netpbm: truncated input"; ++const char wuffs_netpbm__error__unsupported_netpbm_file[] = "#netpbm: unsupported Netpbm file"; ++const char wuffs_netpbm__note__internal_note_short_read[] = "@netpbm: internal note: short read"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_image_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_frame_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_frame( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__swizzle( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_netpbm__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_netpbm__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_netpbm__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_netpbm__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_netpbm__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_netpbm__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_netpbm__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_netpbm__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_netpbm__decoder__initialize( ++ wuffs_netpbm__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_netpbm__decoder* ++wuffs_netpbm__decoder__alloc(void) { ++ wuffs_netpbm__decoder* x = ++ (wuffs_netpbm__decoder*)(calloc(1, sizeof(wuffs_netpbm__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_netpbm__decoder__initialize( ++ x, sizeof(wuffs_netpbm__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_netpbm__decoder(void) { ++ return sizeof(wuffs_netpbm__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func netpbm.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_netpbm__decoder__get_quirk( ++ const wuffs_netpbm__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func netpbm.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__set_quirk( ++ wuffs_netpbm__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func netpbm.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__decode_image_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func netpbm.decoder.do_decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_image_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_n = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 80u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if ((v_c8 < 49u) || (55u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } else if (v_c8 == 53u) { ++ self->private_impl.f_pixfmt = 536870920u; ++ } else if (v_c8 == 54u) { ++ self->private_impl.f_pixfmt = 2684356744u; ++ } else { ++ status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (v_c8 != 10u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u)) { ++ continue; ++ } else if (v_c8 == 35u) { ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if (v_c8 == 10u) { ++ break; ++ } ++ } ++ continue; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_width = ((uint32_t)(((uint8_t)(v_c8 - 48u)))); ++ break; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u)) { ++ break; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ v_n = ((10u * self->private_impl.f_width) + ((uint32_t)(((uint8_t)(v_c8 - 48u))))); ++ if (v_n > 16777215u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ goto exit; ++ } ++ self->private_impl.f_width = v_n; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u)) { ++ continue; ++ } else if (v_c8 == 35u) { ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_7 = *iop_a_src++; ++ v_c8 = t_7; ++ } ++ if (v_c8 == 10u) { ++ break; ++ } ++ } ++ continue; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_height = ((uint32_t)(((uint8_t)(v_c8 - 48u)))); ++ break; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_8 = *iop_a_src++; ++ v_c8 = t_8; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u) || (v_c8 == 13u)) { ++ continue; ++ } else if (v_c8 == 10u) { ++ break; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ v_n = ((10u * self->private_impl.f_height) + ((uint32_t)(((uint8_t)(v_c8 - 48u))))); ++ if (v_n > 16777215u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ goto exit; ++ } ++ self->private_impl.f_height = v_n; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_9 = *iop_a_src++; ++ v_c8 = t_9; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u)) { ++ continue; ++ } else if (v_c8 == 35u) { ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_10 = *iop_a_src++; ++ v_c8 = t_10; ++ } ++ if (v_c8 == 10u) { ++ break; ++ } ++ } ++ continue; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_max_value = ((uint32_t)(((uint8_t)(v_c8 - 48u)))); ++ break; ++ } ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_11 = *iop_a_src++; ++ v_c8 = t_11; ++ } ++ if ((v_c8 == 32u) || (v_c8 == 9u) || (v_c8 == 13u)) { ++ continue; ++ } else if (v_c8 == 10u) { ++ break; ++ } else if ((v_c8 < 48u) || (57u < v_c8)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ goto exit; ++ } ++ v_n = ((10u * self->private_impl.f_max_value) + ((uint32_t)(((uint8_t)(v_c8 - 48u))))); ++ if (v_n > 16777215u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ goto exit; ++ } ++ self->private_impl.f_max_value = v_n; ++ } ++ if (self->private_impl.f_max_value != 255u) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ goto exit; ++ } ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ false); ++ } ++ self->private_impl.f_call_sequence = 32u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func netpbm.decoder.decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__decode_frame_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func netpbm.decoder.do_decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_frame_config( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_netpbm__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ self->private_impl.f_frame_config_io_position, ++ 0u, ++ false, ++ false, ++ 0u); ++ } ++ self->private_impl.f_call_sequence = 64u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func netpbm.decoder.decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__decode_frame( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func netpbm.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__do_decode_frame( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_netpbm__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y = 0u; ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ while (true) { ++ v_status = wuffs_netpbm__decoder__swizzle(self, a_dst, a_src); ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if (v_status.repr != wuffs_netpbm__note__internal_note_short_read) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func netpbm.decoder.swizzle ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_netpbm__decoder__swizzle( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ uint32_t v_src_bytes_per_pixel = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_j = 0; ++ uint64_t v_n = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ while (true) { ++ if (self->private_impl.f_dst_x == self->private_impl.f_width) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += 1u; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ break; ++ } ++ } ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i >= ((uint64_t)(v_dst.len))) { ++ v_src_bytes_per_pixel = 1u; ++ if (self->private_impl.f_pixfmt == 2684356744u) { ++ v_src_bytes_per_pixel = 3u; ++ } ++ v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); ++ v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); ++ v_j = v_n; ++ while (v_j >= 8u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 8u); ++ } ++ v_j -= 8u; ++ } ++ while (v_j > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 1u); ++ } ++ v_j -= 1u; ++ } ++ } else { ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( ++ &self->private_impl.f_swizzler, ++ wuffs_base__slice_u8__subslice_i(v_dst, v_i), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ &iop_a_src, ++ io2_a_src); ++ } ++ if (v_n == 0u) { ++ status = wuffs_base__make_status(wuffs_netpbm__note__internal_note_short_read); ++ goto ok; ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ ++ ok: ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func netpbm.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_netpbm__decoder__frame_dirty_rect( ++ const wuffs_netpbm__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); ++} ++ ++// -------- func netpbm.decoder.num_animation_loops ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_netpbm__decoder__num_animation_loops( ++ const wuffs_netpbm__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func netpbm.decoder.num_decoded_frame_configs ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_netpbm__decoder__num_decoded_frame_configs( ++ const wuffs_netpbm__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func netpbm.decoder.num_decoded_frames ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_netpbm__decoder__num_decoded_frames( ++ const wuffs_netpbm__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func netpbm.decoder.restart_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__restart_frame( ++ wuffs_netpbm__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func netpbm.decoder.set_report_metadata ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_netpbm__decoder__set_report_metadata( ++ wuffs_netpbm__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func netpbm.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_netpbm__decoder__tell_me_more( ++ wuffs_netpbm__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func netpbm.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_netpbm__decoder__workbuf_len( ++ const wuffs_netpbm__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_nie__error__bad_header[] = "#nie: bad header"; ++const char wuffs_nie__error__truncated_input[] = "#nie: truncated input"; ++const char wuffs_nie__error__unsupported_nie_file[] = "#nie: unsupported NIE file"; ++const char wuffs_nie__note__internal_note_short_read[] = "@nie: internal note: short read"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_image_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_frame_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_frame( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__swizzle( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_nie__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_nie__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_nie__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_nie__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_nie__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_nie__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_nie__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_nie__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_nie__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_nie__decoder__initialize( ++ wuffs_nie__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_nie__decoder* ++wuffs_nie__decoder__alloc(void) { ++ wuffs_nie__decoder* x = ++ (wuffs_nie__decoder*)(calloc(1, sizeof(wuffs_nie__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_nie__decoder__initialize( ++ x, sizeof(wuffs_nie__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_nie__decoder(void) { ++ return sizeof(wuffs_nie__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func nie.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_nie__decoder__get_quirk( ++ const wuffs_nie__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func nie.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__set_quirk( ++ wuffs_nie__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func nie.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_image_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_nie__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func nie.decoder.do_decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_image_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_a = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_a = t_0; ++ } ++ if (v_a != 1169146734u) { ++ status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_a = t_1; ++ } ++ if (v_a == 879649535u) { ++ self->private_impl.f_pixfmt = 2164295816u; ++ } else if (v_a == 946758399u) { ++ self->private_impl.f_pixfmt = 2164308923u; ++ } else if (v_a == 879780607u) { ++ status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file); ++ goto exit; ++ } else if (v_a == 946889471u) { ++ status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ v_a = t_2; ++ } ++ if (v_a > 2147483647u) { ++ status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ goto exit; ++ } else if (v_a > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_width = v_a; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ } ++ } ++ v_a = t_3; ++ } ++ if (v_a > 2147483647u) { ++ status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ goto exit; ++ } else if (v_a > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_height = v_a; ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ 16u, ++ false); ++ } ++ self->private_impl.f_call_sequence = 32u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func nie.decoder.decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_frame_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_nie__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func nie.decoder.do_decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_frame_config( ++ wuffs_nie__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_nie__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (16u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ 16u, ++ 0u, ++ false, ++ false, ++ 0u); ++ } ++ self->private_impl.f_call_sequence = 64u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func nie.decoder.decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__decode_frame( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_nie__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func nie.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__do_decode_frame( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_nie__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y = 0u; ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ while (true) { ++ v_status = wuffs_nie__decoder__swizzle(self, a_dst, a_src); ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if (v_status.repr != wuffs_nie__note__internal_note_short_read) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func nie.decoder.swizzle ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_nie__decoder__swizzle( ++ wuffs_nie__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ uint32_t v_src_bytes_per_pixel = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_i = 0; ++ uint64_t v_j = 0; ++ uint64_t v_n = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ while (true) { ++ if (self->private_impl.f_dst_x == self->private_impl.f_width) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += 1u; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ break; ++ } ++ } ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ if (v_i >= ((uint64_t)(v_dst.len))) { ++ v_src_bytes_per_pixel = 4u; ++ if (self->private_impl.f_pixfmt == 2164308923u) { ++ v_src_bytes_per_pixel = 8u; ++ } ++ v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); ++ v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); ++ v_j = v_n; ++ while (v_j >= 8u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 8u); ++ } ++ v_j -= 8u; ++ } ++ while (v_j > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { ++ iop_a_src += (v_src_bytes_per_pixel * 1u); ++ } ++ v_j -= 1u; ++ } ++ } else { ++ v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( ++ &self->private_impl.f_swizzler, ++ wuffs_base__slice_u8__subslice_i(v_dst, v_i), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ &iop_a_src, ++ io2_a_src); ++ } ++ if (v_n == 0u) { ++ status = wuffs_base__make_status(wuffs_nie__note__internal_note_short_read); ++ goto ok; ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ } ++ status = wuffs_base__make_status(NULL); ++ goto ok; ++ ++ ok: ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func nie.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_nie__decoder__frame_dirty_rect( ++ const wuffs_nie__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); ++} ++ ++// -------- func nie.decoder.num_animation_loops ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_nie__decoder__num_animation_loops( ++ const wuffs_nie__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func nie.decoder.num_decoded_frame_configs ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_nie__decoder__num_decoded_frame_configs( ++ const wuffs_nie__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func nie.decoder.num_decoded_frames ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_nie__decoder__num_decoded_frames( ++ const wuffs_nie__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func nie.decoder.restart_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__restart_frame( ++ wuffs_nie__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if ((a_index != 0u) || (a_io_position != 16u)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func nie.decoder.set_report_metadata ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_nie__decoder__set_report_metadata( ++ wuffs_nie__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func nie.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_nie__decoder__tell_me_more( ++ wuffs_nie__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func nie.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_nie__decoder__workbuf_len( ++ const wuffs_nie__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_zlib__note__dictionary_required[] = "@zlib: dictionary required"; ++const char wuffs_zlib__error__bad_checksum[] = "#zlib: bad checksum"; ++const char wuffs_zlib__error__bad_compression_method[] = "#zlib: bad compression method"; ++const char wuffs_zlib__error__bad_compression_window_size[] = "#zlib: bad compression window size"; ++const char wuffs_zlib__error__bad_parity_check[] = "#zlib: bad parity check"; ++const char wuffs_zlib__error__incorrect_dictionary[] = "#zlib: incorrect dictionary"; ++const char wuffs_zlib__error__truncated_input[] = "#zlib: truncated input"; ++ ++// ---------------- Private Consts ++ ++#define WUFFS_ZLIB__QUIRKS_BASE 2113790976u ++ ++#define WUFFS_ZLIB__QUIRKS_COUNT 1u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_zlib__decoder__do_transform_io( ++ wuffs_zlib__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++// ---------------- VTables ++ ++const wuffs_base__io_transformer__func_ptrs ++wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_zlib__decoder__dst_history_retain_length), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_zlib__decoder__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_zlib__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_zlib__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_zlib__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_zlib__decoder__initialize( ++ wuffs_zlib__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ { ++ wuffs_base__status z = wuffs_adler32__hasher__initialize( ++ &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_adler32__hasher__initialize( ++ &self->private_data.f_dict_id_hasher, sizeof(self->private_data.f_dict_id_hasher), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_deflate__decoder__initialize( ++ &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_zlib__decoder* ++wuffs_zlib__decoder__alloc(void) { ++ wuffs_zlib__decoder* x = ++ (wuffs_zlib__decoder*)(calloc(1, sizeof(wuffs_zlib__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_zlib__decoder__initialize( ++ x, sizeof(wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_zlib__decoder(void) { ++ return sizeof(wuffs_zlib__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func zlib.decoder.dictionary_id ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_zlib__decoder__dictionary_id( ++ const wuffs_zlib__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return self->private_impl.f_dict_id_want; ++} ++ ++// -------- func zlib.decoder.add_dictionary ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_zlib__decoder__add_dictionary( ++ wuffs_zlib__decoder* self, ++ wuffs_base__slice_u8 a_dict) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } ++ ++ if (self->private_impl.f_header_complete) { ++ self->private_impl.f_bad_call_sequence = true; ++ } else { ++ self->private_impl.f_dict_id_have = wuffs_adler32__hasher__update_u32(&self->private_data.f_dict_id_hasher, a_dict); ++ wuffs_deflate__decoder__add_history(&self->private_data.f_flate, a_dict); ++ } ++ self->private_impl.f_got_dictionary = true; ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func zlib.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_zlib__decoder__get_quirk( ++ const wuffs_zlib__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ uint32_t v_key = 0; ++ ++ if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } else if (a_key >= 2113790976u) { ++ v_key = (a_key - 2113790976u); ++ if (v_key < 1u) { ++ if (self->private_impl.f_quirks[v_key]) { ++ return 1u; ++ } ++ } ++ } ++ return 0u; ++} ++ ++// -------- func zlib.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_zlib__decoder__set_quirk( ++ wuffs_zlib__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (self->private_impl.f_header_complete) { ++ self->private_impl.f_bad_call_sequence = true; ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } else if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } else if (a_key >= 2113790976u) { ++ a_key -= 2113790976u; ++ if (a_key < 1u) { ++ self->private_impl.f_quirks[a_key] = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } ++ } ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func zlib.decoder.dst_history_retain_length ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_zlib__decoder__dst_history_retain_length( ++ const wuffs_zlib__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_base__utility__make_optional_u63(true, 0u); ++} ++ ++// -------- func zlib.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_zlib__decoder__workbuf_len( ++ const wuffs_zlib__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++} ++ ++// -------- func zlib.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_zlib__decoder__transform_io( ++ wuffs_zlib__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_zlib__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_zlib__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func zlib.decoder.do_transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_zlib__decoder__do_transform_io( ++ wuffs_zlib__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint16_t v_x = 0; ++ uint32_t v_checksum_have = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_checksum_want = 0; ++ uint64_t v_mark = 0; ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; ++ if (coro_susp_point) { ++ v_checksum_have = self->private_data.s_do_transform_io.v_checksum_have; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_bad_call_sequence) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if (self->private_impl.f_quirks[0u]) { ++ } else if ( ! self->private_impl.f_want_dictionary) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint16_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_number_length = wuffs_json__decoder__decode_number(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- v_number_status = (v_number_length >> 8u); +- v_vminor = 10486787u; +- if ((v_number_length & 128u) != 0u) { +- v_vminor = 10486785u; ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_number_length = (v_number_length & 127u); +- if (v_number_status == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_number_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 8) { ++ t_0 = ((uint16_t)(*scratch >> 48)); + break; + } +- while (v_number_length > 0u) { +- v_number_length -= 1u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); +- goto exit; ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ v_x = t_0; ++ } ++ if (((uint16_t)(((uint16_t)(v_x >> 8u)) & 15u)) != 8u) { ++ status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_method); ++ goto exit; ++ } ++ if (((uint16_t)(v_x >> 12u)) > 7u) { ++ status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_window_size); ++ goto exit; ++ } ++ if (((uint16_t)(v_x % 31u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_zlib__error__bad_parity_check); ++ goto exit; ++ } ++ self->private_impl.f_want_dictionary = (((uint16_t)(v_x & 32u)) != 0u); ++ if (self->private_impl.f_want_dictionary) { ++ self->private_impl.f_dict_id_have = 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- } +- if (v_number_status == 1u) { +- if (self->private_impl.f_quirks[14u]) { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch >> 32)); + break; + } +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } else if (v_number_status == 2u) { +- status = wuffs_base__make_status(wuffs_json__error__unsupported_number_length); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(17); +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(18); +- } +- } +- } +- break; +- } else if (v_class == 5u) { +- v_vminor = 2113553u; +- if (v_depth == 0u) { +- } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) { +- v_vminor = 2113601u; +- } else { +- v_vminor = 2113569u; +- } +- if (v_depth >= 1024u) { +- status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth); +- goto exit; +- } +- v_stack_byte = (v_depth / 32u); +- v_stack_bit = (v_depth & 31u); +- self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(1u)) << v_stack_bit); +- v_depth += 1u; +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 4162u; +- v_expect_after_value = 4164u; +- goto label__outer__continue; +- } else if (v_class == 6u) { +- iop_a_src += 1u; +- if (v_depth <= 1u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2101314u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__outer__break; +- } +- v_depth -= 1u; +- v_stack_byte = ((v_depth - 1u) / 32u); +- v_stack_bit = ((v_depth - 1u) & 31u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2105410u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 4356u; +- v_expect_after_value = 4356u; +- } else { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2113602u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 4164u; +- v_expect_after_value = 4164u; +- } +- goto label__outer__continue; +- } else if (v_class == 7u) { +- v_vminor = 2105361u; +- if (v_depth == 0u) { +- } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) { +- v_vminor = 2105409u; +- } else { +- v_vminor = 2105377u; +- } +- if (v_depth >= 1024u) { +- status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth); +- goto exit; +- } +- v_stack_byte = (v_depth / 32u); +- v_stack_bit = (v_depth & 31u); +- self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(1u)) << v_stack_bit)); +- v_depth += 1u; +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 8114u; +- v_expect_after_value = 4356u; +- goto label__outer__continue; +- } else if (v_class == 8u) { +- iop_a_src += 1u; +- if (v_depth <= 1u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2101282u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- goto label__outer__break; +- } +- v_depth -= 1u; +- v_stack_byte = ((v_depth - 1u) / 32u); +- v_stack_bit = ((v_depth - 1u) & 31u); +- if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2105378u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 4356u; +- v_expect_after_value = 4356u; +- } else { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2113570u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- v_expect = 4164u; +- v_expect_after_value = 4164u; +- } +- goto label__outer__continue; +- } else if (v_class == 9u) { +- v_match = wuffs_base__io_reader__match7(iop_a_src, io2_a_src, a_src, 111546413966853u); +- if (v_match == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(8388612u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(5u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) { +- status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- iop_a_src += 5u; +- break; +- } else if (v_match == 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(19); +- goto label__outer__continue; +- } +- } else if (v_class == 10u) { +- v_match = wuffs_base__io_reader__match7(iop_a_src, io2_a_src, a_src, 435762131972u); +- if (v_match == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(8388616u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- iop_a_src += 4u; +- break; +- } else if (v_match == 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(20); +- goto label__outer__continue; +- } +- } else if (v_class == 11u) { +- v_match = wuffs_base__io_reader__match7(iop_a_src, io2_a_src, a_src, 465676103172u); +- if (v_match == 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(8388610u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- iop_a_src += 4u; +- break; +- } else if (v_match == 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(21); +- goto label__outer__continue; +- } +- if (self->private_impl.f_quirks[14u]) { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); +- status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- break; +- } +- } else if (v_class == 12u) { +- if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u]) { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); +- status = wuffs_json__decoder__decode_comment(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_comment_type > 0u) { +- goto label__outer__continue; ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); + } + } ++ self->private_impl.f_dict_id_want = t_1; + } +- status = wuffs_base__make_status(wuffs_json__error__bad_input); ++ status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required); ++ goto ok; ++ } else if (self->private_impl.f_got_dictionary) { ++ status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary); + goto exit; + } +- if (v_depth == 0u) { +- break; ++ } else if (self->private_impl.f_dict_id_have != self->private_impl.f_dict_id_want) { ++ if (self->private_impl.f_got_dictionary) { ++ status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary); ++ goto exit; + } +- v_expect = v_expect_after_value; ++ status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required); ++ goto ok; + } +- label__outer__break:; +- if (self->private_impl.f_quirks[17u] || self->private_impl.f_quirks[18u]) { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ self->private_impl.f_header_complete = true; ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf); ++ v_status = t_2; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } + } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if ( ! self->private_impl.f_ignore_checksum && ! self->private_impl.f_quirks[0u]) { ++ v_checksum_have = wuffs_adler32__hasher__update_u32(&self->private_data.f_checksum, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); +- status = wuffs_json__decoder__decode_trailer(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; + } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ } ++ if ( ! self->private_impl.f_quirks[0u]) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)); ++ } ++ } ++ v_checksum_want = t_3; + } +- if (status.repr) { +- goto suspend; ++ if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != v_checksum_want)) { ++ status = wuffs_base__make_status(wuffs_zlib__error__bad_checksum); ++ goto exit; + } + } +- self->private_impl.f_end_of_data = true; + +- ok: +- self->private_impl.p_decode_tokens[0] = 0; +- goto exit; +- } ++ ok: ++ self->private_impl.p_do_transform_io = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_transform_io.v_checksum_have = v_checksum_have; ++ ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_png__error__bad_animation_sequence_number[] = "#png: bad animation sequence number"; ++const char wuffs_png__error__bad_checksum[] = "#png: bad checksum"; ++const char wuffs_png__error__bad_chunk[] = "#png: bad chunk"; ++const char wuffs_png__error__bad_filter[] = "#png: bad filter"; ++const char wuffs_png__error__bad_header[] = "#png: bad header"; ++const char wuffs_png__error__bad_text_chunk_not_latin_1[] = "#png: bad text chunk (not Latin-1)"; ++const char wuffs_png__error__missing_palette[] = "#png: missing palette"; ++const char wuffs_png__error__truncated_input[] = "#png: truncated input"; ++const char wuffs_png__error__unsupported_cgbi_extension[] = "#png: unsupported CgBI extension"; ++const char wuffs_png__error__unsupported_png_compression_method[] = "#png: unsupported PNG compression method"; ++const char wuffs_png__error__unsupported_png_file[] = "#png: unsupported PNG file"; ++const char wuffs_png__error__internal_error_inconsistent_i_o[] = "#png: internal error: inconsistent I/O"; ++const char wuffs_png__error__internal_error_inconsistent_chunk_type[] = "#png: internal error: inconsistent chunk type"; ++const char wuffs_png__error__internal_error_inconsistent_workbuf_length[] = "#png: internal error: inconsistent workbuf length"; ++const char wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input[] = "#png: internal error: zlib decoder did not exhaust its input"; ++ ++// ---------------- Private Consts ++ ++#define WUFFS_PNG__ANCILLARY_BIT 32u ++ ++static const uint8_t ++WUFFS_PNG__INTERLACING[8][6] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ { ++ 0u, 0u, 0u, 0u, 0u, 0u, ++ }, { ++ 3u, 7u, 0u, 3u, 7u, 0u, ++ }, { ++ 3u, 3u, 4u, 3u, 7u, 0u, ++ }, { ++ 2u, 3u, 0u, 3u, 3u, 4u, ++ }, { ++ 2u, 1u, 2u, 2u, 3u, 0u, ++ }, { ++ 1u, 1u, 0u, 2u, 1u, 2u, ++ }, { ++ 1u, 0u, 1u, 1u, 1u, 0u, ++ }, { ++ 0u, 0u, 0u, 1u, 0u, 1u, ++ }, ++}; ++ ++static const uint8_t ++WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 255u, 85u, 0u, 17u, 0u, 0u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 8u, 4u, 0u, 2u, 0u, 0u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_PNG__NUM_CHANNELS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1u, 0u, 3u, 1u, 2u, 0u, 4u, 0u, ++}; ++ ++static const uint16_t ++WUFFS_PNG__LATIN_1[256] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, ++ 40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u, ++ 48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u, ++ 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, ++ 64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u, ++ 72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u, ++ 80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u, ++ 88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u, ++ 96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u, ++ 104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u, ++ 112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u, ++ 120u, 121u, 122u, 123u, 124u, 125u, 126u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 41410u, 41666u, 41922u, 42178u, 42434u, 42690u, 42946u, ++ 43202u, 43458u, 43714u, 43970u, 44226u, 44482u, 44738u, 44994u, ++ 45250u, 45506u, 45762u, 46018u, 46274u, 46530u, 46786u, 47042u, ++ 47298u, 47554u, 47810u, 48066u, 48322u, 48578u, 48834u, 49090u, ++ 32963u, 33219u, 33475u, 33731u, 33987u, 34243u, 34499u, 34755u, ++ 35011u, 35267u, 35523u, 35779u, 36035u, 36291u, 36547u, 36803u, ++ 37059u, 37315u, 37571u, 37827u, 38083u, 38339u, 38595u, 38851u, ++ 39107u, 39363u, 39619u, 39875u, 40131u, 40387u, 40643u, 40899u, ++ 41155u, 41411u, 41667u, 41923u, 42179u, 42435u, 42691u, 42947u, ++ 43203u, 43459u, 43715u, 43971u, 44227u, 44483u, 44739u, 44995u, ++ 45251u, 45507u, 45763u, 46019u, 46275u, 46531u, 46787u, 47043u, ++ 47299u, 47555u, 47811u, 48067u, 48323u, 48579u, 48835u, 49091u, ++}; ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_2( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +- goto suspend; +- suspend: +- self->private_impl.p_decode_tokens[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; +- self->private_data.s_decode_tokens[0].v_depth = v_depth; +- self->private_data.s_decode_tokens[0].v_expect = v_expect; +- self->private_data.s_decode_tokens[0].v_expect_after_value = v_expect_after_value; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +-// -------- func json.decoder.decode_number ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + + WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_json__decoder__decode_number( +- wuffs_json__decoder* self, +- wuffs_base__io_buffer* a_src) { +- uint8_t v_c = 0; +- uint32_t v_n = 0; +- uint32_t v_floating_point = 0; ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +- do { +- v_n = 0u; +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- break; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (v_c != 45u) { +- } else { +- v_n += 1u; +- iop_a_src += 1u; +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- v_n |= 256u; +- break; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- } +- if (v_c == 48u) { +- v_n += 1u; +- iop_a_src += 1u; +- } else { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (v_n > 99u) { +- break; +- } +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- break; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (v_c != 46u) { +- } else { +- if (v_n >= 99u) { +- v_n |= 512u; +- break; +- } +- v_n += 1u; +- iop_a_src += 1u; +- v_floating_point = 128u; +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (v_n > 99u) { +- break; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- break; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- } +- if ((v_c != 69u) && (v_c != 101u)) { +- break; +- } +- if (v_n >= 99u) { +- v_n |= 512u; +- break; +- } +- v_n += 1u; +- iop_a_src += 1u; +- v_floating_point = 128u; +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- v_n |= 256u; +- break; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if ((v_c != 43u) && (v_c != 45u)) { +- } else { +- if (v_n >= 99u) { +- v_n |= 512u; +- break; +- } +- v_n += 1u; +- iop_a_src += 1u; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } while (0); +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- return (v_n | v_floating_point); +-} ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + +-// -------- func json.decoder.decode_digits ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) + WUFFS_BASE__GENERATED_C_CODE +-static uint32_t +-wuffs_json__decoder__decode_digits( +- wuffs_json__decoder* self, ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev); ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_decode_image_config( ++ wuffs_png__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_ihdr( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__assign_filter_distance( ++ wuffs_png__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint64_t ++wuffs_png__decoder__calculate_bytes_per_row( ++ const wuffs_png__decoder* self, ++ uint32_t a_width); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__choose_filter_implementations( ++ wuffs_png__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_other_chunk( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src, +- uint32_t a_n) { +- uint8_t v_c = 0; +- uint32_t v_n = 0; ++ bool a_framy); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_actl( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_chrm( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_exif( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_fctl( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_gama( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_iccp( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_plte( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_srgb( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_trns( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_decode_frame_config( ++ wuffs_png__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__skip_frame( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_decode_frame( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__decode_pass( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_tell_me_more( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle_tricky( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_png__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_png__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_png__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_png__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_png__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_png__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_png__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_png__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_png__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_png__decoder__initialize( ++ wuffs_png__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + +- v_n = a_n; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if ( ! (a_src && a_src->meta.closed)) { +- v_n |= 768u; +- } +- break; ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (0u == WUFFS_JSON__LUT_DECIMAL_DIGITS[v_c]) { +- break; ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } +- if (v_n >= 99u) { +- v_n |= 512u; +- break; ++ } ++ ++ self->private_impl.choosy_filter_1 = &wuffs_png__decoder__filter_1__choosy_default; ++ self->private_impl.choosy_filter_3 = &wuffs_png__decoder__filter_3__choosy_default; ++ self->private_impl.choosy_filter_4 = &wuffs_png__decoder__filter_4__choosy_default; ++ self->private_impl.choosy_filter_and_swizzle = &wuffs_png__decoder__filter_and_swizzle__choosy_default; ++ ++ { ++ wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( ++ &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; + } +- v_n += 1u; +- iop_a_src += 1u; + } +- if (v_n == a_n) { +- v_n |= 256u; ++ { ++ wuffs_base__status z = wuffs_zlib__decoder__initialize( ++ &self->private_data.f_zlib, sizeof(self->private_data.f_zlib), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } + } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_png__decoder* ++wuffs_png__decoder__alloc(void) { ++ wuffs_png__decoder* x = ++ (wuffs_png__decoder*)(calloc(1, sizeof(wuffs_png__decoder))); ++ if (!x) { ++ return NULL; + } +- return v_n; ++ if (wuffs_png__decoder__initialize( ++ x, sizeof(wuffs_png__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_png__decoder(void) { ++ return sizeof(wuffs_png__decoder); + } + +-// -------- func json.decoder.decode_leading ++// ---------------- Function Implementations + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_leading( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++// ‼ WUFFS MULTI-FILE SECTION +arm_neon ++// -------- func png.decoder.filter_1_distance_4_arm_neon + +- uint8_t v_c = 0; +- uint32_t v_u = 0; ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ uint8x8_t v_fa = {0}; ++ uint8x8_t v_fx = {0}; + +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, v_fa); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, v_fa); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; + } ++ v_curr.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, v_fa); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ } ++ v_curr.len = 0; + } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +- uint32_t coro_susp_point = self->private_impl.p_decode_leading[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// ‼ WUFFS MULTI-FILE SECTION +arm_neon ++// -------- func png.decoder.filter_3_distance_4_arm_neon + +- self->private_impl.f_allow_leading_ars = self->private_impl.f_quirks[15u]; +- self->private_impl.f_allow_leading_ubom = self->private_impl.f_quirks[16u]; +- while (self->private_impl.f_allow_leading_ars || self->private_impl.f_allow_leading_ubom) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint8x8_t v_fa = {0}; ++ uint8x8_t v_fb = {0}; ++ uint8x8_t v_fx = {0}; ++ ++ if (((uint64_t)(a_prev.len)) == 0u) { ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; + } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- break; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- continue; ++ v_curr.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; + } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if ((v_c == 30u) && self->private_impl.f_allow_leading_ars) { +- self->private_impl.f_allow_leading_ars = false; +- iop_a_src += 1u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- continue; +- } else if ((v_c == 239u) && self->private_impl.f_allow_leading_ubom) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { +- if (a_src && a_src->meta.closed) { +- break; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- continue; +- } +- v_u = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); +- if (v_u == 12565487u) { +- self->private_impl.f_allow_leading_ubom = false; +- iop_a_src += 3u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- continue; +- } ++ v_curr.len = 0; ++ } ++ } else { ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; + } +- break; ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- +- ok: +- self->private_impl.p_decode_leading[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_leading[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- +- return status; ++ return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +-// -------- func json.decoder.decode_comment ++// ‼ WUFFS MULTI-FILE SECTION +arm_neon ++// -------- func png.decoder.filter_4_distance_3_arm_neon + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_comment( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- uint16_t v_c2 = 0; +- uint32_t v_length = 0; ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint8x8_t v_fa = {0}; ++ uint8x8_t v_fb = {0}; ++ uint8x8_t v_fc = {0}; ++ uint8x8_t v_fx = {0}; ++ uint16x8_t v_fafb = {0}; ++ uint16x8_t v_fcfc = {0}; ++ uint16x8_t v_pa = {0}; ++ uint16x8_t v_pb = {0}; ++ uint16x8_t v_pc = {0}; ++ uint16x8_t v_cmpab = {0}; ++ uint16x8_t v_cmpac = {0}; ++ uint8x8_t v_picka = {0}; ++ uint8x8_t v_pickb = {0}; + +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; + } ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ } ++ v_curr.len = 3; ++ v_prev.len = 3; ++ const uint8_t* i_end2_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end2_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +- uint32_t coro_susp_point = self->private_impl.p_decode_comment[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// ‼ WUFFS MULTI-FILE SECTION +arm_neon ++// -------- func png.decoder.filter_4_distance_4_arm_neon + +- self->private_impl.f_comment_type = 0u; +- while ((((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) || (((uint64_t)(io2_a_src - iop_a_src)) <= 1u)) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; +- } +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- } +- v_c2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- if ((v_c2 == 10799u) && self->private_impl.f_quirks[11u]) { +- iop_a_src += 2u; +- v_length = 2u; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) { +- if (v_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- } +- v_length = 0u; +- continue; +- } +- v_c2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- if (v_c2 == 12074u) { +- iop_a_src += 2u; +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)((v_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- self->private_impl.f_comment_type = 1u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- iop_a_src += 1u; +- if (v_length >= 65533u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- } +- v_length = 0u; +- continue; +- } +- v_length += 1u; +- } +- } else if ((v_c2 == 12079u) && self->private_impl.f_quirks[12u]) { +- iop_a_src += 2u; +- v_length = 2u; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- self->private_impl.f_comment_type = 2u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } else if (v_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); +- } +- v_length = 0u; +- continue; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (v_c == 10u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- self->private_impl.f_comment_type = 2u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- iop_a_src += 1u; +- if (v_length >= 65533u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) | +- (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- } +- v_length = 0u; +- continue; +- } +- v_length += 1u; +- } ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_arm_neon( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint8x8_t v_fa = {0}; ++ uint8x8_t v_fb = {0}; ++ uint8x8_t v_fc = {0}; ++ uint8x8_t v_fx = {0}; ++ uint16x8_t v_fafb = {0}; ++ uint16x8_t v_fcfc = {0}; ++ uint16x8_t v_pa = {0}; ++ uint16x8_t v_pb = {0}; ++ uint16x8_t v_pc = {0}; ++ uint16x8_t v_cmpab = {0}; ++ uint16x8_t v_cmpac = {0}; ++ uint8x8_t v_picka = {0}; ++ uint8x8_t v_pickb = {0}; ++ ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; + } +- +- ok: +- self->private_impl.p_decode_comment[0] = 0; +- goto exit; ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_fafb = vaddl_u8(v_fa, v_fb); ++ v_fcfc = vaddl_u8(v_fc, v_fc); ++ v_pa = vabdl_u8(v_fb, v_fc); ++ v_pb = vabdl_u8(v_fa, v_fc); ++ v_pc = vabdq_u16(v_fafb, v_fcfc); ++ v_cmpab = vcleq_u16(v_pa, v_pb); ++ v_cmpac = vcleq_u16(v_pa, v_pc); ++ v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); ++ v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); ++ v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); ++ v_fc = v_fb; ++ v_fa = v_fx; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } ++ return wuffs_base__make_empty_struct(); ++} ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +- goto suspend; +- suspend: +- self->private_impl.p_decode_comment[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++// -------- func png.decoder.filter_1 + +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ return (*self->private_impl.choosy_filter_1)(self, a_curr); ++} + +- return status; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ uint64_t v_filter_distance = 0; ++ uint8_t v_fa = 0; ++ uint64_t v_i_start = 0; ++ uint64_t v_i = 0; ++ ++ v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); ++ v_i_start = 0u; ++ while (v_i_start < v_filter_distance) { ++ v_fa = 0u; ++ v_i = v_i_start; ++ while (v_i < ((uint64_t)(a_curr.len))) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + v_fa)); ++ v_fa = a_curr.ptr[v_i]; ++ v_i += v_filter_distance; ++ } ++ v_i_start += 1u; ++ } ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func json.decoder.decode_inf_nan ++// -------- func png.decoder.filter_1_distance_3_fallback + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_inf_nan( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_c4 = 0; +- uint32_t v_neg = 0; ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ uint8_t v_fa0 = 0; ++ uint8_t v_fa1 = 0; ++ uint8_t v_fa2 = 0; + +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 3; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; + } ++ v_curr.len = 3; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ } ++ v_curr.len = 0; + } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ return wuffs_base__make_empty_struct(); ++} + +- uint32_t coro_susp_point = self->private_impl.p_decode_inf_nan[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// -------- func png.decoder.filter_1_distance_4_fallback + +- while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 2u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- continue; +- } +- v_c4 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); +- if ((v_c4 | 2105376u) == 6712937u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) > 7u) { +- if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) | 2314885530818453536u) == 8751735898823356009u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(8u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 8u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- } else if ( ! (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- continue; +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 3u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } else if ((v_c4 | 2105376u) == 7233902u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(10485888u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 3u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } else if ((v_c4 & 255u) == 43u) { +- v_neg = 0u; +- } else if ((v_c4 & 255u) == 45u) { +- v_neg = 1u; +- } else { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 3u) { +- if (a_src && a_src->meta.closed) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- continue; +- } +- v_c4 = (wuffs_base__peek_u32le__no_bounds_check(iop_a_src) >> 8u); +- if ((v_c4 | 2105376u) == 6712937u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) > 8u) { +- if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 1u) | 2314885530818453536u) == 8751735898823356009u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 9u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- } else if ( ! (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- continue; +- } +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 4u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } else if ((v_c4 | 2105376u) == 7233902u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)((10485760u | (((uint32_t)(128u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- iop_a_src += 4u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ uint8_t v_fa0 = 0; ++ uint8_t v_fa1 = 0; ++ uint8_t v_fa2 = 0; ++ uint8_t v_fa3 = 0; + +- ok: +- self->private_impl.p_decode_inf_nan[0] = 0; +- goto exit; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_fa3 = ((uint8_t)(v_fa3 + v_curr.ptr[3u])); ++ v_curr.ptr[3u] = v_fa3; ++ v_curr.ptr += 4; ++ } ++ v_curr.len = 0; + } ++ return wuffs_base__make_empty_struct(); ++} + +- goto suspend; +- suspend: +- self->private_impl.p_decode_inf_nan[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++// -------- func png.decoder.filter_2 + +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_2( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ uint64_t v_n = 0; ++ uint64_t v_i = 0; + +- return status; ++ v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); ++ v_i = 0u; ++ while (v_i < v_n) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i])); ++ v_i += 1u; ++ } ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func json.decoder.decode_trailer ++// -------- func png.decoder.filter_3 + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_json__decoder__decode_trailer( +- wuffs_json__decoder* self, +- wuffs_base__token_buffer* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ return (*self->private_impl.choosy_filter_3)(self, a_curr, a_prev); ++} + +- uint8_t v_c = 0; +- uint32_t v_whitespace_length = 0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ uint64_t v_filter_distance = 0; ++ uint64_t v_n = 0; ++ uint64_t v_i = 0; + +- wuffs_base__token* iop_a_dst = NULL; +- wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; ++ v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); ++ if (((uint64_t)(a_prev.len)) == 0u) { ++ v_i = v_filter_distance; ++ while (v_i < ((uint64_t)(a_curr.len))) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(a_curr.ptr[(v_i - v_filter_distance)] / 2u)))); ++ v_i += 1u; ++ } ++ } else { ++ v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); ++ v_i = 0u; ++ while ((v_i < v_n) && (v_i < v_filter_distance)) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(a_prev.ptr[v_i] / 2u)))); ++ v_i += 1u; ++ } ++ v_i = v_filter_distance; ++ while (v_i < v_n) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(((((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)])) + ((uint32_t)(a_prev.ptr[v_i]))) / 2u))))); ++ v_i += 1u; + } + } +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ return wuffs_base__make_empty_struct(); ++} + +- uint32_t coro_susp_point = self->private_impl.p_decode_trailer[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// -------- func png.decoder.filter_3_distance_3_fallback + +- if (self->private_impl.f_quirks[18u]) { +- self->private_impl.f_trailer_stop = 10u; +- } else { +- self->private_impl.f_trailer_stop = 0u; +- } +- label__outer__continue:; +- while (true) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_3_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint8_t v_fa0 = 0; ++ uint8_t v_fa1 = 0; ++ uint8_t v_fa2 = 0; ++ ++ if (((uint64_t)(a_prev.len)) == 0u) { ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 3; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; + } +- v_whitespace_length = 0u; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (v_whitespace_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- if (a_src && a_src->meta.closed) { +- goto label__outer__break; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- goto label__outer__continue; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (WUFFS_JSON__LUT_CLASSES[v_c] != 0u) { +- if (v_whitespace_length > 0u) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- } +- if (self->private_impl.f_trailer_stop > 0u) { +- status = wuffs_base__make_status(wuffs_json__error__bad_input); +- goto exit; +- } +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_json__decoder__decode_comment(self, a_dst, a_src); +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_comment_type > 0u) { +- goto label__outer__continue; +- } +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- iop_a_src += 1u; +- if ((v_whitespace_length >= 65534u) || (v_c == self->private_impl.f_trailer_stop)) { +- *iop_a_dst++ = wuffs_base__make_token( +- (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) | +- (((uint64_t)((v_whitespace_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT)); +- if (v_c == self->private_impl.f_trailer_stop) { +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- goto label__outer__continue; +- } +- v_whitespace_length += 1u; ++ v_curr.len = 3; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; + } ++ v_curr.len = 0; ++ } ++ } else { ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 3; ++ v_prev.len = 3; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ } ++ v_curr.len = 3; ++ v_prev.len = 3; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- label__outer__break:; +- +- ok: +- self->private_impl.p_decode_trailer[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_trailer[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_lzw__error__bad_code[] = "#lzw: bad code"; +-const char wuffs_lzw__error__truncated_input[] = "#lzw: truncated input"; +-const char wuffs_lzw__error__internal_error_inconsistent_i_o[] = "#lzw: internal error: inconsistent I/O"; +- +-// ---------------- Private Consts +- +-#define WUFFS_LZW__QUIRKS_BASE 1348378624 +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes ++// -------- func png.decoder.filter_3_distance_4_fallback + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_lzw__decoder__read_from( +- wuffs_lzw__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_lzw__decoder__write_to( +- wuffs_lzw__decoder* self, +- wuffs_base__io_buffer* a_dst); +- +-// ---------------- VTables +- +-const wuffs_base__io_transformer__func_ptrs +-wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer = { +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_lzw__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_lzw__decoder__history_retain_length), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_lzw__decoder__set_quirk), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_lzw__decoder__transform_io), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzw__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_lzw__decoder__initialize( +- wuffs_lzw__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++wuffs_png__decoder__filter_3_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint8_t v_fa0 = 0; ++ uint8_t v_fa1 = 0; ++ uint8_t v_fa2 = 0; ++ uint8_t v_fa3 = 0; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ if (((uint64_t)(a_prev.len)) == 0u) { ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_fa3 = ((uint8_t)(((uint8_t)(v_fa3 / 2u)) + v_curr.ptr[3u])); ++ v_curr.ptr[3u] = v_fa3; ++ v_curr.ptr += 4; ++ } ++ v_curr.len = 0; + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif + } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); ++ v_curr.ptr[0u] = v_fa0; ++ v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); ++ v_curr.ptr[1u] = v_fa1; ++ v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); ++ v_curr.ptr[2u] = v_fa2; ++ v_fa3 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa3)) + ((uint32_t)(v_prev.ptr[3u]))) / 2u))) + v_curr.ptr[3u])); ++ v_curr.ptr[3u] = v_fa3; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } + } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = +- wuffs_base__io_transformer__vtable_name; +- self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = +- (const void*)(&wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer); +- return wuffs_base__make_status(NULL); ++ return wuffs_base__make_empty_struct(); + } + +-wuffs_lzw__decoder* +-wuffs_lzw__decoder__alloc(void) { +- wuffs_lzw__decoder* x = +- (wuffs_lzw__decoder*)(calloc(sizeof(wuffs_lzw__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_lzw__decoder__initialize( +- x, sizeof(wuffs_lzw__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} ++// -------- func png.decoder.filter_4 + +-size_t +-sizeof__wuffs_lzw__decoder(void) { +- return sizeof(wuffs_lzw__decoder); ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ return (*self->private_impl.choosy_filter_4)(self, a_curr, a_prev); + } + +-// ---------------- Function Implementations +- +-// -------- func lzw.decoder.get_quirk +- + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_lzw__decoder__get_quirk( +- const wuffs_lzw__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4__choosy_default( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ uint64_t v_filter_distance = 0; ++ uint64_t v_n = 0; ++ uint64_t v_i = 0; ++ uint32_t v_fa = 0; ++ uint32_t v_fb = 0; ++ uint32_t v_fc = 0; ++ uint32_t v_pp = 0; ++ uint32_t v_pa = 0; ++ uint32_t v_pb = 0; ++ uint32_t v_pc = 0; + +- if (a_key == 1348378624u) { +- return ((uint64_t)(self->private_impl.f_pending_literal_width_plus_one)); ++ v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); ++ v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); ++ v_i = 0u; ++ while ((v_i < v_n) && (v_i < v_filter_distance)) { ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i])); ++ v_i += 1u; + } +- return 0u; ++ v_i = v_filter_distance; ++ while (v_i < v_n) { ++ v_fa = ((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)])); ++ v_fb = ((uint32_t)(a_prev.ptr[v_i])); ++ v_fc = ((uint32_t)(a_prev.ptr[(v_i - v_filter_distance)])); ++ v_pp = ((uint32_t)(((uint32_t)(v_fa + v_fb)) - v_fc)); ++ v_pa = ((uint32_t)(v_pp - v_fa)); ++ if (v_pa >= 2147483648u) { ++ v_pa = ((uint32_t)(0u - v_pa)); ++ } ++ v_pb = ((uint32_t)(v_pp - v_fb)); ++ if (v_pb >= 2147483648u) { ++ v_pb = ((uint32_t)(0u - v_pb)); ++ } ++ v_pc = ((uint32_t)(v_pp - v_fc)); ++ if (v_pc >= 2147483648u) { ++ v_pc = ((uint32_t)(0u - v_pc)); ++ } ++ if ((v_pa <= v_pb) && (v_pa <= v_pc)) { ++ } else if (v_pb <= v_pc) { ++ v_fa = v_fb; ++ } else { ++ v_fa = v_fc; ++ } ++ a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(v_fa)))); ++ v_i += 1u; ++ } ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func lzw.decoder.set_quirk ++// -------- func png.decoder.filter_4_distance_3_fallback + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_lzw__decoder__set_quirk( +- wuffs_lzw__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint32_t v_fa0 = 0; ++ uint32_t v_fa1 = 0; ++ uint32_t v_fa2 = 0; ++ uint32_t v_fb0 = 0; ++ uint32_t v_fb1 = 0; ++ uint32_t v_fb2 = 0; ++ uint32_t v_fc0 = 0; ++ uint32_t v_fc1 = 0; ++ uint32_t v_fc2 = 0; ++ uint32_t v_pp0 = 0; ++ uint32_t v_pp1 = 0; ++ uint32_t v_pp2 = 0; ++ uint32_t v_pa0 = 0; ++ uint32_t v_pa1 = 0; ++ uint32_t v_pa2 = 0; ++ uint32_t v_pb0 = 0; ++ uint32_t v_pb1 = 0; ++ uint32_t v_pb2 = 0; ++ uint32_t v_pc0 = 0; ++ uint32_t v_pc1 = 0; ++ uint32_t v_pc2 = 0; + +- if (a_key == 1348378624u) { +- if (a_value > 9u) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 3; ++ v_prev.len = 3; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fb0 = ((uint32_t)(v_prev.ptr[0u])); ++ v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0)); ++ v_pa0 = ((uint32_t)(v_pp0 - v_fa0)); ++ if (v_pa0 >= 2147483648u) { ++ v_pa0 = ((uint32_t)(0u - v_pa0)); ++ } ++ v_pb0 = ((uint32_t)(v_pp0 - v_fb0)); ++ if (v_pb0 >= 2147483648u) { ++ v_pb0 = ((uint32_t)(0u - v_pb0)); ++ } ++ v_pc0 = ((uint32_t)(v_pp0 - v_fc0)); ++ if (v_pc0 >= 2147483648u) { ++ v_pc0 = ((uint32_t)(0u - v_pc0)); ++ } ++ if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) { ++ } else if (v_pb0 <= v_pc0) { ++ v_fa0 = v_fb0; ++ } else { ++ v_fa0 = v_fc0; ++ } ++ v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0)))); ++ v_fa0 = ((uint32_t)(v_curr.ptr[0u])); ++ v_fc0 = v_fb0; ++ v_fb1 = ((uint32_t)(v_prev.ptr[1u])); ++ v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1)); ++ v_pa1 = ((uint32_t)(v_pp1 - v_fa1)); ++ if (v_pa1 >= 2147483648u) { ++ v_pa1 = ((uint32_t)(0u - v_pa1)); ++ } ++ v_pb1 = ((uint32_t)(v_pp1 - v_fb1)); ++ if (v_pb1 >= 2147483648u) { ++ v_pb1 = ((uint32_t)(0u - v_pb1)); ++ } ++ v_pc1 = ((uint32_t)(v_pp1 - v_fc1)); ++ if (v_pc1 >= 2147483648u) { ++ v_pc1 = ((uint32_t)(0u - v_pc1)); ++ } ++ if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) { ++ } else if (v_pb1 <= v_pc1) { ++ v_fa1 = v_fb1; ++ } else { ++ v_fa1 = v_fc1; ++ } ++ v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1)))); ++ v_fa1 = ((uint32_t)(v_curr.ptr[1u])); ++ v_fc1 = v_fb1; ++ v_fb2 = ((uint32_t)(v_prev.ptr[2u])); ++ v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2)); ++ v_pa2 = ((uint32_t)(v_pp2 - v_fa2)); ++ if (v_pa2 >= 2147483648u) { ++ v_pa2 = ((uint32_t)(0u - v_pa2)); ++ } ++ v_pb2 = ((uint32_t)(v_pp2 - v_fb2)); ++ if (v_pb2 >= 2147483648u) { ++ v_pb2 = ((uint32_t)(0u - v_pb2)); ++ } ++ v_pc2 = ((uint32_t)(v_pp2 - v_fc2)); ++ if (v_pc2 >= 2147483648u) { ++ v_pc2 = ((uint32_t)(0u - v_pc2)); ++ } ++ if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) { ++ } else if (v_pb2 <= v_pc2) { ++ v_fa2 = v_fb2; ++ } else { ++ v_fa2 = v_fc2; ++ } ++ v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2)))); ++ v_fa2 = ((uint32_t)(v_curr.ptr[2u])); ++ v_fc2 = v_fb2; ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; + } +- self->private_impl.f_pending_literal_width_plus_one = ((uint32_t)(a_value)); +- return wuffs_base__make_status(NULL); ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func lzw.decoder.history_retain_length ++// -------- func png.decoder.filter_4_distance_4_fallback + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_lzw__decoder__history_retain_length( +- const wuffs_lzw__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func lzw.decoder.workbuf_len ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_fallback( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ uint32_t v_fa0 = 0; ++ uint32_t v_fa1 = 0; ++ uint32_t v_fa2 = 0; ++ uint32_t v_fa3 = 0; ++ uint32_t v_fb0 = 0; ++ uint32_t v_fb1 = 0; ++ uint32_t v_fb2 = 0; ++ uint32_t v_fb3 = 0; ++ uint32_t v_fc0 = 0; ++ uint32_t v_fc1 = 0; ++ uint32_t v_fc2 = 0; ++ uint32_t v_fc3 = 0; ++ uint32_t v_pp0 = 0; ++ uint32_t v_pp1 = 0; ++ uint32_t v_pp2 = 0; ++ uint32_t v_pp3 = 0; ++ uint32_t v_pa0 = 0; ++ uint32_t v_pa1 = 0; ++ uint32_t v_pa2 = 0; ++ uint32_t v_pa3 = 0; ++ uint32_t v_pb0 = 0; ++ uint32_t v_pb1 = 0; ++ uint32_t v_pb2 = 0; ++ uint32_t v_pb3 = 0; ++ uint32_t v_pc0 = 0; ++ uint32_t v_pc1 = 0; ++ uint32_t v_pc2 = 0; ++ uint32_t v_pc3 = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_lzw__decoder__workbuf_len( +- const wuffs_lzw__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_fb0 = ((uint32_t)(v_prev.ptr[0u])); ++ v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0)); ++ v_pa0 = ((uint32_t)(v_pp0 - v_fa0)); ++ if (v_pa0 >= 2147483648u) { ++ v_pa0 = ((uint32_t)(0u - v_pa0)); ++ } ++ v_pb0 = ((uint32_t)(v_pp0 - v_fb0)); ++ if (v_pb0 >= 2147483648u) { ++ v_pb0 = ((uint32_t)(0u - v_pb0)); ++ } ++ v_pc0 = ((uint32_t)(v_pp0 - v_fc0)); ++ if (v_pc0 >= 2147483648u) { ++ v_pc0 = ((uint32_t)(0u - v_pc0)); ++ } ++ if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) { ++ } else if (v_pb0 <= v_pc0) { ++ v_fa0 = v_fb0; ++ } else { ++ v_fa0 = v_fc0; ++ } ++ v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0)))); ++ v_fa0 = ((uint32_t)(v_curr.ptr[0u])); ++ v_fc0 = v_fb0; ++ v_fb1 = ((uint32_t)(v_prev.ptr[1u])); ++ v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1)); ++ v_pa1 = ((uint32_t)(v_pp1 - v_fa1)); ++ if (v_pa1 >= 2147483648u) { ++ v_pa1 = ((uint32_t)(0u - v_pa1)); ++ } ++ v_pb1 = ((uint32_t)(v_pp1 - v_fb1)); ++ if (v_pb1 >= 2147483648u) { ++ v_pb1 = ((uint32_t)(0u - v_pb1)); ++ } ++ v_pc1 = ((uint32_t)(v_pp1 - v_fc1)); ++ if (v_pc1 >= 2147483648u) { ++ v_pc1 = ((uint32_t)(0u - v_pc1)); ++ } ++ if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) { ++ } else if (v_pb1 <= v_pc1) { ++ v_fa1 = v_fb1; ++ } else { ++ v_fa1 = v_fc1; ++ } ++ v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1)))); ++ v_fa1 = ((uint32_t)(v_curr.ptr[1u])); ++ v_fc1 = v_fb1; ++ v_fb2 = ((uint32_t)(v_prev.ptr[2u])); ++ v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2)); ++ v_pa2 = ((uint32_t)(v_pp2 - v_fa2)); ++ if (v_pa2 >= 2147483648u) { ++ v_pa2 = ((uint32_t)(0u - v_pa2)); ++ } ++ v_pb2 = ((uint32_t)(v_pp2 - v_fb2)); ++ if (v_pb2 >= 2147483648u) { ++ v_pb2 = ((uint32_t)(0u - v_pb2)); ++ } ++ v_pc2 = ((uint32_t)(v_pp2 - v_fc2)); ++ if (v_pc2 >= 2147483648u) { ++ v_pc2 = ((uint32_t)(0u - v_pc2)); ++ } ++ if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) { ++ } else if (v_pb2 <= v_pc2) { ++ v_fa2 = v_fb2; ++ } else { ++ v_fa2 = v_fc2; ++ } ++ v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2)))); ++ v_fa2 = ((uint32_t)(v_curr.ptr[2u])); ++ v_fc2 = v_fb2; ++ v_fb3 = ((uint32_t)(v_prev.ptr[3u])); ++ v_pp3 = ((uint32_t)(((uint32_t)(v_fa3 + v_fb3)) - v_fc3)); ++ v_pa3 = ((uint32_t)(v_pp3 - v_fa3)); ++ if (v_pa3 >= 2147483648u) { ++ v_pa3 = ((uint32_t)(0u - v_pa3)); ++ } ++ v_pb3 = ((uint32_t)(v_pp3 - v_fb3)); ++ if (v_pb3 >= 2147483648u) { ++ v_pb3 = ((uint32_t)(0u - v_pb3)); ++ } ++ v_pc3 = ((uint32_t)(v_pp3 - v_fc3)); ++ if (v_pc3 >= 2147483648u) { ++ v_pc3 = ((uint32_t)(0u - v_pc3)); ++ } ++ if ((v_pa3 <= v_pb3) && (v_pa3 <= v_pc3)) { ++ } else if (v_pb3 <= v_pc3) { ++ v_fa3 = v_fb3; ++ } else { ++ v_fa3 = v_fc3; ++ } ++ v_curr.ptr[3u] = ((uint8_t)(v_curr.ptr[3u] + ((uint8_t)(v_fa3)))); ++ v_fa3 = ((uint32_t)(v_curr.ptr[3u])); ++ v_fc3 = v_fb3; ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func lzw.decoder.transform_io ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func png.decoder.filter_1_distance_4_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_lzw__decoder__transform_io( +- wuffs_lzw__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_i = 0; +- +- uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_1_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ __m128i v_x128 = {0}; ++ __m128i v_a128 = {0}; + +- self->private_impl.f_literal_width = 8u; +- if (self->private_impl.f_pending_literal_width_plus_one > 0u) { +- self->private_impl.f_literal_width = (self->private_impl.f_pending_literal_width_plus_one - 1u); +- } +- self->private_impl.f_clear_code = (((uint32_t)(1u)) << self->private_impl.f_literal_width); +- self->private_impl.f_end_code = (self->private_impl.f_clear_code + 1u); +- self->private_impl.f_save_code = self->private_impl.f_end_code; +- self->private_impl.f_prev_code = self->private_impl.f_end_code; +- self->private_impl.f_width = (self->private_impl.f_literal_width + 1u); +- self->private_impl.f_bits = 0u; +- self->private_impl.f_n_bits = 0u; +- self->private_impl.f_output_ri = 0u; +- self->private_impl.f_output_wi = 0u; +- v_i = 0u; +- while (v_i < self->private_impl.f_clear_code) { +- self->private_data.f_lm1s[v_i] = 0u; +- self->private_data.f_suffixes[v_i][0u] = ((uint8_t)(v_i)); +- v_i += 1u; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_a128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_a128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; + } +- while (true) { +- wuffs_lzw__decoder__read_from(self, a_src); +- if (self->private_impl.f_output_wi > 0u) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_lzw__decoder__write_to(self, a_dst); +- if (status.repr) { +- goto suspend; +- } +- } +- if (self->private_impl.f_read_from_return_value == 0u) { +- break; +- } else if (self->private_impl.f_read_from_return_value == 1u) { +- continue; +- } else if (self->private_impl.f_read_from_return_value == 2u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- } else if (self->private_impl.f_read_from_return_value == 3u) { +- status = wuffs_base__make_status(wuffs_lzw__error__truncated_input); +- goto exit; +- } else if (self->private_impl.f_read_from_return_value == 4u) { +- status = wuffs_base__make_status(wuffs_lzw__error__bad_code); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o); +- goto exit; +- } ++ v_curr.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_a128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; + } +- +- ok: +- self->private_impl.p_transform_io[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ v_curr.len = 0; + } +- return status; ++ return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// -------- func lzw.decoder.read_from ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func png.decoder.filter_3_distance_4_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_lzw__decoder__read_from( +- wuffs_lzw__decoder* self, +- wuffs_base__io_buffer* a_src) { +- uint32_t v_clear_code = 0; +- uint32_t v_end_code = 0; +- uint32_t v_save_code = 0; +- uint32_t v_prev_code = 0; +- uint32_t v_width = 0; +- uint32_t v_bits = 0; +- uint32_t v_n_bits = 0; +- uint32_t v_output_wi = 0; +- uint32_t v_code = 0; +- uint32_t v_c = 0; +- uint32_t v_o = 0; +- uint32_t v_steps = 0; +- uint8_t v_first_byte = 0; +- uint16_t v_lm1_b = 0; +- uint16_t v_lm1_a = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++wuffs_png__decoder__filter_3_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ __m128i v_x128 = {0}; ++ __m128i v_a128 = {0}; ++ __m128i v_b128 = {0}; ++ __m128i v_p128 = {0}; ++ __m128i v_k128 = {0}; + +- v_clear_code = self->private_impl.f_clear_code; +- v_end_code = self->private_impl.f_end_code; +- v_save_code = self->private_impl.f_save_code; +- v_prev_code = self->private_impl.f_prev_code; +- v_width = self->private_impl.f_width; +- v_bits = self->private_impl.f_bits; +- v_n_bits = self->private_impl.f_n_bits; +- v_output_wi = self->private_impl.f_output_wi; +- while (true) { +- if (v_n_bits < v_width) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) { +- v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits)); +- iop_a_src += ((31u - v_n_bits) >> 3u); +- v_n_bits |= 24u; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- self->private_impl.f_read_from_return_value = 3u; +- } else { +- self->private_impl.f_read_from_return_value = 2u; +- } +- break; +- } else { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- if (v_n_bits >= v_width) { +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- if (a_src && a_src->meta.closed) { +- self->private_impl.f_read_from_return_value = 3u; +- } else { +- self->private_impl.f_read_from_return_value = 2u; +- } +- break; +- } else { +- v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits); +- iop_a_src += 1u; +- v_n_bits += 8u; +- if (v_n_bits < v_width) { +- self->private_impl.f_read_from_return_value = 5u; +- break; +- } +- } +- } +- } +- v_code = ((v_bits) & WUFFS_BASE__LOW_BITS_MASK__U32(v_width)); +- v_bits >>= v_width; +- v_n_bits -= v_width; +- if (v_code < v_clear_code) { +- self->private_data.f_output[v_output_wi] = ((uint8_t)(v_code)); +- v_output_wi = ((v_output_wi + 1u) & 8191u); +- if (v_save_code <= 4095u) { +- v_lm1_a = (((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u); +- self->private_data.f_lm1s[v_save_code] = v_lm1_a; +- if ((v_lm1_a % 8u) != 0u) { +- self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code]; +- memcpy(self->private_data.f_suffixes[v_save_code],self->private_data.f_suffixes[v_prev_code], sizeof(self->private_data.f_suffixes[v_save_code])); +- self->private_data.f_suffixes[v_save_code][(v_lm1_a % 8u)] = ((uint8_t)(v_code)); +- } else { +- self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); +- self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_code)); +- } +- v_save_code += 1u; +- if (v_width < 12u) { +- v_width += (1u & (v_save_code >> v_width)); +- } +- v_prev_code = v_code; +- } +- } else if (v_code <= v_end_code) { +- if (v_code == v_end_code) { +- self->private_impl.f_read_from_return_value = 0u; +- break; +- } +- v_save_code = v_end_code; +- v_prev_code = v_end_code; +- v_width = (self->private_impl.f_literal_width + 1u); +- } else if (v_code <= v_save_code) { +- v_c = v_code; +- if (v_code == v_save_code) { +- v_c = v_prev_code; +- } +- v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lm1s[v_c])) & 4294967288u)) & 8191u); +- v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lm1s[v_c]))) & 8191u); +- v_steps = (((uint32_t)(self->private_data.f_lm1s[v_c])) >> 3u); +- while (true) { +- memcpy((self->private_data.f_output)+(v_o), (self->private_data.f_suffixes[v_c]), 8u); +- if (v_steps <= 0u) { +- break; +- } +- v_steps -= 1u; +- v_o = (((uint32_t)(v_o - 8u)) & 8191u); +- v_c = ((uint32_t)(self->private_impl.f_prefixes[v_c])); +- } +- v_first_byte = self->private_data.f_suffixes[v_c][0u]; +- if (v_code == v_save_code) { +- self->private_data.f_output[v_output_wi] = v_first_byte; +- v_output_wi = ((v_output_wi + 1u) & 8191u); ++ if (((uint64_t)(a_prev.len)) == 0u) { ++ v_k128 = _mm_set1_epi8((int8_t)(254u)); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ v_curr.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; + } +- if (v_save_code <= 4095u) { +- v_lm1_b = (((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u); +- self->private_data.f_lm1s[v_save_code] = v_lm1_b; +- if ((v_lm1_b % 8u) != 0u) { +- self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code]; +- memcpy(self->private_data.f_suffixes[v_save_code],self->private_data.f_suffixes[v_prev_code], sizeof(self->private_data.f_suffixes[v_save_code])); +- self->private_data.f_suffixes[v_save_code][(v_lm1_b % 8u)] = v_first_byte; +- } else { +- self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code)); +- self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte)); +- } +- v_save_code += 1u; +- if (v_width < 12u) { +- v_width += (1u & (v_save_code >> v_width)); +- } +- v_prev_code = v_code; ++ v_curr.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; + } +- } else { +- self->private_impl.f_read_from_return_value = 4u; +- break; +- } +- if (v_output_wi > 4095u) { +- self->private_impl.f_read_from_return_value = 1u; +- break; ++ v_curr.len = 0; + } +- } +- if (self->private_impl.f_read_from_return_value != 2u) { +- while (v_n_bits >= 8u) { +- v_n_bits -= 8u; +- if (iop_a_src > io1_a_src) { +- iop_a_src--; +- } else { +- self->private_impl.f_read_from_return_value = 5u; +- break; ++ } else { ++ v_k128 = _mm_set1_epi8((int8_t)(1u)); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_p128 = _mm_avg_epu8(v_a128, v_b128); ++ v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_p128 = _mm_avg_epu8(v_a128, v_b128); ++ v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ } ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_p128 = _mm_avg_epu8(v_a128, v_b128); ++ v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; + } ++ v_curr.len = 0; ++ v_prev.len = 0; + } + } +- self->private_impl.f_save_code = v_save_code; +- self->private_impl.f_prev_code = v_prev_code; +- self->private_impl.f_width = v_width; +- self->private_impl.f_bits = v_bits; +- self->private_impl.f_n_bits = v_n_bits; +- self->private_impl.f_output_wi = v_output_wi; +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- + return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// -------- func lzw.decoder.write_to ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func png.decoder.filter_4_distance_3_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_lzw__decoder__write_to( +- wuffs_lzw__decoder* self, +- wuffs_base__io_buffer* a_dst) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__slice_u8 v_s = {0}; +- uint64_t v_n = 0; ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_3_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ __m128i v_x128 = {0}; ++ __m128i v_a128 = {0}; ++ __m128i v_b128 = {0}; ++ __m128i v_c128 = {0}; ++ __m128i v_p128 = {0}; ++ __m128i v_pa128 = {0}; ++ __m128i v_pb128 = {0}; ++ __m128i v_pc128 = {0}; ++ __m128i v_smallest128 = {0}; ++ __m128i v_z128 = {0}; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; + } +- } +- +- uint32_t coro_susp_point = self->private_impl.p_write_to[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (self->private_impl.f_output_wi > 0u) { +- if (self->private_impl.f_output_ri > self->private_impl.f_output_wi) { +- status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- v_s = wuffs_base__make_slice_u8_ij(self->private_data.f_output, +- self->private_impl.f_output_ri, +- self->private_impl.f_output_wi); +- v_n = wuffs_base__io_writer__copy_from_slice(&iop_a_dst, io2_a_dst,v_s); +- if (v_n == ((uint64_t)(v_s.len))) { +- self->private_impl.f_output_ri = 0u; +- self->private_impl.f_output_wi = 0u; +- status = wuffs_base__make_status(NULL); +- goto ok; +- } +- self->private_impl.f_output_ri = (((uint32_t)(self->private_impl.f_output_ri + ((uint32_t)(v_n)))) & 8191u); +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; + } +- +- ok: +- self->private_impl.p_write_to[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_write_to[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func lzw.decoder.flush +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8 +-wuffs_lzw__decoder__flush( +- wuffs_lzw__decoder* self) { +- if (!self) { +- return wuffs_base__make_slice_u8(NULL, 0); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_slice_u8(NULL, 0); +- } +- +- uint32_t v_ri = 0; +- uint32_t v_wi = 0; +- +- v_ri = self->private_impl.f_output_ri; +- v_wi = self->private_impl.f_output_wi; +- self->private_impl.f_output_ri = 0u; +- self->private_impl.f_output_wi = 0u; +- if (v_ri <= v_wi) { +- return wuffs_base__make_slice_u8_ij(self->private_data.f_output, v_ri, v_wi); ++ v_curr.len = 3; ++ v_prev.len = 3; ++ const uint8_t* i_end2_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3)); ++ while (v_curr.ptr < i_end2_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 3; ++ v_prev.ptr += 3; ++ } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- return wuffs_base__make_slice_u8(self->private_data.f_output, 0); ++ return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_netpbm__error__bad_header[] = "#netpbm: bad header"; +-const char wuffs_netpbm__error__truncated_input[] = "#netpbm: truncated input"; +-const char wuffs_netpbm__error__unsupported_netpbm_file[] = "#netpbm: unsupported Netpbm file"; +-const char wuffs_netpbm__note__internal_note_short_read[] = "@netpbm: internal note: short read"; +- +-// ---------------- Private Consts +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_image_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_frame_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_frame( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 ++// -------- func png.decoder.filter_4_distance_4_x86_sse42 + ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_netpbm__decoder__swizzle( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-// ---------------- VTables +- +-const wuffs_base__image_decoder__func_ptrs +-wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_netpbm__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_netpbm__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_netpbm__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_netpbm__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_netpbm__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_netpbm__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_netpbm__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_netpbm__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_netpbm__decoder__initialize( +- wuffs_netpbm__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++static wuffs_base__empty_struct ++wuffs_png__decoder__filter_4_distance_4_x86_sse42( ++ wuffs_png__decoder* self, ++ wuffs_base__slice_u8 a_curr, ++ wuffs_base__slice_u8 a_prev) { ++ wuffs_base__slice_u8 v_curr = {0}; ++ wuffs_base__slice_u8 v_prev = {0}; ++ __m128i v_x128 = {0}; ++ __m128i v_a128 = {0}; ++ __m128i v_b128 = {0}; ++ __m128i v_c128 = {0}; ++ __m128i v_p128 = {0}; ++ __m128i v_pa128 = {0}; ++ __m128i v_pb128 = {0}; ++ __m128i v_pc128 = {0}; ++ __m128i v_smallest128 = {0}; ++ __m128i v_z128 = {0}; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ { ++ wuffs_base__slice_u8 i_slice_curr = a_curr; ++ v_curr.ptr = i_slice_curr.ptr; ++ wuffs_base__slice_u8 i_slice_prev = a_prev; ++ v_prev.ptr = i_slice_prev.ptr; ++ i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8)); ++ while (v_curr.ptr < i_end0_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ v_curr.len = 4; ++ v_prev.len = 4; ++ const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4)); ++ while (v_curr.ptr < i_end1_curr) { ++ v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); ++ v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); ++ v_pa128 = _mm_sub_epi16(v_b128, v_c128); ++ v_pb128 = _mm_sub_epi16(v_a128, v_c128); ++ v_pc128 = _mm_add_epi16(v_pa128, v_pb128); ++ v_pa128 = _mm_abs_epi16(v_pa128); ++ v_pb128 = _mm_abs_epi16(v_pb128); ++ v_pc128 = _mm_abs_epi16(v_pc128); ++ v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); ++ v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); ++ v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); ++ v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); ++ v_x128 = _mm_add_epi8(v_x128, v_p128); ++ v_a128 = v_x128; ++ v_c128 = v_b128; ++ v_x128 = _mm_packus_epi16(v_x128, v_x128); ++ wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); ++ v_curr.ptr += 4; ++ v_prev.ptr += 4; + } ++ v_curr.len = 0; ++ v_prev.len = 0; + } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_netpbm__decoder* +-wuffs_netpbm__decoder__alloc(void) { +- wuffs_netpbm__decoder* x = +- (wuffs_netpbm__decoder*)(calloc(sizeof(wuffs_netpbm__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_netpbm__decoder__initialize( +- x, sizeof(wuffs_netpbm__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} +- +-size_t +-sizeof__wuffs_netpbm__decoder(void) { +- return sizeof(wuffs_netpbm__decoder); ++ return wuffs_base__make_empty_struct(); + } ++#endif // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// ---------------- Function Implementations +- +-// -------- func netpbm.decoder.get_quirk ++// -------- func png.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__get_quirk( +- const wuffs_netpbm__decoder* self, ++wuffs_png__decoder__get_quirk( ++ const wuffs_png__decoder* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -49804,15 +62628,18 @@ wuffs_netpbm__decoder__get_quirk( + return 0; + } + ++ if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } + return 0u; + } + +-// -------- func netpbm.decoder.set_quirk ++// -------- func png.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__set_quirk( +- wuffs_netpbm__decoder* self, ++wuffs_png__decoder__set_quirk( ++ wuffs_png__decoder* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -49825,15 +62652,20 @@ wuffs_netpbm__decoder__set_quirk( + : wuffs_base__error__initialize_not_called); + } + ++ if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, a_key, a_value); ++ return wuffs_base__make_status(NULL); ++ } + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func netpbm.decoder.decode_image_config ++// -------- func png.decoder.decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_image_config( +- wuffs_netpbm__decoder* self, ++wuffs_png__decoder__decode_image_config( ++ wuffs_png__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { +@@ -49859,53 +62691,364 @@ wuffs_netpbm__decoder__decode_image_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_png__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func png.decoder.do_decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_decode_image_config( ++ wuffs_png__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint64_t v_magic = 0; ++ uint64_t v_mark = 0; ++ uint32_t v_checksum_have = 0; ++ uint32_t v_checksum_want = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ if (coro_susp_point) { ++ v_checksum_have = self->private_data.s_do_decode_image_config.v_checksum_have; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if ( ! self->private_impl.f_seen_ihdr) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_0 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 56) { ++ t_0 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_magic = t_0; ++ } ++ if (v_magic != 727905341920923785u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint64_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_1 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 56) { ++ t_1 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_magic = t_1; ++ } ++ if (v_magic != 5927942488114331648u) { ++ if (v_magic == 5278895250759221248u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_cgbi_extension); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; ++ } ++ self->private_impl.f_chunk_type_array[0u] = 73u; ++ self->private_impl.f_chunk_type_array[1u] = 72u; ++ self->private_impl.f_chunk_type_array[2u] = 68u; ++ self->private_impl.f_chunk_type_array[3u] = 82u; ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_png__decoder__decode_ihdr(self, a_src); ++ v_status = t_2; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)); ++ } ++ } ++ v_checksum_want = t_3; ++ } ++ if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != v_checksum_want)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_checksum); ++ goto exit; ++ } ++ self->private_impl.f_seen_ihdr = true; ++ } else if (self->private_impl.f_metadata_fourcc != 0u) { ++ self->private_impl.f_call_sequence = 16u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; ++ } + while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ continue; ++ } ++ self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); ++ if (self->private_impl.f_chunk_type == 1413563465u) { ++ if ( ! self->private_impl.f_seen_actl || self->private_impl.f_seen_fctl) { ++ break; ++ } ++ self->private_impl.f_seen_idat = true; ++ } else if (self->private_impl.f_chunk_type == 1413571686u) { ++ if (self->private_impl.f_seen_idat && self->private_impl.f_seen_fctl) { ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ iop_a_src += 8u; ++ if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) { ++ self->private_impl.f_chunk_type_array[0u] = ((uint8_t)((self->private_impl.f_chunk_type >> 0u))); ++ self->private_impl.f_chunk_type_array[1u] = ((uint8_t)((self->private_impl.f_chunk_type >> 8u))); ++ self->private_impl.f_chunk_type_array[2u] = ((uint8_t)((self->private_impl.f_chunk_type >> 16u))); ++ self->private_impl.f_chunk_type_array[3u] = ((uint8_t)((self->private_impl.f_chunk_type >> 24u))); ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); ++ } ++ while (true) { ++ v_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_4 = wuffs_png__decoder__decode_other_chunk(self, a_src, false); ++ v_status = t_4; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ } ++ if (self->private_impl.f_metadata_fourcc != 0u) { ++ self->private_impl.f_call_sequence = 16u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; ++ } + { +- wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ uint32_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); ++ if (num_bits_5 == 24) { ++ t_5 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)); ++ } ++ } ++ v_checksum_want = t_5; + } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); ++ if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u) && (v_checksum_have != v_checksum_want)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_checksum); + goto exit; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } ++ if ((self->private_impl.f_color_type == 3u) && ! self->private_impl.f_seen_plte) { ++ status = wuffs_base__make_status(wuffs_png__error__missing_palette); ++ goto exit; ++ } ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ self->private_impl.f_first_config_io_position = self->private_impl.f_frame_config_io_position; ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_dst_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_first_config_io_position, ++ ((self->private_impl.f_color_type <= 3u) && ! self->private_impl.f_seen_trns)); ++ } ++ if ( ! self->private_impl.f_seen_actl) { ++ self->private_impl.f_num_animation_frames_value = 1u; ++ self->private_impl.f_first_rect_x0 = 0u; ++ self->private_impl.f_first_rect_y0 = 0u; ++ self->private_impl.f_first_rect_x1 = self->private_impl.f_width; ++ self->private_impl.f_first_rect_y1 = self->private_impl.f_height; ++ self->private_impl.f_first_duration = 0u; ++ self->private_impl.f_first_disposal = 0u; ++ self->private_impl.f_first_overwrite_instead_of_blend = false; ++ } ++ self->private_impl.f_call_sequence = 32u; + + ok: +- self->private_impl.p_decode_image_config[0] = 0; ++ self->private_impl.p_do_decode_image_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_image_config.v_checksum_have = v_checksum_have; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func netpbm.decoder.do_decode_image_config ++// -------- func png.decoder.decode_ihdr + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_image_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__image_config* a_dst, ++wuffs_png__decoder__decode_ihdr( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint32_t v_n = 0; ++ uint32_t v_a32 = 0; ++ uint8_t v_a8 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -49918,348 +63061,343 @@ wuffs_netpbm__decoder__do_decode_image_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_ihdr; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_ihdr.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_ihdr.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ v_a32 = t_0; ++ } ++ if ((v_a32 == 0u) || (v_a32 > 2147483647u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; ++ } else if (v_a32 > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); + goto exit; + } ++ self->private_impl.f_width = v_a32; + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_ihdr.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_ihdr.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); ++ } ++ } ++ v_a32 = t_1; ++ } ++ if ((v_a32 == 0u) || (v_a32 > 2147483647u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; ++ } else if (v_a32 > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_height = v_a32; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; ++ uint8_t t_2 = *iop_a_src++; ++ v_a8 = t_2; + } +- if (v_c != 80u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ if (v_a8 > 16u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); + goto exit; + } ++ self->private_impl.f_depth = v_a8; + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; ++ uint8_t t_3 = *iop_a_src++; ++ v_a8 = t_3; + } +- if ((v_c < 49u) || (55u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; +- } else if (v_c == 53u) { +- self->private_impl.f_pixfmt = 536870920u; +- } else if (v_c == 54u) { +- self->private_impl.f_pixfmt = 2684356744u; +- } else { +- status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); ++ if ((v_a8 == 1u) || (v_a8 == 5u) || (v_a8 > 6u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); + goto exit; + } ++ self->private_impl.f_color_type = v_a8; + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint8_t t_2 = *iop_a_src++; +- v_c = t_2; ++ uint8_t t_4 = *iop_a_src++; ++ v_a8 = t_4; + } +- if (v_c != 10u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); ++ if (v_a8 != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); + goto exit; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; +- } +- if ((v_c == 32u) || (v_c == 9u)) { +- continue; +- } else if (v_c == 35u) { +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; +- } +- if (v_c == 10u) { +- break; +- } +- } +- continue; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- self->private_impl.f_width = ((uint32_t)((v_c - 48u))); +- break; ++ uint8_t t_5 = *iop_a_src++; ++ v_a8 = t_5; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; +- } +- if ((v_c == 32u) || (v_c == 9u)) { +- break; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; +- } +- v_n = ((10u * self->private_impl.f_width) + ((uint32_t)((v_c - 48u)))); +- if (v_n > 16777215u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); +- goto exit; +- } +- self->private_impl.f_width = v_n; ++ if (v_a8 != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_6 = *iop_a_src++; +- v_c = t_6; +- } +- if ((v_c == 32u) || (v_c == 9u)) { +- continue; +- } else if (v_c == 35u) { +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_7 = *iop_a_src++; +- v_c = t_7; +- } +- if (v_c == 10u) { +- break; +- } +- } +- continue; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- self->private_impl.f_height = ((uint32_t)((v_c - 48u))); +- break; ++ uint8_t t_6 = *iop_a_src++; ++ v_a8 = t_6; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_8 = *iop_a_src++; +- v_c = t_8; +- } +- if ((v_c == 32u) || (v_c == 9u) || (v_c == 13u)) { +- continue; +- } else if (v_c == 10u) { +- break; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; +- } +- v_n = ((10u * self->private_impl.f_height) + ((uint32_t)((v_c - 48u)))); +- if (v_n > 16777215u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); +- goto exit; +- } +- self->private_impl.f_height = v_n; ++ if (v_a8 == 0u) { ++ self->private_impl.f_interlace_pass = 0u; ++ } else if (v_a8 == 1u) { ++ self->private_impl.f_interlace_pass = 1u; ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_9 = *iop_a_src++; +- v_c = t_9; +- } +- if ((v_c == 32u) || (v_c == 9u)) { +- continue; +- } else if (v_c == 35u) { +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_10 = *iop_a_src++; +- v_c = t_10; +- } +- if (v_c == 10u) { +- break; +- } +- } +- continue; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; +- } +- self->private_impl.f_max_value = ((uint32_t)((v_c - 48u))); +- break; ++ self->private_impl.f_filter_distance = 0u; ++ wuffs_png__decoder__assign_filter_distance(self); ++ if (self->private_impl.f_filter_distance == 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ goto exit; + } +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_11 = *iop_a_src++; +- v_c = t_11; +- } +- if ((v_c == 32u) || (v_c == 9u) || (v_c == 13u)) { +- continue; +- } else if (v_c == 10u) { +- break; +- } else if ((v_c < 48u) || (57u < v_c)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__bad_header); +- goto exit; +- } +- v_n = ((10u * self->private_impl.f_max_value) + ((uint32_t)((v_c - 48u)))); +- if (v_n > 16777215u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); +- goto exit; ++ self->private_impl.f_overall_workbuf_length = (((uint64_t)(self->private_impl.f_height)) * (1u + wuffs_png__decoder__calculate_bytes_per_row(self, self->private_impl.f_width))); ++ wuffs_png__decoder__choose_filter_implementations(self); ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_ihdr = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_ihdr = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func png.decoder.assign_filter_distance ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__assign_filter_distance( ++ wuffs_png__decoder* self) { ++ if (self->private_impl.f_depth < 8u) { ++ if ((self->private_impl.f_depth != 1u) && (self->private_impl.f_depth != 2u) && (self->private_impl.f_depth != 4u)) { ++ return wuffs_base__make_empty_struct(); ++ } else if (self->private_impl.f_color_type == 0u) { ++ self->private_impl.f_dst_pixfmt = 536870920u; ++ self->private_impl.f_src_pixfmt = 536870920u; ++ } else if (self->private_impl.f_color_type == 3u) { ++ self->private_impl.f_dst_pixfmt = 2198077448u; ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ } else { ++ return wuffs_base__make_empty_struct(); ++ } ++ self->private_impl.f_filter_distance = 1u; ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); ++ } else if (self->private_impl.f_color_type == 0u) { ++ if (self->private_impl.f_depth == 8u) { ++ self->private_impl.f_dst_pixfmt = 536870920u; ++ self->private_impl.f_src_pixfmt = 536870920u; ++ self->private_impl.f_filter_distance = 1u; ++ } else if (self->private_impl.f_depth == 16u) { ++ if (self->private_impl.f_interlace_pass == 0u) { ++ self->private_impl.f_dst_pixfmt = 536870923u; ++ self->private_impl.f_src_pixfmt = 537919499u; ++ } else { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; + } +- self->private_impl.f_max_value = v_n; ++ self->private_impl.f_filter_distance = 2u; + } +- if (self->private_impl.f_max_value != 255u) { +- status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file); +- goto exit; ++ } else if (self->private_impl.f_color_type == 2u) { ++ if (self->private_impl.f_depth == 8u) { ++ self->private_impl.f_dst_pixfmt = 2147485832u; ++ self->private_impl.f_src_pixfmt = 2684356744u; ++ self->private_impl.f_filter_distance = 3u; ++ } else if (self->private_impl.f_depth == 16u) { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ self->private_impl.f_filter_distance = 6u; ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); + } +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- self->private_impl.f_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- false); ++ } else if (self->private_impl.f_color_type == 3u) { ++ if (self->private_impl.f_depth == 8u) { ++ self->private_impl.f_dst_pixfmt = 2198077448u; ++ self->private_impl.f_src_pixfmt = 2198077448u; ++ self->private_impl.f_filter_distance = 1u; ++ } ++ } else if (self->private_impl.f_color_type == 4u) { ++ if (self->private_impl.f_depth == 8u) { ++ self->private_impl.f_dst_pixfmt = 553648264u; ++ self->private_impl.f_src_pixfmt = 553648264u; ++ self->private_impl.f_filter_distance = 2u; ++ } else if (self->private_impl.f_depth == 16u) { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ self->private_impl.f_filter_distance = 4u; ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); ++ } ++ } else if (self->private_impl.f_color_type == 6u) { ++ if (self->private_impl.f_depth == 8u) { ++ self->private_impl.f_dst_pixfmt = 2164295816u; ++ self->private_impl.f_src_pixfmt = 2701166728u; ++ self->private_impl.f_filter_distance = 4u; ++ } else if (self->private_impl.f_depth == 16u) { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ self->private_impl.f_filter_distance = 8u; ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); + } +- self->private_impl.f_call_sequence = 32u; +- +- goto ok; +- ok: +- self->private_impl.p_do_decode_image_config[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func netpbm.decoder.decode_frame_config ++// -------- func png.decoder.calculate_bytes_per_row + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_frame_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++static uint64_t ++wuffs_png__decoder__calculate_bytes_per_row( ++ const wuffs_png__decoder* self, ++ uint32_t a_width) { ++ uint64_t v_bytes_per_channel = 0; + +- ok: +- self->private_impl.p_decode_frame_config[0] = 0; +- goto exit; ++ if (self->private_impl.f_depth == 1u) { ++ return ((uint64_t)(((a_width + 7u) / 8u))); ++ } else if (self->private_impl.f_depth == 2u) { ++ return ((uint64_t)(((a_width + 3u) / 4u))); ++ } else if (self->private_impl.f_depth == 4u) { ++ return ((uint64_t)(((a_width + 1u) / 2u))); + } ++ v_bytes_per_channel = ((uint64_t)(((uint8_t)(self->private_impl.f_depth >> 3u)))); ++ return (((uint64_t)(a_width)) * v_bytes_per_channel * ((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type]))); ++} + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++// -------- func png.decoder.choose_filter_implementations + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_png__decoder__choose_filter_implementations( ++ wuffs_png__decoder* self) { ++ if (self->private_impl.f_filter_distance == 3u) { ++ self->private_impl.choosy_filter_1 = ( ++ &wuffs_png__decoder__filter_1_distance_3_fallback); ++ self->private_impl.choosy_filter_3 = ( ++ &wuffs_png__decoder__filter_3_distance_3_fallback); ++ self->private_impl.choosy_filter_4 = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_3_arm_neon : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_3_x86_sse42 : ++#endif ++ &wuffs_png__decoder__filter_4_distance_3_fallback); ++ } else if (self->private_impl.f_filter_distance == 4u) { ++ self->private_impl.choosy_filter_1 = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_1_distance_4_arm_neon : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_1_distance_4_x86_sse42 : ++#endif ++ &wuffs_png__decoder__filter_1_distance_4_fallback); ++ self->private_impl.choosy_filter_3 = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_3_distance_4_arm_neon : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_3_distance_4_x86_sse42 : ++#endif ++ &wuffs_png__decoder__filter_3_distance_4_fallback); ++ self->private_impl.choosy_filter_4 = ( ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ++ wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_4_arm_neon : ++#endif ++#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ++ wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_4_x86_sse42 : ++#endif ++ &wuffs_png__decoder__filter_4_distance_4_fallback); + } +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func netpbm.decoder.do_decode_frame_config ++// -------- func png.decoder.decode_other_chunk + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_frame_config( +- wuffs_netpbm__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++wuffs_png__decoder__decode_other_chunk( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ bool a_framy) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; +@@ -50273,62 +63411,218 @@ wuffs_netpbm__decoder__do_decode_frame_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_other_chunk; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if ((self->private_impl.f_chunk_type == 1163152464u) && ! a_framy) { ++ if (self->private_impl.f_seen_plte) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } else if (self->private_impl.f_color_type == 3u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_png__decoder__decode_plte(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if ((self->private_impl.f_color_type == 2u) || (self->private_impl.f_color_type == 6u)) { ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_netpbm__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ self->private_impl.f_seen_plte = true; ++ } else if ((self->private_impl.f_chunk_type & 32u) == 0u) { ++ if (self->private_impl.f_chunk_type != 1413563465u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- if (status.repr) { +- goto suspend; ++ } ++ if (self->private_impl.f_chunk_type == 1716082789u) { ++ if (self->private_impl.f_report_metadata_exif) { ++ if (self->private_impl.f_seen_exif) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_png__decoder__decode_exif(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_exif = true; + } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; ++ } else if ((self->private_impl.f_chunk_type == 1951945833u) || (self->private_impl.f_chunk_type == 1951942004u) || (self->private_impl.f_chunk_type == 1951945850u)) { ++ if (self->private_impl.f_report_metadata_kvp) { ++ self->private_impl.f_metadata_flavor = 4u; ++ self->private_impl.f_metadata_fourcc = 1263947851u; ++ self->private_impl.f_metadata_x = 0u; ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; ++ } ++ } else if ( ! a_framy) { ++ if (self->private_impl.f_chunk_type == 1280598881u) { ++ if (self->private_impl.f_seen_actl) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_png__decoder__decode_actl(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_actl = true; ++ } else if (self->private_impl.f_chunk_type == 1297238115u) { ++ if (self->private_impl.f_report_metadata_chrm) { ++ if (self->private_impl.f_seen_chrm) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_png__decoder__decode_chrm(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_chrm = true; ++ } ++ } else if (self->private_impl.f_chunk_type == 1280598886u) { ++ if (self->private_impl.f_seen_fctl) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ status = wuffs_png__decoder__decode_fctl(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_fctl = true; ++ } else if (self->private_impl.f_chunk_type == 1095582055u) { ++ if (self->private_impl.f_report_metadata_gama) { ++ if (self->private_impl.f_seen_gama) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ status = wuffs_png__decoder__decode_gama(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_gama = true; ++ } ++ } else if (self->private_impl.f_chunk_type == 1346585449u) { ++ if (self->private_impl.f_report_metadata_iccp) { ++ if (self->private_impl.f_seen_iccp) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ status = wuffs_png__decoder__decode_iccp(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_iccp = true; ++ } ++ } else if (self->private_impl.f_chunk_type == 1111970419u) { ++ if (self->private_impl.f_report_metadata_srgb) { ++ if (self->private_impl.f_seen_srgb) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_png__decoder__decode_srgb(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_seen_srgb = true; ++ } ++ } else if (self->private_impl.f_chunk_type == 1397641844u) { ++ if (self->private_impl.f_seen_trns || ((self->private_impl.f_color_type == 3u) && ! self->private_impl.f_seen_plte)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } else if (self->private_impl.f_color_type > 3u) { ++ } else { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_png__decoder__decode_trns(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ self->private_impl.f_seen_trns = true; + } +- } else if (self->private_impl.f_call_sequence == 64u) { +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; + } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height), +- ((wuffs_base__flicks)(0u)), +- 0u, +- self->private_impl.f_frame_config_io_position, +- 0u, +- false, +- false, +- 0u); ++ if (self->private_impl.f_metadata_fourcc == 0u) { ++ self->private_data.s_decode_other_chunk.scratch = self->private_impl.f_chunk_length; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (self->private_data.s_decode_other_chunk.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_decode_other_chunk.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_decode_other_chunk.scratch; + } +- self->private_impl.f_call_sequence = 64u; + ++ goto ok; + ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; ++ self->private_impl.p_decode_other_chunk = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_other_chunk = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -50339,181 +63633,130 @@ wuffs_netpbm__decoder__do_decode_frame_config( + return status; + } + +-// -------- func netpbm.decoder.decode_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__decode_frame( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } +- +- ok: +- self->private_impl.p_decode_frame[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} +- +-// -------- func netpbm.decoder.do_decode_frame ++// -------- func png.decoder.decode_actl + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_netpbm__decoder__do_decode_frame( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++wuffs_png__decoder__decode_actl( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_actl; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_netpbm__decoder__do_decode_frame_config(self, NULL, a_src); +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ if (self->private_impl.f_chunk_length != 8u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } else if (self->private_impl.f_interlace_pass > 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ goto exit; + } +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y = 0u; +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette(a_dst), +- wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), +- wuffs_base__utility__empty_slice_u8(), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; ++ self->private_impl.f_chunk_length = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_actl.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_actl.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } + } +- goto ok; ++ self->private_impl.f_num_animation_frames_value = t_0; + } +- while (true) { +- v_status = wuffs_netpbm__decoder__swizzle(self, a_dst, a_src); +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } else if (v_status.repr != wuffs_netpbm__note__internal_note_short_read) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; ++ if (self->private_impl.f_num_animation_frames_value == 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_actl.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_actl.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); + } +- goto ok; + } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ self->private_impl.f_num_animation_loops_value = t_1; + } +- self->private_impl.f_call_sequence = 96u; + ++ goto ok; + ok: +- self->private_impl.p_do_decode_frame[0] = 0; ++ self->private_impl.p_decode_actl = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_actl = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ + return status; + } + +-// -------- func netpbm.decoder.swizzle ++// -------- func png.decoder.decode_chrm + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_netpbm__decoder__swizzle( +- wuffs_netpbm__decoder* self, +- wuffs_base__pixel_buffer* a_dst, ++wuffs_png__decoder__decode_chrm( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- uint32_t v_src_bytes_per_pixel = 0; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_j = 0; +- uint64_t v_n = 0; ++ uint64_t v_u = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -50526,543 +63769,337 @@ wuffs_netpbm__decoder__swizzle( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- while (true) { +- if (self->private_impl.f_dst_x == self->private_impl.f_width) { +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += 1u; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- break; +- } +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ uint32_t coro_susp_point = self->private_impl.p_decode_chrm; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_chunk_length != 32u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i >= ((uint64_t)(v_dst.len))) { +- v_src_bytes_per_pixel = 1u; +- if (self->private_impl.f_pixfmt == 2684356744u) { +- v_src_bytes_per_pixel = 3u; +- } +- v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); +- v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); +- v_j = v_n; +- while (v_j >= 8u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 8u); ++ self->private_impl.f_chunk_length = 0u; ++ self->private_impl.f_metadata_flavor = 5u; ++ self->private_impl.f_metadata_fourcc = 1128813133u; ++ self->private_impl.f_metadata_x = 0u; ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); + } +- v_j -= 8u; + } +- while (v_j > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 1u); ++ v_u = t_0; ++ } ++ self->private_impl.f_metadata_x |= ((16777215u & v_u) << 0u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint64_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 24) { ++ t_1 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); + } +- v_j -= 1u; + } +- } else { +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( +- &self->private_impl.f_swizzler, +- wuffs_base__slice_u8__subslice_i(v_dst, v_i), +- wuffs_base__pixel_buffer__palette(a_dst), +- &iop_a_src, +- io2_a_src); +- } +- if (v_n == 0u) { +- status = wuffs_base__make_status(wuffs_netpbm__note__internal_note_short_read); +- goto ok; ++ v_u = t_1; + } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); +- } +- status = wuffs_base__make_status(NULL); +- goto ok; +- +- ok: +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func netpbm.decoder.frame_dirty_rect +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_netpbm__decoder__frame_dirty_rect( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- +- return wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height); +-} +- +-// -------- func netpbm.decoder.num_animation_loops +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_netpbm__decoder__num_animation_loops( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func netpbm.decoder.num_decoded_frame_configs +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__num_decoded_frame_configs( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- if (self->private_impl.f_call_sequence > 32u) { +- return 1u; +- } +- return 0u; +-} +- +-// -------- func netpbm.decoder.num_decoded_frames +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__num_decoded_frames( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- if (self->private_impl.f_call_sequence > 64u) { +- return 1u; +- } +- return 0u; +-} +- +-// -------- func netpbm.decoder.restart_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__restart_frame( +- wuffs_netpbm__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } +- if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- self->private_impl.f_call_sequence = 40u; +- return wuffs_base__make_status(NULL); +-} +- +-// -------- func netpbm.decoder.set_report_metadata +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_netpbm__decoder__set_report_metadata( +- wuffs_netpbm__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func netpbm.decoder.tell_me_more +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_netpbm__decoder__tell_me_more( +- wuffs_netpbm__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; +- +- goto ok; +- ok: +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} +- +-// -------- func netpbm.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_netpbm__decoder__history_retain_length( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func netpbm.decoder.workbuf_len +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_netpbm__decoder__workbuf_len( +- const wuffs_netpbm__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_nie__error__bad_header[] = "#nie: bad header"; +-const char wuffs_nie__error__truncated_input[] = "#nie: truncated input"; +-const char wuffs_nie__error__unsupported_nie_file[] = "#nie: unsupported NIE file"; +-const char wuffs_nie__note__internal_note_short_read[] = "@nie: internal note: short read"; +- +-// ---------------- Private Consts +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_nie__decoder__do_decode_image_config( +- wuffs_nie__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_nie__decoder__do_decode_frame_config( +- wuffs_nie__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_nie__decoder__do_decode_frame( +- wuffs_nie__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_nie__decoder__swizzle( +- wuffs_nie__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src); +- +-// ---------------- VTables +- +-const wuffs_base__image_decoder__func_ptrs +-wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_nie__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_nie__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_nie__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_nie__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_nie__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_nie__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_nie__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_nie__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_nie__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_nie__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_nie__decoder__initialize( +- wuffs_nie__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } +- +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ self->private_impl.f_metadata_x |= ((16777215u & v_u) << 24u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint64_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); ++ if (num_bits_2 == 24) { ++ t_2 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)); ++ } ++ } ++ v_u = t_2; + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ self->private_impl.f_metadata_x |= ((uint64_t)((16777215u & v_u) << 48u)); ++ self->private_impl.f_metadata_y |= ((16777215u & v_u) >> 16u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint64_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); ++ if (num_bits_3 == 24) { ++ t_3 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)); ++ } ++ } ++ v_u = t_3; + } +- } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_nie__decoder* +-wuffs_nie__decoder__alloc(void) { +- wuffs_nie__decoder* x = +- (wuffs_nie__decoder*)(calloc(sizeof(wuffs_nie__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_nie__decoder__initialize( +- x, sizeof(wuffs_nie__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} +- +-size_t +-sizeof__wuffs_nie__decoder(void) { +- return sizeof(wuffs_nie__decoder); +-} +- +-// ---------------- Function Implementations +- +-// -------- func nie.decoder.get_quirk ++ self->private_impl.f_metadata_y |= ((16777215u & v_u) << 8u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ uint64_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_4 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ if (num_bits_4 == 24) { ++ t_4 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)); ++ } ++ } ++ v_u = t_4; ++ } ++ self->private_impl.f_metadata_y |= ((16777215u & v_u) << 32u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ uint64_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_5 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); ++ if (num_bits_5 == 24) { ++ t_5 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)); ++ } ++ } ++ v_u = t_5; ++ } ++ self->private_impl.f_metadata_y |= ((uint64_t)((16777215u & v_u) << 56u)); ++ self->private_impl.f_metadata_z |= ((16777215u & v_u) >> 8u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ uint64_t t_6; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_6 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); ++ if (num_bits_6 == 24) { ++ t_6 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_6 += 8u; ++ *scratch |= ((uint64_t)(num_bits_6)); ++ } ++ } ++ v_u = t_6; ++ } ++ self->private_impl.f_metadata_z |= ((16777215u & v_u) << 16u); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ uint64_t t_7; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_7 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_chrm.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_chrm.scratch; ++ uint32_t num_bits_7 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_7); ++ if (num_bits_7 == 24) { ++ t_7 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_7 += 8u; ++ *scratch |= ((uint64_t)(num_bits_7)); ++ } ++ } ++ v_u = t_7; ++ } ++ self->private_impl.f_metadata_z |= ((16777215u & v_u) << 40u); + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__get_quirk( +- const wuffs_nie__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ goto ok; ++ ok: ++ self->private_impl.p_decode_chrm = 0; ++ goto exit; + } + +- return 0u; +-} +- +-// -------- func nie.decoder.set_quirk ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_chrm = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__set_quirk( +- wuffs_nie__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ return status; + } + +-// -------- func nie.decoder.decode_image_config ++// -------- func png.decoder.decode_exif + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_image_config( +- wuffs_nie__decoder* self, +- wuffs_base__image_config* a_dst, ++static wuffs_base__status ++wuffs_png__decoder__decode_exif( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_nie__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +- ok: +- self->private_impl.p_decode_image_config[0] = 0; ++ if (self->private_impl.f_chunk_length < 4u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } ++ self->private_impl.f_metadata_flavor = 3u; ++ self->private_impl.f_metadata_fourcc = 1163413830u; ++ self->private_impl.f_metadata_x = 0u; ++ self->private_impl.f_metadata_y = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ self->private_impl.f_metadata_z = wuffs_base__u64__sat_add(self->private_impl.f_metadata_y, ((uint64_t)(self->private_impl.f_chunk_length))); ++ self->private_impl.f_chunk_length = 0u; + +- goto suspend; +- suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; +- ++ goto ok; ++ ok: + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func nie.decoder.do_decode_image_config ++// -------- func png.decoder.decode_fctl + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_nie__decoder__do_decode_image_config( +- wuffs_nie__decoder* self, +- wuffs_base__image_config* a_dst, ++wuffs_png__decoder__decode_fctl( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_a = 0; ++ uint32_t v_x0 = 0; ++ uint32_t v_y0 = 0; ++ uint32_t v_x1 = 0; ++ uint32_t v_y1 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -51075,185 +64112,309 @@ wuffs_nie__decoder__do_decode_image_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_fctl; ++ if (coro_susp_point) { ++ v_x0 = self->private_data.s_decode_fctl.v_x0; ++ v_x1 = self->private_data.s_decode_fctl.v_x1; ++ v_y1 = self->private_data.s_decode_fctl.v_y1; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ if (self->private_impl.f_chunk_length != 26u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } ++ self->private_impl.f_chunk_length = 0u; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_0; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; ++ self->private_data.s_decode_fctl.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); + if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch)); ++ t_0 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ *scratch |= ((uint64_t)(num_bits_0)); + } + } +- v_a = t_0; ++ v_x0 = t_0; + } +- if (v_a != 1169146734u) { +- status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ if (v_x0 != self->private_impl.f_next_animation_seq_num) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); ++ goto exit; ++ } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); + goto exit; + } ++ self->private_impl.f_next_animation_seq_num += 1u; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; ++ self->private_data.s_decode_fctl.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); + if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch)); ++ t_1 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ *scratch |= ((uint64_t)(num_bits_1)); + } + } +- v_a = t_1; +- } +- if (v_a == 879649535u) { +- self->private_impl.f_pixfmt = 2164295816u; +- } else if (v_a == 946758399u) { +- self->private_impl.f_pixfmt = 2164308923u; +- } else if (v_a == 879780607u) { +- status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file); +- goto exit; +- } else if (v_a == 946889471u) { +- status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file); +- goto exit; +- } else { +- status = wuffs_base__make_status(wuffs_nie__error__bad_header); +- goto exit; ++ v_x1 = t_1; + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + uint32_t t_2; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; ++ self->private_data.s_decode_fctl.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); + if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch)); ++ t_2 = ((uint32_t)(*scratch >> 32)); + break; + } + num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ *scratch |= ((uint64_t)(num_bits_2)); + } + } +- v_a = t_2; +- } +- if (v_a > 2147483647u) { +- status = wuffs_base__make_status(wuffs_nie__error__bad_header); +- goto exit; +- } else if (v_a > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; ++ v_y1 = t_2; + } +- self->private_impl.f_width = v_a; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + uint32_t t_3; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; ++ self->private_data.s_decode_fctl.scratch = 0; + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)); ++ } ++ } ++ v_x0 = t_3; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_4 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_fctl.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); ++ if (num_bits_4 == 24) { ++ t_4 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)); ++ } ++ } ++ v_y0 = t_4; ++ } ++ v_x1 += v_x0; ++ v_y1 += v_y0; ++ if ((v_x0 >= v_x1) || ++ (v_x0 > self->private_impl.f_width) || ++ (v_x1 > self->private_impl.f_width) || ++ (v_y0 >= v_y1) || ++ (v_y0 > self->private_impl.f_height) || ++ (v_y1 > self->private_impl.f_height)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_frame_rect_x0 = v_x0; ++ self->private_impl.f_frame_rect_y0 = v_y0; ++ self->private_impl.f_frame_rect_x1 = v_x1; ++ self->private_impl.f_frame_rect_y1 = v_y1; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ uint32_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_fctl.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; + *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); ++ if (num_bits_5 == 8) { ++ t_5 = ((uint32_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)); ++ } ++ } ++ v_x0 = t_5; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ uint32_t t_6; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_6 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_fctl.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_fctl.scratch; ++ uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu)); + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch)); ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); ++ if (num_bits_6 == 8) { ++ t_6 = ((uint32_t)(*scratch >> 48)); + break; + } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ num_bits_6 += 8u; ++ *scratch |= ((uint64_t)(num_bits_6)); + } + } +- v_a = t_3; ++ v_x1 = t_6; + } +- if (v_a > 2147483647u) { +- status = wuffs_base__make_status(wuffs_nie__error__bad_header); ++ if (v_x1 <= 0u) { ++ self->private_impl.f_frame_duration = (((uint64_t)(v_x0)) * 7056000u); ++ } else { ++ self->private_impl.f_frame_duration = ((((uint64_t)(v_x0)) * 705600000u) / ((uint64_t)(v_x1))); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_7 = *iop_a_src++; ++ v_x0 = t_7; ++ } ++ if (v_x0 == 0u) { ++ self->private_impl.f_frame_disposal = 0u; ++ } else if (v_x0 == 1u) { ++ self->private_impl.f_frame_disposal = 1u; ++ } else if (v_x0 == 2u) { ++ self->private_impl.f_frame_disposal = 2u; ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; +- } else if (v_a > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_8 = *iop_a_src++; ++ v_x0 = t_8; ++ } ++ if (v_x0 == 0u) { ++ self->private_impl.f_frame_overwrite_instead_of_blend = true; ++ } else if (v_x0 == 1u) { ++ self->private_impl.f_frame_overwrite_instead_of_blend = false; ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } +- self->private_impl.f_height = v_a; +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- self->private_impl.f_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- 16u, +- false); ++ if (self->private_impl.f_num_decoded_frame_configs_value == 0u) { ++ self->private_impl.f_first_rect_x0 = self->private_impl.f_frame_rect_x0; ++ self->private_impl.f_first_rect_y0 = self->private_impl.f_frame_rect_y0; ++ self->private_impl.f_first_rect_x1 = self->private_impl.f_frame_rect_x1; ++ self->private_impl.f_first_rect_y1 = self->private_impl.f_frame_rect_y1; ++ self->private_impl.f_first_duration = self->private_impl.f_frame_duration; ++ self->private_impl.f_first_disposal = self->private_impl.f_frame_disposal; ++ self->private_impl.f_first_overwrite_instead_of_blend = self->private_impl.f_frame_overwrite_instead_of_blend; + } +- self->private_impl.f_call_sequence = 32u; + + goto ok; + ok: +- self->private_impl.p_do_decode_image_config[0] = 0; ++ self->private_impl.p_decode_fctl = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_fctl = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_fctl.v_x0 = v_x0; ++ self->private_data.s_decode_fctl.v_x1 = v_x1; ++ self->private_data.s_decode_fctl.v_y1 = v_y1; + + goto exit; + exit: +@@ -51264,82 +64425,99 @@ wuffs_nie__decoder__do_decode_image_config( + return status; + } + +-// -------- func nie.decoder.decode_frame_config ++// -------- func png.decoder.decode_gama + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_frame_config( +- wuffs_nie__decoder* self, +- wuffs_base__frame_config* a_dst, ++static wuffs_base__status ++wuffs_png__decoder__decode_gama( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_gama; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_nie__error__truncated_input); +- goto exit; ++ if (self->private_impl.f_chunk_length != 4u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length = 0u; ++ self->private_impl.f_metadata_flavor = 5u; ++ self->private_impl.f_metadata_fourcc = 1195461953u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_gama.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_gama.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint64_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ self->private_impl.f_metadata_x = t_0; + } ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; + ++ goto ok; + ok: +- self->private_impl.p_decode_frame_config[0] = 0; ++ self->private_impl.p_decode_gama = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ self->private_impl.p_decode_gama = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func nie.decoder.do_decode_frame_config ++// -------- func png.decoder.decode_iccp + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_nie__decoder__do_decode_frame_config( +- wuffs_nie__decoder* self, +- wuffs_base__frame_config* a_dst, ++wuffs_png__decoder__decode_iccp( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + ++ uint8_t v_c8 = 0; ++ + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -51351,62 +64529,63 @@ wuffs_nie__decoder__do_decode_frame_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_iccp; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ while (true) { ++ if (self->private_impl.f_chunk_length <= 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_nie__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ self->private_impl.f_chunk_length -= 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- if (status.repr) { +- goto suspend; ++ if (v_c8 == 0u) { ++ break; + } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (16u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; ++ } ++ if (self->private_impl.f_chunk_length <= 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- } else if (self->private_impl.f_call_sequence == 64u) { +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; + } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height), +- ((wuffs_base__flicks)(0u)), +- 0u, +- 16u, +- 0u, +- false, +- false, +- 0u); ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); ++ goto exit; + } +- self->private_impl.f_call_sequence = 64u; ++ self->private_impl.f_metadata_is_zlib_compressed = true; ++ self->private_impl.f_metadata_flavor = 4u; ++ self->private_impl.f_metadata_fourcc = 1229144912u; ++ self->private_impl.f_metadata_x = 0u; ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; + ++ goto ok; + ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; ++ self->private_impl.p_decode_iccp = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_iccp = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -51417,182 +64596,119 @@ wuffs_nie__decoder__do_decode_frame_config( + return status; + } + +-// -------- func nie.decoder.decode_frame ++// -------- func png.decoder.decode_plte + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__decode_frame( +- wuffs_nie__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; ++static wuffs_base__status ++wuffs_png__decoder__decode_plte( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_nie__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++ uint32_t v_num_entries = 0; ++ uint32_t v_i = 0; ++ uint32_t v_argb = 0; + +- ok: +- self->private_impl.p_decode_frame[0] = 0; +- goto exit; ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ uint32_t coro_susp_point = self->private_impl.p_decode_plte; ++ if (coro_susp_point) { ++ v_num_entries = self->private_data.s_decode_plte.v_num_entries; ++ v_i = self->private_data.s_decode_plte.v_i; + } +- return status; +-} +- +-// -------- func nie.decoder.do_decode_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_nie__decoder__do_decode_frame( +- wuffs_nie__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_nie__decoder__do_decode_frame_config(self, NULL, a_src); +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y = 0u; +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette(a_dst), +- wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), +- wuffs_base__utility__empty_slice_u8(), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; ++ if ((self->private_impl.f_chunk_length > 768u) || ((self->private_impl.f_chunk_length % 3u) != 0u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- while (true) { +- v_status = wuffs_nie__decoder__swizzle(self, a_dst, a_src); +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } else if (v_status.repr != wuffs_nie__note__internal_note_short_read) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; ++ v_num_entries = (((uint32_t)(self->private_impl.f_chunk_length)) / 3u); ++ self->private_impl.f_chunk_length = 0u; ++ while (v_i < v_num_entries) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { ++ t_0 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); ++ iop_a_src += 3; ++ } else { ++ self->private_data.s_decode_plte.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_plte.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 16) { ++ t_0 = ((uint32_t)(*scratch >> 40)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } + } +- goto ok; ++ v_argb = t_0; + } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ v_argb |= 4278190080u; ++ self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); ++ self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); ++ self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); ++ v_i += 1u; ++ } ++ while (v_i < 256u) { ++ self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u; ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u; ++ v_i += 1u; + } +- self->private_impl.f_call_sequence = 96u; + ++ goto ok; + ok: +- self->private_impl.p_do_decode_frame[0] = 0; ++ self->private_impl.p_decode_plte = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_plte = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_plte.v_num_entries = v_num_entries; ++ self->private_data.s_decode_plte.v_i = v_i; + + goto exit; + exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ + return status; + } + +-// -------- func nie.decoder.swizzle ++// -------- func png.decoder.decode_srgb + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_nie__decoder__swizzle( +- wuffs_nie__decoder* self, +- wuffs_base__pixel_buffer* a_dst, ++wuffs_png__decoder__decode_srgb( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint32_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row = 0; +- uint32_t v_src_bytes_per_pixel = 0; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_i = 0; +- uint64_t v_j = 0; +- uint64_t v_n = 0; +- + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -51604,66 +64720,39 @@ wuffs_nie__decoder__swizzle( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); +- v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- while (true) { +- if (self->private_impl.f_dst_x == self->private_impl.f_width) { +- self->private_impl.f_dst_x = 0u; +- self->private_impl.f_dst_y += 1u; +- if (self->private_impl.f_dst_y >= self->private_impl.f_height) { +- break; +- } +- } +- v_dst = wuffs_base__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); +- if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); +- } +- v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); +- if (v_i >= ((uint64_t)(v_dst.len))) { +- v_src_bytes_per_pixel = 4u; +- if (self->private_impl.f_pixfmt == 2164308923u) { +- v_src_bytes_per_pixel = 8u; +- } +- v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel))); +- v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x))))); +- v_j = v_n; +- while (v_j >= 8u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 8u); +- } +- v_j -= 8u; +- } +- while (v_j > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) { +- iop_a_src += (v_src_bytes_per_pixel * 1u); +- } +- v_j -= 1u; +- } +- } else { +- v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader( +- &self->private_impl.f_swizzler, +- wuffs_base__slice_u8__subslice_i(v_dst, v_i), +- wuffs_base__pixel_buffer__palette(a_dst), +- &iop_a_src, +- io2_a_src); ++ uint32_t coro_susp_point = self->private_impl.p_decode_srgb; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_chunk_length != 1u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- if (v_n == 0u) { +- status = wuffs_base__make_status(wuffs_nie__note__internal_note_short_read); +- goto ok; ++ self->private_impl.f_chunk_length = 0u; ++ self->private_impl.f_metadata_flavor = 5u; ++ self->private_impl.f_metadata_fourcc = 1397901122u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t t_0 = *iop_a_src++; ++ self->private_impl.f_metadata_x = t_0; + } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n))); ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_srgb = 0; ++ goto exit; + } +- status = wuffs_base__make_status(NULL); +- goto ok; + +- ok: ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_srgb = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ + goto exit; + exit: + if (a_src && a_src->data.ptr) { +@@ -51673,131 +64762,199 @@ wuffs_nie__decoder__swizzle( + return status; + } + +-// -------- func nie.decoder.frame_dirty_rect +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_nie__decoder__frame_dirty_rect( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- +- return wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height); +-} +- +-// -------- func nie.decoder.num_animation_loops ++// -------- func png.decoder.decode_trns + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_nie__decoder__num_animation_loops( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} ++static wuffs_base__status ++wuffs_png__decoder__decode_trns( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// -------- func nie.decoder.num_decoded_frame_configs ++ uint32_t v_i = 0; ++ uint32_t v_n = 0; ++ uint64_t v_u = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__num_decoded_frame_configs( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- if (self->private_impl.f_call_sequence > 32u) { +- return 1u; ++ uint32_t coro_susp_point = self->private_impl.p_decode_trns; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_decode_trns.v_i; ++ v_n = self->private_data.s_decode_trns.v_n; + } +- return 0u; +-} +- +-// -------- func nie.decoder.num_decoded_frames ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__num_decoded_frames( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ if (self->private_impl.f_color_type == 0u) { ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); ++ if (self->private_impl.f_depth <= 8u) { ++ self->private_impl.f_dst_pixfmt = 2164295816u; ++ self->private_impl.f_src_pixfmt = 2164295816u; ++ } else { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ } ++ if (self->private_impl.f_chunk_length != 2u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_decode_trns.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_trns.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 8) { ++ t_0 = ((uint64_t)(*scratch >> 48)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ v_u = t_0; ++ } ++ if (self->private_impl.f_depth <= 1u) { ++ self->private_impl.f_remap_transparency = (((v_u & 1u) * 16777215u) | 4278190080u); ++ } else if (self->private_impl.f_depth <= 2u) { ++ self->private_impl.f_remap_transparency = (((v_u & 3u) * 5592405u) | 4278190080u); ++ } else if (self->private_impl.f_depth <= 4u) { ++ self->private_impl.f_remap_transparency = (((v_u & 15u) * 1118481u) | 4278190080u); ++ } else if (self->private_impl.f_depth <= 8u) { ++ self->private_impl.f_remap_transparency = (((v_u & 255u) * 65793u) | 4278190080u); ++ } else { ++ self->private_impl.f_remap_transparency = ((v_u * 4295032833u) | 18446462598732840960u); ++ } ++ } else if (self->private_impl.f_color_type == 2u) { ++ self->private_impl.choosy_filter_and_swizzle = ( ++ &wuffs_png__decoder__filter_and_swizzle_tricky); ++ if (self->private_impl.f_depth <= 8u) { ++ self->private_impl.f_dst_pixfmt = 2164295816u; ++ self->private_impl.f_src_pixfmt = 2164295816u; ++ } else { ++ self->private_impl.f_dst_pixfmt = 2164308923u; ++ self->private_impl.f_src_pixfmt = 2164308923u; ++ } ++ if (self->private_impl.f_chunk_length != 6u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length = 0u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint64_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) { ++ t_1 = ((uint64_t)(wuffs_base__peek_u48be__no_bounds_check(iop_a_src))); ++ iop_a_src += 6; ++ } else { ++ self->private_data.s_decode_trns.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_trns.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 40) { ++ t_1 = ((uint64_t)(*scratch >> 16)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); ++ } ++ } ++ v_u = t_1; ++ } ++ if (self->private_impl.f_depth <= 8u) { ++ self->private_impl.f_remap_transparency = ((255u & (v_u >> 0u)) | ++ (65280u & (v_u >> 8u)) | ++ (16711680u & (v_u >> 16u)) | ++ 4278190080u); ++ } else { ++ self->private_impl.f_remap_transparency = (v_u | 18446462598732840960u); ++ } ++ } else if (self->private_impl.f_color_type == 3u) { ++ self->private_impl.f_dst_pixfmt = 2164523016u; ++ self->private_impl.f_src_pixfmt = 2164523016u; ++ if (self->private_impl.f_chunk_length > 256u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ v_n = ((uint32_t)(self->private_impl.f_chunk_length)); ++ self->private_impl.f_chunk_length = 0u; ++ while (v_i < v_n) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ self->private_data.f_src_palette[((4u * v_i) + 3u)] = t_2; ++ } ++ v_i += 1u; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } + +- if (self->private_impl.f_call_sequence > 64u) { +- return 1u; ++ goto ok; ++ ok: ++ self->private_impl.p_decode_trns = 0; ++ goto exit; + } +- return 0u; +-} +- +-// -------- func nie.decoder.restart_frame + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__restart_frame( +- wuffs_nie__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_trns = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_trns.v_i = v_i; ++ self->private_data.s_decode_trns.v_n = v_n; + +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } +- if ((a_index != 0u) || (a_io_position != 16u)) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- self->private_impl.f_call_sequence = 40u; +- return wuffs_base__make_status(NULL); +-} + +-// -------- func nie.decoder.set_report_metadata +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_nie__decoder__set_report_metadata( +- wuffs_nie__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { +- return wuffs_base__make_empty_struct(); ++ return status; + } + +-// -------- func nie.decoder.tell_me_more ++// -------- func png.decoder.decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_nie__decoder__tell_me_more( +- wuffs_nie__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, ++wuffs_png__decoder__decode_frame_config( ++ wuffs_png__decoder* self, ++ wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); +@@ -51808,354 +64965,485 @@ wuffs_nie__decoder__tell_me_more( + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } +- if (!a_dst || !a_src) { ++ if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { ++ (self->private_impl.active_coroutine != 2)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } + self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; +- +- goto ok; +- ok: +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} +- +-// -------- func nie.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_nie__decoder__history_retain_length( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func nie.decoder.workbuf_len +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_nie__decoder__workbuf_len( +- const wuffs_nie__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); +- } +- +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_zlib__note__dictionary_required[] = "@zlib: dictionary required"; +-const char wuffs_zlib__error__bad_checksum[] = "#zlib: bad checksum"; +-const char wuffs_zlib__error__bad_compression_method[] = "#zlib: bad compression method"; +-const char wuffs_zlib__error__bad_compression_window_size[] = "#zlib: bad compression window size"; +-const char wuffs_zlib__error__bad_parity_check[] = "#zlib: bad parity check"; +-const char wuffs_zlib__error__incorrect_dictionary[] = "#zlib: incorrect dictionary"; +-const char wuffs_zlib__error__truncated_input[] = "#zlib: truncated input"; +- +-// ---------------- Private Consts +- +-#define WUFFS_ZLIB__QUIRKS_BASE 2113790976 +- +-#define WUFFS_ZLIB__QUIRKS_COUNT 1 +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_zlib__decoder__do_transform_io( +- wuffs_zlib__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); +- +-// ---------------- VTables +- +-const wuffs_base__io_transformer__func_ptrs +-wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer = { +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_zlib__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_zlib__decoder__history_retain_length), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_zlib__decoder__set_quirk), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__slice_u8))(&wuffs_zlib__decoder__transform_io), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_zlib__decoder__workbuf_len), +-}; +- +-// ---------------- Initializer Implementations +- +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_zlib__decoder__initialize( +- wuffs_zlib__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); +- } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); +- } ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } +- } ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- { +- wuffs_base__status z = wuffs_adler32__hasher__initialize( +- &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options); +- if (z.repr) { +- return z; +- } +- } +- { +- wuffs_base__status z = wuffs_adler32__hasher__initialize( +- &self->private_data.f_dict_id_hasher, sizeof(self->private_data.f_dict_id_hasher), WUFFS_VERSION, options); +- if (z.repr) { +- return z; +- } +- } +- { +- wuffs_base__status z = wuffs_deflate__decoder__initialize( +- &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options); +- if (z.repr) { +- return z; ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- } +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = +- wuffs_base__io_transformer__vtable_name; +- self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = +- (const void*)(&wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_zlib__decoder* +-wuffs_zlib__decoder__alloc(void) { +- wuffs_zlib__decoder* x = +- (wuffs_zlib__decoder*)(calloc(sizeof(wuffs_zlib__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_zlib__decoder__initialize( +- x, sizeof(wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; +- } +- return x; +-} +- +-size_t +-sizeof__wuffs_zlib__decoder(void) { +- return sizeof(wuffs_zlib__decoder); +-} +- +-// ---------------- Function Implementations +- +-// -------- func zlib.decoder.dictionary_id +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_zlib__decoder__dictionary_id( +- const wuffs_zlib__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return self->private_impl.f_dict_id_want; +-} + +-// -------- func zlib.decoder.add_dictionary +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_zlib__decoder__add_dictionary( +- wuffs_zlib__decoder* self, +- wuffs_base__slice_u8 a_dict) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; + } + +- if (self->private_impl.f_header_complete) { +- self->private_impl.f_bad_call_sequence = true; +- } else { +- self->private_impl.f_dict_id_got = wuffs_adler32__hasher__update_u32(&self->private_data.f_dict_id_hasher, a_dict); +- wuffs_deflate__decoder__add_history(&self->private_data.f_flate, a_dict); ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- self->private_impl.f_got_dictionary = true; +- return wuffs_base__make_empty_struct(); ++ return status; + } + +-// -------- func zlib.decoder.get_quirk ++// -------- func png.decoder.do_decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_zlib__decoder__get_quirk( +- const wuffs_zlib__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++static wuffs_base__status ++wuffs_png__decoder__do_decode_frame_config( ++ wuffs_png__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_checksum_have = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t v_key = 0; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { +- return 1u; +- } else if (a_key >= 2113790976u) { +- v_key = (a_key - 2113790976u); +- if (v_key < 1u) { +- if (self->private_impl.f_quirks[v_key]) { +- return 1u; ++ if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_png__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_png__decoder__skip_frame(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (self->private_impl.f_metadata_fourcc != 0u) { ++ self->private_impl.f_call_sequence = 48u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; ++ } ++ if (self->private_impl.f_num_decoded_frame_configs_value == 0u) { ++ self->private_impl.f_frame_rect_x0 = self->private_impl.f_first_rect_x0; ++ self->private_impl.f_frame_rect_y0 = self->private_impl.f_first_rect_y0; ++ self->private_impl.f_frame_rect_x1 = self->private_impl.f_first_rect_x1; ++ self->private_impl.f_frame_rect_y1 = self->private_impl.f_first_rect_y1; ++ self->private_impl.f_frame_config_io_position = self->private_impl.f_first_config_io_position; ++ self->private_impl.f_frame_duration = self->private_impl.f_first_duration; ++ self->private_impl.f_frame_disposal = self->private_impl.f_first_disposal; ++ self->private_impl.f_frame_overwrite_instead_of_blend = self->private_impl.f_first_overwrite_instead_of_blend; ++ } else { ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_frame_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ self->private_impl.f_chunk_length = t_0; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_frame_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ self->private_impl.f_chunk_type = t_1; ++ } ++ if (self->private_impl.f_chunk_type == 1145980233u) { ++ if (self->private_impl.f_chunk_length != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_frame_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ v_checksum_have = t_2; ++ } ++ if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != 2187346606u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_checksum); ++ goto exit; ++ } ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else if (self->private_impl.f_chunk_type == 1413571686u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } else if (self->private_impl.f_chunk_type == 1280598886u) { ++ self->private_impl.f_frame_config_io_position = ((uint64_t)(wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) - 8u)); ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_png__decoder__decode_fctl(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_data.s_do_decode_frame_config.scratch = 4u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (self->private_data.s_do_decode_frame_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame_config.scratch; ++ break; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ status = wuffs_png__decoder__decode_other_chunk(self, a_src, true); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_metadata_fourcc != 0u) { ++ self->private_impl.f_call_sequence = 48u; ++ status = wuffs_base__make_status(wuffs_base__note__metadata_reported); ++ goto ok; ++ } ++ self->private_data.s_do_decode_frame_config.scratch = 4u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (self->private_data.s_do_decode_frame_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame_config.scratch; ++ self->private_impl.f_chunk_length = 0u; + } + } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ self->private_impl.f_frame_rect_x0, ++ self->private_impl.f_frame_rect_y0, ++ self->private_impl.f_frame_rect_x1, ++ self->private_impl.f_frame_rect_y1), ++ ((wuffs_base__flicks)(self->private_impl.f_frame_duration)), ++ ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)), ++ self->private_impl.f_frame_config_io_position, ++ self->private_impl.f_frame_disposal, ++ ((self->private_impl.f_color_type <= 3u) && ! self->private_impl.f_seen_trns), ++ self->private_impl.f_frame_overwrite_instead_of_blend, ++ 0u); ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u); ++ self->private_impl.f_call_sequence = 64u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; + } +- return 0u; +-} + +-// -------- func zlib.decoder.set_quirk ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_zlib__decoder__set_quirk( +- wuffs_zlib__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- if (self->private_impl.f_header_complete) { +- self->private_impl.f_bad_call_sequence = true; +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } else if (a_key == 1u) { +- self->private_impl.f_ignore_checksum = (a_value > 0u); +- return wuffs_base__make_status(NULL); +- } else if (a_key >= 2113790976u) { +- a_key -= 2113790976u; +- if (a_key < 1u) { +- self->private_impl.f_quirks[a_key] = (a_value > 0u); +- return wuffs_base__make_status(NULL); +- } +- } +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ return status; + } + +-// -------- func zlib.decoder.history_retain_length ++// -------- func png.decoder.skip_frame + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_zlib__decoder__history_retain_length( +- const wuffs_zlib__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++static wuffs_base__status ++wuffs_png__decoder__skip_frame( ++ wuffs_png__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_seq_num = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- return 0u; +-} ++ uint32_t coro_susp_point = self->private_impl.p_skip_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-// -------- func zlib.decoder.workbuf_len ++ self->private_impl.f_chunk_type_array[0u] = 0u; ++ self->private_impl.f_chunk_type_array[1u] = 0u; ++ self->private_impl.f_chunk_type_array[2u] = 0u; ++ self->private_impl.f_chunk_type_array[3u] = 0u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ continue; ++ } ++ self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); ++ if (self->private_impl.f_chunk_type == 1413563465u) { ++ if (self->private_impl.f_chunk_type_array[0u] == 102u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_type_array[0u] = 73u; ++ self->private_impl.f_chunk_type_array[1u] = 68u; ++ self->private_impl.f_chunk_type_array[2u] = 65u; ++ self->private_impl.f_chunk_type_array[3u] = 84u; ++ } else if (self->private_impl.f_chunk_type == 1413571686u) { ++ if (self->private_impl.f_chunk_type_array[0u] == 73u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_type_array[0u] = 102u; ++ self->private_impl.f_chunk_type_array[1u] = 100u; ++ self->private_impl.f_chunk_type_array[2u] = 65u; ++ self->private_impl.f_chunk_type_array[3u] = 84u; ++ if (self->private_impl.f_chunk_length < 4u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 4u; ++ iop_a_src += 8u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_skip_frame.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_skip_frame.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ v_seq_num = t_0; ++ } ++ if (v_seq_num != self->private_impl.f_next_animation_seq_num) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); ++ goto exit; ++ } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ goto exit; ++ } ++ self->private_impl.f_next_animation_seq_num += 1u; ++ self->private_data.s_skip_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 4u); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_skip_frame.scratch; ++ self->private_impl.f_chunk_length = 0u; ++ continue; ++ } else if (self->private_impl.f_chunk_type_array[0u] != 0u) { ++ break; ++ } else if (self->private_impl.f_chunk_type == 1280598886u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_data.s_skip_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_skip_frame.scratch; ++ self->private_impl.f_chunk_length = 0u; ++ } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ self->private_impl.f_call_sequence = 32u; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_zlib__decoder__workbuf_len( +- const wuffs_zlib__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ ok: ++ self->private_impl.p_skip_frame = 0; ++ goto exit; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_skip_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return wuffs_base__utility__make_range_ii_u64(1u, 1u); ++ return status; + } + +-// -------- func zlib.decoder.transform_io ++// -------- func png.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_zlib__decoder__transform_io( +- wuffs_zlib__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_png__decoder__decode_frame( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -52170,7 +65458,7 @@ wuffs_zlib__decoder__transform_io( + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { ++ (self->private_impl.active_coroutine != 3)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -52179,71 +65467,312 @@ wuffs_zlib__decoder__transform_io( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_transform_io[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func png.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_png__decoder__do_decode_frame( ++ wuffs_png__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_seq_num = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_pass_width = 0; ++ uint32_t v_pass_height = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + ++ if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } else if (self->private_impl.f_call_sequence >= 96u) { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else if (self->private_impl.f_call_sequence != 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_png__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } + while (true) { +- { +- wuffs_base__status t_0 = wuffs_zlib__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); +- v_status = t_0; ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ continue; + } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_zlib__error__truncated_input); ++ self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); ++ if (self->private_impl.f_chunk_type == 1413563465u) { ++ self->private_impl.f_chunk_type_array[0u] = 73u; ++ self->private_impl.f_chunk_type_array[1u] = 68u; ++ self->private_impl.f_chunk_type_array[2u] = 65u; ++ self->private_impl.f_chunk_type_array[3u] = 84u; ++ iop_a_src += 8u; ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); ++ } ++ break; ++ } else if (self->private_impl.f_chunk_type == 1413571686u) { ++ self->private_impl.f_chunk_type_array[0u] = 102u; ++ self->private_impl.f_chunk_type_array[1u] = 100u; ++ self->private_impl.f_chunk_type_array[2u] = 65u; ++ self->private_impl.f_chunk_type_array[3u] = 84u; ++ if (self->private_impl.f_chunk_length < 4u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 4u; ++ iop_a_src += 8u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_frame.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ } ++ v_seq_num = t_0; ++ } ++ if (v_seq_num != self->private_impl.f_next_animation_seq_num) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); ++ goto exit; ++ } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ goto exit; ++ } ++ self->private_impl.f_next_animation_seq_num += 1u; ++ break; ++ } else if (self->private_impl.f_chunk_type == 1280598886u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); + goto exit; + } ++ self->private_data.s_do_decode_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame.scratch; ++ self->private_impl.f_chunk_length = 0u; ++ } ++ if (self->private_impl.f_zlib_is_dirty) { ++ wuffs_private_impl__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib, ++ sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ if (self->private_impl.f_ignore_checksum) { ++ wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u); ++ } ++ } ++ self->private_impl.f_zlib_is_dirty = true; ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), ++ wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { + status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ self->private_impl.f_workbuf_hist_pos_base = 0u; ++ while (true) { ++ if (self->private_impl.f_chunk_type_array[0u] == 73u) { ++ v_pass_width = (16777215u & ((((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][1u])) + self->private_impl.f_width) >> WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u])); ++ v_pass_height = (16777215u & ((((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][4u])) + self->private_impl.f_height) >> WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3u])); ++ } else { ++ v_pass_width = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_x1 - self->private_impl.f_frame_rect_x0))); ++ v_pass_height = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_y1 - self->private_impl.f_frame_rect_y0))); ++ } ++ if ((v_pass_width > 0u) && (v_pass_height > 0u)) { ++ self->private_impl.f_pass_bytes_per_row = wuffs_png__decoder__calculate_bytes_per_row(self, v_pass_width); ++ self->private_impl.f_pass_workbuf_length = (((uint64_t)(v_pass_height)) * (1u + self->private_impl.f_pass_bytes_per_row)); ++ while (true) { ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_1 = wuffs_png__decoder__decode_pass(self, a_src, a_workbuf); ++ v_status = t_1; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if (wuffs_base__status__is_error(&v_status) || ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed))) { ++ if (self->private_impl.f_workbuf_wi <= ((uint64_t)(a_workbuf.len))) { ++ wuffs_png__decoder__filter_and_swizzle(self, a_dst, wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_workbuf_wi)); ++ } ++ if (v_status.repr == wuffs_base__suspension__short_read) { ++ status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ goto exit; ++ } ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ } ++ v_status = wuffs_png__decoder__filter_and_swizzle(self, a_dst, a_workbuf); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ self->private_impl.f_workbuf_hist_pos_base += self->private_impl.f_pass_workbuf_length; ++ } ++ if ((self->private_impl.f_interlace_pass == 0u) || (self->private_impl.f_interlace_pass >= 7u)) { ++ break; ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_interlace_pass += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif + } ++ wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); ++ self->private_impl.f_call_sequence = 32u; + + ok: +- self->private_impl.p_transform_io[0] = 0; ++ self->private_impl.p_do_decode_frame = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func zlib.decoder.do_transform_io ++// -------- func png.decoder.decode_pass + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_zlib__decoder__do_transform_io( +- wuffs_zlib__decoder* self, +- wuffs_base__io_buffer* a_dst, ++wuffs_png__decoder__decode_pass( ++ wuffs_png__decoder* self, + wuffs_base__io_buffer* a_src, + wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint16_t v_x = 0; +- uint32_t v_checksum_got = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_w = &u_w; ++ uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint64_t v_w_mark = 0; ++ uint64_t v_r_mark = 0; ++ wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL); ++ uint32_t v_checksum_have = 0; + uint32_t v_checksum_want = 0; +- uint64_t v_mark = 0; ++ uint32_t v_seq_num = 0; + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -52255,77 +65784,93 @@ wuffs_zlib__decoder__do_transform_io( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_transform_io[0]; +- if (coro_susp_point) { +- v_checksum_got = self->private_data.s_do_transform_io[0].v_checksum_got; +- } ++ uint32_t coro_susp_point = self->private_impl.p_decode_pass; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_bad_call_sequence) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if (self->private_impl.f_quirks[0u]) { +- } else if ( ! self->private_impl.f_want_dictionary) { ++ self->private_impl.f_workbuf_wi = 0u; ++ while (true) { ++ if ((self->private_impl.f_workbuf_wi > self->private_impl.f_pass_workbuf_length) || (self->private_impl.f_pass_workbuf_length > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint16_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_transform_io[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ wuffs_base__io_buffer* o_0_v_w = v_w; ++ uint8_t* o_0_iop_v_w = iop_v_w; ++ uint8_t* o_0_io0_v_w = io0_v_w; ++ uint8_t* o_0_io1_v_w = io1_v_w; ++ uint8_t* o_0_io2_v_w = io2_v_w; ++ v_w = wuffs_private_impl__io_writer__set( ++ &u_w, ++ &iop_v_w, ++ &io0_v_w, ++ &io1_v_w, ++ &io2_v_w, ++ wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ self->private_impl.f_workbuf_wi, ++ self->private_impl.f_pass_workbuf_length), ++ ((uint64_t)(self->private_impl.f_workbuf_hist_pos_base + self->private_impl.f_workbuf_wi))); ++ { ++ const bool o_1_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_1_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; ++ } ++ v_w_mark = ((uint64_t)(iop_v_w - io0_v_w)); ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr)); ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 8) { +- t_0 = ((uint16_t)(*scratch >> 48)); +- break; ++ wuffs_base__status t_0 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, v_w, a_src, wuffs_base__utility__empty_slice_u8()); ++ v_zlib_status = t_0; ++ iop_v_w = u_w.data.ptr + u_w.meta.wi; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_workbuf_wi, wuffs_private_impl__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w)))); ++ io2_a_src = o_1_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_1_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); + } + } +- v_x = t_0; +- } +- if (((v_x >> 8u) & 15u) != 8u) { +- status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_method); +- goto exit; +- } +- if ((v_x >> 12u) > 7u) { +- status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_window_size); +- goto exit; +- } +- if ((v_x % 31u) != 0u) { +- status = wuffs_base__make_status(wuffs_zlib__error__bad_parity_check); +- goto exit; ++ v_w = o_0_v_w; ++ iop_v_w = o_0_iop_v_w; ++ io0_v_w = o_0_io0_v_w; ++ io1_v_w = o_0_io1_v_w; ++ io2_v_w = o_0_io2_v_w; + } +- self->private_impl.f_want_dictionary = ((v_x & 32u) != 0u); +- if (self->private_impl.f_want_dictionary) { +- self->private_impl.f_dict_id_got = 1u; ++ if (wuffs_base__status__is_ok(&v_zlib_status)) { ++ if (self->private_impl.f_chunk_length > 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__too_much_data); ++ goto exit; ++ } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); + uint32_t t_1; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { + t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); + iop_a_src += 4; + } else { +- self->private_data.s_do_transform_io[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ self->private_data.s_decode_pass.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; ++ uint64_t* scratch = &self->private_data.s_decode_pass.scratch; + uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); + *scratch >>= 8; + *scratch <<= 8; +@@ -52338,101 +65883,208 @@ wuffs_zlib__decoder__do_transform_io( + *scratch |= ((uint64_t)(num_bits_1)); + } + } +- self->private_impl.f_dict_id_want = t_1; ++ v_checksum_want = t_1; + } +- status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required); +- goto ok; +- } else if (self->private_impl.f_got_dictionary) { +- status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary); +- goto exit; +- } +- } else if (self->private_impl.f_dict_id_got != self->private_impl.f_dict_id_want) { +- if (self->private_impl.f_got_dictionary) { +- status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary); ++ if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8()); ++ if (v_checksum_have != v_checksum_want) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_checksum); ++ goto exit; ++ } ++ } ++ break; ++ } else if (v_zlib_status.repr == wuffs_base__suspension__short_write) { ++ if ((1u <= self->private_impl.f_interlace_pass) && (self->private_impl.f_interlace_pass <= 6u)) { ++ break; ++ } ++ status = wuffs_base__make_status(wuffs_base__error__too_much_data); + goto exit; +- } +- status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required); +- goto ok; +- } +- self->private_impl.f_header_complete = true; +- while (true) { +- v_mark = ((uint64_t)(iop_a_dst - io0_a_dst)); +- { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } else if (v_zlib_status.repr != wuffs_base__suspension__short_read) { ++ status = v_zlib_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; + } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ goto ok; ++ } else if (self->private_impl.f_chunk_length == 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_pass.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_pass.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)); ++ } ++ } ++ v_checksum_want = t_2; + } +- wuffs_base__status t_2 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf); +- v_status = t_2; +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) { ++ v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8()); ++ if (v_checksum_have != v_checksum_want) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_checksum); ++ goto exit; ++ } + } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_pass.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_pass.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)); ++ } ++ } ++ self->private_impl.f_chunk_length = t_3; + } +- } +- if ( ! self->private_impl.f_ignore_checksum && ! self->private_impl.f_quirks[0u]) { +- v_checksum_got = wuffs_adler32__hasher__update_u32(&self->private_data.f_checksum, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); +- } +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- } +- if ( ! self->private_impl.f_quirks[0u]) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_transform_io[0].scratch = 0; ++ { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ uint32_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_pass.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_pass.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 24) { ++ t_4 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_4 += 8u; ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; + } +- uint64_t* scratch = &self->private_data.s_do_transform_io[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch >> 32)); +- break; ++ } ++ self->private_impl.f_chunk_type = t_4; ++ } ++ if (self->private_impl.f_chunk_type_array[0u] == 73u) { ++ if (self->private_impl.f_chunk_type != 1413563465u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); ++ } ++ } else { ++ if ((self->private_impl.f_chunk_type != 1413571686u) || (self->private_impl.f_chunk_length < 4u)) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 4u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ uint32_t t_5; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_pass.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_pass.scratch; ++ uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); ++ if (num_bits_5 == 24) { ++ t_5 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_5 += 8u; ++ *scratch |= ((uint64_t)(num_bits_5)); ++ } + } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)); ++ v_seq_num = t_5; ++ } ++ if (v_seq_num != self->private_impl.f_next_animation_seq_num) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); ++ goto exit; ++ } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ goto exit; + } ++ self->private_impl.f_next_animation_seq_num += 1u; + } +- v_checksum_want = t_3; +- } +- if ( ! self->private_impl.f_ignore_checksum && (v_checksum_got != v_checksum_want)) { +- status = wuffs_base__make_status(wuffs_zlib__error__bad_checksum); ++ continue; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) > 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input); + goto exit; + } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); ++ } ++ if (self->private_impl.f_workbuf_wi != self->private_impl.f_pass_workbuf_length) { ++ status = wuffs_base__make_status(wuffs_base__error__not_enough_data); ++ goto exit; ++ } else if (0u < ((uint64_t)(a_workbuf.len))) { ++ if (a_workbuf.ptr[0u] == 4u) { ++ a_workbuf.ptr[0u] = 1u; ++ } + } + + ok: +- self->private_impl.p_do_transform_io[0] = 0; ++ self->private_impl.p_decode_pass = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_transform_io[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_transform_io[0].v_checksum_got = v_checksum_got; ++ self->private_impl.p_decode_pass = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -52440,2021 +66092,1710 @@ wuffs_zlib__decoder__do_transform_io( + return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) +- +-// ---------------- Status Codes Implementations +- +-const char wuffs_png__error__bad_animation_sequence_number[] = "#png: bad animation sequence number"; +-const char wuffs_png__error__bad_checksum[] = "#png: bad checksum"; +-const char wuffs_png__error__bad_chunk[] = "#png: bad chunk"; +-const char wuffs_png__error__bad_filter[] = "#png: bad filter"; +-const char wuffs_png__error__bad_header[] = "#png: bad header"; +-const char wuffs_png__error__bad_text_chunk_not_latin_1[] = "#png: bad text chunk (not Latin-1)"; +-const char wuffs_png__error__missing_palette[] = "#png: missing palette"; +-const char wuffs_png__error__truncated_input[] = "#png: truncated input"; +-const char wuffs_png__error__unsupported_cgbi_extension[] = "#png: unsupported CgBI extension"; +-const char wuffs_png__error__unsupported_png_compression_method[] = "#png: unsupported PNG compression method"; +-const char wuffs_png__error__unsupported_png_file[] = "#png: unsupported PNG file"; +-const char wuffs_png__error__internal_error_inconsistent_i_o[] = "#png: internal error: inconsistent I/O"; +-const char wuffs_png__error__internal_error_inconsistent_chunk_type[] = "#png: internal error: inconsistent chunk type"; +-const char wuffs_png__error__internal_error_inconsistent_frame_bounds[] = "#png: internal error: inconsistent frame bounds"; +-const char wuffs_png__error__internal_error_inconsistent_workbuf_length[] = "#png: internal error: inconsistent workbuf length"; +-const char wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input[] = "#png: internal error: zlib decoder did not exhaust its input"; +- +-// ---------------- Private Consts +- +-#define WUFFS_PNG__ANCILLARY_BIT 32 +- +-static const uint8_t +-WUFFS_PNG__INTERLACING[8][6] WUFFS_BASE__POTENTIALLY_UNUSED = { +- { +- 0, 0, 0, 0, 0, 0, +- }, { +- 3, 7, 0, 3, 7, 0, +- }, { +- 3, 3, 4, 3, 7, 0, +- }, { +- 2, 3, 0, 3, 3, 4, +- }, { +- 2, 1, 2, 2, 3, 0, +- }, { +- 1, 1, 0, 2, 1, 2, +- }, { +- 1, 0, 1, 1, 1, 0, +- }, { +- 0, 0, 0, 1, 0, 1, +- }, +-}; +- +-static const uint8_t +-WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 255, 85, 0, 17, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 8, 4, 0, 2, 0, 0, 0, +-}; +- +-static const uint8_t +-WUFFS_PNG__NUM_CHANNELS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 1, 0, 3, 1, 2, 0, 4, 0, +-}; +- +-static const uint16_t +-WUFFS_PNG__LATIN_1[256] WUFFS_BASE__POTENTIALLY_UNUSED = { +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 32, 33, 34, 35, 36, 37, 38, 39, +- 40, 41, 42, 43, 44, 45, 46, 47, +- 48, 49, 50, 51, 52, 53, 54, 55, +- 56, 57, 58, 59, 60, 61, 62, 63, +- 64, 65, 66, 67, 68, 69, 70, 71, +- 72, 73, 74, 75, 76, 77, 78, 79, +- 80, 81, 82, 83, 84, 85, 86, 87, +- 88, 89, 90, 91, 92, 93, 94, 95, +- 96, 97, 98, 99, 100, 101, 102, 103, +- 104, 105, 106, 107, 108, 109, 110, 111, +- 112, 113, 114, 115, 116, 117, 118, 119, +- 120, 121, 122, 123, 124, 125, 126, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0, +- 0, 41410, 41666, 41922, 42178, 42434, 42690, 42946, +- 43202, 43458, 43714, 43970, 44226, 44482, 44738, 44994, +- 45250, 45506, 45762, 46018, 46274, 46530, 46786, 47042, +- 47298, 47554, 47810, 48066, 48322, 48578, 48834, 49090, +- 32963, 33219, 33475, 33731, 33987, 34243, 34499, 34755, +- 35011, 35267, 35523, 35779, 36035, 36291, 36547, 36803, +- 37059, 37315, 37571, 37827, 38083, 38339, 38595, 38851, +- 39107, 39363, 39619, 39875, 40131, 40387, 40643, 40899, +- 41155, 41411, 41667, 41923, 42179, 42435, 42691, 42947, +- 43203, 43459, 43715, 43971, 44227, 44483, 44739, 44995, +- 45251, 45507, 45763, 46019, 46275, 46531, 46787, 47043, +- 47299, 47555, 47811, 48067, 48323, 48579, 48835, 49091, +-}; +- +-// ---------------- Private Initializer Prototypes +- +-// ---------------- Private Function Prototypes +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_3_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_2( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_3_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +- +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev); +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__do_decode_image_config( +- wuffs_png__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_ihdr( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__assign_filter_distance( +- wuffs_png__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-static uint64_t +-wuffs_png__decoder__calculate_bytes_per_row( +- const wuffs_png__decoder* self, +- uint32_t a_width); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__choose_filter_implementations( +- wuffs_png__decoder* self); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_other_chunk( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src, +- bool a_framy); +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_actl( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++// -------- func png.decoder.frame_dirty_rect + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_chrm( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_png__decoder__frame_dirty_rect( ++ const wuffs_png__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_exif( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++ return wuffs_base__utility__make_rect_ie_u32( ++ self->private_impl.f_frame_rect_x0, ++ self->private_impl.f_frame_rect_y0, ++ self->private_impl.f_frame_rect_x1, ++ self->private_impl.f_frame_rect_y1); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_fctl( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++// -------- func png.decoder.num_animation_loops + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_gama( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_png__decoder__num_animation_loops( ++ const wuffs_png__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_iccp( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++ return self->private_impl.f_num_animation_loops_value; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_plte( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++// -------- func png.decoder.num_decoded_frame_configs + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_srgb( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_png__decoder__num_decoded_frame_configs( ++ const wuffs_png__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_trns( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++ return ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__do_decode_frame_config( +- wuffs_png__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); ++// -------- func png.decoder.num_decoded_frames + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__skip_frame( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src); ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_png__decoder__num_decoded_frames( ++ const wuffs_png__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__do_decode_frame( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++ return ((uint64_t)(self->private_impl.f_num_decoded_frames_value)); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_pass( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf); ++// -------- func png.decoder.restart_frame + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__do_tell_me_more( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_png__decoder__restart_frame( + wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src); ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf); ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } else if ((a_index >= ((uint64_t)(self->private_impl.f_num_animation_frames_value))) || ((a_index == 0u) && (a_io_position != self->private_impl.f_first_config_io_position))) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ if (self->private_impl.f_interlace_pass >= 1u) { ++ self->private_impl.f_interlace_pass = 1u; ++ } ++ self->private_impl.f_frame_config_io_position = a_io_position; ++ self->private_impl.f_num_decoded_frame_configs_value = ((uint32_t)(a_index)); ++ self->private_impl.f_num_decoded_frames_value = self->private_impl.f_num_decoded_frame_configs_value; ++ return wuffs_base__make_status(NULL); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf); ++// -------- func png.decoder.set_report_metadata + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle_tricky( ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_png__decoder__set_report_metadata( + wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf); +- +-// ---------------- VTables ++ uint32_t a_fourcc, ++ bool a_report) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } + +-const wuffs_base__image_decoder__func_ptrs +-wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_png__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_png__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_png__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_png__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_png__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_png__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_png__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_png__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_png__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_png__decoder__workbuf_len), +-}; ++ if (a_fourcc == 1128813133u) { ++ self->private_impl.f_report_metadata_chrm = a_report; ++ } else if (a_fourcc == 1163413830u) { ++ self->private_impl.f_report_metadata_exif = a_report; ++ } else if (a_fourcc == 1195461953u) { ++ self->private_impl.f_report_metadata_gama = a_report; ++ } else if (a_fourcc == 1229144912u) { ++ self->private_impl.f_report_metadata_iccp = a_report; ++ } else if (a_fourcc == 1263947808u) { ++ self->private_impl.f_report_metadata_kvp = a_report; ++ } else if (a_fourcc == 1397901122u) { ++ self->private_impl.f_report_metadata_srgb = a_report; ++ } ++ return wuffs_base__make_empty_struct(); ++} + +-// ---------------- Initializer Implementations ++// -------- func png.decoder.tell_me_more + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_png__decoder__initialize( ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_png__decoder__tell_me_more( + wuffs_png__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); + } +- +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); +- } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- self->private_impl.choosy_filter_1 = &wuffs_png__decoder__filter_1__choosy_default; +- self->private_impl.choosy_filter_3 = &wuffs_png__decoder__filter_3__choosy_default; +- self->private_impl.choosy_filter_4 = &wuffs_png__decoder__filter_4__choosy_default; +- self->private_impl.choosy_filter_and_swizzle = &wuffs_png__decoder__filter_and_swizzle__choosy_default; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- { +- wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( +- &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options); +- if (z.repr) { +- return z; +- } +- } +- { +- wuffs_base__status z = wuffs_zlib__decoder__initialize( +- &self->private_data.f_zlib, sizeof(self->private_data.f_zlib), WUFFS_VERSION, options); +- if (z.repr) { +- return z; ++ uint32_t coro_susp_point = self->private_impl.p_tell_me_more; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_png__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- } +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); +-} + +-wuffs_png__decoder* +-wuffs_png__decoder__alloc(void) { +- wuffs_png__decoder* x = +- (wuffs_png__decoder*)(calloc(sizeof(wuffs_png__decoder), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_png__decoder__initialize( +- x, sizeof(wuffs_png__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ ok: ++ self->private_impl.p_tell_me_more = 0; ++ goto exit; + } +- return x; +-} + +-size_t +-sizeof__wuffs_png__decoder(void) { +- return sizeof(wuffs_png__decoder); +-} ++ goto suspend; ++ suspend: ++ self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; + +-// ---------------- Function Implementations ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} + +-// ‼ WUFFS MULTI-FILE SECTION +arm_neon +-// -------- func png.decoder.filter_1_distance_4_arm_neon ++// -------- func png.decoder.do_tell_me_more + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_arm_neon( ++static wuffs_base__status ++wuffs_png__decoder__do_tell_me_more( + wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- wuffs_base__slice_u8 v_curr = {0}; +- uint8x8_t v_fa = {0}; +- uint8x8_t v_fx = {0}; ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, v_fa); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, v_fa); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- } +- v_curr.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, v_fa); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; ++ uint8_t v_c8 = 0; ++ uint16_t v_c16 = 0; ++ wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); ++ wuffs_base__io_buffer* v_w = &u_w; ++ uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint64_t v_num_written = 0; ++ uint64_t v_w_mark = 0; ++ uint64_t v_r_mark = 0; ++ wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL); ++ ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; + } +- v_curr.len = 0; + } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-// ‼ WUFFS MULTI-FILE SECTION -arm_neon +- +-// ‼ WUFFS MULTI-FILE SECTION +arm_neon +-// -------- func png.decoder.filter_3_distance_4_arm_neon ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint8x8_t v_fa = {0}; +- uint8x8_t v_fb = {0}; +- uint8x8_t v_fx = {0}; ++ uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more; ++ if (coro_susp_point) { ++ v_zlib_status = self->private_data.s_do_tell_me_more.v_zlib_status; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (((uint64_t)(a_prev.len)) == 0u) { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; ++ if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) == 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } ++ if (self->private_impl.f_metadata_fourcc == 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ } ++ do { ++ if (self->private_impl.f_metadata_flavor == 3u) { ++ while (true) { ++ if (wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_y) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); ++ goto exit; ++ } else if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ self->private_impl.f_metadata_flavor, ++ self->private_impl.f_metadata_fourcc, ++ self->private_impl.f_metadata_x, ++ self->private_impl.f_metadata_y, ++ self->private_impl.f_metadata_z); ++ } ++ if (self->private_impl.f_metadata_y >= self->private_impl.f_metadata_z) { ++ goto label__goto_done__break; ++ } ++ self->private_impl.f_metadata_y = self->private_impl.f_metadata_z; ++ status = wuffs_base__make_status(wuffs_base__suspension__even_more_information); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ } ++ if (self->private_impl.f_metadata_is_zlib_compressed) { ++ if (self->private_impl.f_zlib_is_dirty) { ++ wuffs_private_impl__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib, ++ sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ if (self->private_impl.f_ignore_checksum) { ++ wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u); ++ } ++ } ++ self->private_impl.f_zlib_is_dirty = true; ++ self->private_impl.f_ztxt_hist_pos = 0u; ++ } ++ label__loop__continue:; ++ while (true) { ++ if (a_minfo != NULL) { ++ wuffs_base__more_information__set(a_minfo, ++ self->private_impl.f_metadata_flavor, ++ self->private_impl.f_metadata_fourcc, ++ self->private_impl.f_metadata_x, ++ self->private_impl.f_metadata_y, ++ self->private_impl.f_metadata_z); ++ } ++ if (self->private_impl.f_metadata_flavor != 4u) { ++ break; ++ } ++ if (self->private_impl.f_metadata_is_zlib_compressed) { ++ if (self->private_impl.f_chunk_type == 1346585449u) { ++ { ++ const bool o_0_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_0_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; ++ } ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_0 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, a_dst, a_src, wuffs_base__utility__empty_slice_u8()); ++ v_zlib_status = t_0; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ io2_a_src = o_0_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_0_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_zlib_status)) { ++ self->private_impl.f_metadata_is_zlib_compressed = false; ++ break; ++ } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { ++ status = v_zlib_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ status = v_zlib_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } else if (self->private_impl.f_chunk_type == 1951945833u) { ++ { ++ const bool o_1_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_1_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; ++ } ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_1 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, a_dst, a_src, wuffs_base__utility__empty_slice_u8()); ++ v_zlib_status = t_1; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ io2_a_src = o_1_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_1_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_zlib_status)) { ++ self->private_impl.f_metadata_is_zlib_compressed = false; ++ break; ++ } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { ++ status = v_zlib_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ status = v_zlib_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ } else if (self->private_impl.f_chunk_type == 1951945850u) { ++ if (self->private_impl.f_ztxt_ri == self->private_impl.f_ztxt_wi) { ++ { ++ wuffs_base__io_buffer* o_2_v_w = v_w; ++ uint8_t* o_2_iop_v_w = iop_v_w; ++ uint8_t* o_2_io0_v_w = io0_v_w; ++ uint8_t* o_2_io1_v_w = io1_v_w; ++ uint8_t* o_2_io2_v_w = io2_v_w; ++ v_w = wuffs_private_impl__io_writer__set( ++ &u_w, ++ &iop_v_w, ++ &io0_v_w, ++ &io1_v_w, ++ &io2_v_w, ++ wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024), ++ self->private_impl.f_ztxt_hist_pos); ++ { ++ const bool o_3_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_3_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; ++ } ++ v_w_mark = ((uint64_t)(iop_v_w - io0_v_w)); ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr)); ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, v_w, a_src, wuffs_base__utility__empty_slice_u8()); ++ v_zlib_status = t_2; ++ iop_v_w = u_w.data.ptr + u_w.meta.wi; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ v_num_written = wuffs_private_impl__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w))); ++ io2_a_src = o_3_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_3_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); ++ } ++ } ++ v_w = o_2_v_w; ++ iop_v_w = o_2_iop_v_w; ++ io0_v_w = o_2_io0_v_w; ++ io1_v_w = o_2_io1_v_w; ++ io2_v_w = o_2_io2_v_w; ++ } ++ if (v_num_written > 1024u) { ++ status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_i_o); ++ goto exit; ++ } ++ self->private_impl.f_ztxt_ri = 0u; ++ self->private_impl.f_ztxt_wi = ((uint32_t)(v_num_written)); ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_ztxt_hist_pos, v_num_written); ++ } ++ while (self->private_impl.f_ztxt_ri < self->private_impl.f_ztxt_wi) { ++ v_c16 = WUFFS_PNG__LATIN_1[self->private_data.f_dst_palette[self->private_impl.f_ztxt_ri]]; ++ if (v_c16 == 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1); ++ goto exit; ++ } else if (v_c16 <= 127u) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ goto label__loop__continue; ++ } ++ self->private_impl.f_ztxt_ri += 1u; ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c16))), iop_a_dst += 1); ++ } else { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ goto label__loop__continue; ++ } ++ self->private_impl.f_ztxt_ri += 1u; ++ (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c16), iop_a_dst += 2); ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_zlib_status)) { ++ self->private_impl.f_metadata_is_zlib_compressed = false; ++ break; ++ } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { ++ status = v_zlib_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } else if (v_zlib_status.repr != wuffs_base__suspension__short_write) { ++ status = v_zlib_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_chunk_type); ++ goto exit; ++ } ++ } else if ((self->private_impl.f_chunk_type == 1951945833u) && (self->private_impl.f_metadata_fourcc == 1263947862u)) { ++ while (true) { ++ if (self->private_impl.f_chunk_length <= 0u) { ++ goto label__loop__break; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ goto label__loop__continue; ++ } else if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ goto label__loop__continue; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_c8), iop_a_dst += 1); ++ } ++ } else { ++ while (true) { ++ if (self->private_impl.f_chunk_length <= 0u) { ++ if (self->private_impl.f_metadata_fourcc == 1263947851u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ goto label__loop__break; ++ } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ goto label__loop__continue; ++ } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ if (v_c8 == 0u) { ++ self->private_impl.f_chunk_length -= 1u; ++ iop_a_src += 1u; ++ goto label__loop__break; ++ } ++ v_c16 = WUFFS_PNG__LATIN_1[v_c8]; ++ if (v_c16 == 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1); ++ goto exit; ++ } else if (v_c16 <= 127u) { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ goto label__loop__continue; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ iop_a_src += 1u; ++ (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c16))), iop_a_dst += 1); ++ } else { ++ if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); ++ goto label__loop__continue; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ iop_a_src += 1u; ++ (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c16), iop_a_dst += 2); ++ } ++ } ++ } + } +- v_curr.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; ++ label__loop__break:; ++ if (self->private_impl.f_metadata_fourcc == 1263947851u) { ++ self->private_impl.f_metadata_fourcc = 1263947862u; ++ if (self->private_impl.f_chunk_type == 1951945833u) { ++ if (self->private_impl.f_chunk_length <= 1u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 2u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if (v_c8 == 0u) { ++ self->private_impl.f_metadata_is_zlib_compressed = false; ++ } else if (v_c8 == 1u) { ++ self->private_impl.f_metadata_is_zlib_compressed = true; ++ } else { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if ((v_c8 != 0u) && self->private_impl.f_metadata_is_zlib_compressed) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); ++ goto exit; ++ } ++ self->private_impl.f_metadata_fourcc -= 2u; ++ while (self->private_impl.f_metadata_fourcc != 1263947862u) { ++ self->private_impl.f_metadata_fourcc += 1u; ++ while (true) { ++ if (self->private_impl.f_chunk_length <= 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ if (v_c8 == 0u) { ++ break; ++ } ++ } ++ } ++ } else if (self->private_impl.f_chunk_type == 1951945850u) { ++ if (self->private_impl.f_chunk_length <= 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; ++ } ++ self->private_impl.f_chunk_length -= 1u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); ++ goto exit; ++ } ++ self->private_impl.f_metadata_is_zlib_compressed = true; ++ } ++ self->private_impl.f_call_sequence &= 239u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; + } +- v_curr.len = 0; ++ } while (0); ++ label__goto_done__break:; ++ if (self->private_impl.f_chunk_length != 0u) { ++ status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ goto exit; + } +- } else { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb)); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 0; +- v_prev.len = 0; ++ self->private_data.s_do_tell_me_more.scratch = 4u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ if (self->private_data.s_do_tell_me_more.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_tell_me_more.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-// ‼ WUFFS MULTI-FILE SECTION -arm_neon +- +-// ‼ WUFFS MULTI-FILE SECTION +arm_neon +-// -------- func png.decoder.filter_4_distance_3_arm_neon +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint8x8_t v_fa = {0}; +- uint8x8_t v_fb = {0}; +- uint8x8_t v_fc = {0}; +- uint8x8_t v_fx = {0}; +- uint16x8_t v_fafb = {0}; +- uint16x8_t v_fcfc = {0}; +- uint16x8_t v_pa = {0}; +- uint16x8_t v_pb = {0}; +- uint16x8_t v_pc = {0}; +- uint16x8_t v_cmpab = {0}; +- uint16x8_t v_cmpac = {0}; +- uint8x8_t v_picka = {0}; +- uint8x8_t v_pickb = {0}; ++ iop_a_src += self->private_data.s_do_tell_me_more.scratch; ++ self->private_impl.f_metadata_flavor = 0u; ++ self->private_impl.f_metadata_fourcc = 0u; ++ self->private_impl.f_metadata_x = 0u; ++ self->private_impl.f_metadata_y = 0u; ++ self->private_impl.f_metadata_z = 0u; ++ self->private_impl.f_call_sequence &= 239u; ++ status = wuffs_base__make_status(NULL); ++ goto ok; + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + wuffs_base__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6); +- while (v_curr.ptr < i_end0_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + wuffs_base__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3); +- while (v_curr.ptr < i_end1_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 3; +- v_prev.len = 3; +- uint8_t* i_end2_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end2_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 0; +- v_prev.len = 0; ++ ok: ++ self->private_impl.p_do_tell_me_more = 0; ++ goto exit; + } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-// ‼ WUFFS MULTI-FILE SECTION -arm_neon + +-// ‼ WUFFS MULTI-FILE SECTION +arm_neon +-// -------- func png.decoder.filter_4_distance_4_arm_neon +- +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_arm_neon( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint8x8_t v_fa = {0}; +- uint8x8_t v_fb = {0}; +- uint8x8_t v_fc = {0}; +- uint8x8_t v_fx = {0}; +- uint16x8_t v_fafb = {0}; +- uint16x8_t v_fcfc = {0}; +- uint16x8_t v_pa = {0}; +- uint16x8_t v_pb = {0}; +- uint16x8_t v_pc = {0}; +- uint16x8_t v_cmpab = {0}; +- uint16x8_t v_cmpac = {0}; +- uint8x8_t v_picka = {0}; +- uint8x8_t v_pickb = {0}; ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_tell_me_more.v_zlib_status = v_zlib_status; + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_fafb = vaddl_u8(v_fa, v_fb); +- v_fcfc = vaddl_u8(v_fc, v_fc); +- v_pa = vabdl_u8(v_fb, v_fc); +- v_pb = vabdl_u8(v_fa, v_fc); +- v_pc = vabdq_u16(v_fafb, v_fcfc); +- v_cmpab = vcleq_u16(v_pa, v_pb); +- v_cmpac = vcleq_u16(v_pa, v_pc); +- v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac)); +- v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc)); +- v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc))); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u)); +- v_fc = v_fb; +- v_fa = v_fx; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 0; +- v_prev.len = 0; ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +-// ‼ WUFFS MULTI-FILE SECTION -arm_neon +- +-// -------- func png.decoder.filter_1 +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- return (*self->private_impl.choosy_filter_1)(self, a_curr); +-} +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- uint64_t v_filter_distance = 0; +- uint8_t v_fa = 0; +- uint64_t v_i_start = 0; +- uint64_t v_i = 0; +- +- v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); +- v_i_start = 0u; +- while (v_i_start < v_filter_distance) { +- v_fa = 0u; +- v_i = v_i_start; +- while (v_i < ((uint64_t)(a_curr.len))) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + v_fa)); +- v_fa = a_curr.ptr[v_i]; +- v_i += v_filter_distance; +- } +- v_i_start += 1u; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func png.decoder.filter_1_distance_3_fallback +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_3_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- wuffs_base__slice_u8 v_curr = {0}; +- uint8_t v_fa0 = 0; +- uint8_t v_fa1 = 0; +- uint8_t v_fa2 = 0; + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 3; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- } +- v_curr.len = 3; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end1_curr) { +- v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- } +- v_curr.len = 0; +- } +- return wuffs_base__make_empty_struct(); ++ return status; + } + +-// -------- func png.decoder.filter_1_distance_4_fallback ++// -------- func png.decoder.workbuf_len + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- wuffs_base__slice_u8 v_curr = {0}; +- uint8_t v_fa0 = 0; +- uint8_t v_fa1 = 0; +- uint8_t v_fa2 = 0; +- uint8_t v_fa3 = 0; +- +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_fa3 = ((uint8_t)(v_fa3 + v_curr.ptr[3u])); +- v_curr.ptr[3u] = v_fa3; +- v_curr.ptr += 4; +- } +- v_curr.len = 0; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_png__decoder__workbuf_len( ++ const wuffs_png__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func png.decoder.filter_2 +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_2( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- uint64_t v_n = 0; +- uint64_t v_i = 0; +- +- v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); +- v_i = 0u; +- while (v_i < v_n) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i])); +- v_i += 1u; ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } +- return wuffs_base__make_empty_struct(); ++ ++ return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_overall_workbuf_length, self->private_impl.f_overall_workbuf_length); + } + +-// -------- func png.decoder.filter_3 ++// -------- func png.decoder.filter_and_swizzle + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3( ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle( + wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- return (*self->private_impl.choosy_filter_3)(self, a_curr, a_prev); ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf) { ++ return (*self->private_impl.choosy_filter_and_swizzle)(self, a_dst, a_workbuf); + } + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3__choosy_default( ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle__choosy_default( + wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- uint64_t v_filter_distance = 0; +- uint64_t v_n = 0; +- uint64_t v_i = 0; ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint64_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row0 = 0; ++ uint64_t v_dst_bytes_per_row1 = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ uint32_t v_y = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint8_t v_filter = 0; ++ wuffs_base__slice_u8 v_curr_row = {0}; ++ wuffs_base__slice_u8 v_prev_row = {0}; + +- v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); +- if (((uint64_t)(a_prev.len)) == 0u) { +- v_i = v_filter_distance; +- while (v_i < ((uint64_t)(a_curr.len))) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + (a_curr.ptr[(v_i - v_filter_distance)] / 2u))); +- v_i += 1u; +- } ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ } ++ v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); ++ v_dst_bytes_per_row0 = (((uint64_t)(self->private_impl.f_frame_rect_x0)) * v_dst_bytes_per_pixel); ++ v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ if (v_dst_bytes_per_row1 < ((uint64_t)(v_tab.width))) { ++ v_tab = wuffs_base__table_u8__subtable_ij(v_tab, ++ 0u, ++ 0u, ++ v_dst_bytes_per_row1, ++ ((uint64_t)(v_tab.height))); ++ } ++ if (v_dst_bytes_per_row0 < ((uint64_t)(v_tab.width))) { ++ v_tab = wuffs_base__table_u8__subtable_ij(v_tab, ++ v_dst_bytes_per_row0, ++ 0u, ++ ((uint64_t)(v_tab.width)), ++ ((uint64_t)(v_tab.height))); + } else { +- v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); +- v_i = 0u; +- while ((v_i < v_n) && (v_i < v_filter_distance)) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + (a_prev.ptr[v_i] / 2u))); +- v_i += 1u; ++ v_tab = wuffs_base__table_u8__subtable_ij(v_tab, ++ 0u, ++ 0u, ++ 0u, ++ 0u); ++ } ++ v_y = self->private_impl.f_frame_rect_y0; ++ while (v_y < self->private_impl.f_frame_rect_y1) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y); ++ if (1u > ((uint64_t)(a_workbuf.len))) { ++ return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); + } +- v_i = v_filter_distance; +- while (v_i < v_n) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(((((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)])) + ((uint32_t)(a_prev.ptr[v_i]))) / 2u))))); +- v_i += 1u; ++ v_filter = a_workbuf.ptr[0u]; ++ a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u); ++ if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) { ++ return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); ++ } ++ v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row); ++ a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row); ++ if (v_filter == 0u) { ++ } else if (v_filter == 1u) { ++ wuffs_png__decoder__filter_1(self, v_curr_row); ++ } else if (v_filter == 2u) { ++ wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row); ++ } else if (v_filter == 3u) { ++ wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row); ++ } else if (v_filter == 4u) { ++ wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row); ++ } else { ++ return wuffs_base__make_status(wuffs_png__error__bad_filter); + } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, v_curr_row); ++ v_prev_row = v_curr_row; ++ v_y += 1u; + } +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__make_status(NULL); + } + +-// -------- func png.decoder.filter_3_distance_3_fallback ++// -------- func png.decoder.filter_and_swizzle_tricky + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_3_fallback( ++static wuffs_base__status ++wuffs_png__decoder__filter_and_swizzle_tricky( + wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint8_t v_fa0 = 0; +- uint8_t v_fa1 = 0; +- uint8_t v_fa2 = 0; ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint64_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row1 = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ uint64_t v_src_bytes_per_pixel = 0; ++ uint32_t v_x = 0; ++ uint32_t v_y = 0; ++ uint64_t v_i = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint8_t v_filter = 0; ++ wuffs_base__slice_u8 v_s = {0}; ++ wuffs_base__slice_u8 v_curr_row = {0}; ++ wuffs_base__slice_u8 v_prev_row = {0}; ++ uint8_t v_bits_unpacked[8] = {0}; ++ uint8_t v_bits_packed = 0; ++ uint8_t v_packs_remaining = 0; ++ uint8_t v_multiplier = 0; ++ uint8_t v_shift = 0; + +- if (((uint64_t)(a_prev.len)) == 0u) { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 3; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)((v_fa0 / 2u) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)((v_fa1 / 2u) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)((v_fa2 / 2u) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- v_fa0 = ((uint8_t)((v_fa0 / 2u) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)((v_fa1 / 2u) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)((v_fa2 / 2u) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ } ++ v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); ++ v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_src_bytes_per_pixel = 1u; ++ if (self->private_impl.f_depth >= 8u) { ++ v_src_bytes_per_pixel = (((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type])) * ((uint64_t)(((uint8_t)(self->private_impl.f_depth >> 3u))))); ++ } ++ if (self->private_impl.f_chunk_type_array[0u] == 73u) { ++ v_y = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][5u])); ++ } else { ++ v_y = self->private_impl.f_frame_rect_y0; ++ } ++ while (v_y < self->private_impl.f_frame_rect_y1) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y); ++ if (v_dst_bytes_per_row1 < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row1); ++ } ++ if (1u > ((uint64_t)(a_workbuf.len))) { ++ return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); ++ } ++ v_filter = a_workbuf.ptr[0u]; ++ a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u); ++ if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) { ++ return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); ++ } ++ v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row); ++ a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row); ++ if (v_filter == 0u) { ++ } else if (v_filter == 1u) { ++ wuffs_png__decoder__filter_1(self, v_curr_row); ++ } else if (v_filter == 2u) { ++ wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row); ++ } else if (v_filter == 3u) { ++ wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row); ++ } else if (v_filter == 4u) { ++ wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row); ++ } else { ++ return wuffs_base__make_status(wuffs_png__error__bad_filter); ++ } ++ v_s = v_curr_row; ++ if (self->private_impl.f_chunk_type_array[0u] == 73u) { ++ v_x = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][2u])); ++ } else { ++ v_x = self->private_impl.f_frame_rect_x0; ++ } ++ if (self->private_impl.f_depth == 8u) { ++ while (v_x < self->private_impl.f_frame_rect_x1) { ++ v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); ++ if (v_i <= ((uint64_t)(v_dst.len))) { ++ if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) { ++ if (self->private_impl.f_color_type == 0u) { ++ if (1u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[0u]; ++ v_bits_unpacked[1u] = v_s.ptr[0u]; ++ v_bits_unpacked[2u] = v_s.ptr[0u]; ++ v_bits_unpacked[3u] = 255u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | ++ (((uint32_t)(v_bits_unpacked[1u])) << 8u) | ++ (((uint32_t)(v_bits_unpacked[2u])) << 16u) | ++ (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { ++ v_bits_unpacked[0u] = 0u; ++ v_bits_unpacked[1u] = 0u; ++ v_bits_unpacked[2u] = 0u; ++ v_bits_unpacked[3u] = 0u; ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); ++ } ++ } else { ++ if (3u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[2u]; ++ v_bits_unpacked[1u] = v_s.ptr[1u]; ++ v_bits_unpacked[2u] = v_s.ptr[0u]; ++ v_bits_unpacked[3u] = 255u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 3u); ++ if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | ++ (((uint32_t)(v_bits_unpacked[1u])) << 8u) | ++ (((uint32_t)(v_bits_unpacked[2u])) << 16u) | ++ (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { ++ v_bits_unpacked[0u] = 0u; ++ v_bits_unpacked[1u] = 0u; ++ v_bits_unpacked[2u] = 0u; ++ v_bits_unpacked[3u] = 0u; ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); ++ } ++ } ++ } else if (v_src_bytes_per_pixel <= ((uint64_t)(v_s.len))) { ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__slice_u8__subslice_j(v_s, v_src_bytes_per_pixel)); ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, v_src_bytes_per_pixel); ++ } ++ } ++ v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); + } +- v_curr.len = 3; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end1_curr) { +- v_fa0 = ((uint8_t)((v_fa0 / 2u) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)((v_fa1 / 2u) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)((v_fa2 / 2u) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; ++ } else if (self->private_impl.f_depth < 8u) { ++ v_multiplier = 1u; ++ if (self->private_impl.f_color_type == 0u) { ++ v_multiplier = WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[self->private_impl.f_depth]; + } +- v_curr.len = 0; +- } +- } else { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 3; +- v_prev.len = 3; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- v_prev.ptr += 3; ++ v_shift = ((uint8_t)(((uint8_t)(8u - self->private_impl.f_depth)) & 7u)); ++ v_packs_remaining = 0u; ++ while (v_x < self->private_impl.f_frame_rect_x1) { ++ v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); ++ if (v_i <= ((uint64_t)(v_dst.len))) { ++ if ((v_packs_remaining == 0u) && (1u <= ((uint64_t)(v_s.len)))) { ++ v_packs_remaining = WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[self->private_impl.f_depth]; ++ v_bits_packed = v_s.ptr[0u]; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ } ++ v_bits_unpacked[0u] = ((uint8_t)(((uint8_t)(v_bits_packed >> v_shift)) * v_multiplier)); ++ v_bits_packed = ((uint8_t)(v_bits_packed << self->private_impl.f_depth)); ++ v_packs_remaining = ((uint8_t)(v_packs_remaining - 1u)); ++ if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) { ++ v_bits_unpacked[1u] = v_bits_unpacked[0u]; ++ v_bits_unpacked[2u] = v_bits_unpacked[0u]; ++ v_bits_unpacked[3u] = 255u; ++ if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | ++ (((uint32_t)(v_bits_unpacked[1u])) << 8u) | ++ (((uint32_t)(v_bits_unpacked[2u])) << 16u) | ++ (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { ++ v_bits_unpacked[0u] = 0u; ++ v_bits_unpacked[1u] = 0u; ++ v_bits_unpacked[2u] = 0u; ++ v_bits_unpacked[3u] = 0u; ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); ++ } else { ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 1)); ++ } ++ } ++ v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); + } +- v_curr.len = 3; +- v_prev.len = 3; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end1_curr) { +- v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_curr.ptr += 3; +- v_prev.ptr += 3; ++ } else { ++ while (v_x < self->private_impl.f_frame_rect_x1) { ++ v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); ++ if (v_i <= ((uint64_t)(v_dst.len))) { ++ if (self->private_impl.f_color_type == 0u) { ++ if (2u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[1u]; ++ v_bits_unpacked[1u] = v_s.ptr[0u]; ++ v_bits_unpacked[2u] = v_s.ptr[1u]; ++ v_bits_unpacked[3u] = v_s.ptr[0u]; ++ v_bits_unpacked[4u] = v_s.ptr[1u]; ++ v_bits_unpacked[5u] = v_s.ptr[0u]; ++ v_bits_unpacked[6u] = 255u; ++ v_bits_unpacked[7u] = 255u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); ++ if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) | ++ (((uint64_t)(v_bits_unpacked[1u])) << 8u) | ++ (((uint64_t)(v_bits_unpacked[2u])) << 16u) | ++ (((uint64_t)(v_bits_unpacked[3u])) << 24u) | ++ (((uint64_t)(v_bits_unpacked[4u])) << 32u) | ++ (((uint64_t)(v_bits_unpacked[5u])) << 40u) | ++ (((uint64_t)(v_bits_unpacked[6u])) << 48u) | ++ (((uint64_t)(v_bits_unpacked[7u])) << 56u))) { ++ v_bits_unpacked[0u] = 0u; ++ v_bits_unpacked[1u] = 0u; ++ v_bits_unpacked[2u] = 0u; ++ v_bits_unpacked[3u] = 0u; ++ v_bits_unpacked[4u] = 0u; ++ v_bits_unpacked[5u] = 0u; ++ v_bits_unpacked[6u] = 0u; ++ v_bits_unpacked[7u] = 0u; ++ } ++ } ++ } else if (self->private_impl.f_color_type == 2u) { ++ if (6u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[5u]; ++ v_bits_unpacked[1u] = v_s.ptr[4u]; ++ v_bits_unpacked[2u] = v_s.ptr[3u]; ++ v_bits_unpacked[3u] = v_s.ptr[2u]; ++ v_bits_unpacked[4u] = v_s.ptr[1u]; ++ v_bits_unpacked[5u] = v_s.ptr[0u]; ++ v_bits_unpacked[6u] = 255u; ++ v_bits_unpacked[7u] = 255u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 6u); ++ if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) | ++ (((uint64_t)(v_bits_unpacked[1u])) << 8u) | ++ (((uint64_t)(v_bits_unpacked[2u])) << 16u) | ++ (((uint64_t)(v_bits_unpacked[3u])) << 24u) | ++ (((uint64_t)(v_bits_unpacked[4u])) << 32u) | ++ (((uint64_t)(v_bits_unpacked[5u])) << 40u) | ++ (((uint64_t)(v_bits_unpacked[6u])) << 48u) | ++ (((uint64_t)(v_bits_unpacked[7u])) << 56u))) { ++ v_bits_unpacked[0u] = 0u; ++ v_bits_unpacked[1u] = 0u; ++ v_bits_unpacked[2u] = 0u; ++ v_bits_unpacked[3u] = 0u; ++ v_bits_unpacked[4u] = 0u; ++ v_bits_unpacked[5u] = 0u; ++ v_bits_unpacked[6u] = 0u; ++ v_bits_unpacked[7u] = 0u; ++ } ++ } ++ } else if (self->private_impl.f_color_type == 4u) { ++ if (4u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[1u]; ++ v_bits_unpacked[1u] = v_s.ptr[0u]; ++ v_bits_unpacked[2u] = v_s.ptr[1u]; ++ v_bits_unpacked[3u] = v_s.ptr[0u]; ++ v_bits_unpacked[4u] = v_s.ptr[1u]; ++ v_bits_unpacked[5u] = v_s.ptr[0u]; ++ v_bits_unpacked[6u] = v_s.ptr[3u]; ++ v_bits_unpacked[7u] = v_s.ptr[2u]; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ } else { ++ if (8u <= ((uint64_t)(v_s.len))) { ++ v_bits_unpacked[0u] = v_s.ptr[5u]; ++ v_bits_unpacked[1u] = v_s.ptr[4u]; ++ v_bits_unpacked[2u] = v_s.ptr[3u]; ++ v_bits_unpacked[3u] = v_s.ptr[2u]; ++ v_bits_unpacked[4u] = v_s.ptr[1u]; ++ v_bits_unpacked[5u] = v_s.ptr[0u]; ++ v_bits_unpacked[6u] = v_s.ptr[7u]; ++ v_bits_unpacked[7u] = v_s.ptr[6u]; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u); ++ } ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 8)); ++ } ++ v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); + } +- v_curr.len = 0; +- v_prev.len = 0; + } ++ v_prev_row = v_curr_row; ++ v_y += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3u]); + } +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__make_status(NULL); + } + +-// -------- func png.decoder.filter_3_distance_4_fallback ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_qoi__error__bad_footer[] = "#qoi: bad footer"; ++const char wuffs_qoi__error__bad_header[] = "#qoi: bad header"; ++const char wuffs_qoi__error__truncated_input[] = "#qoi: truncated input"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint8_t v_fa0 = 0; +- uint8_t v_fa1 = 0; +- uint8_t v_fa2 = 0; +- uint8_t v_fa3 = 0; ++static wuffs_base__status ++wuffs_qoi__decoder__do_decode_image_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_qoi__decoder__do_decode_frame_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_qoi__decoder__do_decode_frame( ++ wuffs_qoi__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_qoi__decoder__from_src_to_buffer( ++ wuffs_qoi__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_qoi__decoder__from_buffer_to_dst( ++ wuffs_qoi__decoder* self, ++ wuffs_base__pixel_buffer* a_dst); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_qoi__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_qoi__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_qoi__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_qoi__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_qoi__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_qoi__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_qoi__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_qoi__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_qoi__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_qoi__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_qoi__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_qoi__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_qoi__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_qoi__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_qoi__decoder__initialize( ++ wuffs_qoi__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } + +- if (((uint64_t)(a_prev.len)) == 0u) { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)((v_fa0 / 2u) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)((v_fa1 / 2u) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)((v_fa2 / 2u) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_fa3 = ((uint8_t)((v_fa3 / 2u) + v_curr.ptr[3u])); +- v_curr.ptr[3u] = v_fa3; +- v_curr.ptr += 4; +- } +- v_curr.len = 0; ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif + } else { +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end0_curr) { +- v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u])); +- v_curr.ptr[0u] = v_fa0; +- v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u])); +- v_curr.ptr[1u] = v_fa1; +- v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u])); +- v_curr.ptr[2u] = v_fa2; +- v_fa3 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa3)) + ((uint32_t)(v_prev.ptr[3u]))) / 2u))) + v_curr.ptr[3u])); +- v_curr.ptr[3u] = v_fa3; +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 0; +- v_prev.len = 0; ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } + } +- return wuffs_base__make_empty_struct(); ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_qoi__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); + } + +-// -------- func png.decoder.filter_4 ++wuffs_qoi__decoder* ++wuffs_qoi__decoder__alloc(void) { ++ wuffs_qoi__decoder* x = ++ (wuffs_qoi__decoder*)(calloc(1, sizeof(wuffs_qoi__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_qoi__decoder__initialize( ++ x, sizeof(wuffs_qoi__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- return (*self->private_impl.choosy_filter_4)(self, a_curr, a_prev); ++size_t ++sizeof__wuffs_qoi__decoder(void) { ++ return sizeof(wuffs_qoi__decoder); + } + ++// ---------------- Function Implementations ++ ++// -------- func qoi.decoder.get_quirk ++ + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- uint64_t v_filter_distance = 0; +- uint64_t v_n = 0; +- uint64_t v_i = 0; +- uint32_t v_fa = 0; +- uint32_t v_fb = 0; +- uint32_t v_fc = 0; +- uint32_t v_pp = 0; +- uint32_t v_pa = 0; +- uint32_t v_pb = 0; +- uint32_t v_pc = 0; ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_qoi__decoder__get_quirk( ++ const wuffs_qoi__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } + +- v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance)); +- v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len))); +- v_i = 0u; +- while ((v_i < v_n) && (v_i < v_filter_distance)) { +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i])); +- v_i += 1u; ++ return 0u; ++} ++ ++// -------- func qoi.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_qoi__decoder__set_quirk( ++ wuffs_qoi__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- v_i = v_filter_distance; +- while (v_i < v_n) { +- v_fa = ((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)])); +- v_fb = ((uint32_t)(a_prev.ptr[v_i])); +- v_fc = ((uint32_t)(a_prev.ptr[(v_i - v_filter_distance)])); +- v_pp = ((uint32_t)(((uint32_t)(v_fa + v_fb)) - v_fc)); +- v_pa = ((uint32_t)(v_pp - v_fa)); +- if (v_pa >= 2147483648u) { +- v_pa = ((uint32_t)(0u - v_pa)); +- } +- v_pb = ((uint32_t)(v_pp - v_fb)); +- if (v_pb >= 2147483648u) { +- v_pb = ((uint32_t)(0u - v_pb)); +- } +- v_pc = ((uint32_t)(v_pp - v_fc)); +- if (v_pc >= 2147483648u) { +- v_pc = ((uint32_t)(0u - v_pc)); +- } +- if ((v_pa <= v_pb) && (v_pa <= v_pc)) { +- } else if (v_pb <= v_pc) { +- v_fa = v_fb; +- } else { +- v_fa = v_fc; +- } +- a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(v_fa)))); +- v_i += 1u; ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } +- return wuffs_base__make_empty_struct(); ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func png.decoder.filter_4_distance_3_fallback ++// -------- func qoi.decoder.decode_image_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint32_t v_fa0 = 0; +- uint32_t v_fa1 = 0; +- uint32_t v_fa2 = 0; +- uint32_t v_fb0 = 0; +- uint32_t v_fb1 = 0; +- uint32_t v_fb2 = 0; +- uint32_t v_fc0 = 0; +- uint32_t v_fc1 = 0; +- uint32_t v_fc2 = 0; +- uint32_t v_pp0 = 0; +- uint32_t v_pp1 = 0; +- uint32_t v_pp2 = 0; +- uint32_t v_pa0 = 0; +- uint32_t v_pa1 = 0; +- uint32_t v_pa2 = 0; +- uint32_t v_pb0 = 0; +- uint32_t v_pb1 = 0; +- uint32_t v_pb2 = 0; +- uint32_t v_pc0 = 0; +- uint32_t v_pc1 = 0; +- uint32_t v_pc2 = 0; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_qoi__decoder__decode_image_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 3; +- v_prev.len = 3; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end0_curr) { +- v_fb0 = ((uint32_t)(v_prev.ptr[0u])); +- v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0)); +- v_pa0 = ((uint32_t)(v_pp0 - v_fa0)); +- if (v_pa0 >= 2147483648u) { +- v_pa0 = ((uint32_t)(0u - v_pa0)); +- } +- v_pb0 = ((uint32_t)(v_pp0 - v_fb0)); +- if (v_pb0 >= 2147483648u) { +- v_pb0 = ((uint32_t)(0u - v_pb0)); +- } +- v_pc0 = ((uint32_t)(v_pp0 - v_fc0)); +- if (v_pc0 >= 2147483648u) { +- v_pc0 = ((uint32_t)(0u - v_pc0)); +- } +- if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) { +- } else if (v_pb0 <= v_pc0) { +- v_fa0 = v_fb0; +- } else { +- v_fa0 = v_fc0; +- } +- v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0)))); +- v_fa0 = ((uint32_t)(v_curr.ptr[0u])); +- v_fc0 = v_fb0; +- v_fb1 = ((uint32_t)(v_prev.ptr[1u])); +- v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1)); +- v_pa1 = ((uint32_t)(v_pp1 - v_fa1)); +- if (v_pa1 >= 2147483648u) { +- v_pa1 = ((uint32_t)(0u - v_pa1)); +- } +- v_pb1 = ((uint32_t)(v_pp1 - v_fb1)); +- if (v_pb1 >= 2147483648u) { +- v_pb1 = ((uint32_t)(0u - v_pb1)); +- } +- v_pc1 = ((uint32_t)(v_pp1 - v_fc1)); +- if (v_pc1 >= 2147483648u) { +- v_pc1 = ((uint32_t)(0u - v_pc1)); +- } +- if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) { +- } else if (v_pb1 <= v_pc1) { +- v_fa1 = v_fb1; +- } else { +- v_fa1 = v_fc1; +- } +- v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1)))); +- v_fa1 = ((uint32_t)(v_curr.ptr[1u])); +- v_fc1 = v_fb1; +- v_fb2 = ((uint32_t)(v_prev.ptr[2u])); +- v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2)); +- v_pa2 = ((uint32_t)(v_pp2 - v_fa2)); +- if (v_pa2 >= 2147483648u) { +- v_pa2 = ((uint32_t)(0u - v_pa2)); +- } +- v_pb2 = ((uint32_t)(v_pp2 - v_fb2)); +- if (v_pb2 >= 2147483648u) { +- v_pb2 = ((uint32_t)(0u - v_pb2)); +- } +- v_pc2 = ((uint32_t)(v_pp2 - v_fc2)); +- if (v_pc2 >= 2147483648u) { +- v_pc2 = ((uint32_t)(0u - v_pc2)); ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; + } +- if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) { +- } else if (v_pb2 <= v_pc2) { +- v_fa2 = v_fb2; +- } else { +- v_fa2 = v_fc2; ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_qoi__error__truncated_input); ++ goto exit; + } +- v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2)))); +- v_fa2 = ((uint32_t)(v_curr.ptr[2u])); +- v_fc2 = v_fb2; +- v_curr.ptr += 3; +- v_prev.ptr += 3; ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- v_curr.len = 0; +- v_prev.len = 0; ++ ++ ok: ++ self->private_impl.p_decode_image_config = 0; ++ goto exit; + } +- return wuffs_base__make_empty_struct(); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; + } + +-// -------- func png.decoder.filter_4_distance_4_fallback ++// -------- func qoi.decoder.do_decode_image_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_fallback( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- uint32_t v_fa0 = 0; +- uint32_t v_fa1 = 0; +- uint32_t v_fa2 = 0; +- uint32_t v_fa3 = 0; +- uint32_t v_fb0 = 0; +- uint32_t v_fb1 = 0; +- uint32_t v_fb2 = 0; +- uint32_t v_fb3 = 0; +- uint32_t v_fc0 = 0; +- uint32_t v_fc1 = 0; +- uint32_t v_fc2 = 0; +- uint32_t v_fc3 = 0; +- uint32_t v_pp0 = 0; +- uint32_t v_pp1 = 0; +- uint32_t v_pp2 = 0; +- uint32_t v_pp3 = 0; +- uint32_t v_pa0 = 0; +- uint32_t v_pa1 = 0; +- uint32_t v_pa2 = 0; +- uint32_t v_pa3 = 0; +- uint32_t v_pb0 = 0; +- uint32_t v_pb1 = 0; +- uint32_t v_pb2 = 0; +- uint32_t v_pb3 = 0; +- uint32_t v_pc0 = 0; +- uint32_t v_pc1 = 0; +- uint32_t v_pc2 = 0; +- uint32_t v_pc3 = 0; ++static wuffs_base__status ++wuffs_qoi__decoder__do_decode_image_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end0_curr) { +- v_fb0 = ((uint32_t)(v_prev.ptr[0u])); +- v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0)); +- v_pa0 = ((uint32_t)(v_pp0 - v_fa0)); +- if (v_pa0 >= 2147483648u) { +- v_pa0 = ((uint32_t)(0u - v_pa0)); +- } +- v_pb0 = ((uint32_t)(v_pp0 - v_fb0)); +- if (v_pb0 >= 2147483648u) { +- v_pb0 = ((uint32_t)(0u - v_pb0)); +- } +- v_pc0 = ((uint32_t)(v_pp0 - v_fc0)); +- if (v_pc0 >= 2147483648u) { +- v_pc0 = ((uint32_t)(0u - v_pc0)); +- } +- if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) { +- } else if (v_pb0 <= v_pc0) { +- v_fa0 = v_fb0; +- } else { +- v_fa0 = v_fc0; +- } +- v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0)))); +- v_fa0 = ((uint32_t)(v_curr.ptr[0u])); +- v_fc0 = v_fb0; +- v_fb1 = ((uint32_t)(v_prev.ptr[1u])); +- v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1)); +- v_pa1 = ((uint32_t)(v_pp1 - v_fa1)); +- if (v_pa1 >= 2147483648u) { +- v_pa1 = ((uint32_t)(0u - v_pa1)); +- } +- v_pb1 = ((uint32_t)(v_pp1 - v_fb1)); +- if (v_pb1 >= 2147483648u) { +- v_pb1 = ((uint32_t)(0u - v_pb1)); +- } +- v_pc1 = ((uint32_t)(v_pp1 - v_fc1)); +- if (v_pc1 >= 2147483648u) { +- v_pc1 = ((uint32_t)(0u - v_pc1)); +- } +- if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) { +- } else if (v_pb1 <= v_pc1) { +- v_fa1 = v_fb1; ++ uint32_t v_a = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- v_fa1 = v_fc1; +- } +- v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1)))); +- v_fa1 = ((uint32_t)(v_curr.ptr[1u])); +- v_fc1 = v_fb1; +- v_fb2 = ((uint32_t)(v_prev.ptr[2u])); +- v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2)); +- v_pa2 = ((uint32_t)(v_pp2 - v_fa2)); +- if (v_pa2 >= 2147483648u) { +- v_pa2 = ((uint32_t)(0u - v_pa2)); +- } +- v_pb2 = ((uint32_t)(v_pp2 - v_fb2)); +- if (v_pb2 >= 2147483648u) { +- v_pb2 = ((uint32_t)(0u - v_pb2)); +- } +- v_pc2 = ((uint32_t)(v_pp2 - v_fc2)); +- if (v_pc2 >= 2147483648u) { +- v_pc2 = ((uint32_t)(0u - v_pc2)); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } + } +- if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) { +- } else if (v_pb2 <= v_pc2) { +- v_fa2 = v_fb2; ++ v_a = t_0; ++ } ++ if (v_a != 1718185841u) { ++ status = wuffs_base__make_status(wuffs_qoi__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- v_fa2 = v_fc2; +- } +- v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2)))); +- v_fa2 = ((uint32_t)(v_curr.ptr[2u])); +- v_fc2 = v_fb2; +- v_fb3 = ((uint32_t)(v_prev.ptr[3u])); +- v_pp3 = ((uint32_t)(((uint32_t)(v_fa3 + v_fb3)) - v_fc3)); +- v_pa3 = ((uint32_t)(v_pp3 - v_fa3)); +- if (v_pa3 >= 2147483648u) { +- v_pa3 = ((uint32_t)(0u - v_pa3)); +- } +- v_pb3 = ((uint32_t)(v_pp3 - v_fb3)); +- if (v_pb3 >= 2147483648u) { +- v_pb3 = ((uint32_t)(0u - v_pb3)); +- } +- v_pc3 = ((uint32_t)(v_pp3 - v_fc3)); +- if (v_pc3 >= 2147483648u) { +- v_pc3 = ((uint32_t)(0u - v_pc3)); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)); ++ } + } +- if ((v_pa3 <= v_pb3) && (v_pa3 <= v_pc3)) { +- } else if (v_pb3 <= v_pc3) { +- v_fa3 = v_fb3; ++ v_a = t_1; ++ } ++ if (v_a > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_width = v_a; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- v_fa3 = v_fc3; ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch >> 32)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)); ++ } + } +- v_curr.ptr[3u] = ((uint8_t)(v_curr.ptr[3u] + ((uint8_t)(v_fa3)))); +- v_fa3 = ((uint32_t)(v_curr.ptr[3u])); +- v_fc3 = v_fb3; +- v_curr.ptr += 4; +- v_prev.ptr += 4; ++ v_a = t_2; + } +- v_curr.len = 0; +- v_prev.len = 0; +- } +- return wuffs_base__make_empty_struct(); +-} ++ if (v_a > 16777215u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); ++ goto exit; ++ } ++ self->private_impl.f_height = v_a; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint32_t t_3 = *iop_a_src++; ++ v_a = t_3; ++ } ++ if (v_a == 3u) { ++ self->private_impl.f_pixfmt = 2415954056u; ++ } else if (v_a == 4u) { ++ self->private_impl.f_pixfmt = 2164295816u; ++ } else { ++ status = wuffs_base__make_status(wuffs_qoi__error__bad_header); ++ goto exit; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src++; ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ 14u, ++ (self->private_impl.f_pixfmt == 2415954056u)); ++ } ++ self->private_impl.f_call_sequence = 32u; + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func png.decoder.filter_1_distance_4_x86_sse42 ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_1_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr) { +- wuffs_base__slice_u8 v_curr = {0}; +- __m128i v_x128 = {0}; +- __m128i v_a128 = {0}; ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_a128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_a128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- } +- v_curr.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_a128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- } +- v_curr.len = 0; ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- return wuffs_base__make_empty_struct(); ++ ++ return status; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func png.decoder.filter_3_distance_4_x86_sse42 ++// -------- func qoi.decoder.decode_frame_config + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_3_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- __m128i v_x128 = {0}; +- __m128i v_a128 = {0}; +- __m128i v_b128 = {0}; +- __m128i v_p128 = {0}; +- __m128i v_k128 = {0}; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_qoi__decoder__decode_frame_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- if (((uint64_t)(a_prev.len)) == 0u) { +- v_k128 = _mm_set1_epi8((int8_t)(254u)); +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- v_curr.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- } +- v_curr.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- } +- v_curr.len = 0; +- } +- } else { +- v_k128 = _mm_set1_epi8((int8_t)(1u)); +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_p128 = _mm_avg_epu8(v_a128, v_b128); +- v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_p128 = _mm_avg_epu8(v_a128, v_b128); +- v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; + } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_p128 = _mm_avg_epu8(v_a128, v_b128); +- v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128))); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_qoi__error__truncated_input); ++ goto exit; + } +- v_curr.len = 0; +- v_prev.len = 0; ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func png.decoder.filter_4_distance_3_x86_sse42 ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_3_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- __m128i v_x128 = {0}; +- __m128i v_a128 = {0}; +- __m128i v_b128 = {0}; +- __m128i v_c128 = {0}; +- __m128i v_p128 = {0}; +- __m128i v_pa128 = {0}; +- __m128i v_pb128 = {0}; +- __m128i v_pc128 = {0}; +- __m128i v_smallest128 = {0}; +- __m128i v_z128 = {0}; ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + wuffs_base__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6); +- while (v_curr.ptr < i_end0_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + wuffs_base__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3); +- while (v_curr.ptr < i_end1_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 3; +- v_prev.len = 3; +- uint8_t* i_end2_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3); +- while (v_curr.ptr < i_end2_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 3; +- v_prev.ptr += 3; +- } +- v_curr.len = 0; +- v_prev.len = 0; ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- return wuffs_base__make_empty_struct(); ++ return status; + } +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 + +-// ‼ WUFFS MULTI-FILE SECTION +x86_sse42 +-// -------- func png.decoder.filter_4_distance_4_x86_sse42 ++// -------- func qoi.decoder.do_decode_frame_config + +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2") + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_png__decoder__filter_4_distance_4_x86_sse42( +- wuffs_png__decoder* self, +- wuffs_base__slice_u8 a_curr, +- wuffs_base__slice_u8 a_prev) { +- wuffs_base__slice_u8 v_curr = {0}; +- wuffs_base__slice_u8 v_prev = {0}; +- __m128i v_x128 = {0}; +- __m128i v_a128 = {0}; +- __m128i v_b128 = {0}; +- __m128i v_c128 = {0}; +- __m128i v_p128 = {0}; +- __m128i v_pa128 = {0}; +- __m128i v_pb128 = {0}; +- __m128i v_pc128 = {0}; +- __m128i v_smallest128 = {0}; +- __m128i v_z128 = {0}; ++static wuffs_base__status ++wuffs_qoi__decoder__do_decode_frame_config( ++ wuffs_qoi__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- { +- wuffs_base__slice_u8 i_slice_curr = a_curr; +- v_curr.ptr = i_slice_curr.ptr; +- wuffs_base__slice_u8 i_slice_prev = a_prev; +- v_prev.ptr = i_slice_prev.ptr; +- i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len))); +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end0_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8); +- while (v_curr.ptr < i_end0_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; +- } +- v_curr.len = 4; +- v_prev.len = 4; +- uint8_t* i_end1_curr = v_curr.ptr + (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4); +- while (v_curr.ptr < i_end1_curr) { +- v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr))); +- v_b128 = _mm_unpacklo_epi8(v_b128, v_z128); +- v_pa128 = _mm_sub_epi16(v_b128, v_c128); +- v_pb128 = _mm_sub_epi16(v_a128, v_c128); +- v_pc128 = _mm_add_epi16(v_pa128, v_pb128); +- v_pa128 = _mm_abs_epi16(v_pa128); +- v_pb128 = _mm_abs_epi16(v_pb128); +- v_pc128 = _mm_abs_epi16(v_pc128); +- v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128)); +- v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128)); +- v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr))); +- v_x128 = _mm_unpacklo_epi8(v_x128, v_z128); +- v_x128 = _mm_add_epi8(v_x128, v_p128); +- v_a128 = v_x128; +- v_c128 = v_b128; +- v_x128 = _mm_packus_epi16(v_x128, v_x128); +- wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128)))); +- v_curr.ptr += 4; +- v_prev.ptr += 4; ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_qoi__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (16u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } +- v_curr.len = 0; +- v_prev.len = 0; +- } +- return wuffs_base__make_empty_struct(); +-} +-#endif // defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +-// ‼ WUFFS MULTI-FILE SECTION -x86_sse42 +- +-// -------- func png.decoder.get_quirk +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_png__decoder__get_quirk( +- const wuffs_png__decoder* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ 14u, ++ 0u, ++ (self->private_impl.f_pixfmt == 2415954056u), ++ false, ++ 0u); ++ } ++ self->private_impl.f_call_sequence = 64u; + +- if ((a_key == 1u) && self->private_impl.f_ignore_checksum) { +- return 1u; ++ ok: ++ self->private_impl.p_do_decode_frame_config = 0; ++ goto exit; + } +- return 0u; +-} + +-// -------- func png.decoder.set_quirk ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__set_quirk( +- wuffs_png__decoder* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- if (a_key == 1u) { +- self->private_impl.f_ignore_checksum = (a_value > 0u); +- wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, a_key, a_value); +- return wuffs_base__make_status(NULL); +- } +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ return status; + } + +-// -------- func png.decoder.decode_image_config ++// -------- func qoi.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__decode_image_config( +- wuffs_png__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++wuffs_qoi__decoder__decode_frame( ++ wuffs_qoi__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -54464,12 +67805,12 @@ wuffs_png__decoder__decode_image_config( + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } +- if (!a_src) { ++ if (!a_dst || !a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { ++ (self->private_impl.active_coroutine != 3)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -54478,17 +67819,22 @@ wuffs_png__decoder__decode_image_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_png__decoder__do_decode_image_config(self, a_dst, a_src); ++ wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_qoi__error__truncated_input); + goto exit; + } + status = v_status; +@@ -54496,14 +67842,14 @@ wuffs_png__decoder__decode_image_config( + } + + ok: +- self->private_impl.p_decode_image_config[0] = 0; ++ self->private_impl.p_decode_frame = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; + + goto exit; + exit: +@@ -54513,21 +67859,21 @@ wuffs_png__decoder__decode_image_config( + return status; + } + +-// -------- func png.decoder.do_decode_image_config ++// -------- func qoi.decoder.do_decode_frame + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__do_decode_image_config( +- wuffs_png__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++wuffs_qoi__decoder__do_decode_frame( ++ wuffs_qoi__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint64_t v_magic = 0; +- uint64_t v_mark = 0; +- uint32_t v_checksum_have = 0; +- uint32_t v_checksum_want = 0; + wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint64_t v_c64 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -54540,281 +67886,332 @@ wuffs_png__decoder__do_decode_image_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; +- if (coro_susp_point) { +- v_checksum_have = self->private_data.s_do_decode_image_config[0].v_checksum_have; +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if ( ! self->private_impl.f_seen_ihdr) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint64_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { +- t_0 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); +- iop_a_src += 8; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; +- if (num_bits_0 == 56) { +- t_0 = ((uint64_t)(*scratch)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)) << 56; +- } +- } +- v_magic = t_0; ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (v_magic != 727905341920923785u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_qoi__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint64_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { +- t_1 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); +- iop_a_src += 8; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 56) { +- t_1 = ((uint64_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; +- } +- } +- v_magic = t_1; ++ goto ok; ++ } ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y = 0u; ++ self->private_data.f_pixel[0u] = 0u; ++ self->private_data.f_pixel[1u] = 0u; ++ self->private_data.f_pixel[2u] = 0u; ++ self->private_data.f_pixel[3u] = 255u; ++ wuffs_private_impl__bulk_memset(&self->private_data.f_cache[0], 256u, 0u); ++ self->private_impl.f_remaining_pixels_times_4 = (((uint64_t)(self->private_impl.f_width)) * ((uint64_t)(self->private_impl.f_height)) * 4u); ++ while (self->private_impl.f_remaining_pixels_times_4 > 0u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if (v_magic != 5927942488114331648u) { +- if (v_magic == 5278895250759221248u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_cgbi_extension); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_qoi__decoder__from_src_to_buffer(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (self->private_impl.f_remaining_pixels_times_4 < ((uint64_t)(self->private_impl.f_buffer_index))) { ++ status = wuffs_base__make_status(wuffs_base__error__too_much_data); ++ goto exit; ++ } ++ self->private_impl.f_remaining_pixels_times_4 -= ((uint64_t)(self->private_impl.f_buffer_index)); ++ v_status = wuffs_qoi__decoder__from_buffer_to_dst(self, a_dst); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); + goto exit; + } +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; ++ goto ok; + } +- self->private_impl.f_chunk_type_array[0u] = 73u; +- self->private_impl.f_chunk_type_array[1u] = 72u; +- self->private_impl.f_chunk_type_array[2u] = 68u; +- self->private_impl.f_chunk_type_array[3u] = 82u; +- wuffs_base__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, +- sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); +- while (true) { +- v_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_0 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_decode_frame.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- wuffs_base__status t_2 = wuffs_png__decoder__decode_ihdr(self, a_src); +- v_status = t_2; +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); ++ if (num_bits_0 == 56) { ++ t_0 = ((uint64_t)(*scratch >> 0)); ++ break; + } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)); + } +- if ( ! self->private_impl.f_ignore_checksum) { +- v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); +- } +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); + } ++ v_c64 = t_0; ++ } ++ if (v_c64 != 1u) { ++ status = wuffs_base__make_status(wuffs_qoi__error__bad_footer); ++ goto exit; ++ } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func qoi.decoder.from_src_to_buffer ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_qoi__decoder__from_src_to_buffer( ++ wuffs_qoi__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint8_t v_dg = 0; ++ uint32_t v_bi = 0; ++ uint32_t v_bj = 0; ++ uint32_t v_bk = 0; ++ uint32_t v_ci = 0; ++ uint32_t v_hash4 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_from_src_to_buffer; ++ if (coro_susp_point) { ++ v_dg = self->private_data.s_from_src_to_buffer.v_dg; ++ v_bi = self->private_data.s_from_src_to_buffer.v_bi; ++ v_bk = self->private_data.s_from_src_to_buffer.v_bk; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ v_bk = 7936u; ++ if (self->private_impl.f_remaining_pixels_times_4 < 7936u) { ++ v_bk = ((uint32_t)(self->private_impl.f_remaining_pixels_times_4)); ++ } ++ while (v_bi < v_bk) { + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)); +- } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_checksum_want = t_3; +- } +- if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != v_checksum_want)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_checksum); +- goto exit; +- } +- self->private_impl.f_seen_ihdr = true; +- } else if (self->private_impl.f_metadata_fourcc != 0u) { +- self->private_impl.f_call_sequence = 16u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; +- } +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- continue; ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); +- if (self->private_impl.f_chunk_type == 1413563465u) { +- if ( ! self->private_impl.f_seen_actl || self->private_impl.f_seen_fctl) { +- break; ++ if (v_c8 == 254u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ self->private_data.f_pixel[2u] = t_1; + } +- self->private_impl.f_seen_idat = true; +- } else if (self->private_impl.f_chunk_type == 1413571686u) { +- if (self->private_impl.f_seen_idat && self->private_impl.f_seen_fctl) { +- break; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ self->private_data.f_pixel[1u] = t_2; + } +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- iop_a_src += 8u; +- if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) { +- self->private_impl.f_chunk_type_array[0u] = ((uint8_t)((self->private_impl.f_chunk_type >> 0u))); +- self->private_impl.f_chunk_type_array[1u] = ((uint8_t)((self->private_impl.f_chunk_type >> 8u))); +- self->private_impl.f_chunk_type_array[2u] = ((uint8_t)((self->private_impl.f_chunk_type >> 16u))); +- self->private_impl.f_chunk_type_array[3u] = ((uint8_t)((self->private_impl.f_chunk_type >> 24u))); +- wuffs_base__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, +- sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); +- } +- while (true) { +- v_mark = ((uint64_t)(iop_a_src - io0_a_src)); + { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- wuffs_base__status t_4 = wuffs_png__decoder__decode_other_chunk(self, a_src, false); +- v_status = t_4; +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ uint8_t t_3 = *iop_a_src++; ++ self->private_data.f_pixel[0u] = t_3; ++ } ++ } else if (v_c8 == 255u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_4 = *iop_a_src++; ++ self->private_data.f_pixel[2u] = t_4; + } +- if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) { +- v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ self->private_data.f_pixel[1u] = t_5; + } +- if (wuffs_base__status__is_ok(&v_status)) { +- break; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ self->private_data.f_pixel[0u] = t_6; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); +- } +- if (self->private_impl.f_metadata_fourcc != 0u) { +- self->private_impl.f_call_sequence = 16u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- uint32_t t_5; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); +- if (num_bits_5 == 24) { +- t_5 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_5 += 8u; +- *scratch |= ((uint64_t)(num_bits_5)); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_7 = *iop_a_src++; ++ self->private_data.f_pixel[3u] = t_7; + } +- v_checksum_want = t_5; +- } +- if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u) && (v_checksum_have != v_checksum_want)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_checksum); +- goto exit; +- } +- } +- if ((self->private_impl.f_color_type == 3u) && ! self->private_impl.f_seen_plte) { +- status = wuffs_base__make_status(wuffs_png__error__missing_palette); +- goto exit; +- } +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- self->private_impl.f_first_config_io_position = self->private_impl.f_frame_config_io_position; +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- self->private_impl.f_dst_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_first_config_io_position, +- ((self->private_impl.f_color_type <= 3u) && ! self->private_impl.f_seen_trns)); +- } +- if ( ! self->private_impl.f_seen_actl) { +- self->private_impl.f_num_animation_frames_value = 1u; +- self->private_impl.f_first_rect_x0 = 0u; +- self->private_impl.f_first_rect_y0 = 0u; +- self->private_impl.f_first_rect_x1 = self->private_impl.f_width; +- self->private_impl.f_first_rect_y1 = self->private_impl.f_height; +- self->private_impl.f_first_duration = 0u; +- self->private_impl.f_first_disposal = 0u; +- self->private_impl.f_first_overwrite_instead_of_blend = false; +- } +- self->private_impl.f_call_sequence = 32u; ++ } else if (((uint8_t)(v_c8 >> 6u)) == 0u) { ++ v_ci = (4u * ((uint32_t)(((uint8_t)(v_c8 & 63u))))); ++ self->private_data.f_pixel[0u] = self->private_data.f_cache[(v_ci + 0u)]; ++ self->private_data.f_pixel[1u] = self->private_data.f_cache[(v_ci + 1u)]; ++ self->private_data.f_pixel[2u] = self->private_data.f_cache[(v_ci + 2u)]; ++ self->private_data.f_pixel[3u] = self->private_data.f_cache[(v_ci + 3u)]; ++ self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u]; ++ self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u]; ++ self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u]; ++ self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u]; ++ v_bi += 4u; ++ continue; ++ } else if (((uint8_t)(v_c8 >> 6u)) == 1u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_pixel[2u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 4u)) & 3u)) + 254u)); ++ self->private_data.f_pixel[1u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 2u)) & 3u)) + 254u)); ++ self->private_data.f_pixel[0u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 0u)) & 3u)) + 254u)); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (((uint8_t)(v_c8 >> 6u)) == 2u) { ++ v_dg = ((uint8_t)(((uint8_t)(v_c8 & 63u)) + 224u)); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_8 = *iop_a_src++; ++ v_c8 = t_8; ++ } ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_data.f_pixel[2u] += ((uint8_t)(((uint8_t)(v_dg + 248u)) + ((uint8_t)(15u & ((uint8_t)(v_c8 >> 4u)))))); ++ self->private_data.f_pixel[1u] += v_dg; ++ self->private_data.f_pixel[0u] += ((uint8_t)(((uint8_t)(v_dg + 248u)) + ((uint8_t)(15u & ((uint8_t)(v_c8 >> 0u)))))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ v_bj = (v_bi + (4u * (63u & (1u + ((uint32_t)(v_c8)))))); ++ while (v_bi < v_bj) { ++ self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u]; ++ self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u]; ++ self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u]; ++ self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u]; ++ v_bi += 4u; ++ } ++ continue; ++ } ++ v_hash4 = (4u * (63u & ((((uint32_t)(self->private_data.f_pixel[2u])) * 3u) + ++ (((uint32_t)(self->private_data.f_pixel[1u])) * 5u) + ++ (((uint32_t)(self->private_data.f_pixel[0u])) * 7u) + ++ (((uint32_t)(self->private_data.f_pixel[3u])) * 11u)))); ++ self->private_data.f_cache[(v_hash4 + 0u)] = self->private_data.f_pixel[0u]; ++ self->private_data.f_cache[(v_hash4 + 1u)] = self->private_data.f_pixel[1u]; ++ self->private_data.f_cache[(v_hash4 + 2u)] = self->private_data.f_pixel[2u]; ++ self->private_data.f_cache[(v_hash4 + 3u)] = self->private_data.f_pixel[3u]; ++ self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u]; ++ self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u]; ++ self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u]; ++ self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u]; ++ v_bi += 4u; ++ } ++ self->private_impl.f_buffer_index = v_bi; + ++ goto ok; + ok: +- self->private_impl.p_do_decode_image_config[0] = 0; ++ self->private_impl.p_from_src_to_buffer = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_image_config[0].v_checksum_have = v_checksum_have; ++ self->private_impl.p_from_src_to_buffer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_from_src_to_buffer.v_dg = v_dg; ++ self->private_data.s_from_src_to_buffer.v_bi = v_bi; ++ self->private_data.s_from_src_to_buffer.v_bk = v_bk; + + goto exit; + exit: +@@ -54825,1068 +68222,1113 @@ wuffs_png__decoder__do_decode_image_config( + return status; + } + +-// -------- func png.decoder.decode_ihdr ++// -------- func qoi.decoder.from_buffer_to_dst + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__decode_ihdr( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_a32 = 0; +- uint8_t v_a8 = 0; ++wuffs_qoi__decoder__from_buffer_to_dst( ++ wuffs_qoi__decoder* self, ++ wuffs_base__pixel_buffer* a_dst) { ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ uint32_t v_bi = 0; ++ uint32_t v_rem_x = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ wuffs_base__slice_u8 v_src = {0}; ++ uint32_t v_src_length = 0; ++ uint64_t v_i = 0; + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } +- +- uint32_t coro_susp_point = self->private_impl.p_decode_ihdr[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_ihdr[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_ihdr[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- v_a32 = t_0; +- } +- if ((v_a32 == 0u) || (v_a32 > 2147483647u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; +- } else if (v_a32 > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_width = v_a32; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_ihdr[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_ihdr[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } +- } +- v_a32 = t_1; +- } +- if ((v_a32 == 0u) || (v_a32 > 2147483647u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; +- } else if (v_a32 > 16777215u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- self->private_impl.f_height = v_a32; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- v_a8 = t_2; +- } +- if (v_a8 > 16u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; +- } +- self->private_impl.f_depth = v_a8; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_a8 = t_3; +- } +- if ((v_a8 == 1u) || (v_a8 == 5u) || (v_a8 > 6u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; +- } +- self->private_impl.f_color_type = v_a8; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_a8 = t_4; +- } +- if (v_a8 != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ while (v_bi < self->private_impl.f_buffer_index) { ++ if (self->private_impl.f_width <= self->private_impl.f_dst_x) { ++ self->private_impl.f_dst_x = 0u; ++ self->private_impl.f_dst_y += 1u; ++ if (self->private_impl.f_dst_y >= self->private_impl.f_height) { ++ break; + } +- uint8_t t_5 = *iop_a_src++; +- v_a8 = t_5; +- } +- if (v_a8 != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; ++ v_rem_x = self->private_impl.f_width; ++ } else { ++ v_rem_x = (self->private_impl.f_width - self->private_impl.f_dst_x); + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_6 = *iop_a_src++; +- v_a8 = t_6; ++ v_src = wuffs_base__make_slice_u8_ij(self->private_data.f_buffer, v_bi, self->private_impl.f_buffer_index); ++ if (((uint64_t)((4u * v_rem_x))) < ((uint64_t)(v_src.len))) { ++ v_src = wuffs_base__slice_u8__subslice_j(v_src, ((uint64_t)((4u * v_rem_x)))); + } +- if (v_a8 == 0u) { +- self->private_impl.f_interlace_pass = 0u; +- } else if (v_a8 == 1u) { +- self->private_impl.f_interlace_pass = 1u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; ++ v_src_length = ((uint32_t)(((uint64_t)(v_src.len)))); ++ v_bi += v_src_length; ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); + } +- self->private_impl.f_filter_distance = 0u; +- wuffs_png__decoder__assign_filter_distance(self); +- if (self->private_impl.f_filter_distance == 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_header); +- goto exit; ++ v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel))); ++ self->private_impl.f_dst_x += (v_src_length / 4u); ++ if (v_i < ((uint64_t)(v_dst.len))) { ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), wuffs_base__pixel_buffer__palette(a_dst), v_src); + } +- self->private_impl.f_overall_workbuf_length = (((uint64_t)(self->private_impl.f_height)) * (1u + wuffs_png__decoder__calculate_bytes_per_row(self, self->private_impl.f_width))); +- wuffs_png__decoder__choose_filter_implementations(self); ++ } ++ return wuffs_base__make_status(NULL); ++} + +- goto ok; +- ok: +- self->private_impl.p_decode_ihdr[0] = 0; +- goto exit; ++// -------- func qoi.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_qoi__decoder__frame_dirty_rect( ++ const wuffs_qoi__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_ihdr[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); ++} ++ ++// -------- func qoi.decoder.num_animation_loops ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_qoi__decoder__num_animation_loops( ++ const wuffs_qoi__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func qoi.decoder.num_decoded_frame_configs ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_qoi__decoder__num_decoded_frame_configs( ++ const wuffs_qoi__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; ++} + ++// -------- func qoi.decoder.num_decoded_frames ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_qoi__decoder__num_decoded_frames( ++ const wuffs_qoi__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func qoi.decoder.restart_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_qoi__decoder__restart_frame( ++ wuffs_qoi__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if ((a_index != 0u) || (a_io_position != 14u)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func qoi.decoder.set_report_metadata ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_qoi__decoder__set_report_metadata( ++ wuffs_qoi__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func qoi.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_qoi__decoder__tell_me_more( ++ wuffs_qoi__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ ++ goto ok; ++ ok: + goto exit; + exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- + return status; + } + +-// -------- func png.decoder.assign_filter_distance ++// -------- func qoi.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_qoi__decoder__workbuf_len( ++ const wuffs_qoi__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) ++ ++// ---------------- Status Codes Implementations ++ ++// ---------------- Private Consts ++ ++static const uint32_t ++WUFFS_SHA256__INITIAL_SHA256_H[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1779033703u, 3144134277u, 1013904242u, 2773480762u, 1359893119u, 2600822924u, 528734635u, 1541459225u, ++}; ++ ++static const uint32_t ++WUFFS_SHA256__K[64] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1116352408u, 1899447441u, 3049323471u, 3921009573u, 961987163u, 1508970993u, 2453635748u, 2870763221u, ++ 3624381080u, 310598401u, 607225278u, 1426881987u, 1925078388u, 2162078206u, 2614888103u, 3248222580u, ++ 3835390401u, 4022224774u, 264347078u, 604807628u, 770255983u, 1249150122u, 1555081692u, 1996064986u, ++ 2554220882u, 2821834349u, 2952996808u, 3210313671u, 3336571891u, 3584528711u, 113926993u, 338241895u, ++ 666307205u, 773529912u, 1294757372u, 1396182291u, 1695183700u, 1986661051u, 2177026350u, 2456956037u, ++ 2730485921u, 2820302411u, 3259730800u, 3345764771u, 3516065817u, 3600352804u, 4094571909u, 275423344u, ++ 430227734u, 506948616u, 659060556u, 883997877u, 958139571u, 1322822218u, 1537002063u, 1747873779u, ++ 1955562222u, 2024104815u, 2227730452u, 2361852424u, 2428436474u, 2756734187u, 3204031479u, 3329325298u, ++}; ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_png__decoder__assign_filter_distance( +- wuffs_png__decoder* self) { +- if (self->private_impl.f_depth < 8u) { +- if ((self->private_impl.f_depth != 1u) && (self->private_impl.f_depth != 2u) && (self->private_impl.f_depth != 4u)) { +- return wuffs_base__make_empty_struct(); +- } else if (self->private_impl.f_color_type == 0u) { +- self->private_impl.f_dst_pixfmt = 536870920u; +- self->private_impl.f_src_pixfmt = 536870920u; +- } else if (self->private_impl.f_color_type == 3u) { +- self->private_impl.f_dst_pixfmt = 2198077448u; +- self->private_impl.f_src_pixfmt = 2198077448u; ++wuffs_sha256__hasher__up( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x); ++ ++// ---------------- VTables ++ ++const wuffs_base__hasher_bitvec256__func_ptrs ++wuffs_sha256__hasher__func_ptrs_for__wuffs_base__hasher_bitvec256 = { ++ (wuffs_base__bitvec256(*)(const void*))(&wuffs_sha256__hasher__checksum_bitvec256), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_sha256__hasher__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_sha256__hasher__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_sha256__hasher__update), ++ (wuffs_base__bitvec256(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_sha256__hasher__update_bitvec256), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_sha256__hasher__initialize( ++ wuffs_sha256__hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { +- return wuffs_base__make_empty_struct(); ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } +- self->private_impl.f_filter_distance = 1u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- } else if (self->private_impl.f_color_type == 0u) { +- if (self->private_impl.f_depth == 8u) { +- self->private_impl.f_dst_pixfmt = 536870920u; +- self->private_impl.f_src_pixfmt = 536870920u; +- self->private_impl.f_filter_distance = 1u; +- } else if (self->private_impl.f_depth == 16u) { +- if (self->private_impl.f_interlace_pass == 0u) { +- self->private_impl.f_dst_pixfmt = 536870923u; +- self->private_impl.f_src_pixfmt = 537919499u; +- } else { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__hasher_bitvec256.vtable_name = ++ wuffs_base__hasher_bitvec256__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_bitvec256.function_pointers = ++ (const void*)(&wuffs_sha256__hasher__func_ptrs_for__wuffs_base__hasher_bitvec256); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_sha256__hasher* ++wuffs_sha256__hasher__alloc(void) { ++ wuffs_sha256__hasher* x = ++ (wuffs_sha256__hasher*)(calloc(1, sizeof(wuffs_sha256__hasher))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_sha256__hasher__initialize( ++ x, sizeof(wuffs_sha256__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; ++} ++ ++size_t ++sizeof__wuffs_sha256__hasher(void) { ++ return sizeof(wuffs_sha256__hasher); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func sha256.hasher.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_sha256__hasher__get_quirk( ++ const wuffs_sha256__hasher* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func sha256.hasher.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_sha256__hasher__set_quirk( ++ wuffs_sha256__hasher* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func sha256.hasher.update ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_sha256__hasher__update( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } ++ ++ uint64_t v_new_lmu = 0; ++ ++ if ((self->private_impl.f_length_modulo_u64 == 0u) && ! self->private_impl.f_length_overflows_u64) { ++ self->private_impl.f_h0 = WUFFS_SHA256__INITIAL_SHA256_H[0u]; ++ self->private_impl.f_h1 = WUFFS_SHA256__INITIAL_SHA256_H[1u]; ++ self->private_impl.f_h2 = WUFFS_SHA256__INITIAL_SHA256_H[2u]; ++ self->private_impl.f_h3 = WUFFS_SHA256__INITIAL_SHA256_H[3u]; ++ self->private_impl.f_h4 = WUFFS_SHA256__INITIAL_SHA256_H[4u]; ++ self->private_impl.f_h5 = WUFFS_SHA256__INITIAL_SHA256_H[5u]; ++ self->private_impl.f_h6 = WUFFS_SHA256__INITIAL_SHA256_H[6u]; ++ self->private_impl.f_h7 = WUFFS_SHA256__INITIAL_SHA256_H[7u]; ++ } ++ v_new_lmu = ((uint64_t)(self->private_impl.f_length_modulo_u64 + ((uint64_t)(a_x.len)))); ++ self->private_impl.f_length_overflows_u64 = ((v_new_lmu < self->private_impl.f_length_modulo_u64) || self->private_impl.f_length_overflows_u64); ++ self->private_impl.f_length_modulo_u64 = v_new_lmu; ++ if (self->private_impl.f_buf_len != 0u) { ++ while (self->private_impl.f_buf_len < 64u) { ++ if (((uint64_t)(a_x.len)) <= 0u) { ++ return wuffs_base__make_empty_struct(); + } +- self->private_impl.f_filter_distance = 2u; +- } +- } else if (self->private_impl.f_color_type == 2u) { +- if (self->private_impl.f_depth == 8u) { +- self->private_impl.f_dst_pixfmt = 2147485832u; +- self->private_impl.f_src_pixfmt = 2684356744u; +- self->private_impl.f_filter_distance = 3u; +- } else if (self->private_impl.f_depth == 16u) { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; +- self->private_impl.f_filter_distance = 6u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- } +- } else if (self->private_impl.f_color_type == 3u) { +- if (self->private_impl.f_depth == 8u) { +- self->private_impl.f_dst_pixfmt = 2198077448u; +- self->private_impl.f_src_pixfmt = 2198077448u; +- self->private_impl.f_filter_distance = 1u; +- } +- } else if (self->private_impl.f_color_type == 4u) { +- if (self->private_impl.f_depth == 8u) { +- self->private_impl.f_dst_pixfmt = 2164295816u; +- self->private_impl.f_src_pixfmt = 2164295816u; +- self->private_impl.f_filter_distance = 2u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- } else if (self->private_impl.f_depth == 16u) { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; +- self->private_impl.f_filter_distance = 4u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- } +- } else if (self->private_impl.f_color_type == 6u) { +- if (self->private_impl.f_depth == 8u) { +- self->private_impl.f_dst_pixfmt = 2164295816u; +- self->private_impl.f_src_pixfmt = 2701166728u; +- self->private_impl.f_filter_distance = 4u; +- } else if (self->private_impl.f_depth == 16u) { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; +- self->private_impl.f_filter_distance = 8u; +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); ++ self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u]; ++ self->private_impl.f_buf_len += 1u; ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); + } ++ self->private_impl.f_buf_len = 0u; ++ wuffs_sha256__hasher__up(self, wuffs_base__make_slice_u8(self->private_impl.f_buf_data, 64)); + } ++ wuffs_sha256__hasher__up(self, a_x); + return wuffs_base__make_empty_struct(); + } + +-// -------- func png.decoder.calculate_bytes_per_row ++// -------- func sha256.hasher.update_bitvec256 + + WUFFS_BASE__GENERATED_C_CODE +-static uint64_t +-wuffs_png__decoder__calculate_bytes_per_row( +- const wuffs_png__decoder* self, +- uint32_t a_width) { +- uint64_t v_bytes_per_channel = 0; +- +- if (self->private_impl.f_depth == 1u) { +- return ((uint64_t)(((a_width + 7u) / 8u))); +- } else if (self->private_impl.f_depth == 2u) { +- return ((uint64_t)(((a_width + 3u) / 4u))); +- } else if (self->private_impl.f_depth == 4u) { +- return ((uint64_t)(((a_width + 1u) / 2u))); ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_sha256__hasher__update_bitvec256( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); + } +- v_bytes_per_channel = ((uint64_t)((self->private_impl.f_depth >> 3u))); +- return (((uint64_t)(a_width)) * v_bytes_per_channel * ((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type]))); ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); ++ } ++ ++ wuffs_sha256__hasher__update(self, a_x); ++ return wuffs_sha256__hasher__checksum_bitvec256(self); + } + +-// -------- func png.decoder.choose_filter_implementations ++// -------- func sha256.hasher.up + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__empty_struct +-wuffs_png__decoder__choose_filter_implementations( +- wuffs_png__decoder* self) { +- if (self->private_impl.f_filter_distance == 3u) { +- self->private_impl.choosy_filter_1 = ( +- &wuffs_png__decoder__filter_1_distance_3_fallback); +- self->private_impl.choosy_filter_3 = ( +- &wuffs_png__decoder__filter_3_distance_3_fallback); +- self->private_impl.choosy_filter_4 = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_3_arm_neon : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_3_x86_sse42 : +-#endif +- &wuffs_png__decoder__filter_4_distance_3_fallback); +- } else if (self->private_impl.f_filter_distance == 4u) { +- self->private_impl.choosy_filter_1 = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_1_distance_4_arm_neon : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_1_distance_4_x86_sse42 : +-#endif +- &wuffs_png__decoder__filter_1_distance_4_fallback); +- self->private_impl.choosy_filter_3 = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_3_distance_4_arm_neon : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_3_distance_4_x86_sse42 : +-#endif +- &wuffs_png__decoder__filter_3_distance_4_fallback); +- self->private_impl.choosy_filter_4 = ( +-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON) +- wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_4_arm_neon : +-#endif +-#if defined(WUFFS_BASE__CPU_ARCH__X86_FAMILY) +- wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_4_x86_sse42 : +-#endif +- &wuffs_png__decoder__filter_4_distance_4_fallback); ++wuffs_sha256__hasher__up( ++ wuffs_sha256__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ wuffs_base__slice_u8 v_p = {0}; ++ uint32_t v_w[64] = {0}; ++ uint32_t v_w2 = 0; ++ uint32_t v_w15 = 0; ++ uint32_t v_s0 = 0; ++ uint32_t v_s1 = 0; ++ uint32_t v_t1 = 0; ++ uint32_t v_t2 = 0; ++ uint32_t v_a = 0; ++ uint32_t v_b = 0; ++ uint32_t v_c = 0; ++ uint32_t v_d = 0; ++ uint32_t v_e = 0; ++ uint32_t v_f = 0; ++ uint32_t v_g = 0; ++ uint32_t v_h = 0; ++ uint32_t v_i = 0; ++ uint32_t v_buf_len = 0; ++ ++ v_a = self->private_impl.f_h0; ++ v_b = self->private_impl.f_h1; ++ v_c = self->private_impl.f_h2; ++ v_d = self->private_impl.f_h3; ++ v_e = self->private_impl.f_h4; ++ v_f = self->private_impl.f_h5; ++ v_g = self->private_impl.f_h6; ++ v_h = self->private_impl.f_h7; ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 64; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64)); ++ while (v_p.ptr < i_end0_p) { ++ v_w[0u] = ((((uint32_t)(v_p.ptr[0u])) << 24u) | ++ (((uint32_t)(v_p.ptr[1u])) << 16u) | ++ (((uint32_t)(v_p.ptr[2u])) << 8u) | ++ ((uint32_t)(v_p.ptr[3u]))); ++ v_w[1u] = ((((uint32_t)(v_p.ptr[4u])) << 24u) | ++ (((uint32_t)(v_p.ptr[5u])) << 16u) | ++ (((uint32_t)(v_p.ptr[6u])) << 8u) | ++ ((uint32_t)(v_p.ptr[7u]))); ++ v_w[2u] = ((((uint32_t)(v_p.ptr[8u])) << 24u) | ++ (((uint32_t)(v_p.ptr[9u])) << 16u) | ++ (((uint32_t)(v_p.ptr[10u])) << 8u) | ++ ((uint32_t)(v_p.ptr[11u]))); ++ v_w[3u] = ((((uint32_t)(v_p.ptr[12u])) << 24u) | ++ (((uint32_t)(v_p.ptr[13u])) << 16u) | ++ (((uint32_t)(v_p.ptr[14u])) << 8u) | ++ ((uint32_t)(v_p.ptr[15u]))); ++ v_w[4u] = ((((uint32_t)(v_p.ptr[16u])) << 24u) | ++ (((uint32_t)(v_p.ptr[17u])) << 16u) | ++ (((uint32_t)(v_p.ptr[18u])) << 8u) | ++ ((uint32_t)(v_p.ptr[19u]))); ++ v_w[5u] = ((((uint32_t)(v_p.ptr[20u])) << 24u) | ++ (((uint32_t)(v_p.ptr[21u])) << 16u) | ++ (((uint32_t)(v_p.ptr[22u])) << 8u) | ++ ((uint32_t)(v_p.ptr[23u]))); ++ v_w[6u] = ((((uint32_t)(v_p.ptr[24u])) << 24u) | ++ (((uint32_t)(v_p.ptr[25u])) << 16u) | ++ (((uint32_t)(v_p.ptr[26u])) << 8u) | ++ ((uint32_t)(v_p.ptr[27u]))); ++ v_w[7u] = ((((uint32_t)(v_p.ptr[28u])) << 24u) | ++ (((uint32_t)(v_p.ptr[29u])) << 16u) | ++ (((uint32_t)(v_p.ptr[30u])) << 8u) | ++ ((uint32_t)(v_p.ptr[31u]))); ++ v_w[8u] = ((((uint32_t)(v_p.ptr[32u])) << 24u) | ++ (((uint32_t)(v_p.ptr[33u])) << 16u) | ++ (((uint32_t)(v_p.ptr[34u])) << 8u) | ++ ((uint32_t)(v_p.ptr[35u]))); ++ v_w[9u] = ((((uint32_t)(v_p.ptr[36u])) << 24u) | ++ (((uint32_t)(v_p.ptr[37u])) << 16u) | ++ (((uint32_t)(v_p.ptr[38u])) << 8u) | ++ ((uint32_t)(v_p.ptr[39u]))); ++ v_w[10u] = ((((uint32_t)(v_p.ptr[40u])) << 24u) | ++ (((uint32_t)(v_p.ptr[41u])) << 16u) | ++ (((uint32_t)(v_p.ptr[42u])) << 8u) | ++ ((uint32_t)(v_p.ptr[43u]))); ++ v_w[11u] = ((((uint32_t)(v_p.ptr[44u])) << 24u) | ++ (((uint32_t)(v_p.ptr[45u])) << 16u) | ++ (((uint32_t)(v_p.ptr[46u])) << 8u) | ++ ((uint32_t)(v_p.ptr[47u]))); ++ v_w[12u] = ((((uint32_t)(v_p.ptr[48u])) << 24u) | ++ (((uint32_t)(v_p.ptr[49u])) << 16u) | ++ (((uint32_t)(v_p.ptr[50u])) << 8u) | ++ ((uint32_t)(v_p.ptr[51u]))); ++ v_w[13u] = ((((uint32_t)(v_p.ptr[52u])) << 24u) | ++ (((uint32_t)(v_p.ptr[53u])) << 16u) | ++ (((uint32_t)(v_p.ptr[54u])) << 8u) | ++ ((uint32_t)(v_p.ptr[55u]))); ++ v_w[14u] = ((((uint32_t)(v_p.ptr[56u])) << 24u) | ++ (((uint32_t)(v_p.ptr[57u])) << 16u) | ++ (((uint32_t)(v_p.ptr[58u])) << 8u) | ++ ((uint32_t)(v_p.ptr[59u]))); ++ v_w[15u] = ((((uint32_t)(v_p.ptr[60u])) << 24u) | ++ (((uint32_t)(v_p.ptr[61u])) << 16u) | ++ (((uint32_t)(v_p.ptr[62u])) << 8u) | ++ ((uint32_t)(v_p.ptr[63u]))); ++ v_i = 16u; ++ while (v_i < 64u) { ++ v_w2 = v_w[(v_i - 2u)]; ++ v_s1 = ((v_w2 >> 10u) ^ (((uint32_t)(v_w2 << 15u)) | (v_w2 >> 17u)) ^ (((uint32_t)(v_w2 << 13u)) | (v_w2 >> 19u))); ++ v_w15 = v_w[(v_i - 15u)]; ++ v_s0 = ((v_w15 >> 3u) ^ (((uint32_t)(v_w15 << 25u)) | (v_w15 >> 7u)) ^ (((uint32_t)(v_w15 << 14u)) | (v_w15 >> 18u))); ++ v_w[v_i] = ((uint32_t)(((uint32_t)(((uint32_t)(v_s1 + v_w[(v_i - 7u)])) + v_s0)) + v_w[(v_i - 16u)])); ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 64u) { ++ v_t1 = v_h; ++ v_t1 += ((((uint32_t)(v_e << 26u)) | (v_e >> 6u)) ^ (((uint32_t)(v_e << 21u)) | (v_e >> 11u)) ^ (((uint32_t)(v_e << 7u)) | (v_e >> 25u))); ++ v_t1 += ((v_e & v_f) ^ ((4294967295u ^ v_e) & v_g)); ++ v_t1 += WUFFS_SHA256__K[v_i]; ++ v_t1 += v_w[v_i]; ++ v_t2 = ((((uint32_t)(v_a << 30u)) | (v_a >> 2u)) ^ (((uint32_t)(v_a << 19u)) | (v_a >> 13u)) ^ (((uint32_t)(v_a << 10u)) | (v_a >> 22u))); ++ v_t2 += ((v_a & v_b) ^ (v_a & v_c) ^ (v_b & v_c)); ++ v_h = v_g; ++ v_g = v_f; ++ v_f = v_e; ++ v_e = ((uint32_t)(v_d + v_t1)); ++ v_d = v_c; ++ v_c = v_b; ++ v_b = v_a; ++ v_a = ((uint32_t)(v_t1 + v_t2)); ++ v_i += 1u; ++ } ++ v_a += self->private_impl.f_h0; ++ self->private_impl.f_h0 = v_a; ++ v_b += self->private_impl.f_h1; ++ self->private_impl.f_h1 = v_b; ++ v_c += self->private_impl.f_h2; ++ self->private_impl.f_h2 = v_c; ++ v_d += self->private_impl.f_h3; ++ self->private_impl.f_h3 = v_d; ++ v_e += self->private_impl.f_h4; ++ self->private_impl.f_h4 = v_e; ++ v_f += self->private_impl.f_h5; ++ self->private_impl.f_h5 = v_f; ++ v_g += self->private_impl.f_h6; ++ self->private_impl.f_h6 = v_g; ++ v_h += self->private_impl.f_h7; ++ self->private_impl.f_h7 = v_h; ++ v_p.ptr += 64; ++ } ++ v_p.len = 1; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end1_p) { ++ self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u]; ++ v_buf_len = ((v_buf_len + 1u) & 63u); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; + } ++ self->private_impl.f_buf_len = ((uint32_t)((((uint64_t)(a_x.len)) & 63u))); + return wuffs_base__make_empty_struct(); + } + +-// -------- func png.decoder.decode_other_chunk ++// -------- func sha256.hasher.checksum_bitvec256 + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_other_chunk( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src, +- bool a_framy) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256 ++wuffs_sha256__hasher__checksum_bitvec256( ++ const wuffs_sha256__hasher* self) { ++ if (!self) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u); + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_other_chunk[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ uint32_t v_buf_len = 0; ++ uint8_t v_buf_data[64] = {0}; ++ uint64_t v_length_in_bits = 0; ++ uint32_t v_w[64] = {0}; ++ uint32_t v_w2 = 0; ++ uint32_t v_w15 = 0; ++ uint32_t v_s0 = 0; ++ uint32_t v_s1 = 0; ++ uint32_t v_t1 = 0; ++ uint32_t v_t2 = 0; ++ uint32_t v_h0 = 0; ++ uint32_t v_h1 = 0; ++ uint32_t v_h2 = 0; ++ uint32_t v_h3 = 0; ++ uint32_t v_h4 = 0; ++ uint32_t v_h5 = 0; ++ uint32_t v_h6 = 0; ++ uint32_t v_h7 = 0; ++ uint32_t v_a = 0; ++ uint32_t v_b = 0; ++ uint32_t v_c = 0; ++ uint32_t v_d = 0; ++ uint32_t v_e = 0; ++ uint32_t v_f = 0; ++ uint32_t v_g = 0; ++ uint32_t v_h = 0; ++ uint32_t v_i = 0; ++ bool v_final_block = false; + +- if ((self->private_impl.f_chunk_type == 1163152464u) && ! a_framy) { +- if (self->private_impl.f_seen_plte) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } else if (self->private_impl.f_color_type == 3u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_png__decoder__decode_plte(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else if ((self->private_impl.f_color_type == 2u) || (self->private_impl.f_color_type == 6u)) { +- } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_seen_plte = true; +- } else if ((self->private_impl.f_chunk_type & 32u) == 0u) { +- if (self->private_impl.f_chunk_type != 1413563465u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } ++ v_i = 0u; ++ while (v_i < 64u) { ++ v_buf_data[v_i] = self->private_impl.f_buf_data[v_i]; ++ v_i += 1u; ++ } ++ v_buf_len = (self->private_impl.f_buf_len & 63u); ++ if (v_buf_len < 56u) { ++ v_buf_data[v_buf_len] = 128u; ++ v_buf_len += 1u; ++ while (v_buf_len < 56u) { ++ v_buf_data[v_buf_len] = 0u; ++ v_buf_len += 1u; + } +- if (self->private_impl.f_chunk_type == 1716082789u) { +- if (self->private_impl.f_report_metadata_exif) { +- if (self->private_impl.f_seen_exif) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_png__decoder__decode_exif(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_exif = true; +- } +- } else if ((self->private_impl.f_chunk_type == 1951945833u) || (self->private_impl.f_chunk_type == 1951942004u) || (self->private_impl.f_chunk_type == 1951945850u)) { +- if (self->private_impl.f_report_metadata_kvp) { +- self->private_impl.f_metadata_flavor = 4u; +- self->private_impl.f_metadata_fourcc = 1263947851u; +- self->private_impl.f_metadata_x = 0u; +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; +- } +- } else if ( ! a_framy) { +- if (self->private_impl.f_chunk_type == 1280598881u) { +- if (self->private_impl.f_seen_actl) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- status = wuffs_png__decoder__decode_actl(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_actl = true; +- } else if (self->private_impl.f_chunk_type == 1297238115u) { +- if (self->private_impl.f_report_metadata_chrm) { +- if (self->private_impl.f_seen_chrm) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- status = wuffs_png__decoder__decode_chrm(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_chrm = true; +- } +- } else if (self->private_impl.f_chunk_type == 1280598886u) { +- if (self->private_impl.f_seen_fctl) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- status = wuffs_png__decoder__decode_fctl(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_fctl = true; +- } else if (self->private_impl.f_chunk_type == 1095582055u) { +- if (self->private_impl.f_report_metadata_gama) { +- if (self->private_impl.f_seen_gama) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- status = wuffs_png__decoder__decode_gama(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_gama = true; +- } +- } else if (self->private_impl.f_chunk_type == 1346585449u) { +- if (self->private_impl.f_report_metadata_iccp) { +- if (self->private_impl.f_seen_iccp) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- status = wuffs_png__decoder__decode_iccp(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_iccp = true; +- } +- } else if (self->private_impl.f_chunk_type == 1111970419u) { +- if (self->private_impl.f_report_metadata_srgb) { +- if (self->private_impl.f_seen_srgb) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- status = wuffs_png__decoder__decode_srgb(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_srgb = true; +- } +- } else if (self->private_impl.f_chunk_type == 1397641844u) { +- if (self->private_impl.f_seen_trns || (self->private_impl.f_color_type > 3u) || ((self->private_impl.f_color_type == 3u) && ! self->private_impl.f_seen_plte)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_png__decoder__decode_trns(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_impl.f_seen_trns = true; +- } ++ v_final_block = true; ++ } else { ++ v_buf_data[v_buf_len] = 128u; ++ v_buf_len += 1u; ++ while (v_buf_len < 64u) { ++ v_buf_data[v_buf_len] = 0u; ++ v_buf_len += 1u; ++ } ++ } ++ v_h0 = self->private_impl.f_h0; ++ v_a = v_h0; ++ v_h1 = self->private_impl.f_h1; ++ v_b = v_h1; ++ v_h2 = self->private_impl.f_h2; ++ v_c = v_h2; ++ v_h3 = self->private_impl.f_h3; ++ v_d = v_h3; ++ v_h4 = self->private_impl.f_h4; ++ v_e = v_h4; ++ v_h5 = self->private_impl.f_h5; ++ v_f = v_h5; ++ v_h6 = self->private_impl.f_h6; ++ v_g = v_h6; ++ v_h7 = self->private_impl.f_h7; ++ v_h = v_h7; ++ while (true) { ++ if (v_final_block) { ++ v_length_in_bits = ((uint64_t)(self->private_impl.f_length_modulo_u64 * 8u)); ++ v_buf_data[56u] = ((uint8_t)((v_length_in_bits >> 56u))); ++ v_buf_data[57u] = ((uint8_t)((v_length_in_bits >> 48u))); ++ v_buf_data[58u] = ((uint8_t)((v_length_in_bits >> 40u))); ++ v_buf_data[59u] = ((uint8_t)((v_length_in_bits >> 32u))); ++ v_buf_data[60u] = ((uint8_t)((v_length_in_bits >> 24u))); ++ v_buf_data[61u] = ((uint8_t)((v_length_in_bits >> 16u))); ++ v_buf_data[62u] = ((uint8_t)((v_length_in_bits >> 8u))); ++ v_buf_data[63u] = ((uint8_t)(v_length_in_bits)); ++ } ++ v_w[0u] = ((((uint32_t)(v_buf_data[0u])) << 24u) | ++ (((uint32_t)(v_buf_data[1u])) << 16u) | ++ (((uint32_t)(v_buf_data[2u])) << 8u) | ++ ((uint32_t)(v_buf_data[3u]))); ++ v_w[1u] = ((((uint32_t)(v_buf_data[4u])) << 24u) | ++ (((uint32_t)(v_buf_data[5u])) << 16u) | ++ (((uint32_t)(v_buf_data[6u])) << 8u) | ++ ((uint32_t)(v_buf_data[7u]))); ++ v_w[2u] = ((((uint32_t)(v_buf_data[8u])) << 24u) | ++ (((uint32_t)(v_buf_data[9u])) << 16u) | ++ (((uint32_t)(v_buf_data[10u])) << 8u) | ++ ((uint32_t)(v_buf_data[11u]))); ++ v_w[3u] = ((((uint32_t)(v_buf_data[12u])) << 24u) | ++ (((uint32_t)(v_buf_data[13u])) << 16u) | ++ (((uint32_t)(v_buf_data[14u])) << 8u) | ++ ((uint32_t)(v_buf_data[15u]))); ++ v_w[4u] = ((((uint32_t)(v_buf_data[16u])) << 24u) | ++ (((uint32_t)(v_buf_data[17u])) << 16u) | ++ (((uint32_t)(v_buf_data[18u])) << 8u) | ++ ((uint32_t)(v_buf_data[19u]))); ++ v_w[5u] = ((((uint32_t)(v_buf_data[20u])) << 24u) | ++ (((uint32_t)(v_buf_data[21u])) << 16u) | ++ (((uint32_t)(v_buf_data[22u])) << 8u) | ++ ((uint32_t)(v_buf_data[23u]))); ++ v_w[6u] = ((((uint32_t)(v_buf_data[24u])) << 24u) | ++ (((uint32_t)(v_buf_data[25u])) << 16u) | ++ (((uint32_t)(v_buf_data[26u])) << 8u) | ++ ((uint32_t)(v_buf_data[27u]))); ++ v_w[7u] = ((((uint32_t)(v_buf_data[28u])) << 24u) | ++ (((uint32_t)(v_buf_data[29u])) << 16u) | ++ (((uint32_t)(v_buf_data[30u])) << 8u) | ++ ((uint32_t)(v_buf_data[31u]))); ++ v_w[8u] = ((((uint32_t)(v_buf_data[32u])) << 24u) | ++ (((uint32_t)(v_buf_data[33u])) << 16u) | ++ (((uint32_t)(v_buf_data[34u])) << 8u) | ++ ((uint32_t)(v_buf_data[35u]))); ++ v_w[9u] = ((((uint32_t)(v_buf_data[36u])) << 24u) | ++ (((uint32_t)(v_buf_data[37u])) << 16u) | ++ (((uint32_t)(v_buf_data[38u])) << 8u) | ++ ((uint32_t)(v_buf_data[39u]))); ++ v_w[10u] = ((((uint32_t)(v_buf_data[40u])) << 24u) | ++ (((uint32_t)(v_buf_data[41u])) << 16u) | ++ (((uint32_t)(v_buf_data[42u])) << 8u) | ++ ((uint32_t)(v_buf_data[43u]))); ++ v_w[11u] = ((((uint32_t)(v_buf_data[44u])) << 24u) | ++ (((uint32_t)(v_buf_data[45u])) << 16u) | ++ (((uint32_t)(v_buf_data[46u])) << 8u) | ++ ((uint32_t)(v_buf_data[47u]))); ++ v_w[12u] = ((((uint32_t)(v_buf_data[48u])) << 24u) | ++ (((uint32_t)(v_buf_data[49u])) << 16u) | ++ (((uint32_t)(v_buf_data[50u])) << 8u) | ++ ((uint32_t)(v_buf_data[51u]))); ++ v_w[13u] = ((((uint32_t)(v_buf_data[52u])) << 24u) | ++ (((uint32_t)(v_buf_data[53u])) << 16u) | ++ (((uint32_t)(v_buf_data[54u])) << 8u) | ++ ((uint32_t)(v_buf_data[55u]))); ++ v_w[14u] = ((((uint32_t)(v_buf_data[56u])) << 24u) | ++ (((uint32_t)(v_buf_data[57u])) << 16u) | ++ (((uint32_t)(v_buf_data[58u])) << 8u) | ++ ((uint32_t)(v_buf_data[59u]))); ++ v_w[15u] = ((((uint32_t)(v_buf_data[60u])) << 24u) | ++ (((uint32_t)(v_buf_data[61u])) << 16u) | ++ (((uint32_t)(v_buf_data[62u])) << 8u) | ++ ((uint32_t)(v_buf_data[63u]))); ++ v_i = 16u; ++ while (v_i < 64u) { ++ v_w2 = v_w[(v_i - 2u)]; ++ v_s1 = ((v_w2 >> 10u) ^ (((uint32_t)(v_w2 << 15u)) | (v_w2 >> 17u)) ^ (((uint32_t)(v_w2 << 13u)) | (v_w2 >> 19u))); ++ v_w15 = v_w[(v_i - 15u)]; ++ v_s0 = ((v_w15 >> 3u) ^ (((uint32_t)(v_w15 << 25u)) | (v_w15 >> 7u)) ^ (((uint32_t)(v_w15 << 14u)) | (v_w15 >> 18u))); ++ v_w[v_i] = ((uint32_t)(((uint32_t)(((uint32_t)(v_s1 + v_w[(v_i - 7u)])) + v_s0)) + v_w[(v_i - 16u)])); ++ v_i += 1u; + } +- if (self->private_impl.f_metadata_fourcc == 0u) { +- self->private_data.s_decode_other_chunk[0].scratch = self->private_impl.f_chunk_length; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (self->private_data.s_decode_other_chunk[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_decode_other_chunk[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_decode_other_chunk[0].scratch; ++ v_i = 0u; ++ while (v_i < 64u) { ++ v_t1 = v_h; ++ v_t1 += ((((uint32_t)(v_e << 26u)) | (v_e >> 6u)) ^ (((uint32_t)(v_e << 21u)) | (v_e >> 11u)) ^ (((uint32_t)(v_e << 7u)) | (v_e >> 25u))); ++ v_t1 += ((v_e & v_f) ^ ((4294967295u ^ v_e) & v_g)); ++ v_t1 += WUFFS_SHA256__K[v_i]; ++ v_t1 += v_w[v_i]; ++ v_t2 = ((((uint32_t)(v_a << 30u)) | (v_a >> 2u)) ^ (((uint32_t)(v_a << 19u)) | (v_a >> 13u)) ^ (((uint32_t)(v_a << 10u)) | (v_a >> 22u))); ++ v_t2 += ((v_a & v_b) ^ (v_a & v_c) ^ (v_b & v_c)); ++ v_h = v_g; ++ v_g = v_f; ++ v_f = v_e; ++ v_e = ((uint32_t)(v_d + v_t1)); ++ v_d = v_c; ++ v_c = v_b; ++ v_b = v_a; ++ v_a = ((uint32_t)(v_t1 + v_t2)); ++ v_i += 1u; ++ } ++ v_a += v_h0; ++ v_b += v_h1; ++ v_c += v_h2; ++ v_d += v_h3; ++ v_e += v_h4; ++ v_f += v_h5; ++ v_g += v_h6; ++ v_h += v_h7; ++ if (v_final_block) { ++ break; ++ } ++ v_final_block = true; ++ v_h0 = v_a; ++ v_h1 = v_b; ++ v_h2 = v_c; ++ v_h3 = v_d; ++ v_h4 = v_e; ++ v_h5 = v_f; ++ v_h6 = v_g; ++ v_h7 = v_h; ++ v_buf_len = 0u; ++ while (v_buf_len < 56u) { ++ v_buf_data[v_buf_len] = 0u; ++ v_buf_len += 1u; + } +- +- goto ok; +- ok: +- self->private_impl.p_decode_other_chunk[0] = 0; +- goto exit; + } ++ return wuffs_base__utility__make_bitvec256( ++ (((uint64_t)(v_h)) | (((uint64_t)(v_g)) << 32u)), ++ (((uint64_t)(v_f)) | (((uint64_t)(v_e)) << 32u)), ++ (((uint64_t)(v_d)) | (((uint64_t)(v_c)) << 32u)), ++ (((uint64_t)(v_b)) | (((uint64_t)(v_a)) << 32u))); ++} + +- goto suspend; +- suspend: +- self->private_impl.p_decode_other_chunk[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) + +- return status; +-} ++// ---------------- Status Codes Implementations + +-// -------- func png.decoder.decode_actl ++const char wuffs_tga__error__bad_header[] = "#tga: bad header"; ++const char wuffs_tga__error__bad_run_length_encoding[] = "#tga: bad run length encoding"; ++const char wuffs_tga__error__truncated_input[] = "#tga: truncated input"; ++const char wuffs_tga__error__unsupported_tga_file[] = "#tga: unsupported TGA file"; ++ ++// ---------------- Private Consts ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__decode_actl( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++wuffs_tga__decoder__do_decode_image_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_tga__decoder__do_decode_frame_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_tga__decoder__do_decode_frame( ++ wuffs_tga__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_tga__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_tga__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_tga__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_tga__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_tga__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_tga__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_tga__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_tga__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_tga__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_tga__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_tga__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_tga__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_tga__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_tga__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_tga__decoder__initialize( ++ wuffs_tga__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_tga__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_tga__decoder* ++wuffs_tga__decoder__alloc(void) { ++ wuffs_tga__decoder* x = ++ (wuffs_tga__decoder*)(calloc(1, sizeof(wuffs_tga__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_tga__decoder__initialize( ++ x, sizeof(wuffs_tga__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; + } ++ return x; ++} + +- uint32_t coro_susp_point = self->private_impl.p_decode_actl[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++size_t ++sizeof__wuffs_tga__decoder(void) { ++ return sizeof(wuffs_tga__decoder); ++} + +- if (self->private_impl.f_chunk_length != 8u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } else if (self->private_impl.f_interlace_pass > 0u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); +- goto exit; +- } +- self->private_impl.f_chunk_length = 0u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_actl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_actl[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- self->private_impl.f_num_animation_frames_value = t_0; +- } +- if (self->private_impl.f_num_animation_frames_value == 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_actl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_actl[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } +- } +- self->private_impl.f_num_animation_loops_value = t_1; +- } ++// ---------------- Function Implementations + +- goto ok; +- ok: +- self->private_impl.p_decode_actl[0] = 0; +- goto exit; ++// -------- func tga.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_tga__decoder__get_quirk( ++ const wuffs_tga__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_actl[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ return 0u; ++} + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++// -------- func tga.decoder.set_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__set_quirk( ++ wuffs_tga__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); + } + +- return status; ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func png.decoder.decode_chrm ++// -------- func tga.decoder.decode_image_config + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_chrm( +- wuffs_png__decoder* self, ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_image_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint64_t v_u = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_chrm[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_chunk_length != 32u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length = 0u; +- self->private_impl.f_metadata_flavor = 5u; +- self->private_impl.f_metadata_fourcc = 1128813133u; +- self->private_impl.f_metadata_x = 0u; +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint64_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- v_u = t_0; +- } +- self->private_impl.f_metadata_x |= ((16777215u & v_u) << 0u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint64_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 24) { +- t_1 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } +- } +- v_u = t_1; +- } +- self->private_impl.f_metadata_x |= ((16777215u & v_u) << 24u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- uint64_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); +- if (num_bits_2 == 24) { +- t_2 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)); +- } +- } +- v_u = t_2; +- } +- self->private_impl.f_metadata_x |= ((uint64_t)((16777215u & v_u) << 48u)); +- self->private_impl.f_metadata_y |= ((16777215u & v_u) >> 16u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- uint64_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); +- if (num_bits_3 == 24) { +- t_3 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)); +- } +- } +- v_u = t_3; +- } +- self->private_impl.f_metadata_y |= ((16777215u & v_u) << 8u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- uint64_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_4 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); +- if (num_bits_4 == 24) { +- t_4 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)); +- } +- } +- v_u = t_4; +- } +- self->private_impl.f_metadata_y |= ((16777215u & v_u) << 32u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- uint64_t t_5; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_5 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); +- if (num_bits_5 == 24) { +- t_5 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_5 += 8u; +- *scratch |= ((uint64_t)(num_bits_5)); +- } +- } +- v_u = t_5; +- } +- self->private_impl.f_metadata_y |= ((uint64_t)((16777215u & v_u) << 56u)); +- self->private_impl.f_metadata_z |= ((16777215u & v_u) >> 8u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); +- uint64_t t_6; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_6 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); +- if (num_bits_6 == 24) { +- t_6 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_6 += 8u; +- *scratch |= ((uint64_t)(num_bits_6)); +- } ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_image_config(self, a_dst, a_src); ++ v_status = t_0; + } +- v_u = t_6; +- } +- self->private_impl.f_metadata_z |= ((16777215u & v_u) << 16u); +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); +- uint64_t t_7; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_7 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_chrm[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_chrm[0].scratch; +- uint32_t num_bits_7 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_7); +- if (num_bits_7 == 24) { +- t_7 = ((uint64_t)(*scratch >> 32)); +- break; +- } +- num_bits_7 += 8u; +- *scratch |= ((uint64_t)(num_bits_7)); +- } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ goto exit; + } +- v_u = t_7; ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); + } +- self->private_impl.f_metadata_z |= ((16777215u & v_u) << 40u); + +- goto ok; + ok: +- self->private_impl.p_decode_chrm[0] = 0; ++ self->private_impl.p_decode_image_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_chrm[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func png.decoder.decode_exif +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_exif( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- if (self->private_impl.f_chunk_length < 4u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_metadata_flavor = 3u; +- self->private_impl.f_metadata_fourcc = 1163413830u; +- self->private_impl.f_metadata_x = 0u; +- self->private_impl.f_metadata_y = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- self->private_impl.f_metadata_z = wuffs_base__u64__sat_add(self->private_impl.f_metadata_y, ((uint64_t)(self->private_impl.f_chunk_length))); +- self->private_impl.f_chunk_length = 0u; ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + +- goto ok; +- ok: + goto exit; + exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- + return status; + } + +-// -------- func png.decoder.decode_fctl ++// -------- func tga.decoder.do_decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__decode_fctl( +- wuffs_png__decoder* self, ++wuffs_tga__decoder__do_decode_image_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_x0 = 0; +- uint32_t v_y0 = 0; +- uint32_t v_x1 = 0; +- uint32_t v_y1 = 0; ++ uint32_t v_c32 = 0; ++ uint32_t v_c5 = 0; ++ uint32_t v_i = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -55899,309 +69341,577 @@ wuffs_png__decoder__decode_fctl( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_fctl[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; + if (coro_susp_point) { +- v_x0 = self->private_data.s_decode_fctl[0].v_x0; +- v_x1 = self->private_data.s_decode_fctl[0].v_x1; +- v_y1 = self->private_data.s_decode_fctl[0].v_y1; ++ v_i = self->private_data.s_do_decode_image_config.v_i; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_chunk_length != 26u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ if (self->private_impl.f_call_sequence != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; + } +- self->private_impl.f_chunk_length = 0u; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_x0 = t_0; ++ uint8_t t_0 = *iop_a_src++; ++ self->private_impl.f_header_id_length = t_0; + } +- if (v_x0 != self->private_impl.f_next_animation_seq_num) { +- status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); +- goto exit; +- } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ self->private_impl.f_header_color_map_type = t_1; ++ } ++ if (self->private_impl.f_header_color_map_type > 1u) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_header); + goto exit; + } +- self->private_impl.f_next_animation_seq_num += 1u; + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_x1 = t_1; ++ uint8_t t_2 = *iop_a_src++; ++ self->private_impl.f_header_image_type = t_2; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); +- if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)); +- } +- } +- v_y1 = t_2; ++ if ((self->private_impl.f_header_image_type == 1u) || ++ (self->private_impl.f_header_image_type == 2u) || ++ (self->private_impl.f_header_image_type == 3u) || ++ (self->private_impl.f_header_image_type == 9u) || ++ (self->private_impl.f_header_image_type == 10u) || ++ (self->private_impl.f_header_image_type == 11u)) { ++ } else { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_header); ++ goto exit; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ uint16_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_3 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ iop_a_src += 2; + } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch >> 32)); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 8) { ++ t_3 = ((uint16_t)(*scratch)); + break; + } + num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)); ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; + } + } +- v_x0 = t_3; ++ self->private_impl.f_header_color_map_first_entry_index = t_3; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_4 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ uint16_t t_4; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ iop_a_src += 2; + } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4); +- if (num_bits_4 == 24) { +- t_4 = ((uint32_t)(*scratch >> 32)); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; ++ if (num_bits_4 == 8) { ++ t_4 = ((uint16_t)(*scratch)); + break; + } + num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)); ++ *scratch |= ((uint64_t)(num_bits_4)) << 56; + } + } +- v_y0 = t_4; ++ self->private_impl.f_header_color_map_length = t_4; + } +- v_x1 += v_x0; +- v_y1 += v_y0; +- if ((v_x0 >= v_x1) || +- (v_x0 > self->private_impl.f_width) || +- (v_x1 > self->private_impl.f_width) || +- (v_y0 >= v_y1) || +- (v_y0 > self->private_impl.f_height) || +- (v_y1 > self->private_impl.f_height)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ self->private_impl.f_header_color_map_entry_size = t_5; + } +- self->private_impl.f_frame_rect_x0 = v_x0; +- self->private_impl.f_frame_rect_y0 = v_y0; +- self->private_impl.f_frame_rect_x1 = v_x1; +- self->private_impl.f_frame_rect_y1 = v_y1; ++ if (self->private_impl.f_header_color_map_type != 0u) { ++ if ((self->private_impl.f_header_color_map_first_entry_index != 0u) || (self->private_impl.f_header_color_map_length > 256u)) { ++ status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); ++ goto exit; ++ } else if ((self->private_impl.f_header_color_map_entry_size != 15u) && ++ (self->private_impl.f_header_color_map_entry_size != 16u) && ++ (self->private_impl.f_header_color_map_entry_size != 24u) && ++ (self->private_impl.f_header_color_map_entry_size != 32u)) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_header); ++ goto exit; ++ } ++ } else { ++ if ((self->private_impl.f_header_color_map_first_entry_index != 0u) || (self->private_impl.f_header_color_map_length != 0u) || (self->private_impl.f_header_color_map_entry_size != 0u)) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_header); ++ goto exit; ++ } ++ } ++ self->private_data.s_do_decode_image_config.scratch = 4u; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- uint32_t t_5; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ uint32_t t_6; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); +- if (num_bits_5 == 8) { +- t_5 = ((uint32_t)(*scratch >> 48)); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6; ++ if (num_bits_6 == 8) { ++ t_6 = ((uint32_t)(*scratch)); + break; + } +- num_bits_5 += 8u; +- *scratch |= ((uint64_t)(num_bits_5)); ++ num_bits_6 += 8u; ++ *scratch |= ((uint64_t)(num_bits_6)) << 56; + } + } +- v_x0 = t_5; ++ self->private_impl.f_width = t_6; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); +- uint32_t t_6; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ uint32_t t_7; + if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_6 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); ++ t_7 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); + iop_a_src += 2; + } else { +- self->private_data.s_decode_fctl[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_decode_fctl[0].scratch; +- uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6); +- if (num_bits_6 == 8) { +- t_6 = ((uint32_t)(*scratch >> 48)); ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; ++ if (num_bits_7 == 8) { ++ t_7 = ((uint32_t)(*scratch)); + break; + } +- num_bits_6 += 8u; +- *scratch |= ((uint64_t)(num_bits_6)); ++ num_bits_7 += 8u; ++ *scratch |= ((uint64_t)(num_bits_7)) << 56; + } + } +- v_x1 = t_6; +- } +- if (v_x1 <= 0u) { +- self->private_impl.f_frame_duration = (((uint64_t)(v_x0)) * 7056000u); +- } else { +- self->private_impl.f_frame_duration = ((((uint64_t)(v_x0)) * 705600000u) / ((uint64_t)(v_x1))); ++ self->private_impl.f_height = t_7; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_7 = *iop_a_src++; +- v_x0 = t_7; ++ uint8_t t_8 = *iop_a_src++; ++ self->private_impl.f_header_pixel_depth = t_8; + } +- if (v_x0 == 0u) { +- self->private_impl.f_frame_disposal = 0u; +- } else if (v_x0 == 1u) { +- self->private_impl.f_frame_disposal = 1u; +- } else if (v_x0 == 2u) { +- self->private_impl.f_frame_disposal = 2u; +- } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ if ((self->private_impl.f_header_pixel_depth != 1u) && ++ (self->private_impl.f_header_pixel_depth != 8u) && ++ (self->private_impl.f_header_pixel_depth != 15u) && ++ (self->private_impl.f_header_pixel_depth != 16u) && ++ (self->private_impl.f_header_pixel_depth != 24u) && ++ (self->private_impl.f_header_pixel_depth != 32u)) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_header); + goto exit; + } ++ if (((uint8_t)(self->private_impl.f_header_image_type | 8u)) == 9u) { ++ self->private_impl.f_scratch_bytes_per_pixel = 1u; ++ self->private_impl.f_src_bytes_per_pixel = 1u; ++ self->private_impl.f_src_pixfmt = 2164523016u; ++ self->private_impl.f_opaque = ((self->private_impl.f_header_color_map_entry_size == 15u) || (self->private_impl.f_header_color_map_entry_size == 24u)); ++ } else if (((uint8_t)(self->private_impl.f_header_image_type | 8u)) == 10u) { ++ if ((self->private_impl.f_header_pixel_depth == 15u) || (self->private_impl.f_header_pixel_depth == 16u)) { ++ self->private_impl.f_scratch_bytes_per_pixel = 4u; ++ self->private_impl.f_src_bytes_per_pixel = 0u; ++ self->private_impl.f_src_pixfmt = 2164295816u; ++ } else if (self->private_impl.f_header_pixel_depth == 24u) { ++ self->private_impl.f_scratch_bytes_per_pixel = 3u; ++ self->private_impl.f_src_bytes_per_pixel = 3u; ++ self->private_impl.f_src_pixfmt = 2147485832u; ++ self->private_impl.f_opaque = true; ++ } else if (self->private_impl.f_header_pixel_depth == 32u) { ++ self->private_impl.f_scratch_bytes_per_pixel = 4u; ++ self->private_impl.f_src_bytes_per_pixel = 4u; ++ self->private_impl.f_src_pixfmt = 2164295816u; ++ } else { ++ status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); ++ goto exit; ++ } ++ } else { ++ if (self->private_impl.f_header_pixel_depth == 8u) { ++ self->private_impl.f_scratch_bytes_per_pixel = 1u; ++ self->private_impl.f_src_bytes_per_pixel = 1u; ++ self->private_impl.f_src_pixfmt = 536870920u; ++ self->private_impl.f_opaque = true; ++ } else { ++ status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); ++ goto exit; ++ } ++ } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint32_t t_8 = *iop_a_src++; +- v_x0 = t_8; +- } +- if (v_x0 == 0u) { +- self->private_impl.f_frame_overwrite_instead_of_blend = true; +- } else if (v_x0 == 1u) { +- self->private_impl.f_frame_overwrite_instead_of_blend = false; ++ uint8_t t_9 = *iop_a_src++; ++ self->private_impl.f_header_image_descriptor = t_9; ++ } ++ if (((uint8_t)(self->private_impl.f_header_image_descriptor & 16u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); ++ goto exit; ++ } ++ self->private_data.s_do_decode_image_config.scratch = ((uint32_t)(self->private_impl.f_header_id_length)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_image_config.scratch; ++ if (self->private_impl.f_header_color_map_type != 0u) { ++ while (v_i < ((uint32_t)(self->private_impl.f_header_color_map_length))) { ++ if (self->private_impl.f_header_color_map_entry_size == 24u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); ++ uint32_t t_10; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { ++ t_10 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); ++ iop_a_src += 3; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10; ++ if (num_bits_10 == 16) { ++ t_10 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_10 += 8u; ++ *scratch |= ((uint64_t)(num_bits_10)) << 56; ++ } ++ } ++ v_c32 = t_10; ++ } ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c32 >> 0u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c32 >> 8u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c32 >> 16u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u; ++ } else if (self->private_impl.f_header_color_map_entry_size == 32u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); ++ uint32_t t_11; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11; ++ if (num_bits_11 == 24) { ++ t_11 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_11 += 8u; ++ *scratch |= ((uint64_t)(num_bits_11)) << 56; ++ } ++ } ++ v_c32 = t_11; ++ } ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c32 >> 0u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c32 >> 8u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c32 >> 16u))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = ((uint8_t)((v_c32 >> 24u))); ++ } else { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); ++ uint32_t t_12; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_12 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12; ++ if (num_bits_12 == 8) { ++ t_12 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_12 += 8u; ++ *scratch |= ((uint64_t)(num_bits_12)) << 56; ++ } ++ } ++ v_c32 = t_12; ++ } ++ v_c5 = (31u & (v_c32 >> 0u)); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 5u)); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 10u)); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u; ++ } ++ v_i += 1u; ++ } ++ while (v_i < 256u) { ++ self->private_data.f_src_palette[((v_i * 4u) + 0u)] = 0u; ++ self->private_data.f_src_palette[((v_i * 4u) + 1u)] = 0u; ++ self->private_data.f_src_palette[((v_i * 4u) + 2u)] = 0u; ++ self->private_data.f_src_palette[((v_i * 4u) + 3u)] = 255u; ++ v_i += 1u; ++ } ++ } ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_src_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ self->private_impl.f_opaque); ++ } ++ self->private_impl.f_call_sequence = 32u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_image_config.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func tga.decoder.decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_frame_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 2)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_frame_config(self, a_dst, a_src); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func tga.decoder.do_decode_frame_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_tga__decoder__do_decode_frame_config( ++ wuffs_tga__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_tga__decoder__do_decode_image_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); ++ goto exit; ++ } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; + } +- if (self->private_impl.f_num_decoded_frame_configs_value == 0u) { +- self->private_impl.f_first_rect_x0 = self->private_impl.f_frame_rect_x0; +- self->private_impl.f_first_rect_y0 = self->private_impl.f_frame_rect_y0; +- self->private_impl.f_first_rect_x1 = self->private_impl.f_frame_rect_x1; +- self->private_impl.f_first_rect_y1 = self->private_impl.f_frame_rect_y1; +- self->private_impl.f_first_duration = self->private_impl.f_frame_duration; +- self->private_impl.f_first_disposal = self->private_impl.f_frame_disposal; +- self->private_impl.f_first_overwrite_instead_of_blend = self->private_impl.f_frame_overwrite_instead_of_blend; ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ self->private_impl.f_frame_config_io_position, ++ 0u, ++ self->private_impl.f_opaque, ++ false, ++ 4278190080u); + } ++ self->private_impl.f_call_sequence = 64u; + +- goto ok; + ok: +- self->private_impl.p_decode_fctl[0] = 0; ++ self->private_impl.p_do_decode_frame_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_fctl[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_fctl[0].v_x0 = v_x0; +- self->private_data.s_decode_fctl[0].v_x1 = v_x1; +- self->private_data.s_decode_fctl[0].v_y1 = v_y1; ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -56212,15 +69922,114 @@ wuffs_png__decoder__decode_fctl( + return status; + } + +-// -------- func png.decoder.decode_gama ++// -------- func tga.decoder.decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__decode_frame( ++ wuffs_tga__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func tga.decoder.do_decode_frame + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__decode_gama( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { ++wuffs_tga__decoder__do_decode_frame( ++ wuffs_tga__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { + wuffs_base__status status = wuffs_base__make_status(NULL); + ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint64_t v_dst_bytes_per_pixel = 0; ++ uint32_t v_dst_x = 0; ++ uint32_t v_dst_y = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint64_t v_dst_start = 0; ++ wuffs_base__slice_u8 v_src_palette = {0}; ++ uint64_t v_mark = 0; ++ uint64_t v_num_pixels64 = 0; ++ uint32_t v_num_pixels32 = 0; ++ uint32_t v_lit_length = 0; ++ uint32_t v_run_length = 0; ++ uint64_t v_num_dst_bytes = 0; ++ uint32_t v_num_src_bytes = 0; ++ uint32_t v_c32 = 0; ++ uint32_t v_c5 = 0; ++ + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -56232,516 +70041,739 @@ wuffs_png__decoder__decode_gama( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_gama[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ if (coro_susp_point) { ++ v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel; ++ v_dst_x = self->private_data.s_do_decode_frame.v_dst_x; ++ v_dst_y = self->private_data.s_do_decode_frame.v_dst_y; ++ v_mark = self->private_data.s_do_decode_frame.v_mark; ++ v_num_pixels32 = self->private_data.s_do_decode_frame.v_num_pixels32; ++ v_lit_length = self->private_data.s_do_decode_frame.v_lit_length; ++ v_run_length = self->private_data.s_do_decode_frame.v_run_length; ++ v_num_dst_bytes = self->private_data.s_do_decode_frame.v_num_dst_bytes; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_chunk_length != 4u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_tga__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ if (self->private_impl.f_header_color_map_type != 0u) { ++ v_src_palette = wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024); ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), ++ v_src_palette, ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); + goto exit; + } +- self->private_impl.f_chunk_length = 0u; +- self->private_impl.f_metadata_flavor = 5u; +- self->private_impl.f_metadata_fourcc = 1195461953u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint64_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src))); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_gama[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_gama[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint64_t)(*scratch >> 32)); +- break; ++ v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); ++ if (((uint8_t)(self->private_impl.f_header_image_descriptor & 32u)) == 0u) { ++ v_dst_y = ((uint32_t)(self->private_impl.f_height - 1u)); ++ } ++ if (((uint8_t)(self->private_impl.f_header_image_type & 8u)) == 0u) { ++ v_lit_length = self->private_impl.f_width; ++ } ++ label__resume__continue:; ++ while (true) { ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); ++ while (v_dst_y < self->private_impl.f_height) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y); ++ v_dst_start = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel); ++ if (v_dst_start <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_start); ++ } else { ++ v_dst = wuffs_base__utility__empty_slice_u8(); ++ } ++ while (v_dst_x < self->private_impl.f_width) { ++ if (self->private_impl.f_src_bytes_per_pixel > 0u) { ++ if (v_lit_length > 0u) { ++ v_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ v_num_pixels64 = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(self->private_impl.f_src_bytes_per_pixel))); ++ v_num_pixels32 = ((uint32_t)(wuffs_base__u64__min(v_num_pixels64, ((uint64_t)(v_lit_length))))); ++ v_num_dst_bytes = (((uint64_t)(v_num_pixels32)) * v_dst_bytes_per_pixel); ++ v_num_src_bytes = (v_num_pixels32 * self->private_impl.f_src_bytes_per_pixel); ++ self->private_data.s_do_decode_frame.scratch = v_num_src_bytes; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_decode_frame.scratch; ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ if (v_num_dst_bytes <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_num_dst_bytes); ++ } else { ++ v_dst = wuffs_base__utility__empty_slice_u8(); ++ } ++ v_dst_x += v_num_pixels32; ++ v_lit_length = (((uint32_t)(v_lit_length - v_num_pixels32)) & 65535u); ++ if (v_lit_length > 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); ++ goto label__resume__continue; ++ } ++ } else if (v_run_length > 0u) { ++ v_run_length -= 1u; ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_scratch_bytes_per_pixel)); ++ if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); ++ } ++ v_dst_x += 1u; ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); ++ goto label__resume__continue; ++ } ++ if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) { ++ v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u); ++ iop_a_src += 1u; ++ if ((v_lit_length + v_dst_x) > self->private_impl.f_width) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); ++ goto exit; ++ } ++ } else { ++ if (self->private_impl.f_src_bytes_per_pixel == 1u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ goto label__resume__continue; ++ } ++ v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ } else if (self->private_impl.f_src_bytes_per_pixel == 3u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ goto label__resume__continue; ++ } ++ v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ goto label__resume__continue; ++ } ++ v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ self->private_data.f_scratch[3u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; ++ } ++ if ((v_run_length + v_dst_x) > self->private_impl.f_width) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); ++ goto exit; ++ } ++ } ++ } ++ } else { ++ if (v_lit_length > 0u) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); ++ goto label__resume__continue; ++ } ++ v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2u; ++ v_c5 = (31u & (v_c32 >> 0u)); ++ self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 5u)); ++ self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 10u)); ++ self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ self->private_data.f_scratch[3u] = 255u; ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, 4)); ++ if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); ++ } ++ v_dst_x += 1u; ++ v_lit_length -= 1u; ++ } else if (v_run_length > 0u) { ++ v_run_length -= 1u; ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_scratch_bytes_per_pixel)); ++ if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); ++ } ++ v_dst_x += 1u; ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ goto label__resume__continue; ++ } ++ if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) { ++ v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u); ++ iop_a_src += 1u; ++ if ((v_lit_length + v_dst_x) > self->private_impl.f_width) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); ++ goto exit; ++ } ++ } else { ++ if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ goto label__resume__continue; ++ } ++ v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); ++ iop_a_src += 1u; ++ v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2u; ++ v_c5 = (31u & (v_c32 >> 0u)); ++ self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 5u)); ++ self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ v_c5 = (31u & (v_c32 >> 10u)); ++ self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); ++ self->private_data.f_scratch[3u] = 255u; ++ if ((v_run_length + v_dst_x) > self->private_impl.f_width) { ++ status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); ++ goto exit; ++ } ++ } ++ } + } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); ++ } ++ v_dst_x = 0u; ++ if (((uint8_t)(self->private_impl.f_header_image_descriptor & 32u)) == 0u) { ++ v_dst_y -= 1u; ++ } else { ++ v_dst_y += 1u; ++ } ++ if (((uint8_t)(self->private_impl.f_header_image_type & 8u)) == 0u) { ++ v_lit_length = self->private_impl.f_width; + } + } +- self->private_impl.f_metadata_x = t_0; ++ break; + } +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel = v_dst_bytes_per_pixel; ++ self->private_data.s_do_decode_frame.v_dst_x = v_dst_x; ++ self->private_data.s_do_decode_frame.v_dst_y = v_dst_y; ++ self->private_data.s_do_decode_frame.v_mark = v_mark; ++ self->private_data.s_do_decode_frame.v_num_pixels32 = v_num_pixels32; ++ self->private_data.s_do_decode_frame.v_lit_length = v_lit_length; ++ self->private_data.s_do_decode_frame.v_run_length = v_run_length; ++ self->private_data.s_do_decode_frame.v_num_dst_bytes = v_num_dst_bytes; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func tga.decoder.frame_dirty_rect ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 ++wuffs_tga__decoder__frame_dirty_rect( ++ const wuffs_tga__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_rect_ie_u32(); ++ } ++ ++ return wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); ++} ++ ++// -------- func tga.decoder.num_animation_loops ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_tga__decoder__num_animation_loops( ++ const wuffs_tga__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ return 0u; ++} ++ ++// -------- func tga.decoder.num_decoded_frame_configs ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_tga__decoder__num_decoded_frame_configs( ++ const wuffs_tga__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func tga.decoder.num_decoded_frames ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_tga__decoder__num_decoded_frames( ++ const wuffs_tga__decoder* self) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; ++} ++ ++// -------- func tga.decoder.restart_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__restart_frame( ++ wuffs_tga__decoder* self, ++ uint64_t a_index, ++ uint64_t a_io_position) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ if (self->private_impl.f_call_sequence < 32u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); ++ } ++ if (a_index != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ self->private_impl.f_call_sequence = 40u; ++ self->private_impl.f_frame_config_io_position = a_io_position; ++ return wuffs_base__make_status(NULL); ++} + +- goto ok; +- ok: +- self->private_impl.p_decode_gama[0] = 0; +- goto exit; ++// -------- func tga.decoder.set_report_metadata ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_tga__decoder__set_report_metadata( ++ wuffs_tga__decoder* self, ++ uint32_t a_fourcc, ++ bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func tga.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_tga__decoder__tell_me_more( ++ wuffs_tga__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- goto suspend; +- suspend: +- self->private_impl.p_decode_gama[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; + ++ goto ok; ++ ok: + goto exit; + exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- + return status; + } + +-// -------- func png.decoder.decode_iccp ++// -------- func tga.decoder.workbuf_len + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_iccp( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint8_t v_c = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_tga__decoder__workbuf_len( ++ const wuffs_tga__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); + } + +- uint32_t coro_susp_point = self->private_impl.p_decode_iccp[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} + +- while (true) { +- if (self->private_impl.f_chunk_length <= 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c == 0u) { +- break; +- } +- } +- if (self->private_impl.f_chunk_length <= 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- if (v_c != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); +- goto exit; +- } +- self->private_impl.f_metadata_is_zlib_compressed = true; +- self->private_impl.f_metadata_flavor = 4u; +- self->private_impl.f_metadata_fourcc = 1229144912u; +- self->private_impl.f_metadata_x = 0u; +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) + +- goto ok; +- ok: +- self->private_impl.p_decode_iccp[0] = 0; +- goto exit; +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) + +- goto suspend; +- suspend: +- self->private_impl.p_decode_iccp[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++// ---------------- Status Codes Implementations + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++// ---------------- Private Consts + +- return status; +-} ++// ---------------- Private Initializer Prototypes + +-// -------- func png.decoder.decode_plte ++// ---------------- Private Function Prototypes + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_plte( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++// ---------------- VTables + +- uint32_t v_num_entries = 0; +- uint32_t v_i = 0; +- uint32_t v_argb = 0; ++// ---------------- Initializer Implementations + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_vp8__placeholder__initialize( ++ wuffs_vp8__placeholder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- +- uint32_t coro_susp_point = self->private_impl.p_decode_plte[0]; +- if (coro_susp_point) { +- v_num_entries = self->private_data.s_decode_plte[0].v_num_entries; +- v_i = self->private_data.s_decode_plte[0].v_i; ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_chunk_length > 768u) || ((self->private_impl.f_chunk_length % 3u) != 0u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- v_num_entries = (((uint32_t)(self->private_impl.f_chunk_length)) / 3u); +- self->private_impl.f_chunk_length = 0u; +- while (v_i < v_num_entries) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { +- t_0 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src))); +- iop_a_src += 3; +- } else { +- self->private_data.s_decode_plte[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_plte[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 16) { +- t_0 = ((uint32_t)(*scratch >> 40)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- v_argb = t_0; +- } +- v_argb |= 4278190080u; +- self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u))); +- self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u))); +- self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u))); +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u))); +- v_i += 1u; ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); + } +- while (v_i < 256u) { +- self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u; +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u; +- v_i += 1u; ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } +- +- goto ok; +- ok: +- self->private_impl.p_decode_plte[0] = 0; +- goto exit; + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_plte[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_plte[0].v_num_entries = v_num_entries; +- self->private_data.s_decode_plte[0].v_i = v_i; ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ return wuffs_base__make_status(NULL); ++} + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++wuffs_vp8__placeholder* ++wuffs_vp8__placeholder__alloc(void) { ++ wuffs_vp8__placeholder* x = ++ (wuffs_vp8__placeholder*)(calloc(1, sizeof(wuffs_vp8__placeholder))); ++ if (!x) { ++ return NULL; + } +- +- return status; ++ if (wuffs_vp8__placeholder__initialize( ++ x, sizeof(wuffs_vp8__placeholder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; + } + +-// -------- func png.decoder.decode_srgb +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_srgb( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++size_t ++sizeof__wuffs_vp8__placeholder(void) { ++ return sizeof(wuffs_vp8__placeholder); ++} + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++// ---------------- Function Implementations + +- uint32_t coro_susp_point = self->private_impl.p_decode_srgb[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) + +- if (self->private_impl.f_chunk_length != 1u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length = 0u; +- self->private_impl.f_metadata_flavor = 5u; +- self->private_impl.f_metadata_fourcc = 1397901122u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t t_0 = *iop_a_src++; +- self->private_impl.f_metadata_x = t_0; +- } +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) + +- goto ok; +- ok: +- self->private_impl.p_decode_srgb[0] = 0; +- goto exit; +- } ++// ---------------- Status Codes Implementations + +- goto suspend; +- suspend: +- self->private_impl.p_decode_srgb[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++const char wuffs_wbmp__error__bad_header[] = "#wbmp: bad header"; ++const char wuffs_wbmp__error__truncated_input[] = "#wbmp: truncated input"; + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++// ---------------- Private Consts + +- return status; +-} ++// ---------------- Private Initializer Prototypes + +-// -------- func png.decoder.decode_trns ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__decode_trns( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++wuffs_wbmp__decoder__do_decode_image_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- uint32_t v_i = 0; +- uint32_t v_n = 0; +- uint64_t v_u = 0; ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_wbmp__decoder__do_decode_frame_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_wbmp__decoder__do_decode_frame( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); + +- uint32_t coro_susp_point = self->private_impl.p_decode_trns[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_decode_trns[0].v_i; +- v_n = self->private_data.s_decode_trns[0].v_n; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++// ---------------- VTables + +- if (self->private_impl.f_color_type == 0u) { +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- if (self->private_impl.f_depth <= 8u) { +- self->private_impl.f_dst_pixfmt = 2164295816u; +- self->private_impl.f_src_pixfmt = 2164295816u; +- } else { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; +- } +- if (self->private_impl.f_chunk_length != 2u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length = 0u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint64_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_0 = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_decode_trns[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_trns[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 8) { +- t_0 = ((uint64_t)(*scratch >> 48)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- v_u = t_0; +- } +- if (self->private_impl.f_depth <= 1u) { +- self->private_impl.f_remap_transparency = (((v_u & 1u) * 16777215u) | 4278190080u); +- } else if (self->private_impl.f_depth <= 2u) { +- self->private_impl.f_remap_transparency = (((v_u & 3u) * 5592405u) | 4278190080u); +- } else if (self->private_impl.f_depth <= 4u) { +- self->private_impl.f_remap_transparency = (((v_u & 15u) * 1118481u) | 4278190080u); +- } else if (self->private_impl.f_depth <= 8u) { +- self->private_impl.f_remap_transparency = (((v_u & 255u) * 65793u) | 4278190080u); +- } else { +- self->private_impl.f_remap_transparency = ((v_u * 4295032833u) | 18446462598732840960u); +- } +- } else if (self->private_impl.f_color_type == 2u) { +- self->private_impl.choosy_filter_and_swizzle = ( +- &wuffs_png__decoder__filter_and_swizzle_tricky); +- if (self->private_impl.f_depth <= 8u) { +- self->private_impl.f_dst_pixfmt = 2164295816u; +- self->private_impl.f_src_pixfmt = 2164295816u; +- } else { +- self->private_impl.f_dst_pixfmt = 2164308923u; +- self->private_impl.f_src_pixfmt = 2164308923u; +- } +- if (self->private_impl.f_chunk_length != 6u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length = 0u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint64_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) { +- t_1 = ((uint64_t)(wuffs_base__peek_u48be__no_bounds_check(iop_a_src))); +- iop_a_src += 6; +- } else { +- self->private_data.s_decode_trns[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_trns[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 40) { +- t_1 = ((uint64_t)(*scratch >> 16)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } +- } +- v_u = t_1; +- } +- if (self->private_impl.f_depth <= 8u) { +- self->private_impl.f_remap_transparency = ((255u & (v_u >> 0u)) | +- (65280u & (v_u >> 8u)) | +- (16711680u & (v_u >> 16u)) | +- 4278190080u); +- } else { +- self->private_impl.f_remap_transparency = (v_u | 18446462598732840960u); +- } +- } else if (self->private_impl.f_color_type == 3u) { +- self->private_impl.f_dst_pixfmt = 2164523016u; +- self->private_impl.f_src_pixfmt = 2164523016u; +- if (self->private_impl.f_chunk_length > 256u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- v_n = ((uint32_t)(self->private_impl.f_chunk_length)); +- self->private_impl.f_chunk_length = 0u; +- while (v_i < v_n) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- self->private_data.f_src_palette[((4u * v_i) + 3u)] = t_2; +- } +- v_i += 1u; +- } ++const wuffs_base__image_decoder__func_ptrs ++wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_wbmp__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_wbmp__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_wbmp__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_wbmp__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_wbmp__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_wbmp__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_wbmp__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_wbmp__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_wbmp__decoder__initialize( ++ wuffs_wbmp__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; + } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); + } ++ } + +- goto ok; +- ok: +- self->private_impl.p_decode_trns[0] = 0; +- goto exit; ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_wbmp__decoder* ++wuffs_wbmp__decoder__alloc(void) { ++ wuffs_wbmp__decoder* x = ++ (wuffs_wbmp__decoder*)(calloc(1, sizeof(wuffs_wbmp__decoder))); ++ if (!x) { ++ return NULL; ++ } ++ if (wuffs_wbmp__decoder__initialize( ++ x, sizeof(wuffs_wbmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; + } ++ return x; ++} + +- goto suspend; +- suspend: +- self->private_impl.p_decode_trns[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_decode_trns[0].v_i = v_i; +- self->private_data.s_decode_trns[0].v_n = v_n; ++size_t ++sizeof__wuffs_wbmp__decoder(void) { ++ return sizeof(wuffs_wbmp__decoder); ++} + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++// ---------------- Function Implementations ++ ++// -------- func wbmp.decoder.get_quirk ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_wbmp__decoder__get_quirk( ++ const wuffs_wbmp__decoder* self, ++ uint32_t a_key) { ++ if (!self) { ++ return 0; ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; + } + +- return status; ++ return 0u; + } + +-// -------- func png.decoder.decode_frame_config ++// -------- func wbmp.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__decode_frame_config( +- wuffs_png__decoder* self, +- wuffs_base__frame_config* a_dst, ++wuffs_wbmp__decoder__set_quirk( ++ wuffs_wbmp__decoder* self, ++ uint32_t a_key, ++ uint64_t a_value) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++} ++ ++// -------- func wbmp.decoder.decode_image_config ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__decode_image_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); +@@ -56757,7 +70789,7 @@ wuffs_png__decoder__decode_frame_config( + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { ++ (self->private_impl.active_coroutine != 1)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -56766,17 +70798,17 @@ wuffs_png__decoder__decode_frame_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame_config(self, a_dst, a_src); ++ wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_image_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); + goto exit; + } + status = v_status; +@@ -56784,14 +70816,14 @@ wuffs_png__decoder__decode_frame_config( + } + + ok: +- self->private_impl.p_decode_frame_config[0] = 0; ++ self->private_impl.p_decode_image_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; + exit: +@@ -56801,17 +70833,19 @@ wuffs_png__decoder__decode_frame_config( + return status; + } + +-// -------- func png.decoder.do_decode_frame_config ++// -------- func wbmp.decoder.do_decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__do_decode_frame_config( +- wuffs_png__decoder* self, +- wuffs_base__frame_config* a_dst, ++wuffs_wbmp__decoder__do_decode_image_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_checksum_have = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_i = 0; ++ uint32_t v_p = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -56824,392 +70858,88 @@ wuffs_png__decoder__do_decode_frame_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; ++ if (coro_susp_point) { ++ v_i = self->private_data.s_do_decode_image_config.v_i; ++ v_p = self->private_data.s_do_decode_image_config.v_p; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_call_sequence & 16u) != 0u) { ++ if (self->private_impl.f_call_sequence != 0u) { + status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + goto exit; +- } else if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_png__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; +- } +- } else if (self->private_impl.f_call_sequence == 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- status = wuffs_png__decoder__skip_frame(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- if (self->private_impl.f_metadata_fourcc != 0u) { +- self->private_impl.f_call_sequence = 48u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; + } +- if (self->private_impl.f_num_decoded_frame_configs_value == 0u) { +- self->private_impl.f_frame_rect_x0 = self->private_impl.f_first_rect_x0; +- self->private_impl.f_frame_rect_y0 = self->private_impl.f_first_rect_y0; +- self->private_impl.f_frame_rect_x1 = self->private_impl.f_first_rect_x1; +- self->private_impl.f_frame_rect_y1 = self->private_impl.f_first_rect_y1; +- self->private_impl.f_frame_config_io_position = self->private_impl.f_first_config_io_position; +- self->private_impl.f_frame_duration = self->private_impl.f_first_duration; +- self->private_impl.f_frame_disposal = self->private_impl.f_first_disposal; +- self->private_impl.f_frame_overwrite_instead_of_blend = self->private_impl.f_first_overwrite_instead_of_blend; +- } else { +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_frame_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_frame_config[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- self->private_impl.f_chunk_length = t_0; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_frame_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_frame_config[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)) << 56; +- } +- } +- self->private_impl.f_chunk_type = t_1; +- } +- if (self->private_impl.f_chunk_type == 1145980233u) { +- if (self->private_impl.f_chunk_length != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_frame_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_frame_config[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; +- if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)) << 56; +- } +- } +- v_checksum_have = t_2; +- } +- if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != 2187346606u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_checksum); +- goto exit; +- } +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else if (self->private_impl.f_chunk_type == 1413571686u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } else if (self->private_impl.f_chunk_type == 1280598886u) { +- self->private_impl.f_frame_config_io_position = ((uint64_t)(wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) - 8u)); +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- status = wuffs_png__decoder__decode_fctl(self, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- self->private_data.s_do_decode_frame_config[0].scratch = 4u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- if (self->private_data.s_do_decode_frame_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame_config[0].scratch; +- break; +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); +- status = wuffs_png__decoder__decode_other_chunk(self, a_src, true); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- if (self->private_impl.f_metadata_fourcc != 0u) { +- self->private_impl.f_call_sequence = 48u; +- status = wuffs_base__make_status(wuffs_base__note__metadata_reported); +- goto ok; +- } +- self->private_data.s_do_decode_frame_config[0].scratch = 4u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- if (self->private_data.s_do_decode_frame_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; ++ v_i = 0u; ++ while (v_i < 2u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- iop_a_src += self->private_data.s_do_decode_frame_config[0].scratch; +- self->private_impl.f_chunk_length = 0u; ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- self->private_impl.f_frame_rect_x0, +- self->private_impl.f_frame_rect_y0, +- self->private_impl.f_frame_rect_x1, +- self->private_impl.f_frame_rect_y1), +- ((wuffs_base__flicks)(self->private_impl.f_frame_duration)), +- ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)), +- self->private_impl.f_frame_config_io_position, +- self->private_impl.f_frame_disposal, +- ((self->private_impl.f_color_type <= 3u) && ! self->private_impl.f_seen_trns), +- self->private_impl.f_frame_overwrite_instead_of_blend, +- 0u); +- } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u); +- self->private_impl.f_call_sequence = 64u; +- +- ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- +- return status; +-} +- +-// -------- func png.decoder.skip_frame +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__skip_frame( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- uint32_t v_seq_num = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_skip_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- self->private_impl.f_chunk_type_array[0u] = 0u; +- self->private_impl.f_chunk_type_array[1u] = 0u; +- self->private_impl.f_chunk_type_array[2u] = 0u; +- self->private_impl.f_chunk_type_array[3u] = 0u; +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- continue; ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_wbmp__error__bad_header); ++ goto exit; + } +- self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); +- if (self->private_impl.f_chunk_type == 1413563465u) { +- if (self->private_impl.f_chunk_type_array[0u] == 102u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_type_array[0u] = 73u; +- self->private_impl.f_chunk_type_array[1u] = 68u; +- self->private_impl.f_chunk_type_array[2u] = 65u; +- self->private_impl.f_chunk_type_array[3u] = 84u; +- } else if (self->private_impl.f_chunk_type == 1413571686u) { +- if (self->private_impl.f_chunk_type_array[0u] == 73u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_type_array[0u] = 102u; +- self->private_impl.f_chunk_type_array[1u] = 100u; +- self->private_impl.f_chunk_type_array[2u] = 65u; +- self->private_impl.f_chunk_type_array[3u] = 84u; +- if (self->private_impl.f_chunk_length < 4u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 4u; +- iop_a_src += 8u; ++ v_i += 1u; ++ } ++ v_i = 0u; ++ while (v_i < 2u) { ++ v_p = 0u; ++ while (true) { + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_skip_frame[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_skip_frame[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- v_seq_num = t_0; ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; + } +- if (v_seq_num != self->private_impl.f_next_animation_seq_num) { +- status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); +- goto exit; +- } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); ++ v_p |= ((uint32_t)(((uint8_t)(v_c8 & 127u)))); ++ if (((uint8_t)(v_c8 >> 7u)) == 0u) { ++ break; ++ } else if (v_p > 131071u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); + goto exit; + } +- self->private_impl.f_next_animation_seq_num += 1u; +- self->private_data.s_skip_frame[0].scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 4u); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_skip_frame[0].scratch; +- self->private_impl.f_chunk_length = 0u; +- continue; +- } else if (self->private_impl.f_chunk_type_array[0u] != 0u) { +- break; +- } else if (self->private_impl.f_chunk_type == 1280598886u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; ++ v_p <<= 7u; + } +- self->private_data.s_skip_frame[0].scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ if (v_i == 0u) { ++ self->private_impl.f_width = v_p; ++ } else { ++ self->private_impl.f_height = v_p; + } +- iop_a_src += self->private_data.s_skip_frame[0].scratch; +- self->private_impl.f_chunk_length = 0u; ++ v_i += 1u; ++ } ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ 2198077448u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ true); + } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); + self->private_impl.f_call_sequence = 32u; + ++ goto ok; + ok: +- self->private_impl.p_skip_frame[0] = 0; ++ self->private_impl.p_do_decode_image_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_skip_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_image_config.v_i = v_i; ++ self->private_data.s_do_decode_image_config.v_p = v_p; + + goto exit; + exit: +@@ -57220,17 +70950,14 @@ wuffs_png__decoder__skip_frame( + return status; + } + +-// -------- func png.decoder.decode_frame ++// -------- func wbmp.decoder.decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__decode_frame( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++wuffs_wbmp__decoder__decode_frame_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -57240,12 +70967,12 @@ wuffs_png__decoder__decode_frame( + ? wuffs_base__error__disabled_by_previous_error + : wuffs_base__error__initialize_not_called); + } +- if (!a_dst || !a_src) { ++ if (!a_src) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { ++ (self->private_impl.active_coroutine != 2)) { + self->private_impl.magic = WUFFS_BASE__DISABLED; + return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } +@@ -57254,22 +70981,17 @@ wuffs_png__decoder__decode_frame( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); ++ wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_png__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); + goto exit; + } + status = v_status; +@@ -57277,14 +70999,14 @@ wuffs_png__decoder__decode_frame( + } + + ok: +- self->private_impl.p_decode_frame[0] = 0; ++ self->private_impl.p_decode_frame_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + + goto exit; + exit: +@@ -57294,24 +71016,16 @@ wuffs_png__decoder__decode_frame( + return status; + } + +-// -------- func png.decoder.do_decode_frame ++// -------- func wbmp.decoder.do_decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__do_decode_frame( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++wuffs_wbmp__decoder__do_decode_frame_config( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_seq_num = 0; +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- uint32_t v_pass_width = 0; +- uint32_t v_pass_height = 0; +- + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -57323,210 +71037,62 @@ wuffs_png__decoder__do_decode_frame( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_call_sequence & 16u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } else if (self->private_impl.f_call_sequence >= 96u) { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else if (self->private_impl.f_call_sequence != 64u) { ++ if (self->private_impl.f_call_sequence == 32u) { ++ } else if (self->private_impl.f_call_sequence < 32u) { + if (a_src) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_png__decoder__do_decode_frame_config(self, NULL, a_src); ++ status = wuffs_wbmp__decoder__do_decode_image_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + if (status.repr) { + goto suspend; + } +- } +- while (true) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- continue; +- } +- self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u))); +- if (self->private_impl.f_chunk_type == 1413563465u) { +- self->private_impl.f_chunk_type_array[0u] = 73u; +- self->private_impl.f_chunk_type_array[1u] = 68u; +- self->private_impl.f_chunk_type_array[2u] = 65u; +- self->private_impl.f_chunk_type_array[3u] = 84u; +- iop_a_src += 8u; +- if ( ! self->private_impl.f_ignore_checksum) { +- wuffs_base__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, +- sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); +- } +- break; +- } else if (self->private_impl.f_chunk_type == 1413571686u) { +- self->private_impl.f_chunk_type_array[0u] = 102u; +- self->private_impl.f_chunk_type_array[1u] = 100u; +- self->private_impl.f_chunk_type_array[2u] = 65u; +- self->private_impl.f_chunk_type_array[3u] = 84u; +- if (self->private_impl.f_chunk_length < 4u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 4u; +- iop_a_src += 8u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_0; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_frame[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_frame[0].scratch; +- uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0); +- if (num_bits_0 == 24) { +- t_0 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_0 += 8u; +- *scratch |= ((uint64_t)(num_bits_0)); +- } +- } +- v_seq_num = t_0; +- } +- if (v_seq_num != self->private_impl.f_next_animation_seq_num) { +- status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); +- goto exit; +- } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); +- goto exit; +- } +- self->private_impl.f_next_animation_seq_num += 1u; +- break; +- } else if (self->private_impl.f_chunk_type == 1280598886u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_data.s_do_decode_frame[0].scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame[0].scratch; +- self->private_impl.f_chunk_length = 0u; +- } +- if (self->private_impl.f_zlib_is_dirty) { +- wuffs_base__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib, +- sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- if (self->private_impl.f_ignore_checksum) { +- wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u); +- } +- } +- self->private_impl.f_zlib_is_dirty = true; +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), +- wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), +- wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ } else if (self->private_impl.f_call_sequence == 40u) { ++ if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_restart); + goto exit; + } ++ } else if (self->private_impl.f_call_sequence == 64u) { ++ self->private_impl.f_call_sequence = 96u; ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); + goto ok; + } +- self->private_impl.f_workbuf_hist_pos_base = 0u; +- while (true) { +- if (self->private_impl.f_chunk_type_array[0u] == 73u) { +- v_pass_width = (16777215u & ((((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][1u])) + self->private_impl.f_width) >> WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u])); +- v_pass_height = (16777215u & ((((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][4u])) + self->private_impl.f_height) >> WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3u])); +- } else { +- v_pass_width = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_x1 - self->private_impl.f_frame_rect_x0))); +- v_pass_height = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_y1 - self->private_impl.f_frame_rect_y0))); +- } +- if ((v_pass_width > 0u) && (v_pass_height > 0u)) { +- self->private_impl.f_pass_bytes_per_row = wuffs_png__decoder__calculate_bytes_per_row(self, v_pass_width); +- self->private_impl.f_pass_workbuf_length = (((uint64_t)(v_pass_height)) * (1u + self->private_impl.f_pass_bytes_per_row)); +- while (true) { +- { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_1 = wuffs_png__decoder__decode_pass(self, a_src, a_workbuf); +- v_status = t_1; +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- if (wuffs_base__status__is_ok(&v_status)) { +- break; +- } else if (wuffs_base__status__is_error(&v_status) || ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed))) { +- if (self->private_impl.f_workbuf_wi <= ((uint64_t)(a_workbuf.len))) { +- wuffs_png__decoder__filter_and_swizzle(self, a_dst, wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_workbuf_wi)); +- } +- if (v_status.repr == wuffs_base__suspension__short_read) { +- status = wuffs_base__make_status(wuffs_png__error__truncated_input); +- goto exit; +- } +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- } +- v_status = wuffs_png__decoder__filter_and_swizzle(self, a_dst, a_workbuf); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- self->private_impl.f_workbuf_hist_pos_base += self->private_impl.f_pass_workbuf_length; +- } +- if ((self->private_impl.f_interlace_pass == 0u) || (self->private_impl.f_interlace_pass >= 7u)) { +- break; +- } +-#if defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wconversion" +-#endif +- self->private_impl.f_interlace_pass += 1u; +-#if defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif ++ if (a_dst != NULL) { ++ wuffs_base__frame_config__set( ++ a_dst, ++ wuffs_base__utility__make_rect_ie_u32( ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height), ++ ((wuffs_base__flicks)(0u)), ++ 0u, ++ self->private_impl.f_frame_config_io_position, ++ 0u, ++ true, ++ false, ++ 4278190080u); + } +- wuffs_base__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u); +- self->private_impl.f_call_sequence = 32u; ++ self->private_impl.f_call_sequence = 64u; + + ok: +- self->private_impl.p_do_decode_frame[0] = 0; ++ self->private_impl.p_do_decode_frame_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -57537,338 +71103,217 @@ wuffs_png__decoder__do_decode_frame( + return status; + } + +-// -------- func png.decoder.decode_pass ++// -------- func wbmp.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_png__decoder__decode_pass( +- wuffs_png__decoder* self, ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__decode_frame( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, +- wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 3)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_w = &u_w; +- uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint64_t v_w_mark = 0; +- uint64_t v_r_mark = 0; +- wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL); +- uint32_t v_checksum_have = 0; +- uint32_t v_checksum_want = 0; +- uint32_t v_seq_num = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_pass[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- self->private_impl.f_workbuf_wi = 0u; + while (true) { +- if ((self->private_impl.f_workbuf_wi > self->private_impl.f_pass_workbuf_length) || (self->private_impl.f_pass_workbuf_length > ((uint64_t)(a_workbuf.len)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); +- goto exit; +- } + { +- wuffs_base__io_buffer* o_0_v_w = v_w; +- uint8_t *o_0_iop_v_w = iop_v_w; +- uint8_t *o_0_io0_v_w = io0_v_w; +- uint8_t *o_0_io1_v_w = io1_v_w; +- uint8_t *o_0_io2_v_w = io2_v_w; +- v_w = wuffs_base__io_writer__set( +- &u_w, +- &iop_v_w, +- &io0_v_w, +- &io1_v_w, +- &io2_v_w, +- wuffs_base__slice_u8__subslice_ij(a_workbuf, +- self->private_impl.f_workbuf_wi, +- self->private_impl.f_pass_workbuf_length), +- ((uint64_t)(self->private_impl.f_workbuf_hist_pos_base + self->private_impl.f_workbuf_wi))); +- { +- const bool o_1_closed_a_src = a_src->meta.closed; +- const uint8_t *o_1_io2_a_src = io2_a_src; +- wuffs_base__io_reader__limit(&io2_a_src, iop_a_src, +- ((uint64_t)(self->private_impl.f_chunk_length))); +- if (a_src) { +- size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); +- a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); +- a_src->meta.wi = n; +- } +- v_w_mark = ((uint64_t)(iop_v_w - io0_v_w)); +- v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- { +- u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr)); +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_0 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, v_w, a_src, wuffs_base__utility__empty_slice_u8()); +- v_zlib_status = t_0; +- iop_v_w = u_w.data.ptr + u_w.meta.wi; +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- if ( ! self->private_impl.f_ignore_checksum) { +- wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__io__since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); +- } +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_base__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_workbuf_wi, wuffs_base__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w)))); +- io2_a_src = o_1_io2_a_src; +- if (a_src) { +- a_src->meta.closed = o_1_closed_a_src; +- a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); +- } +- } +- v_w = o_0_v_w; +- iop_v_w = o_0_iop_v_w; +- io0_v_w = o_0_io0_v_w; +- io1_v_w = o_0_io1_v_w; +- io2_v_w = o_0_io2_v_w; ++ wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame(self, ++ a_dst, ++ a_src, ++ a_blend, ++ a_workbuf, ++ a_opts); ++ v_status = t_0; + } +- if (wuffs_base__status__is_ok(&v_zlib_status)) { +- if (self->private_impl.f_chunk_length > 0u) { +- status = wuffs_base__make_status(wuffs_base__error__too_much_data); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- uint32_t t_1; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_pass[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; +- uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1); +- if (num_bits_1 == 24) { +- t_1 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_1 += 8u; +- *scratch |= ((uint64_t)(num_bits_1)); +- } +- } +- v_checksum_want = t_1; +- } +- if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) { +- v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8()); +- if (v_checksum_have != v_checksum_want) { +- status = wuffs_base__make_status(wuffs_png__error__bad_checksum); +- goto exit; +- } +- } +- break; +- } else if (v_zlib_status.repr == wuffs_base__suspension__short_write) { +- if ((1u <= self->private_impl.f_interlace_pass) && (self->private_impl.f_interlace_pass <= 6u)) { +- break; +- } +- status = wuffs_base__make_status(wuffs_base__error__too_much_data); ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); + goto exit; +- } else if (v_zlib_status.repr != wuffs_base__suspension__short_read) { +- status = v_zlib_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } else if (self->private_impl.f_chunk_length == 0u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- uint32_t t_2; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_pass[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; +- uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2); +- if (num_bits_2 == 24) { +- t_2 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_2 += 8u; +- *scratch |= ((uint64_t)(num_bits_2)); +- } +- } +- v_checksum_want = t_2; +- } +- if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) { +- v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8()); +- if (v_checksum_have != v_checksum_want) { +- status = wuffs_base__make_status(wuffs_png__error__bad_checksum); +- goto exit; +- } +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); +- uint32_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_pass[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3); +- if (num_bits_3 == 24) { +- t_3 = ((uint32_t)(*scratch >> 32)); +- break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func wbmp.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_wbmp__decoder__do_decode_frame( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint64_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_x_in_bytes = 0; ++ uint32_t v_dst_x = 0; ++ uint32_t v_dst_y = 0; ++ wuffs_base__table_u8 v_tab = {0}; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint8_t v_src[1] = {0}; ++ uint8_t v_c8 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ if (coro_susp_point) { ++ v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel; ++ v_dst_x = self->private_data.s_do_decode_frame.v_dst_x; ++ v_dst_y = self->private_data.s_do_decode_frame.v_dst_y; ++ memcpy(v_src, self->private_data.s_do_decode_frame.v_src, sizeof(v_src)); ++ v_c8 = self->private_data.s_do_decode_frame.v_c8; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_wbmp__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette(a_dst), ++ wuffs_base__utility__make_pixel_format(536870920u), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ status = wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ goto exit; ++ } ++ v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); ++ if (self->private_impl.f_width > 0u) { ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ while (v_dst_y < self->private_impl.f_height) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y); ++ v_dst_x = 0u; ++ while (v_dst_x < self->private_impl.f_width) { ++ if ((v_dst_x & 7u) == 0u) { ++ while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y); ++ v_dst_x_in_bytes = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel); ++ if (v_dst_x_in_bytes <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_x_in_bytes); + } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)); + } ++ v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); ++ iop_a_src += 1u; + } +- self->private_impl.f_chunk_length = t_3; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); +- uint32_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; ++ if (((uint8_t)(v_c8 & 128u)) == 0u) { ++ v_src[0u] = 0u; + } else { +- self->private_data.s_decode_pass[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 24) { +- t_4 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; +- } +- } +- self->private_impl.f_chunk_type = t_4; +- } +- if (self->private_impl.f_chunk_type_array[0u] == 73u) { +- if (self->private_impl.f_chunk_type != 1413563465u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- if ( ! self->private_impl.f_ignore_checksum) { +- wuffs_base__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, +- sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4)); +- } +- } else { +- if ((self->private_impl.f_chunk_type != 1413571686u) || (self->private_impl.f_chunk_length < 4u)) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 4u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- uint32_t t_5; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_decode_pass[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_decode_pass[0].scratch; +- uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu)); +- *scratch >>= 8; +- *scratch <<= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5); +- if (num_bits_5 == 24) { +- t_5 = ((uint32_t)(*scratch >> 32)); +- break; +- } +- num_bits_5 += 8u; +- *scratch |= ((uint64_t)(num_bits_5)); +- } +- } +- v_seq_num = t_5; ++ v_src[0u] = 255u; + } +- if (v_seq_num != self->private_impl.f_next_animation_seq_num) { +- status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number); +- goto exit; +- } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file); +- goto exit; ++ v_c8 = ((uint8_t)((((uint32_t)(v_c8)) << 1u))); ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__utility__empty_slice_u8(), wuffs_base__make_slice_u8(v_src, 1)); ++ if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); + } +- self->private_impl.f_next_animation_seq_num += 1u; ++ v_dst_x += 1u; + } +- continue; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) > 0u) { +- status = wuffs_base__make_status(wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input); +- goto exit; +- } +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); +- } +- if (self->private_impl.f_workbuf_wi != self->private_impl.f_pass_workbuf_length) { +- status = wuffs_base__make_status(wuffs_base__error__not_enough_data); +- goto exit; +- } else if (0u < ((uint64_t)(a_workbuf.len))) { +- if (a_workbuf.ptr[0u] == 4u) { +- a_workbuf.ptr[0u] = 1u; ++ v_dst_y += 1u; + } + } ++ self->private_impl.f_call_sequence = 96u; + + ok: +- self->private_impl.p_decode_pass[0] = 0; ++ self->private_impl.p_do_decode_frame = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_pass[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel = v_dst_bytes_per_pixel; ++ self->private_data.s_do_decode_frame.v_dst_x = v_dst_x; ++ self->private_data.s_do_decode_frame.v_dst_y = v_dst_y; ++ memcpy(self->private_data.s_do_decode_frame.v_src, v_src, sizeof(v_src)); ++ self->private_data.s_do_decode_frame.v_c8 = v_c8; + + goto exit; + exit: +@@ -57879,12 +71324,12 @@ wuffs_png__decoder__decode_pass( + return status; + } + +-// -------- func png.decoder.frame_dirty_rect ++// -------- func wbmp.decoder.frame_dirty_rect + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_png__decoder__frame_dirty_rect( +- const wuffs_png__decoder* self) { ++wuffs_wbmp__decoder__frame_dirty_rect( ++ const wuffs_wbmp__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_rect_ie_u32(); + } +@@ -57894,18 +71339,18 @@ wuffs_png__decoder__frame_dirty_rect( + } + + return wuffs_base__utility__make_rect_ie_u32( +- self->private_impl.f_frame_rect_x0, +- self->private_impl.f_frame_rect_y0, +- self->private_impl.f_frame_rect_x1, +- self->private_impl.f_frame_rect_y1); ++ 0u, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height); + } + +-// -------- func png.decoder.num_animation_loops ++// -------- func wbmp.decoder.num_animation_loops + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_png__decoder__num_animation_loops( +- const wuffs_png__decoder* self) { ++wuffs_wbmp__decoder__num_animation_loops( ++ const wuffs_wbmp__decoder* self) { + if (!self) { + return 0; + } +@@ -57914,15 +71359,15 @@ wuffs_png__decoder__num_animation_loops( + return 0; + } + +- return self->private_impl.f_num_animation_loops_value; ++ return 0u; + } + +-// -------- func png.decoder.num_decoded_frame_configs ++// -------- func wbmp.decoder.num_decoded_frame_configs + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_png__decoder__num_decoded_frame_configs( +- const wuffs_png__decoder* self) { ++wuffs_wbmp__decoder__num_decoded_frame_configs( ++ const wuffs_wbmp__decoder* self) { + if (!self) { + return 0; + } +@@ -57931,15 +71376,18 @@ wuffs_png__decoder__num_decoded_frame_configs( + return 0; + } + +- return ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)); ++ if (self->private_impl.f_call_sequence > 32u) { ++ return 1u; ++ } ++ return 0u; + } + +-// -------- func png.decoder.num_decoded_frames ++// -------- func wbmp.decoder.num_decoded_frames + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_png__decoder__num_decoded_frames( +- const wuffs_png__decoder* self) { ++wuffs_wbmp__decoder__num_decoded_frames( ++ const wuffs_wbmp__decoder* self) { + if (!self) { + return 0; + } +@@ -57948,15 +71396,18 @@ wuffs_png__decoder__num_decoded_frames( + return 0; + } + +- return ((uint64_t)(self->private_impl.f_num_decoded_frames_value)); ++ if (self->private_impl.f_call_sequence > 64u) { ++ return 1u; ++ } ++ return 0u; + } + +-// -------- func png.decoder.restart_frame ++// -------- func wbmp.decoder.restart_frame + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__restart_frame( +- wuffs_png__decoder* self, ++wuffs_wbmp__decoder__restart_frame( ++ wuffs_wbmp__decoder* self, + uint64_t a_index, + uint64_t a_io_position) { + if (!self) { +@@ -57971,154 +71422,514 @@ wuffs_png__decoder__restart_frame( + + if (self->private_impl.f_call_sequence < 32u) { + return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } else if ((a_index >= ((uint64_t)(self->private_impl.f_num_animation_frames_value))) || ((a_index == 0u) && (a_io_position != self->private_impl.f_first_config_io_position))) { ++ } ++ if (a_index != 0u) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + self->private_impl.f_call_sequence = 40u; +- if (self->private_impl.f_interlace_pass >= 1u) { +- self->private_impl.f_interlace_pass = 1u; +- } + self->private_impl.f_frame_config_io_position = a_io_position; +- self->private_impl.f_num_decoded_frame_configs_value = ((uint32_t)(a_index)); +- self->private_impl.f_num_decoded_frames_value = self->private_impl.f_num_decoded_frame_configs_value; + return wuffs_base__make_status(NULL); + } + +-// -------- func png.decoder.set_report_metadata ++// -------- func wbmp.decoder.set_report_metadata + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_png__decoder__set_report_metadata( +- wuffs_png__decoder* self, ++wuffs_wbmp__decoder__set_report_metadata( ++ wuffs_wbmp__decoder* self, + uint32_t a_fourcc, + bool a_report) { ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func wbmp.decoder.tell_me_more ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_wbmp__decoder__tell_me_more( ++ wuffs_wbmp__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__more_information* a_minfo, ++ wuffs_base__io_buffer* a_src) { + if (!self) { +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 4)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); + } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- if (a_fourcc == 1128813133u) { +- self->private_impl.f_report_metadata_chrm = a_report; +- } else if (a_fourcc == 1163413830u) { +- self->private_impl.f_report_metadata_exif = a_report; +- } else if (a_fourcc == 1195461953u) { +- self->private_impl.f_report_metadata_gama = a_report; +- } else if (a_fourcc == 1229144912u) { +- self->private_impl.f_report_metadata_iccp = a_report; +- } else if (a_fourcc == 1263947808u) { +- self->private_impl.f_report_metadata_kvp = a_report; +- } else if (a_fourcc == 1397901122u) { +- self->private_impl.f_report_metadata_srgb = a_report; ++ status = wuffs_base__make_status(wuffs_base__error__no_more_information); ++ goto exit; ++ ++ goto ok; ++ ok: ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func wbmp.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_wbmp__decoder__workbuf_len( ++ const wuffs_wbmp__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++} ++ ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) ++ ++// ---------------- Status Codes Implementations ++ ++const char wuffs_webp__error__bad_huffman_code_over_subscribed[] = "#webp: bad Huffman code (over-subscribed)"; ++const char wuffs_webp__error__bad_huffman_code_under_subscribed[] = "#webp: bad Huffman code (under-subscribed)"; ++const char wuffs_webp__error__bad_huffman_code[] = "#webp: bad Huffman code"; ++const char wuffs_webp__error__bad_back_reference[] = "#webp: bad back-reference"; ++const char wuffs_webp__error__bad_color_cache[] = "#webp: bad color cache"; ++const char wuffs_webp__error__bad_header[] = "#webp: bad header"; ++const char wuffs_webp__error__bad_transform[] = "#webp: bad transform"; ++const char wuffs_webp__error__short_chunk[] = "#webp: short chunk"; ++const char wuffs_webp__error__truncated_input[] = "#webp: truncated input"; ++const char wuffs_webp__error__unsupported_number_of_huffman_groups[] = "#webp: unsupported number of Huffman groups"; ++const char wuffs_webp__error__unsupported_transform_after_color_indexing_transform[] = "#webp: unsupported transform after color indexing transform"; ++const char wuffs_webp__error__unsupported_webp_file[] = "#webp: unsupported WebP file"; ++const char wuffs_webp__error__internal_error_inconsistent_huffman_code[] = "#webp: internal error: inconsistent Huffman code"; ++const char wuffs_webp__error__internal_error_inconsistent_dst_buffer[] = "#webp: internal error: inconsistent dst buffer"; ++const char wuffs_webp__error__internal_error_inconsistent_n_bits[] = "#webp: internal error: inconsistent n_bits"; ++ ++// ---------------- Private Consts ++ ++static const uint8_t ++WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 17u, 18u, 0u, 1u, 2u, 3u, 4u, 5u, ++ 16u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, ++ 13u, 14u, 15u, ++}; ++ ++static const uint8_t ++WUFFS_WEBP__REPEAT_N_BITS[4] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 2u, 3u, 7u, 0u, ++}; ++ ++static const uint8_t ++WUFFS_WEBP__REPEAT_COUNTS[4] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 3u, 3u, 11u, 0u, ++}; ++ ++static const uint16_t ++WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[5] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1612u, 0u, 511u, 1022u, 1533u, ++}; ++ ++static const uint8_t ++WUFFS_WEBP__DISTANCE_MAP[120] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 24u, 7u, 23u, 25u, 40u, 6u, 39u, 41u, ++ 22u, 26u, 38u, 42u, 56u, 5u, 55u, 57u, ++ 21u, 27u, 54u, 58u, 37u, 43u, 72u, 4u, ++ 71u, 73u, 20u, 28u, 53u, 59u, 70u, 74u, ++ 36u, 44u, 88u, 69u, 75u, 52u, 60u, 3u, ++ 87u, 89u, 19u, 29u, 86u, 90u, 35u, 45u, ++ 68u, 76u, 85u, 91u, 51u, 61u, 104u, 2u, ++ 103u, 105u, 18u, 30u, 102u, 106u, 34u, 46u, ++ 84u, 92u, 67u, 77u, 101u, 107u, 50u, 62u, ++ 120u, 1u, 119u, 121u, 83u, 93u, 17u, 31u, ++ 100u, 108u, 66u, 78u, 118u, 122u, 33u, 47u, ++ 117u, 123u, 49u, 63u, 99u, 109u, 82u, 94u, ++ 0u, 116u, 124u, 65u, 79u, 16u, 32u, 98u, ++ 110u, 48u, 115u, 125u, 81u, 95u, 64u, 114u, ++ 126u, 97u, 111u, 80u, 113u, 127u, 96u, 112u, ++}; ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_huffman_groups( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_n_huffman_groups); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_huffman_tree( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_hg, ++ uint32_t a_ht); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_huffman_tree_simple( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_hg, ++ uint32_t a_ht); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_code_length_code_lengths( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__build_code_lengths_huffman_nodes( ++ wuffs_webp__decoder* self); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__build_huffman_nodes( ++ wuffs_webp__decoder* self, ++ uint32_t a_hg, ++ uint32_t a_ht); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__build_code_lengths( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_pixels_slow( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_dst, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_width, ++ uint32_t a_height, ++ wuffs_base__slice_u8 a_tile_data, ++ uint32_t a_tile_size_log2); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_predictor( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix, ++ wuffs_base__slice_u8 a_tile_data); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint32_t ++wuffs_webp__decoder__absolute_difference( ++ const wuffs_webp__decoder* self, ++ uint32_t a_a, ++ uint32_t a_b); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_webp__decoder__mode12( ++ const wuffs_webp__decoder* self, ++ uint8_t a_l, ++ uint8_t a_t, ++ uint8_t a_tl); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_webp__decoder__mode13( ++ const wuffs_webp__decoder* self, ++ uint8_t a_l, ++ uint8_t a_t, ++ uint8_t a_tl); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_cross_color( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix, ++ wuffs_base__slice_u8 a_tile_data); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_subtract_green( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_color_indexing( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_image_config( ++ wuffs_webp__decoder* self, ++ wuffs_base__image_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_image_config_limited( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_image_config_limited_vp8l( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_frame_config( ++ wuffs_webp__decoder* self, ++ wuffs_base__frame_config* a_dst, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_frame( ++ wuffs_webp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_transform( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_color_cache_parameters( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_hg_table( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_width, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_pixels( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_dst, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_width, ++ uint32_t a_height, ++ wuffs_base__slice_u8 a_tile_data, ++ uint32_t a_tile_size_log2); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__swizzle( ++ wuffs_webp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_src, ++ wuffs_base__pixel_blend a_blend); ++ ++// ---------------- VTables ++ ++const wuffs_base__image_decoder__func_ptrs ++wuffs_webp__decoder__func_ptrs_for__wuffs_base__image_decoder = { ++ (wuffs_base__status(*)(void*, ++ wuffs_base__pixel_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__pixel_blend, ++ wuffs_base__slice_u8, ++ wuffs_base__decode_frame_options*))(&wuffs_webp__decoder__decode_frame), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__frame_config*, ++ wuffs_base__io_buffer*))(&wuffs_webp__decoder__decode_frame_config), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__image_config*, ++ wuffs_base__io_buffer*))(&wuffs_webp__decoder__decode_image_config), ++ (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_webp__decoder__frame_dirty_rect), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_webp__decoder__get_quirk), ++ (uint32_t(*)(const void*))(&wuffs_webp__decoder__num_animation_loops), ++ (uint64_t(*)(const void*))(&wuffs_webp__decoder__num_decoded_frame_configs), ++ (uint64_t(*)(const void*))(&wuffs_webp__decoder__num_decoded_frames), ++ (wuffs_base__status(*)(void*, ++ uint64_t, ++ uint64_t))(&wuffs_webp__decoder__restart_frame), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_webp__decoder__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ uint32_t, ++ bool))(&wuffs_webp__decoder__set_report_metadata), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__more_information*, ++ wuffs_base__io_buffer*))(&wuffs_webp__decoder__tell_me_more), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_webp__decoder__workbuf_len), ++}; ++ ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_webp__decoder__initialize( ++ wuffs_webp__decoder* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ } ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ } ++ ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } ++ ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = ++ wuffs_base__image_decoder__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = ++ (const void*)(&wuffs_webp__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ return wuffs_base__make_status(NULL); ++} ++ ++wuffs_webp__decoder* ++wuffs_webp__decoder__alloc(void) { ++ wuffs_webp__decoder* x = ++ (wuffs_webp__decoder*)(calloc(1, sizeof(wuffs_webp__decoder))); ++ if (!x) { ++ return NULL; + } +- return wuffs_base__make_empty_struct(); ++ if (wuffs_webp__decoder__initialize( ++ x, sizeof(wuffs_webp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; ++ } ++ return x; + } + +-// -------- func png.decoder.tell_me_more ++size_t ++sizeof__wuffs_webp__decoder(void) { ++ return sizeof(wuffs_webp__decoder); ++} ++ ++// ---------------- Function Implementations ++ ++// -------- func webp.decoder.decode_huffman_groups + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_png__decoder__tell_me_more( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; ++static wuffs_base__status ++wuffs_webp__decoder__decode_huffman_groups( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_n_huffman_groups) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_hg = 0; ++ uint32_t v_ht = 0; + +- uint32_t coro_susp_point = self->private_impl.p_tell_me_more[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_huffman_groups; ++ if (coro_susp_point) { ++ v_hg = self->private_data.s_decode_huffman_groups.v_hg; ++ v_ht = self->private_data.s_decode_huffman_groups.v_ht; ++ } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_png__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_png__error__truncated_input); +- goto exit; ++ v_hg = 0u; ++ while (v_hg < a_n_huffman_groups) { ++ v_ht = 0u; ++ while (v_ht < 5u) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_webp__decoder__decode_huffman_tree(self, a_src, v_hg, v_ht); ++ if (status.repr) { ++ goto suspend; ++ } ++ v_ht += 1u; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ v_hg += 1u; + } + ++ goto ok; + ok: +- self->private_impl.p_tell_me_more[0] = 0; ++ self->private_impl.p_decode_huffman_groups = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0; ++ self->private_impl.p_decode_huffman_groups = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_huffman_groups.v_hg = v_hg; ++ self->private_data.s_decode_huffman_groups.v_ht = v_ht; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } + return status; + } + +-// -------- func png.decoder.do_tell_me_more ++// -------- func webp.decoder.decode_huffman_tree + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__do_tell_me_more( +- wuffs_png__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { ++wuffs_webp__decoder__decode_huffman_tree( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_hg, ++ uint32_t a_ht) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint16_t v_c2 = 0; +- wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer(); +- wuffs_base__io_buffer* v_w = &u_w; +- uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint64_t v_num_written = 0; +- uint64_t v_w_mark = 0; +- uint64_t v_r_mark = 0; +- wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL); ++ uint8_t v_c8 = 0; ++ uint32_t v_use_simple = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint8_t* iop_a_dst = NULL; +- uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_dst && a_dst->data.ptr) { +- io0_a_dst = a_dst->data.ptr; +- io1_a_dst = io0_a_dst + a_dst->meta.wi; +- iop_a_dst = io1_a_dst; +- io2_a_dst = io0_a_dst + a_dst->data.len; +- if (a_dst->meta.closed) { +- io2_a_dst = iop_a_dst; +- } +- } + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; + const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -58130,462 +71941,105 @@ wuffs_png__decoder__do_tell_me_more( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more[0]; +- if (coro_susp_point) { +- v_zlib_status = self->private_data.s_do_tell_me_more[0].v_zlib_status; +- } ++ uint32_t coro_susp_point = self->private_impl.p_decode_huffman_tree; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((self->private_impl.f_call_sequence & 16u) == 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } +- if (self->private_impl.f_metadata_fourcc == 0u) { +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; ++ if (a_ht >= 4u) { ++ self->private_impl.f_ht_n_symbols = 40u; ++ } else if (a_ht > 0u) { ++ self->private_impl.f_ht_n_symbols = 256u; ++ } else if (self->private_impl.f_color_cache_bits == 0u) { ++ self->private_impl.f_ht_n_symbols = 280u; ++ } else { ++ self->private_impl.f_ht_n_symbols = (280u + (((uint32_t)(1u)) << self->private_impl.f_color_cache_bits)); + } +- do { +- if (self->private_impl.f_metadata_flavor == 3u) { +- while (true) { +- if (wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_y) { +- status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position); +- goto exit; +- } else if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- self->private_impl.f_metadata_flavor, +- self->private_impl.f_metadata_fourcc, +- self->private_impl.f_metadata_x, +- self->private_impl.f_metadata_y, +- self->private_impl.f_metadata_z); +- } +- if (self->private_impl.f_metadata_y >= self->private_impl.f_metadata_z) { +- goto label__goto_done__break; +- } +- self->private_impl.f_metadata_y = self->private_impl.f_metadata_z; +- status = wuffs_base__make_status(wuffs_base__suspension__even_more_information); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- if (self->private_impl.f_metadata_is_zlib_compressed) { +- if (self->private_impl.f_zlib_is_dirty) { +- wuffs_base__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib, +- sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); +- if (self->private_impl.f_ignore_checksum) { +- wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u); +- } +- } +- self->private_impl.f_zlib_is_dirty = true; +- self->private_impl.f_ztxt_hist_pos = 0u; ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_use_simple = (self->private_impl.f_bits & 1u); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ if (v_use_simple != 0u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- label__loop__continue:; +- while (true) { +- if (a_minfo != NULL) { +- wuffs_base__more_information__set(a_minfo, +- self->private_impl.f_metadata_flavor, +- self->private_impl.f_metadata_fourcc, +- self->private_impl.f_metadata_x, +- self->private_impl.f_metadata_y, +- self->private_impl.f_metadata_z); +- } +- if (self->private_impl.f_metadata_flavor != 4u) { +- break; +- } +- if (self->private_impl.f_metadata_is_zlib_compressed) { +- if (self->private_impl.f_chunk_type == 1346585449u) { +- { +- const bool o_0_closed_a_src = a_src->meta.closed; +- const uint8_t *o_0_io2_a_src = io2_a_src; +- wuffs_base__io_reader__limit(&io2_a_src, iop_a_src, +- ((uint64_t)(self->private_impl.f_chunk_length))); +- if (a_src) { +- size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); +- a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); +- a_src->meta.wi = n; +- } +- v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_0 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, a_dst, a_src, wuffs_base__utility__empty_slice_u8()); +- v_zlib_status = t_0; +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_base__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); +- io2_a_src = o_0_io2_a_src; +- if (a_src) { +- a_src->meta.closed = o_0_closed_a_src; +- a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); +- } +- } +- if (wuffs_base__status__is_ok(&v_zlib_status)) { +- self->private_impl.f_metadata_is_zlib_compressed = false; +- break; +- } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { +- status = v_zlib_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- status = v_zlib_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- } else if (self->private_impl.f_chunk_type == 1951945833u) { +- { +- const bool o_1_closed_a_src = a_src->meta.closed; +- const uint8_t *o_1_io2_a_src = io2_a_src; +- wuffs_base__io_reader__limit(&io2_a_src, iop_a_src, +- ((uint64_t)(self->private_impl.f_chunk_length))); +- if (a_src) { +- size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); +- a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); +- a_src->meta.wi = n; +- } +- v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- { +- if (a_dst) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_1 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, a_dst, a_src, wuffs_base__utility__empty_slice_u8()); +- v_zlib_status = t_1; +- if (a_dst) { +- iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; +- } +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_base__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); +- io2_a_src = o_1_io2_a_src; +- if (a_src) { +- a_src->meta.closed = o_1_closed_a_src; +- a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); +- } +- } +- if (wuffs_base__status__is_ok(&v_zlib_status)) { +- self->private_impl.f_metadata_is_zlib_compressed = false; +- break; +- } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { +- status = v_zlib_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- status = v_zlib_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- } else if (self->private_impl.f_chunk_type == 1951945850u) { +- if (self->private_impl.f_ztxt_ri == self->private_impl.f_ztxt_wi) { +- { +- wuffs_base__io_buffer* o_2_v_w = v_w; +- uint8_t *o_2_iop_v_w = iop_v_w; +- uint8_t *o_2_io0_v_w = io0_v_w; +- uint8_t *o_2_io1_v_w = io1_v_w; +- uint8_t *o_2_io2_v_w = io2_v_w; +- v_w = wuffs_base__io_writer__set( +- &u_w, +- &iop_v_w, +- &io0_v_w, +- &io1_v_w, +- &io2_v_w, +- wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024), +- self->private_impl.f_ztxt_hist_pos); +- { +- const bool o_3_closed_a_src = a_src->meta.closed; +- const uint8_t *o_3_io2_a_src = io2_a_src; +- wuffs_base__io_reader__limit(&io2_a_src, iop_a_src, +- ((uint64_t)(self->private_impl.f_chunk_length))); +- if (a_src) { +- size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); +- a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); +- a_src->meta.wi = n; +- } +- v_w_mark = ((uint64_t)(iop_v_w - io0_v_w)); +- v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- { +- u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr)); +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- wuffs_base__status t_2 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, v_w, a_src, wuffs_base__utility__empty_slice_u8()); +- v_zlib_status = t_2; +- iop_v_w = u_w.data.ptr + u_w.meta.wi; +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- } +- wuffs_base__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_base__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); +- v_num_written = wuffs_base__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w))); +- io2_a_src = o_3_io2_a_src; +- if (a_src) { +- a_src->meta.closed = o_3_closed_a_src; +- a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); +- } +- } +- v_w = o_2_v_w; +- iop_v_w = o_2_iop_v_w; +- io0_v_w = o_2_io0_v_w; +- io1_v_w = o_2_io1_v_w; +- io2_v_w = o_2_io2_v_w; +- } +- if (v_num_written > 1024u) { +- status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_i_o); +- goto exit; +- } +- self->private_impl.f_ztxt_ri = 0u; +- self->private_impl.f_ztxt_wi = ((uint32_t)(v_num_written)); +- wuffs_base__u64__sat_add_indirect(&self->private_impl.f_ztxt_hist_pos, v_num_written); +- } +- while (self->private_impl.f_ztxt_ri < self->private_impl.f_ztxt_wi) { +- v_c2 = WUFFS_PNG__LATIN_1[self->private_data.f_dst_palette[self->private_impl.f_ztxt_ri]]; +- if (v_c2 == 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1); +- goto exit; +- } else if (v_c2 <= 127u) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- goto label__loop__continue; +- } +- self->private_impl.f_ztxt_ri += 1u; +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c2))), iop_a_dst += 1); +- } else { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- goto label__loop__continue; +- } +- self->private_impl.f_ztxt_ri += 1u; +- (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c2), iop_a_dst += 2); +- } +- } +- if (wuffs_base__status__is_ok(&v_zlib_status)) { +- self->private_impl.f_metadata_is_zlib_compressed = false; +- break; +- } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) { +- status = v_zlib_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } else if (v_zlib_status.repr != wuffs_base__suspension__short_write) { +- status = v_zlib_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- } +- } else { +- status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_chunk_type); +- goto exit; +- } +- } else if ((self->private_impl.f_chunk_type == 1951945833u) && (self->private_impl.f_metadata_fourcc == 1263947862u)) { +- while (true) { +- if (self->private_impl.f_chunk_length <= 0u) { +- goto label__loop__break; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); +- goto label__loop__continue; +- } else if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- goto label__loop__continue; +- } +- self->private_impl.f_chunk_length -= 1u; +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_c), iop_a_dst += 1); +- } +- } else { +- while (true) { +- if (self->private_impl.f_chunk_length <= 0u) { +- if (self->private_impl.f_metadata_fourcc == 1263947851u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- goto label__loop__break; +- } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); +- goto label__loop__continue; +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- if (v_c == 0u) { +- self->private_impl.f_chunk_length -= 1u; +- iop_a_src += 1u; +- goto label__loop__break; +- } +- v_c2 = WUFFS_PNG__LATIN_1[v_c]; +- if (v_c2 == 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1); +- goto exit; +- } else if (v_c2 <= 127u) { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); +- goto label__loop__continue; +- } +- self->private_impl.f_chunk_length -= 1u; +- iop_a_src += 1u; +- (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c2))), iop_a_dst += 1); +- } else { +- if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_write); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11); +- goto label__loop__continue; +- } +- self->private_impl.f_chunk_length -= 1u; +- iop_a_src += 1u; +- (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c2), iop_a_dst += 2); +- } +- } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ status = wuffs_webp__decoder__decode_huffman_tree_simple(self, a_src, a_hg, a_ht); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_webp__decoder__decode_code_length_code_lengths(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ v_status = wuffs_webp__decoder__build_code_lengths_huffman_nodes(self); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; + } ++ goto ok; + } +- label__loop__break:; +- if (self->private_impl.f_metadata_fourcc == 1263947851u) { +- self->private_impl.f_metadata_fourcc = 1263947862u; +- if (self->private_impl.f_chunk_type == 1951945833u) { +- if (self->private_impl.f_chunk_length <= 1u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 2u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_3 = *iop_a_src++; +- v_c = t_3; +- } +- if (v_c == 0u) { +- self->private_impl.f_metadata_is_zlib_compressed = false; +- } else if (v_c == 1u) { +- self->private_impl.f_metadata_is_zlib_compressed = true; +- } else { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_4 = *iop_a_src++; +- v_c = t_4; +- } +- if ((v_c != 0u) && self->private_impl.f_metadata_is_zlib_compressed) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); +- goto exit; +- } +- self->private_impl.f_metadata_fourcc -= 2u; +- while (self->private_impl.f_metadata_fourcc != 1263947862u) { +- self->private_impl.f_metadata_fourcc += 1u; +- while (true) { +- if (self->private_impl.f_chunk_length <= 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_5 = *iop_a_src++; +- v_c = t_5; +- } +- if (v_c == 0u) { +- break; +- } +- } +- } +- } else if (self->private_impl.f_chunk_type == 1951945850u) { +- if (self->private_impl.f_chunk_length <= 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_impl.f_chunk_length -= 1u; +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_6 = *iop_a_src++; +- v_c = t_6; +- } +- if (v_c != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method); +- goto exit; +- } +- self->private_impl.f_metadata_is_zlib_compressed = true; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_webp__decoder__build_code_lengths(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ v_status = wuffs_webp__decoder__build_huffman_nodes(self, a_hg, a_ht); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; + } +- self->private_impl.f_call_sequence &= 239u; +- status = wuffs_base__make_status(NULL); + goto ok; + } +- } while (0); +- label__goto_done__break:; +- if (self->private_impl.f_chunk_length != 0u) { +- status = wuffs_base__make_status(wuffs_png__error__bad_chunk); +- goto exit; +- } +- self->private_data.s_do_tell_me_more[0].scratch = 4u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- if (self->private_data.s_do_tell_me_more[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_tell_me_more[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; + } +- iop_a_src += self->private_data.s_do_tell_me_more[0].scratch; +- self->private_impl.f_metadata_flavor = 0u; +- self->private_impl.f_metadata_fourcc = 0u; +- self->private_impl.f_metadata_x = 0u; +- self->private_impl.f_metadata_y = 0u; +- self->private_impl.f_metadata_z = 0u; +- self->private_impl.f_call_sequence &= 239u; +- status = wuffs_base__make_status(NULL); +- goto ok; + + ok: +- self->private_impl.p_do_tell_me_more[0] = 0; ++ self->private_impl.p_decode_huffman_tree = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_tell_me_more[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_tell_me_more[0].v_zlib_status = v_zlib_status; ++ self->private_impl.p_decode_huffman_tree = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (a_dst && a_dst->data.ptr) { +- a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); +- } + if (a_src && a_src->data.ptr) { + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +@@ -58593,563 +72047,1574 @@ wuffs_png__decoder__do_tell_me_more( + return status; + } + +-// -------- func png.decoder.history_retain_length ++// -------- func webp.decoder.decode_huffman_tree_simple + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_png__decoder__history_retain_length( +- const wuffs_png__decoder* self) { +- if (!self) { +- return 0; ++static wuffs_base__status ++wuffs_webp__decoder__decode_huffman_tree_simple( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_hg, ++ uint32_t a_ht) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_use_second_symbol = 0; ++ uint32_t v_first_symbol_n_bits = 0; ++ uint32_t v_symbol0 = 0; ++ uint32_t v_symbol1 = 0; ++ uint32_t v_base_offset = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_huffman_tree_simple; ++ if (coro_susp_point) { ++ v_use_second_symbol = self->private_data.s_decode_huffman_tree_simple.v_use_second_symbol; ++ v_first_symbol_n_bits = self->private_data.s_decode_huffman_tree_simple.v_first_symbol_n_bits; ++ v_symbol0 = self->private_data.s_decode_huffman_tree_simple.v_symbol0; ++ v_base_offset = self->private_data.s_decode_huffman_tree_simple.v_base_offset; + } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- return 0u; ++ if (self->private_impl.f_n_bits < 2u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (self->private_impl.f_n_bits >= 2u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_use_second_symbol = (self->private_impl.f_bits & 1u); ++ v_first_symbol_n_bits = ((((self->private_impl.f_bits & 2u) >> 1u) * 7u) + 1u); ++ self->private_impl.f_bits >>= 2u; ++ self->private_impl.f_n_bits -= 2u; ++ if (self->private_impl.f_n_bits < v_first_symbol_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= v_first_symbol_n_bits) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_symbol0 = (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_first_symbol_n_bits) - 1u)); ++ self->private_impl.f_bits >>= v_first_symbol_n_bits; ++ self->private_impl.f_n_bits -= v_first_symbol_n_bits; ++ v_base_offset = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[a_ht])); ++ if (v_use_second_symbol != 0u) { ++ if (self->private_impl.f_n_bits < 8u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (self->private_impl.f_n_bits >= 8u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_symbol1 = (self->private_impl.f_bits & 255u); ++ self->private_impl.f_bits >>= 8u; ++ self->private_impl.f_n_bits -= 8u; ++ self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 0u)] = ((uint16_t)((v_base_offset + 1u))); ++ self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 1u)] = ((uint16_t)((v_symbol0 | 32768u))); ++ self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 2u)] = ((uint16_t)((v_symbol1 | 32768u))); ++ } else { ++ self->private_data.f_huffman_nodes[a_hg][v_base_offset] = ((uint16_t)((v_symbol0 | 32768u))); ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_huffman_tree_simple = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_huffman_tree_simple = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_huffman_tree_simple.v_use_second_symbol = v_use_second_symbol; ++ self->private_data.s_decode_huffman_tree_simple.v_first_symbol_n_bits = v_first_symbol_n_bits; ++ self->private_data.s_decode_huffman_tree_simple.v_symbol0 = v_symbol0; ++ self->private_data.s_decode_huffman_tree_simple.v_base_offset = v_base_offset; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; + } + +-// -------- func png.decoder.workbuf_len ++// -------- func webp.decoder.decode_code_length_code_lengths + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_png__decoder__workbuf_len( +- const wuffs_png__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++static wuffs_base__status ++wuffs_webp__decoder__decode_code_length_code_lengths( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_n_codes = 0; ++ uint32_t v_i = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_code_length_code_lengths; ++ if (coro_susp_point) { ++ v_n_codes = self->private_data.s_decode_code_length_code_lengths.v_n_codes; ++ v_i = self->private_data.s_decode_code_length_code_lengths.v_i; + } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_overall_workbuf_length, self->private_impl.f_overall_workbuf_length); ++ if (self->private_impl.f_n_bits < 4u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (self->private_impl.f_n_bits >= 4u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_n_codes = ((self->private_impl.f_bits & 15u) + 4u); ++ self->private_impl.f_bits >>= 4u; ++ self->private_impl.f_n_bits -= 4u; ++ v_i = 0u; ++ while (v_i < v_n_codes) { ++ if (self->private_impl.f_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= 3u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ self->private_impl.f_code_length_code_lengths[WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[v_i]] = ((uint8_t)((self->private_impl.f_bits & 7u))); ++ self->private_impl.f_bits >>= 3u; ++ self->private_impl.f_n_bits -= 3u; ++ v_i += 1u; ++ } ++ while (v_i < 19u) { ++ self->private_impl.f_code_length_code_lengths[WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[v_i]] = 0u; ++ v_i += 1u; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_code_length_code_lengths = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_code_length_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_code_length_code_lengths.v_n_codes = v_n_codes; ++ self->private_data.s_decode_code_length_code_lengths.v_i = v_i; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; + } + +-// -------- func png.decoder.filter_and_swizzle ++// -------- func webp.decoder.build_code_lengths_huffman_nodes + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf) { +- return (*self->private_impl.choosy_filter_and_swizzle)(self, a_dst, a_workbuf); ++wuffs_webp__decoder__build_code_lengths_huffman_nodes( ++ wuffs_webp__decoder* self) { ++ uint32_t v_code_bits = 0; ++ uint32_t v_code_len = 0; ++ uint32_t v_symbol = 0; ++ uint32_t v_histogram[8] = {0}; ++ uint32_t v_n_used_symbols = 0; ++ uint32_t v_last_used_symbol = 0; ++ uint32_t v_subscription_weight = 0; ++ uint32_t v_subscription_total = 0; ++ uint32_t v_curr_code = 0; ++ uint32_t v_next_codes[9] = {0}; ++ uint32_t v_n_branches = 0; ++ uint32_t v_h = 0; ++ uint32_t v_children = 0; ++ uint16_t v_node = 0; ++ ++ v_symbol = 0u; ++ while (v_symbol < 19u) { ++ v_code_len = ((uint32_t)(self->private_impl.f_code_length_code_lengths[v_symbol])); ++ if (v_code_len != 0u) { ++ v_histogram[v_code_len] += 1u; ++ v_n_used_symbols += 1u; ++ v_last_used_symbol = v_symbol; ++ } ++ v_symbol += 1u; ++ } ++ if (v_n_used_symbols < 1u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code); ++ } else if (v_n_used_symbols == 1u) { ++ self->private_data.f_code_lengths_huffman_nodes[0u] = ((uint16_t)((v_last_used_symbol | 32768u))); ++ return wuffs_base__make_status(NULL); ++ } ++ v_subscription_weight = 16384u; ++ v_code_len = 1u; ++ while (true) { ++ v_curr_code = ((uint32_t)(((uint32_t)(v_curr_code + v_histogram[v_code_len])) << 1u)); ++ v_next_codes[(v_code_len + 1u)] = v_curr_code; ++ v_subscription_total += ((uint32_t)(v_subscription_weight * v_histogram[v_code_len])); ++ v_subscription_weight >>= 1u; ++ if (v_code_len >= 7u) { ++ break; ++ } ++ v_code_len += 1u; ++ } ++ if (v_subscription_total > 32768u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_over_subscribed); ++ } else if (v_subscription_total < 32768u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_under_subscribed); ++ } ++ self->private_data.f_code_lengths_huffman_nodes[0u] = 0u; ++ v_symbol = 0u; ++ while (v_symbol < 19u) { ++ v_code_len = ((uint32_t)(self->private_impl.f_code_length_code_lengths[v_symbol])); ++ if (v_code_len > 0u) { ++ v_code_bits = v_next_codes[v_code_len]; ++ v_next_codes[v_code_len] += 1u; ++ v_code_bits <<= (32u - v_code_len); ++ v_h = 0u; ++ while (v_code_len > 0u) { ++ v_node = self->private_data.f_code_lengths_huffman_nodes[v_h]; ++ if (v_node == 0u) { ++ v_children = ((uint32_t)(1u + ((uint32_t)(2u * v_n_branches)))); ++ v_children = wuffs_base__u32__min(v_children, 35u); ++ self->private_data.f_code_lengths_huffman_nodes[v_h] = ((uint16_t)(v_children)); ++ self->private_data.f_code_lengths_huffman_nodes[(v_children + 0u)] = 0u; ++ self->private_data.f_code_lengths_huffman_nodes[(v_children + 1u)] = 0u; ++ v_h = (v_children + (v_code_bits >> 31u)); ++ v_n_branches += 1u; ++ } else { ++ v_children = ((uint32_t)(v_node)); ++ v_h = (wuffs_base__u32__min(v_children, 35u) + (v_code_bits >> 31u)); ++ } ++ v_code_bits <<= 1u; ++ v_code_len -= 1u; ++ } ++ self->private_data.f_code_lengths_huffman_nodes[v_h] = ((uint16_t)((v_symbol | 32768u))); ++ } ++ v_symbol += 1u; ++ } ++ return wuffs_base__make_status(NULL); + } + ++// -------- func webp.decoder.build_huffman_nodes ++ + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle__choosy_default( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint64_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row0 = 0; +- uint64_t v_dst_bytes_per_row1 = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- uint32_t v_y = 0; +- wuffs_base__slice_u8 v_dst = {0}; +- uint8_t v_filter = 0; +- wuffs_base__slice_u8 v_curr_row = {0}; +- wuffs_base__slice_u8 v_prev_row = {0}; +- +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++wuffs_webp__decoder__build_huffman_nodes( ++ wuffs_webp__decoder* self, ++ uint32_t a_hg, ++ uint32_t a_ht) { ++ uint32_t v_base_offset = 0; ++ uint32_t v_code_bits = 0; ++ uint32_t v_code_len = 0; ++ uint32_t v_symbol = 0; ++ uint32_t v_histogram[16] = {0}; ++ uint32_t v_n_used_symbols = 0; ++ uint32_t v_last_used_symbol = 0; ++ uint32_t v_subscription_weight = 0; ++ uint32_t v_subscription_total = 0; ++ uint32_t v_curr_code = 0; ++ uint32_t v_next_codes[17] = {0}; ++ uint32_t v_n_branches = 0; ++ uint32_t v_h = 0; ++ uint32_t v_children = 0; ++ uint16_t v_node = 0; ++ ++ v_base_offset = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[a_ht])); ++ v_symbol = 0u; ++ while (v_symbol < self->private_impl.f_ht_n_symbols) { ++ v_code_len = ((uint32_t)(((uint16_t)(self->private_data.f_code_lengths[v_symbol] & 15u)))); ++ if (v_code_len != 0u) { ++ v_histogram[v_code_len] += 1u; ++ v_n_used_symbols += 1u; ++ v_last_used_symbol = v_symbol; ++ } ++ v_symbol += 1u; ++ } ++ if (v_n_used_symbols < 1u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code); ++ } else if (v_n_used_symbols == 1u) { ++ self->private_data.f_huffman_nodes[a_hg][v_base_offset] = ((uint16_t)((v_last_used_symbol | 32768u))); ++ return wuffs_base__make_status(NULL); + } +- v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); +- v_dst_bytes_per_row0 = (((uint64_t)(self->private_impl.f_frame_rect_x0)) * v_dst_bytes_per_pixel); +- v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- if (v_dst_bytes_per_row1 < ((uint64_t)(v_tab.width))) { +- v_tab = wuffs_base__table_u8__subtable_ij(v_tab, +- 0u, +- 0u, +- v_dst_bytes_per_row1, +- ((uint64_t)(v_tab.height))); ++ v_subscription_weight = 16384u; ++ v_code_len = 1u; ++ while (true) { ++ v_curr_code = ((uint32_t)(((uint32_t)(v_curr_code + v_histogram[v_code_len])) << 1u)); ++ v_next_codes[(v_code_len + 1u)] = v_curr_code; ++ v_subscription_total += ((uint32_t)(v_subscription_weight * v_histogram[v_code_len])); ++ v_subscription_weight >>= 1u; ++ if (v_code_len >= 15u) { ++ break; ++ } ++ v_code_len += 1u; ++ } ++ if (v_subscription_total > 32768u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_over_subscribed); ++ } else if (v_subscription_total < 32768u) { ++ return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_under_subscribed); ++ } ++ self->private_data.f_huffman_nodes[a_hg][v_base_offset] = 0u; ++ v_symbol = 0u; ++ while (v_symbol < self->private_impl.f_ht_n_symbols) { ++ v_code_len = ((uint32_t)(((uint16_t)(self->private_data.f_code_lengths[v_symbol] & 15u)))); ++ if (v_code_len != 0u) { ++ v_code_bits = v_next_codes[v_code_len]; ++ v_next_codes[v_code_len] += 1u; ++ v_code_bits <<= (32u - v_code_len); ++ v_h = v_base_offset; ++ while (v_code_len > 0u) { ++ v_node = self->private_data.f_huffman_nodes[a_hg][v_h]; ++ if (v_node == 0u) { ++ v_children = ((uint32_t)(v_base_offset + ((uint32_t)(1u + ((uint32_t)(2u * v_n_branches)))))); ++ v_children = wuffs_base__u32__min(v_children, 6265u); ++ self->private_data.f_huffman_nodes[a_hg][v_h] = ((uint16_t)(v_children)); ++ self->private_data.f_huffman_nodes[a_hg][(v_children + 0u)] = 0u; ++ self->private_data.f_huffman_nodes[a_hg][(v_children + 1u)] = 0u; ++ v_h = (v_children + (v_code_bits >> 31u)); ++ v_n_branches += 1u; ++ } else { ++ v_children = ((uint32_t)(v_node)); ++ v_h = (wuffs_base__u32__min(v_children, 6265u) + (v_code_bits >> 31u)); ++ } ++ v_code_bits <<= 1u; ++ v_code_len -= 1u; ++ } ++ self->private_data.f_huffman_nodes[a_hg][v_h] = ((uint16_t)((v_symbol | 32768u))); ++ } ++ v_symbol += 1u; + } +- if (v_dst_bytes_per_row0 < ((uint64_t)(v_tab.width))) { +- v_tab = wuffs_base__table_u8__subtable_ij(v_tab, +- v_dst_bytes_per_row0, +- 0u, +- ((uint64_t)(v_tab.width)), +- ((uint64_t)(v_tab.height))); +- } else { +- v_tab = wuffs_base__table_u8__subtable_ij(v_tab, +- 0u, +- 0u, +- 0u, +- 0u); ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func webp.decoder.build_code_lengths ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__build_code_lengths( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_use_length = 0; ++ uint32_t v_length_n_bits = 0; ++ uint32_t v_length = 0; ++ uint16_t v_prev_code_length = 0; ++ uint32_t v_h = 0; ++ uint32_t v_s = 0; ++ uint32_t v_s_max = 0; ++ uint16_t v_node = 0; ++ uint32_t v_symbol = 0; ++ uint16_t v_repeat_value = 0; ++ uint32_t v_repeat_n_bits = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- v_y = self->private_impl.f_frame_rect_y0; +- while (v_y < self->private_impl.f_frame_rect_y1) { +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_y); +- if (1u > ((uint64_t)(a_workbuf.len))) { +- return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); ++ ++ uint32_t coro_susp_point = self->private_impl.p_build_code_lengths; ++ if (coro_susp_point) { ++ v_length_n_bits = self->private_data.s_build_code_lengths.v_length_n_bits; ++ v_prev_code_length = self->private_data.s_build_code_lengths.v_prev_code_length; ++ v_s = self->private_data.s_build_code_lengths.v_s; ++ v_s_max = self->private_data.s_build_code_lengths.v_s_max; ++ v_node = self->private_data.s_build_code_lengths.v_node; ++ v_repeat_value = self->private_data.s_build_code_lengths.v_repeat_value; ++ v_repeat_n_bits = self->private_data.s_build_code_lengths.v_repeat_n_bits; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; + } +- v_filter = a_workbuf.ptr[0u]; +- a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u); +- if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) { +- return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); ++ v_use_length = (self->private_impl.f_bits & 1u); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ self->private_impl.f_ht_code_lengths_remaining = self->private_impl.f_ht_n_symbols; ++ if (v_use_length != 0u) { ++ if (self->private_impl.f_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= 3u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_length_n_bits = (((self->private_impl.f_bits & 7u) * 2u) + 2u); ++ self->private_impl.f_bits >>= 3u; ++ self->private_impl.f_n_bits -= 3u; ++ while (self->private_impl.f_n_bits < v_length_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (self->private_impl.f_n_bits >= v_length_n_bits) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_length = ((self->private_impl.f_bits & ((((uint32_t)(1u)) << v_length_n_bits) - 1u)) + 2u); ++ self->private_impl.f_bits >>= v_length_n_bits; ++ self->private_impl.f_n_bits -= v_length_n_bits; ++ if (v_length > self->private_impl.f_ht_n_symbols) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_huffman_code); ++ goto exit; ++ } ++ self->private_impl.f_ht_code_lengths_remaining = v_length; + } +- v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row); +- a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row); +- if (v_filter == 0u) { +- } else if (v_filter == 1u) { +- wuffs_png__decoder__filter_1(self, v_curr_row); +- } else if (v_filter == 2u) { +- wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row); +- } else if (v_filter == 3u) { +- wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row); +- } else if (v_filter == 4u) { +- wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row); +- } else { +- return wuffs_base__make_status(wuffs_png__error__bad_filter); ++ v_prev_code_length = 8u; ++ while (v_s < self->private_impl.f_ht_n_symbols) { ++ if (self->private_impl.f_ht_code_lengths_remaining <= 0u) { ++ while (v_s < self->private_impl.f_ht_n_symbols) { ++ self->private_data.f_code_lengths[v_s] = 0u; ++ v_s += 1u; ++ } ++ break; ++ } ++ self->private_impl.f_ht_code_lengths_remaining -= 1u; ++ v_h = 0u; ++ while (true) { ++ v_node = self->private_data.f_code_lengths_huffman_nodes[v_h]; ++ if (v_node >= 32768u) { ++ break; ++ } else if (v_node > 35u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_huffman_code); ++ goto exit; ++ } ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_h = (((uint32_t)(v_node)) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ } ++ v_symbol = ((uint32_t)(((uint16_t)(v_node & 32767u)))); ++ if (v_symbol == 0u) { ++ self->private_data.f_code_lengths[v_s] = 0u; ++ v_s += 1u; ++ continue; ++ } else if (v_symbol < 16u) { ++ v_prev_code_length = ((uint16_t)(v_symbol)); ++ self->private_data.f_code_lengths[v_s] = v_prev_code_length; ++ v_s += 1u; ++ continue; ++ } else if (v_symbol == 16u) { ++ v_repeat_value = v_prev_code_length; ++ } else { ++ v_repeat_value = 0u; ++ } ++ v_repeat_n_bits = ((uint32_t)(WUFFS_WEBP__REPEAT_N_BITS[(v_symbol & 3u)])); ++ v_s_max = ((uint32_t)(((uint32_t)(WUFFS_WEBP__REPEAT_COUNTS[(v_symbol & 3u)])) + v_s)); ++ if (self->private_impl.f_n_bits < v_repeat_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if (self->private_impl.f_n_bits >= v_repeat_n_bits) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_s_max += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_repeat_n_bits) - 1u)); ++ self->private_impl.f_bits >>= v_repeat_n_bits; ++ self->private_impl.f_n_bits -= v_repeat_n_bits; ++ if (v_s_max > self->private_impl.f_ht_n_symbols) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_huffman_code); ++ goto exit; ++ } ++ while (v_s < v_s_max) { ++ self->private_data.f_code_lengths[v_s] = v_repeat_value; ++ v_s += 1u; ++ } + } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, v_curr_row); +- v_prev_row = v_curr_row; +- v_y += 1u; ++ ++ goto ok; ++ ok: ++ self->private_impl.p_build_code_lengths = 0; ++ goto exit; + } +- return wuffs_base__make_status(NULL); ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_build_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_build_code_lengths.v_length_n_bits = v_length_n_bits; ++ self->private_data.s_build_code_lengths.v_prev_code_length = v_prev_code_length; ++ self->private_data.s_build_code_lengths.v_s = v_s; ++ self->private_data.s_build_code_lengths.v_s_max = v_s_max; ++ self->private_data.s_build_code_lengths.v_node = v_node; ++ self->private_data.s_build_code_lengths.v_repeat_value = v_repeat_value; ++ self->private_data.s_build_code_lengths.v_repeat_n_bits = v_repeat_n_bits; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; + } + +-// -------- func png.decoder.filter_and_swizzle_tricky ++// -------- func webp.decoder.decode_pixels_slow + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_png__decoder__filter_and_swizzle_tricky( +- wuffs_png__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__slice_u8 a_workbuf) { +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint64_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_bytes_per_row1 = 0; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__table_u8 v_tab = {0}; +- uint64_t v_src_bytes_per_pixel = 0; ++wuffs_webp__decoder__decode_pixels_slow( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_dst, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_width, ++ uint32_t a_height, ++ wuffs_base__slice_u8 a_tile_data, ++ uint32_t a_tile_size_log2) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint64_t v_p = 0; ++ uint64_t v_p_max = 0; ++ uint32_t v_tile_size_log2 = 0; ++ uint32_t v_width_in_tiles = 0; + uint32_t v_x = 0; + uint32_t v_y = 0; +- uint64_t v_i = 0; +- wuffs_base__slice_u8 v_dst = {0}; +- uint8_t v_filter = 0; +- wuffs_base__slice_u8 v_s = {0}; +- wuffs_base__slice_u8 v_curr_row = {0}; +- wuffs_base__slice_u8 v_prev_row = {0}; +- uint8_t v_bits_unpacked[8] = {0}; +- uint8_t v_bits_packed = 0; +- uint8_t v_packs_remaining = 0; +- uint8_t v_multiplier = 0; +- uint8_t v_shift = 0; ++ uint32_t v_i = 0; ++ uint32_t v_hg = 0; ++ uint32_t v_h = 0; ++ uint16_t v_node = 0; ++ uint32_t v_pixel_g = 0; ++ uint32_t v_color = 0; ++ wuffs_base__slice_u8 v_dst_pixel = {0}; ++ uint32_t v_back_ref_len_n_bits = 0; ++ uint32_t v_back_ref_len_minus_1 = 0; ++ uint32_t v_back_ref_dist_n_bits = 0; ++ uint32_t v_back_ref_dist_sym = 0; ++ uint32_t v_back_ref_dist_premap_minus_1 = 0; ++ uint32_t v_back_ref_dist_minus_1 = 0; ++ uint32_t v_dm = 0; ++ uint32_t v_dx = 0; ++ uint32_t v_dy = 0; ++ uint64_t v_p_end = 0; ++ uint64_t v_dist4 = 0; ++ uint64_t v_q = 0; ++ wuffs_base__slice_u8 v_color_cache_pixels = {0}; ++ uint64_t v_color_cache_p = 0; ++ uint32_t v_color_cache_shift = 0; + +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +- } +- v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); +- v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- v_src_bytes_per_pixel = 1u; +- if (self->private_impl.f_depth >= 8u) { +- v_src_bytes_per_pixel = (((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type])) * ((uint64_t)((self->private_impl.f_depth >> 3u)))); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (self->private_impl.f_chunk_type_array[0u] == 73u) { +- v_y = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][5u])); +- } else { +- v_y = self->private_impl.f_frame_rect_y0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_pixels_slow; ++ if (coro_susp_point) { ++ v_p = self->private_data.s_decode_pixels_slow.v_p; ++ v_p_max = self->private_data.s_decode_pixels_slow.v_p_max; ++ v_tile_size_log2 = self->private_data.s_decode_pixels_slow.v_tile_size_log2; ++ v_width_in_tiles = self->private_data.s_decode_pixels_slow.v_width_in_tiles; ++ v_x = self->private_data.s_decode_pixels_slow.v_x; ++ v_y = self->private_data.s_decode_pixels_slow.v_y; ++ v_hg = self->private_data.s_decode_pixels_slow.v_hg; ++ v_node = self->private_data.s_decode_pixels_slow.v_node; ++ v_color = self->private_data.s_decode_pixels_slow.v_color; ++ v_back_ref_len_n_bits = self->private_data.s_decode_pixels_slow.v_back_ref_len_n_bits; ++ v_back_ref_len_minus_1 = self->private_data.s_decode_pixels_slow.v_back_ref_len_minus_1; ++ v_back_ref_dist_n_bits = self->private_data.s_decode_pixels_slow.v_back_ref_dist_n_bits; ++ v_back_ref_dist_premap_minus_1 = self->private_data.s_decode_pixels_slow.v_back_ref_dist_premap_minus_1; ++ v_color_cache_p = self->private_data.s_decode_pixels_slow.v_color_cache_p; + } +- while (v_y < self->private_impl.f_frame_rect_y1) { +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_y); +- if (v_dst_bytes_per_row1 < ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row1); +- } +- if (1u > ((uint64_t)(a_workbuf.len))) { +- return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); +- } +- v_filter = a_workbuf.ptr[0u]; +- a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u); +- if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) { +- return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length); +- } +- v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row); +- a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row); +- if (v_filter == 0u) { +- } else if (v_filter == 1u) { +- wuffs_png__decoder__filter_1(self, v_curr_row); +- } else if (v_filter == 2u) { +- wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row); +- } else if (v_filter == 3u) { +- wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row); +- } else if (v_filter == 4u) { +- wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row); +- } else { +- return wuffs_base__make_status(wuffs_png__error__bad_filter); ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ v_p_max = ((uint64_t)((4u * a_width * a_height))); ++ if (((uint64_t)(a_dst.len)) < v_p_max) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer); ++ goto exit; + } +- v_s = v_curr_row; +- if (self->private_impl.f_chunk_type_array[0u] == 73u) { +- v_x = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][2u])); ++ if (a_tile_size_log2 != 0u) { ++ v_tile_size_log2 = a_tile_size_log2; ++ v_width_in_tiles = ((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2); + } else { +- v_x = self->private_impl.f_frame_rect_x0; ++ v_tile_size_log2 = 31u; ++ v_width_in_tiles = 1u; + } +- if (self->private_impl.f_depth == 8u) { +- while (v_x < self->private_impl.f_frame_rect_x1) { +- v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); +- if (v_i <= ((uint64_t)(v_dst.len))) { +- if (self->private_impl.f_color_type == 4u) { +- if (2u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[0u]; +- v_bits_unpacked[1u] = v_s.ptr[0u]; +- v_bits_unpacked[2u] = v_s.ptr[0u]; +- v_bits_unpacked[3u] = v_s.ptr[1u]; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); +- } +- } else if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) { +- if (self->private_impl.f_color_type == 0u) { +- if (1u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[0u]; +- v_bits_unpacked[1u] = v_s.ptr[0u]; +- v_bits_unpacked[2u] = v_s.ptr[0u]; +- v_bits_unpacked[3u] = 255u; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); +- if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | +- (((uint32_t)(v_bits_unpacked[1u])) << 8u) | +- (((uint32_t)(v_bits_unpacked[2u])) << 16u) | +- (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { +- v_bits_unpacked[0u] = 0u; +- v_bits_unpacked[1u] = 0u; +- v_bits_unpacked[2u] = 0u; +- v_bits_unpacked[3u] = 0u; +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); ++ while (v_p < v_p_max) { ++ v_i = ((uint32_t)(((uint32_t)(((uint32_t)(((uint32_t)((v_y >> v_tile_size_log2) * v_width_in_tiles)) + (v_x >> v_tile_size_log2))) * 4u)) + 1u)); ++ if (((uint64_t)(v_i)) < ((uint64_t)(a_tile_data.len))) { ++ v_hg = ((uint32_t)(a_tile_data.ptr[((uint64_t)(v_i))])); ++ } ++ v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[0u])); ++ while (true) { ++ v_node = self->private_data.f_huffman_nodes[v_hg][v_h]; ++ if (v_node >= 32768u) { ++ break; ++ } else if (v_node > 6265u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_huffman_code); ++ goto exit; ++ } ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_h = (((uint32_t)(v_node)) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ } ++ v_pixel_g = ((uint32_t)(((uint16_t)(v_node & 32767u)))); ++ if (v_pixel_g < 256u) { ++ v_color = (v_pixel_g << 8u); ++ v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[1u])); ++ while (true) { ++ v_node = self->private_data.f_huffman_nodes[v_hg][v_h]; ++ if (v_node >= 32768u) { ++ break; ++ } ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } +- } else { +- if (3u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[2u]; +- v_bits_unpacked[1u] = v_s.ptr[1u]; +- v_bits_unpacked[2u] = v_s.ptr[0u]; +- v_bits_unpacked[3u] = 255u; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 3u); +- if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | +- (((uint32_t)(v_bits_unpacked[1u])) << 8u) | +- (((uint32_t)(v_bits_unpacked[2u])) << 16u) | +- (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { +- v_bits_unpacked[0u] = 0u; +- v_bits_unpacked[1u] = 0u; +- v_bits_unpacked[2u] = 0u; +- v_bits_unpacked[3u] = 0u; +- } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ } ++ v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 16u); ++ v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[2u])); ++ while (true) { ++ v_node = self->private_data.f_huffman_nodes[v_hg][v_h]; ++ if (v_node >= 32768u) { ++ break; ++ } ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; + } +- } else if (v_src_bytes_per_pixel <= ((uint64_t)(v_s.len))) { +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__slice_u8__subslice_j(v_s, v_src_bytes_per_pixel)); +- v_s = wuffs_base__slice_u8__subslice_i(v_s, v_src_bytes_per_pixel); ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; + } ++ v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; + } +- v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); +- } +- } else if (self->private_impl.f_depth < 8u) { +- v_multiplier = 1u; +- if (self->private_impl.f_color_type == 0u) { +- v_multiplier = WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[self->private_impl.f_depth]; +- } +- v_shift = ((8u - self->private_impl.f_depth) & 7u); +- v_packs_remaining = 0u; +- while (v_x < self->private_impl.f_frame_rect_x1) { +- v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); +- if (v_i <= ((uint64_t)(v_dst.len))) { +- if ((v_packs_remaining == 0u) && (1u <= ((uint64_t)(v_s.len)))) { +- v_packs_remaining = WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[self->private_impl.f_depth]; +- v_bits_packed = v_s.ptr[0u]; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 0u); ++ v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[3u])); ++ while (true) { ++ v_node = self->private_data.f_huffman_nodes[v_hg][v_h]; ++ if (v_node >= 32768u) { ++ break; + } +- v_bits_unpacked[0u] = ((uint8_t)((v_bits_packed >> v_shift) * v_multiplier)); +- v_bits_packed = ((uint8_t)(v_bits_packed << self->private_impl.f_depth)); +- v_packs_remaining = ((uint8_t)(v_packs_remaining - 1u)); +- if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) { +- v_bits_unpacked[1u] = v_bits_unpacked[0u]; +- v_bits_unpacked[2u] = v_bits_unpacked[0u]; +- v_bits_unpacked[3u] = 255u; +- if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) | +- (((uint32_t)(v_bits_unpacked[1u])) << 8u) | +- (((uint32_t)(v_bits_unpacked[2u])) << 16u) | +- (((uint32_t)(v_bits_unpacked[3u])) << 24u))) { +- v_bits_unpacked[0u] = 0u; +- v_bits_unpacked[1u] = 0u; +- v_bits_unpacked[2u] = 0u; +- v_bits_unpacked[3u] = 0u; ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; + } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4)); +- } else { +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 1)); ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; + } ++ v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; + } +- v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); +- } +- } else { +- while (v_x < self->private_impl.f_frame_rect_x1) { +- v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel); +- if (v_i <= ((uint64_t)(v_dst.len))) { +- if (self->private_impl.f_color_type == 0u) { +- if (2u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[1u]; +- v_bits_unpacked[1u] = v_s.ptr[0u]; +- v_bits_unpacked[2u] = v_s.ptr[1u]; +- v_bits_unpacked[3u] = v_s.ptr[0u]; +- v_bits_unpacked[4u] = v_s.ptr[1u]; +- v_bits_unpacked[5u] = v_s.ptr[0u]; +- v_bits_unpacked[6u] = 255u; +- v_bits_unpacked[7u] = 255u; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); +- if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) | +- (((uint64_t)(v_bits_unpacked[1u])) << 8u) | +- (((uint64_t)(v_bits_unpacked[2u])) << 16u) | +- (((uint64_t)(v_bits_unpacked[3u])) << 24u) | +- (((uint64_t)(v_bits_unpacked[4u])) << 32u) | +- (((uint64_t)(v_bits_unpacked[5u])) << 40u) | +- (((uint64_t)(v_bits_unpacked[6u])) << 48u) | +- (((uint64_t)(v_bits_unpacked[7u])) << 56u))) { +- v_bits_unpacked[0u] = 0u; +- v_bits_unpacked[1u] = 0u; +- v_bits_unpacked[2u] = 0u; +- v_bits_unpacked[3u] = 0u; +- v_bits_unpacked[4u] = 0u; +- v_bits_unpacked[5u] = 0u; +- v_bits_unpacked[6u] = 0u; +- v_bits_unpacked[7u] = 0u; ++ v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 24u); ++ } else if (v_pixel_g < 280u) { ++ if (v_pixel_g < 260u) { ++ v_back_ref_len_minus_1 = (v_pixel_g - 256u); ++ } else { ++ v_back_ref_len_n_bits = ((v_pixel_g - 258u) >> 1u); ++ v_back_ref_len_minus_1 = ((((uint32_t)(2u)) + (v_pixel_g & 1u)) << v_back_ref_len_n_bits); ++ while (self->private_impl.f_n_bits < v_back_ref_len_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; + } +- } else if (self->private_impl.f_color_type == 2u) { +- if (6u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[5u]; +- v_bits_unpacked[1u] = v_s.ptr[4u]; +- v_bits_unpacked[2u] = v_s.ptr[3u]; +- v_bits_unpacked[3u] = v_s.ptr[2u]; +- v_bits_unpacked[4u] = v_s.ptr[1u]; +- v_bits_unpacked[5u] = v_s.ptr[0u]; +- v_bits_unpacked[6u] = 255u; +- v_bits_unpacked[7u] = 255u; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 6u); +- if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) | +- (((uint64_t)(v_bits_unpacked[1u])) << 8u) | +- (((uint64_t)(v_bits_unpacked[2u])) << 16u) | +- (((uint64_t)(v_bits_unpacked[3u])) << 24u) | +- (((uint64_t)(v_bits_unpacked[4u])) << 32u) | +- (((uint64_t)(v_bits_unpacked[5u])) << 40u) | +- (((uint64_t)(v_bits_unpacked[6u])) << 48u) | +- (((uint64_t)(v_bits_unpacked[7u])) << 56u))) { +- v_bits_unpacked[0u] = 0u; +- v_bits_unpacked[1u] = 0u; +- v_bits_unpacked[2u] = 0u; +- v_bits_unpacked[3u] = 0u; +- v_bits_unpacked[4u] = 0u; +- v_bits_unpacked[5u] = 0u; +- v_bits_unpacked[6u] = 0u; +- v_bits_unpacked[7u] = 0u; ++ if (self->private_impl.f_n_bits >= v_back_ref_len_n_bits) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_back_ref_len_minus_1 += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_back_ref_len_n_bits) - 1u)); ++ self->private_impl.f_bits >>= v_back_ref_len_n_bits; ++ self->private_impl.f_n_bits -= v_back_ref_len_n_bits; ++ } ++ v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[4u])); ++ while (true) { ++ v_node = self->private_data.f_huffman_nodes[v_hg][v_h]; ++ if (v_node >= 32768u) { ++ break; ++ } ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; + } +- } else if (self->private_impl.f_color_type == 4u) { +- if (4u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[1u]; +- v_bits_unpacked[1u] = v_s.ptr[0u]; +- v_bits_unpacked[2u] = v_s.ptr[1u]; +- v_bits_unpacked[3u] = v_s.ptr[0u]; +- v_bits_unpacked[4u] = v_s.ptr[1u]; +- v_bits_unpacked[5u] = v_s.ptr[0u]; +- v_bits_unpacked[6u] = v_s.ptr[3u]; +- v_bits_unpacked[7u] = v_s.ptr[2u]; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u)); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ } ++ v_back_ref_dist_sym = ((uint32_t)(((uint16_t)(v_node & 32767u)))); ++ if (v_back_ref_dist_sym < 4u) { ++ v_back_ref_dist_premap_minus_1 = v_back_ref_dist_sym; ++ } else if (v_back_ref_dist_sym < 40u) { ++ v_back_ref_dist_n_bits = ((v_back_ref_dist_sym - 2u) >> 1u); ++ v_back_ref_dist_premap_minus_1 = ((((uint32_t)(2u)) + (v_back_ref_dist_sym & 1u)) << v_back_ref_dist_n_bits); ++ while (self->private_impl.f_n_bits < v_back_ref_dist_n_bits) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; + } +- } else { +- if (8u <= ((uint64_t)(v_s.len))) { +- v_bits_unpacked[0u] = v_s.ptr[5u]; +- v_bits_unpacked[1u] = v_s.ptr[4u]; +- v_bits_unpacked[2u] = v_s.ptr[3u]; +- v_bits_unpacked[3u] = v_s.ptr[2u]; +- v_bits_unpacked[4u] = v_s.ptr[1u]; +- v_bits_unpacked[5u] = v_s.ptr[0u]; +- v_bits_unpacked[6u] = v_s.ptr[7u]; +- v_bits_unpacked[7u] = v_s.ptr[6u]; +- v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u); ++ if (self->private_impl.f_n_bits >= v_back_ref_dist_n_bits) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; + } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; + } +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 8)); ++ v_back_ref_dist_premap_minus_1 += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_back_ref_dist_n_bits) - 1u)); ++ self->private_impl.f_bits >>= v_back_ref_dist_n_bits; ++ self->private_impl.f_n_bits -= v_back_ref_dist_n_bits; + } +- v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]); ++ if (v_back_ref_dist_premap_minus_1 >= 120u) { ++ v_back_ref_dist_minus_1 = (v_back_ref_dist_premap_minus_1 - 120u); ++ } else { ++ v_dm = ((uint32_t)(WUFFS_WEBP__DISTANCE_MAP[v_back_ref_dist_premap_minus_1])); ++ v_dy = (v_dm >> 4u); ++ v_dx = ((uint32_t)(7u - (v_dm & 15u))); ++ v_back_ref_dist_minus_1 = ((uint32_t)((a_width * v_dy) + v_dx)); ++ } ++ v_p_end = (v_p + ((uint64_t)(((v_back_ref_len_minus_1 + 1u) * 4u)))); ++ v_dist4 = ((((uint64_t)(v_back_ref_dist_minus_1)) * 4u) + 4u); ++ if ((v_p_end > v_p_max) || (v_p_end > ((uint64_t)(a_dst.len))) || (v_p < v_dist4)) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_back_reference); ++ goto exit; ++ } ++ v_q = (v_p - v_dist4); ++ while ((v_q < v_p) && (v_p < v_p_end)) { ++ a_dst.ptr[v_p] = a_dst.ptr[v_q]; ++ v_p += 1u; ++ v_q += 1u; ++ } ++ v_x += (v_back_ref_len_minus_1 + 1u); ++ while (v_x >= a_width) { ++ v_x -= a_width; ++ v_y += 1u; ++ } ++ continue; ++ } else { ++ if ((v_color_cache_p > v_p) || (v_p > ((uint64_t)(a_dst.len)))) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer); ++ goto exit; ++ } ++ v_color_cache_pixels = wuffs_base__slice_u8__subslice_ij(a_dst, v_color_cache_p, v_p); ++ v_color_cache_p = v_p; ++ v_color_cache_shift = ((32u - self->private_impl.f_color_cache_bits) & 31u); ++ while (((uint64_t)(v_color_cache_pixels.len)) >= 4u) { ++ v_color = wuffs_base__peek_u32le__no_bounds_check(v_color_cache_pixels.ptr); ++ self->private_data.f_color_cache[((((uint32_t)(v_color * 506832829u)) >> v_color_cache_shift) & 2047u)] = v_color; ++ v_color_cache_pixels = wuffs_base__slice_u8__subslice_i(v_color_cache_pixels, 4u); ++ } ++ v_color = self->private_data.f_color_cache[((v_pixel_g - 280u) & 2047u)]; ++ } ++ if (v_p > ((uint64_t)(a_dst.len))) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer); ++ goto exit; ++ } ++ v_dst_pixel = wuffs_base__slice_u8__subslice_i(a_dst, v_p); ++ if (((uint64_t)(v_dst_pixel.len)) < 4u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer); ++ goto exit; ++ } ++ wuffs_base__poke_u32le__no_bounds_check(v_dst_pixel.ptr, v_color); ++ v_p += 4u; ++ v_x += 1u; ++ if (v_x == a_width) { ++ v_x = 0u; ++ v_y += 1u; + } + } +- v_prev_row = v_curr_row; +- v_y += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3u]); +- } +- return wuffs_base__make_status(NULL); +-} + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) ++ goto ok; ++ ok: ++ self->private_impl.p_decode_pixels_slow = 0; ++ goto exit; ++ } + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_pixels_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_pixels_slow.v_p = v_p; ++ self->private_data.s_decode_pixels_slow.v_p_max = v_p_max; ++ self->private_data.s_decode_pixels_slow.v_tile_size_log2 = v_tile_size_log2; ++ self->private_data.s_decode_pixels_slow.v_width_in_tiles = v_width_in_tiles; ++ self->private_data.s_decode_pixels_slow.v_x = v_x; ++ self->private_data.s_decode_pixels_slow.v_y = v_y; ++ self->private_data.s_decode_pixels_slow.v_hg = v_hg; ++ self->private_data.s_decode_pixels_slow.v_node = v_node; ++ self->private_data.s_decode_pixels_slow.v_color = v_color; ++ self->private_data.s_decode_pixels_slow.v_back_ref_len_n_bits = v_back_ref_len_n_bits; ++ self->private_data.s_decode_pixels_slow.v_back_ref_len_minus_1 = v_back_ref_len_minus_1; ++ self->private_data.s_decode_pixels_slow.v_back_ref_dist_n_bits = v_back_ref_dist_n_bits; ++ self->private_data.s_decode_pixels_slow.v_back_ref_dist_premap_minus_1 = v_back_ref_dist_premap_minus_1; ++ self->private_data.s_decode_pixels_slow.v_color_cache_p = v_color_cache_p; + +-// ---------------- Status Codes Implementations ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +-const char wuffs_tga__error__bad_header[] = "#tga: bad header"; +-const char wuffs_tga__error__bad_run_length_encoding[] = "#tga: bad run length encoding"; +-const char wuffs_tga__error__truncated_input[] = "#tga: truncated input"; +-const char wuffs_tga__error__unsupported_tga_file[] = "#tga: unsupported TGA file"; ++ return status; ++} + +-// ---------------- Private Consts ++// -------- func webp.decoder.apply_transform_predictor + +-// ---------------- Private Initializer Prototypes ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_predictor( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix, ++ wuffs_base__slice_u8 a_tile_data) { ++ uint64_t v_w4 = 0; ++ wuffs_base__slice_u8 v_prev_row = {0}; ++ wuffs_base__slice_u8 v_curr_row = {0}; ++ uint32_t v_tile_size_log2 = 0; ++ uint32_t v_tiles_per_row = 0; ++ uint32_t v_mask = 0; ++ uint32_t v_y = 0; ++ uint32_t v_x = 0; ++ uint64_t v_t = 0; ++ wuffs_base__slice_u8 v_tile_data = {0}; ++ uint8_t v_mode = 0; ++ uint32_t v_l0 = 0; ++ uint32_t v_l1 = 0; ++ uint32_t v_l2 = 0; ++ uint32_t v_l3 = 0; ++ uint32_t v_c0 = 0; ++ uint32_t v_c1 = 0; ++ uint32_t v_c2 = 0; ++ uint32_t v_c3 = 0; ++ uint32_t v_t0 = 0; ++ uint32_t v_t1 = 0; ++ uint32_t v_t2 = 0; ++ uint32_t v_t3 = 0; ++ uint32_t v_sum_l = 0; ++ uint32_t v_sum_t = 0; ++ ++ if ((self->private_impl.f_width <= 0u) || (self->private_impl.f_height <= 0u)) { ++ return wuffs_base__make_empty_struct(); ++ } ++ v_w4 = ((uint64_t)((self->private_impl.f_width * 4u))); ++ v_curr_row = wuffs_base__utility__empty_slice_u8(); ++ if (v_w4 <= ((uint64_t)(a_pix.len))) { ++ v_curr_row = wuffs_base__slice_u8__subslice_j(a_pix, v_w4); ++ } ++ if (((uint64_t)(v_curr_row.len)) >= 4u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[3u] += 255u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ while (((uint64_t)(v_curr_row.len)) >= 8u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += v_curr_row.ptr[0u]; ++ v_curr_row.ptr[5u] += v_curr_row.ptr[1u]; ++ v_curr_row.ptr[6u] += v_curr_row.ptr[2u]; ++ v_curr_row.ptr[7u] += v_curr_row.ptr[3u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_curr_row = wuffs_base__slice_u8__subslice_i(v_curr_row, 4u); ++ } ++ v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[0u])); ++ v_tiles_per_row = ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2); ++ v_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u); ++ v_y = 1u; ++ while (v_y < self->private_impl.f_height) { ++ v_t = ((uint64_t)((4u * (v_y >> v_tile_size_log2) * v_tiles_per_row))); ++ v_tile_data = wuffs_base__utility__empty_slice_u8(); ++ if (v_t <= ((uint64_t)(a_tile_data.len))) { ++ v_tile_data = wuffs_base__slice_u8__subslice_i(a_tile_data, v_t); ++ if (((uint64_t)(v_tile_data.len)) >= 4u) { ++ v_mode = ((uint8_t)(v_tile_data.ptr[1u] & 15u)); ++ v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u); ++ } ++ } ++ if (v_w4 <= ((uint64_t)(a_pix.len))) { ++ v_prev_row = a_pix; ++ a_pix = wuffs_base__slice_u8__subslice_i(a_pix, v_w4); ++ v_curr_row = a_pix; ++ } ++ if ((((uint64_t)(v_prev_row.len)) >= 4u) && (((uint64_t)(v_curr_row.len)) >= 4u)) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[0u] += v_prev_row.ptr[0u]; ++ v_curr_row.ptr[1u] += v_prev_row.ptr[1u]; ++ v_curr_row.ptr[2u] += v_prev_row.ptr[2u]; ++ v_curr_row.ptr[3u] += v_prev_row.ptr[3u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ v_x = 1u; ++ while (v_x < self->private_impl.f_width) { ++ if (((v_x & v_mask) == 0u) && (((uint64_t)(v_tile_data.len)) >= 4u)) { ++ v_mode = ((uint8_t)(v_tile_data.ptr[1u] & 15u)); ++ v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u); ++ } ++ if ((((uint64_t)(v_prev_row.len)) < 12u) || (((uint64_t)(v_curr_row.len)) < 8u)) { ++ break; ++ } ++ if (v_mode == 0u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[7u] += 255u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 1u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += v_curr_row.ptr[0u]; ++ v_curr_row.ptr[5u] += v_curr_row.ptr[1u]; ++ v_curr_row.ptr[6u] += v_curr_row.ptr[2u]; ++ v_curr_row.ptr[7u] += v_curr_row.ptr[3u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 2u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += v_prev_row.ptr[4u]; ++ v_curr_row.ptr[5u] += v_prev_row.ptr[5u]; ++ v_curr_row.ptr[6u] += v_prev_row.ptr[6u]; ++ v_curr_row.ptr[7u] += v_prev_row.ptr[7u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 3u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += v_prev_row.ptr[8u]; ++ v_curr_row.ptr[5u] += v_prev_row.ptr[9u]; ++ v_curr_row.ptr[6u] += v_prev_row.ptr[10u]; ++ v_curr_row.ptr[7u] += v_prev_row.ptr[11u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 4u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += v_prev_row.ptr[0u]; ++ v_curr_row.ptr[5u] += v_prev_row.ptr[1u]; ++ v_curr_row.ptr[6u] += v_prev_row.ptr[2u]; ++ v_curr_row.ptr[7u] += v_prev_row.ptr[3u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 5u) { ++ v_l0 = ((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u); ++ v_l1 = ((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u); ++ v_l2 = ((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u); ++ v_l3 = ((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((v_l0 + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((v_l1 + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((v_l2 + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((v_l3 + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 6u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[0u]))) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[1u]))) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[2u]))) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[3u]))) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 7u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 8u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 9u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[4u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[5u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[6u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[7u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 10u) { ++ v_l0 = ((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[0u]))) / 2u); ++ v_l1 = ((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[1u]))) / 2u); ++ v_l2 = ((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[2u]))) / 2u); ++ v_l3 = ((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[3u]))) / 2u); ++ v_t0 = ((((uint32_t)(v_prev_row.ptr[4u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u); ++ v_t1 = ((((uint32_t)(v_prev_row.ptr[5u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u); ++ v_t2 = ((((uint32_t)(v_prev_row.ptr[6u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u); ++ v_t3 = ((((uint32_t)(v_prev_row.ptr[7u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u); ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(((v_l0 + v_t0) / 2u))); ++ v_curr_row.ptr[5u] += ((uint8_t)(((v_l1 + v_t1) / 2u))); ++ v_curr_row.ptr[6u] += ((uint8_t)(((v_l2 + v_t2) / 2u))); ++ v_curr_row.ptr[7u] += ((uint8_t)(((v_l3 + v_t3) / 2u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 11u) { ++ v_l0 = ((uint32_t)(v_curr_row.ptr[0u])); ++ v_l1 = ((uint32_t)(v_curr_row.ptr[1u])); ++ v_l2 = ((uint32_t)(v_curr_row.ptr[2u])); ++ v_l3 = ((uint32_t)(v_curr_row.ptr[3u])); ++ v_c0 = ((uint32_t)(v_prev_row.ptr[0u])); ++ v_c1 = ((uint32_t)(v_prev_row.ptr[1u])); ++ v_c2 = ((uint32_t)(v_prev_row.ptr[2u])); ++ v_c3 = ((uint32_t)(v_prev_row.ptr[3u])); ++ v_t0 = ((uint32_t)(v_prev_row.ptr[4u])); ++ v_t1 = ((uint32_t)(v_prev_row.ptr[5u])); ++ v_t2 = ((uint32_t)(v_prev_row.ptr[6u])); ++ v_t3 = ((uint32_t)(v_prev_row.ptr[7u])); ++ v_sum_l = (wuffs_webp__decoder__absolute_difference(self, v_c0, v_t0) + ++ wuffs_webp__decoder__absolute_difference(self, v_c1, v_t1) + ++ wuffs_webp__decoder__absolute_difference(self, v_c2, v_t2) + ++ wuffs_webp__decoder__absolute_difference(self, v_c3, v_t3)); ++ v_sum_t = (wuffs_webp__decoder__absolute_difference(self, v_c0, v_l0) + ++ wuffs_webp__decoder__absolute_difference(self, v_c1, v_l1) + ++ wuffs_webp__decoder__absolute_difference(self, v_c2, v_l2) + ++ wuffs_webp__decoder__absolute_difference(self, v_c3, v_l3)); ++ if (v_sum_l < v_sum_t) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(v_l0)); ++ v_curr_row.ptr[5u] += ((uint8_t)(v_l1)); ++ v_curr_row.ptr[6u] += ((uint8_t)(v_l2)); ++ v_curr_row.ptr[7u] += ((uint8_t)(v_l3)); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += ((uint8_t)(v_t0)); ++ v_curr_row.ptr[5u] += ((uint8_t)(v_t1)); ++ v_curr_row.ptr[6u] += ((uint8_t)(v_t2)); ++ v_curr_row.ptr[7u] += ((uint8_t)(v_t3)); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ } else if (v_mode == 12u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[0u], v_prev_row.ptr[4u], v_prev_row.ptr[0u]); ++ v_curr_row.ptr[5u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[1u], v_prev_row.ptr[5u], v_prev_row.ptr[1u]); ++ v_curr_row.ptr[6u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[2u], v_prev_row.ptr[6u], v_prev_row.ptr[2u]); ++ v_curr_row.ptr[7u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[3u], v_prev_row.ptr[7u], v_prev_row.ptr[3u]); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else if (v_mode == 13u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_curr_row.ptr[4u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[0u], v_prev_row.ptr[4u], v_prev_row.ptr[0u]); ++ v_curr_row.ptr[5u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[1u], v_prev_row.ptr[5u], v_prev_row.ptr[1u]); ++ v_curr_row.ptr[6u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[2u], v_prev_row.ptr[6u], v_prev_row.ptr[2u]); ++ v_curr_row.ptr[7u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[3u], v_prev_row.ptr[7u], v_prev_row.ptr[3u]); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } ++ v_curr_row = wuffs_base__slice_u8__subslice_i(v_curr_row, 4u); ++ v_prev_row = wuffs_base__slice_u8__subslice_i(v_prev_row, 4u); ++ v_x += 1u; ++ } ++ v_y += 1u; ++ } ++ return wuffs_base__make_empty_struct(); ++} + +-// ---------------- Private Function Prototypes ++// -------- func webp.decoder.absolute_difference + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_tga__decoder__do_decode_image_config( +- wuffs_tga__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); ++static uint32_t ++wuffs_webp__decoder__absolute_difference( ++ const wuffs_webp__decoder* self, ++ uint32_t a_a, ++ uint32_t a_b) { ++ if (a_a < a_b) { ++ return (a_b - a_a); ++ } ++ return (a_a - a_b); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_tga__decoder__do_decode_frame_config( +- wuffs_tga__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); ++// -------- func webp.decoder.mode12 + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_tga__decoder__do_decode_frame( +- wuffs_tga__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++static uint8_t ++wuffs_webp__decoder__mode12( ++ const wuffs_webp__decoder* self, ++ uint8_t a_l, ++ uint8_t a_t, ++ uint8_t a_tl) { ++ uint32_t v_v = 0; + +-// ---------------- VTables ++ v_v = ((uint32_t)((((uint32_t)(a_l)) + ((uint32_t)(a_t))) - ((uint32_t)(a_tl)))); ++ if (v_v < 256u) { ++ return ((uint8_t)(v_v)); ++ } else if (v_v < 512u) { ++ return 255u; ++ } ++ return 0u; ++} + +-const wuffs_base__image_decoder__func_ptrs +-wuffs_tga__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_tga__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_tga__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_tga__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_tga__decoder__frame_dirty_rect), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_tga__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_tga__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_tga__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_tga__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_tga__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_tga__decoder__restart_frame), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_tga__decoder__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_tga__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_tga__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_tga__decoder__workbuf_len), +-}; ++// -------- func webp.decoder.mode13 + +-// ---------------- Initializer Implementations ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_webp__decoder__mode13( ++ const wuffs_webp__decoder* self, ++ uint8_t a_l, ++ uint8_t a_t, ++ uint8_t a_tl) { ++ uint32_t v_x = 0; ++ uint32_t v_y = 0; ++ uint32_t v_z = 0; ++ uint32_t v_v = 0; + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_tga__decoder__initialize( +- wuffs_tga__decoder* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ v_x = ((((uint32_t)(a_l)) + ((uint32_t)(a_t))) / 2u); ++ v_y = ((uint32_t)(a_tl)); ++ v_z = ((uint32_t)(v_x - v_y)); ++ v_v = ((uint32_t)(v_x + wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(v_z + (v_z >> 31u))), 1u))); ++ if (v_v < 256u) { ++ return ((uint8_t)(v_v)); ++ } else if (v_v < 512u) { ++ return 255u; + } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ return 0u; ++} ++ ++// -------- func webp.decoder.apply_transform_cross_color ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_cross_color( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix, ++ wuffs_base__slice_u8 a_tile_data) { ++ uint32_t v_tile_size_log2 = 0; ++ uint32_t v_tiles_per_row = 0; ++ uint32_t v_mask = 0; ++ uint32_t v_y = 0; ++ uint32_t v_x = 0; ++ uint64_t v_t = 0; ++ wuffs_base__slice_u8 v_tile_data = {0}; ++ uint32_t v_g2r = 0; ++ uint32_t v_g2b = 0; ++ uint32_t v_r2b = 0; ++ uint8_t v_b = 0; ++ uint8_t v_g = 0; ++ uint8_t v_r = 0; ++ ++ v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[1u])); ++ v_tiles_per_row = ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2); ++ v_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u); ++ v_y = 0u; ++ while (v_y < self->private_impl.f_height) { ++ v_t = ((uint64_t)((4u * (v_y >> v_tile_size_log2) * v_tiles_per_row))); ++ v_tile_data = wuffs_base__utility__empty_slice_u8(); ++ if (v_t <= ((uint64_t)(a_tile_data.len))) { ++ v_tile_data = wuffs_base__slice_u8__subslice_i(a_tile_data, v_t); ++ } ++ v_x = 0u; ++ while (v_x < self->private_impl.f_width) { ++ if (((v_x & v_mask) == 0u) && (((uint64_t)(v_tile_data.len)) >= 4u)) { ++ v_g2r = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[0u]); ++ v_g2b = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[1u]); ++ v_r2b = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[2u]); ++ v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u); ++ } ++ if (((uint64_t)(a_pix.len)) >= 4u) { ++ v_b = a_pix.ptr[0u]; ++ v_g = a_pix.ptr[1u]; ++ v_r = a_pix.ptr[2u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_r += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_g) * v_g2r)) >> 5u))); ++ v_b += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_g) * v_g2b)) >> 5u))); ++ v_b += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_r) * v_r2b)) >> 5u))); ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ a_pix.ptr[0u] = v_b; ++ a_pix.ptr[2u] = v_r; ++ a_pix = wuffs_base__slice_u8__subslice_i(a_pix, 4u); ++ } ++ v_x += 1u; ++ } ++ v_y += 1u; + } ++ return wuffs_base__make_empty_struct(); ++} ++ ++// -------- func webp.decoder.apply_transform_subtract_green ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_subtract_green( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix) { ++ wuffs_base__slice_u8 v_p = {0}; ++ uint8_t v_g = 0; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) ++ { ++ wuffs_base__slice_u8 i_slice_p = a_pix; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 4; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 4) * 4)); ++ while (v_p.ptr < i_end0_p) { ++ v_g = v_p.ptr[1u]; ++#if defined(__GNUC__) + #pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#pragma GCC diagnostic ignored "-Wconversion" + #endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); +- } +-#if !defined(__clang__) && defined(__GNUC__) ++ v_p.ptr[0u] += v_g; ++ v_p.ptr[2u] += v_g; ++#if defined(__GNUC__) + #pragma GCC diagnostic pop + #endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; +- } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ v_p.ptr += 4; + } ++ v_p.len = 0; + } +- +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_tga__decoder__func_ptrs_for__wuffs_base__image_decoder); +- return wuffs_base__make_status(NULL); ++ return wuffs_base__make_empty_struct(); + } + +-wuffs_tga__decoder* +-wuffs_tga__decoder__alloc(void) { +- wuffs_tga__decoder* x = +- (wuffs_tga__decoder*)(calloc(sizeof(wuffs_tga__decoder), 1)); +- if (!x) { +- return NULL; ++// -------- func webp.decoder.apply_transform_color_indexing ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_webp__decoder__apply_transform_color_indexing( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_pix) { ++ uint32_t v_tile_size_log2 = 0; ++ uint32_t v_bits_per_pixel = 0; ++ uint32_t v_x_mask = 0; ++ uint32_t v_s_mask = 0; ++ uint64_t v_src_index = 0; ++ uint32_t v_y = 0; ++ uint64_t v_di = 0; ++ uint64_t v_dj = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint32_t v_x = 0; ++ uint32_t v_s = 0; ++ uint32_t v_p = 0; ++ uint8_t v_p0 = 0; ++ uint8_t v_p1 = 0; ++ uint8_t v_p2 = 0; ++ uint8_t v_p3 = 0; ++ ++ v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[3u])); ++ if (v_tile_size_log2 == 0u) { ++ { ++ wuffs_base__slice_u8 i_slice_dst = a_pix; ++ v_dst.ptr = i_slice_dst.ptr; ++ v_dst.len = 4; ++ const uint8_t* i_end0_dst = wuffs_private_impl__ptr_u8_plus_len(v_dst.ptr, (((i_slice_dst.len - (size_t)(v_dst.ptr - i_slice_dst.ptr)) / 4) * 4)); ++ while (v_dst.ptr < i_end0_dst) { ++ v_p = (((uint32_t)(v_dst.ptr[1u])) * 4u); ++ v_p0 = self->private_data.f_palette[(v_p + 0u)]; ++ v_p1 = self->private_data.f_palette[(v_p + 1u)]; ++ v_p2 = self->private_data.f_palette[(v_p + 2u)]; ++ v_p3 = self->private_data.f_palette[(v_p + 3u)]; ++ v_dst.ptr[0u] = v_p0; ++ v_dst.ptr[1u] = v_p1; ++ v_dst.ptr[2u] = v_p2; ++ v_dst.ptr[3u] = v_p3; ++ v_dst.ptr += 4; ++ } ++ v_dst.len = 0; ++ } ++ return wuffs_base__make_empty_struct(); + } +- if (wuffs_tga__decoder__initialize( +- x, sizeof(wuffs_tga__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ v_bits_per_pixel = (((uint32_t)(8u)) >> v_tile_size_log2); ++ v_x_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u); ++ v_s_mask = ((((uint32_t)(1u)) << v_bits_per_pixel) - 1u); ++ v_src_index = ((uint64_t)((self->private_impl.f_workbuf_offset_for_color_indexing + 1u))); ++ v_y = 0u; ++ while (v_y < self->private_impl.f_height) { ++ v_di = ((uint64_t)((4u * (v_y + 0u) * self->private_impl.f_width))); ++ v_dj = ((uint64_t)((4u * (v_y + 1u) * self->private_impl.f_width))); ++ if ((v_di > v_dj) || (v_dj > ((uint64_t)(a_pix.len)))) { ++ break; ++ } ++ v_dst = wuffs_base__slice_u8__subslice_ij(a_pix, v_di, v_dj); ++ v_x = 0u; ++ while (((uint64_t)(v_dst.len)) >= 4u) { ++ if (((v_x & v_x_mask) == 0u) && (v_src_index < ((uint64_t)(a_pix.len)))) { ++ v_s = ((uint32_t)(a_pix.ptr[v_src_index])); ++ v_src_index += 4u; ++ } ++ v_p = ((v_s & v_s_mask) * 4u); ++ v_s >>= v_bits_per_pixel; ++ v_p0 = self->private_data.f_palette[(v_p + 0u)]; ++ v_p1 = self->private_data.f_palette[(v_p + 1u)]; ++ v_p2 = self->private_data.f_palette[(v_p + 2u)]; ++ v_p3 = self->private_data.f_palette[(v_p + 3u)]; ++ v_dst.ptr[0u] = v_p0; ++ v_dst.ptr[1u] = v_p1; ++ v_dst.ptr[2u] = v_p2; ++ v_dst.ptr[3u] = v_p3; ++ v_dst = wuffs_base__slice_u8__subslice_i(v_dst, 4u); ++ v_x += 1u; ++ } ++ v_y += 1u; + } +- return x; +-} +- +-size_t +-sizeof__wuffs_tga__decoder(void) { +- return sizeof(wuffs_tga__decoder); ++ return wuffs_base__make_empty_struct(); + } + +-// ---------------- Function Implementations +- +-// -------- func tga.decoder.get_quirk ++// -------- func webp.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__get_quirk( +- const wuffs_tga__decoder* self, ++wuffs_webp__decoder__get_quirk( ++ const wuffs_webp__decoder* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -59162,12 +73627,12 @@ wuffs_tga__decoder__get_quirk( + return 0u; + } + +-// -------- func tga.decoder.set_quirk ++// -------- func webp.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__set_quirk( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__set_quirk( ++ wuffs_webp__decoder* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -59183,12 +73648,12 @@ wuffs_tga__decoder__set_quirk( + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func tga.decoder.decode_image_config ++// -------- func webp.decoder.decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_image_config( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__decode_image_config( ++ wuffs_webp__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { +@@ -59214,17 +73679,17 @@ wuffs_tga__decoder__decode_image_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_image_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_image_config(self, a_dst, a_src); ++ wuffs_base__status t_0 = wuffs_webp__decoder__do_decode_image_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_webp__error__truncated_input); + goto exit; + } + status = v_status; +@@ -59232,13 +73697,13 @@ wuffs_tga__decoder__decode_image_config( + } + + ok: +- self->private_impl.p_decode_image_config[0] = 0; ++ self->private_impl.p_decode_image_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + + goto exit; +@@ -59249,19 +73714,19 @@ wuffs_tga__decoder__decode_image_config( + return status; + } + +-// -------- func tga.decoder.do_decode_image_config ++// -------- func webp.decoder.do_decode_image_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_tga__decoder__do_decode_image_config( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__do_decode_image_config( ++ wuffs_webp__decoder* self, + wuffs_base__image_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint32_t v_c = 0; +- uint32_t v_c5 = 0; +- uint32_t v_i = 0; ++ uint32_t v_c32 = 0; ++ uint64_t v_r_mark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -59274,10 +73739,7 @@ wuffs_tga__decoder__do_decode_image_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_do_decode_image_config[0].v_i; +- } ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +@@ -59287,411 +73749,446 @@ wuffs_tga__decoder__do_decode_image_config( + } + { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- self->private_impl.f_header_id_length = t_0; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- self->private_impl.f_header_color_map_type = t_1; +- } +- if (self->private_impl.f_header_color_map_type > 1u) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_header); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_2 = *iop_a_src++; +- self->private_impl.f_header_image_type = t_2; +- } +- if ((self->private_impl.f_header_image_type == 1u) || +- (self->private_impl.f_header_image_type == 2u) || +- (self->private_impl.f_header_image_type == 3u) || +- (self->private_impl.f_header_image_type == 9u) || +- (self->private_impl.f_header_image_type == 10u) || +- (self->private_impl.f_header_image_type == 11u)) { +- } else { +- status = wuffs_base__make_status(wuffs_tga__error__bad_header); +- goto exit; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); +- uint16_t t_3; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_3 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- iop_a_src += 2; ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; +- if (num_bits_3 == 8) { +- t_3 = ((uint16_t)(*scratch)); ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); + break; + } +- num_bits_3 += 8u; +- *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; + } + } +- self->private_impl.f_header_color_map_first_entry_index = t_3; ++ v_c32 = t_0; ++ } ++ if (v_c32 != 1179011410u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); +- uint16_t t_4; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); +- iop_a_src += 2; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ self->private_data.s_do_decode_image_config.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56)); ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4; +- if (num_bits_4 == 8) { +- t_4 = ((uint16_t)(*scratch)); ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); + break; + } +- num_bits_4 += 8u; +- *scratch |= ((uint64_t)(num_bits_4)) << 56; ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; + } + } +- self->private_impl.f_header_color_map_length = t_4; ++ self->private_impl.f_riff_chunk_length = t_1; + } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_5 = *iop_a_src++; +- self->private_impl.f_header_color_map_entry_size = t_5; ++ if ((self->private_impl.f_riff_chunk_length & 1u) != 0u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; + } +- if (self->private_impl.f_header_color_map_type != 0u) { +- if ((self->private_impl.f_header_color_map_first_entry_index != 0u) || (self->private_impl.f_header_color_map_length > 256u)) { +- status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); +- goto exit; +- } else if ((self->private_impl.f_header_color_map_entry_size != 15u) && +- (self->private_impl.f_header_color_map_entry_size != 16u) && +- (self->private_impl.f_header_color_map_entry_size != 24u) && +- (self->private_impl.f_header_color_map_entry_size != 32u)) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_header); +- goto exit; ++ while (true) { ++ { ++ const bool o_0_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_0_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_riff_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; ++ } ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_webp__decoder__do_decode_image_config_limited(self, a_src); ++ v_status = t_2; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_riff_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ io2_a_src = o_0_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_0_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); ++ } + } +- } else { +- if ((self->private_impl.f_header_color_map_first_entry_index != 0u) || (self->private_impl.f_header_color_map_length != 0u) || (self->private_impl.f_header_color_map_entry_size != 0u)) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_header); ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if ( ! wuffs_base__status__is_suspension(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } else if ((v_status.repr == wuffs_base__suspension__short_read) && (self->private_impl.f_riff_chunk_length == 0u)) { ++ status = wuffs_base__make_status(wuffs_webp__error__short_chunk); + goto exit; + } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); + } +- self->private_data.s_do_decode_image_config[0].scratch = 4u; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; ++ self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); ++ if (a_dst != NULL) { ++ wuffs_base__image_config__set( ++ a_dst, ++ self->private_impl.f_pixfmt, ++ 0u, ++ self->private_impl.f_width, ++ self->private_impl.f_height, ++ self->private_impl.f_frame_config_io_position, ++ false); + } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; ++ self->private_impl.f_call_sequence = 32u; ++ ++ ok: ++ self->private_impl.p_do_decode_image_config = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func webp.decoder.do_decode_image_config_limited ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_image_config_limited( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_c32 = 0; ++ uint64_t v_r_mark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config_limited; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); +- uint32_t t_6; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ self->private_data.s_do_decode_image_config_limited.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56)); ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6; +- if (num_bits_6 == 8) { +- t_6 = ((uint32_t)(*scratch)); ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); + break; + } +- num_bits_6 += 8u; +- *scratch |= ((uint64_t)(num_bits_6)) << 56; ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; + } + } +- self->private_impl.f_width = t_6; ++ v_c32 = t_0; ++ } ++ if (v_c32 != 1346520407u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; + } + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); +- uint32_t t_7; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_7 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; + } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ self->private_data.s_do_decode_image_config_limited.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); + while (true) { + if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { + status = wuffs_base__make_status(wuffs_base__suspension__short_read); + goto suspend; + } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); + *scratch <<= 8; + *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; +- if (num_bits_7 == 8) { +- t_7 = ((uint32_t)(*scratch)); ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); + break; + } +- num_bits_7 += 8u; +- *scratch |= ((uint64_t)(num_bits_7)) << 56; ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; + } + } +- self->private_impl.f_height = t_7; +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_8 = *iop_a_src++; +- self->private_impl.f_header_pixel_depth = t_8; ++ v_c32 = t_1; + } +- if ((self->private_impl.f_header_pixel_depth != 1u) && +- (self->private_impl.f_header_pixel_depth != 8u) && +- (self->private_impl.f_header_pixel_depth != 15u) && +- (self->private_impl.f_header_pixel_depth != 16u) && +- (self->private_impl.f_header_pixel_depth != 24u) && +- (self->private_impl.f_header_pixel_depth != 32u)) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_header); ++ if (v_c32 == 540561494u) { ++ status = wuffs_base__make_status(wuffs_webp__error__unsupported_webp_file); + goto exit; +- } +- if ((self->private_impl.f_header_image_type | 8u) == 9u) { +- self->private_impl.f_scratch_bytes_per_pixel = 1u; +- self->private_impl.f_src_bytes_per_pixel = 1u; +- self->private_impl.f_src_pixfmt = 2164523016u; +- self->private_impl.f_opaque = ((self->private_impl.f_header_color_map_entry_size == 15u) || (self->private_impl.f_header_color_map_entry_size == 24u)); +- } else if ((self->private_impl.f_header_image_type | 8u) == 10u) { +- if ((self->private_impl.f_header_pixel_depth == 15u) || (self->private_impl.f_header_pixel_depth == 16u)) { +- self->private_impl.f_scratch_bytes_per_pixel = 4u; +- self->private_impl.f_src_bytes_per_pixel = 0u; +- self->private_impl.f_src_pixfmt = 2164295816u; +- } else if (self->private_impl.f_header_pixel_depth == 24u) { +- self->private_impl.f_scratch_bytes_per_pixel = 3u; +- self->private_impl.f_src_bytes_per_pixel = 3u; +- self->private_impl.f_src_pixfmt = 2147485832u; +- self->private_impl.f_opaque = true; +- } else if (self->private_impl.f_header_pixel_depth == 32u) { +- self->private_impl.f_scratch_bytes_per_pixel = 4u; +- self->private_impl.f_src_bytes_per_pixel = 4u; +- self->private_impl.f_src_pixfmt = 2164295816u; +- } else { +- status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); +- goto exit; ++ } else if (v_c32 == 1278758998u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ uint32_t t_2; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config_limited.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch; ++ uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2; ++ if (num_bits_2 == 24) { ++ t_2 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_2 += 8u; ++ *scratch |= ((uint64_t)(num_bits_2)) << 56; ++ } ++ } ++ self->private_impl.f_sub_chunk_length = t_2; + } +- } else { +- if (self->private_impl.f_header_pixel_depth == 8u) { +- self->private_impl.f_scratch_bytes_per_pixel = 1u; +- self->private_impl.f_src_bytes_per_pixel = 1u; +- self->private_impl.f_src_pixfmt = 536870920u; +- self->private_impl.f_opaque = true; +- } else { +- status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); ++ if (self->private_impl.f_sub_chunk_length < 4u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); + goto exit; + } +- } +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_9 = *iop_a_src++; +- self->private_impl.f_header_image_descriptor = t_9; +- } +- if ((self->private_impl.f_header_image_descriptor & 16u) != 0u) { +- status = wuffs_base__make_status(wuffs_tga__error__unsupported_tga_file); +- goto exit; +- } +- self->private_data.s_do_decode_image_config[0].scratch = ((uint32_t)(self->private_impl.f_header_id_length)); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); +- if (self->private_data.s_do_decode_image_config[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_image_config[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_image_config[0].scratch; +- if (self->private_impl.f_header_color_map_type != 0u) { +- while (v_i < ((uint32_t)(self->private_impl.f_header_color_map_length))) { +- if (self->private_impl.f_header_color_map_entry_size == 24u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); +- uint32_t t_10; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) { +- t_10 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src))); +- iop_a_src += 3; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10; +- if (num_bits_10 == 16) { +- t_10 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_10 += 8u; +- *scratch |= ((uint64_t)(num_bits_10)) << 56; +- } +- } +- v_c = t_10; ++ self->private_impl.f_sub_chunk_has_padding = ((self->private_impl.f_sub_chunk_length & 1u) != 0u); ++ while (true) { ++ { ++ const bool o_0_closed_a_src = a_src->meta.closed; ++ const uint8_t* o_0_io2_a_src = io2_a_src; ++ wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src, ++ ((uint64_t)(self->private_impl.f_sub_chunk_length))); ++ if (a_src) { ++ size_t n = ((size_t)(io2_a_src - a_src->data.ptr)); ++ a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n); ++ a_src->meta.wi = n; + } +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c >> 0u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c >> 8u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c >> 16u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u; +- } else if (self->private_impl.f_header_color_map_entry_size == 32u) { ++ v_r_mark = ((uint64_t)(iop_a_src - io0_a_src)); + { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); +- uint32_t t_11; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { +- t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); +- iop_a_src += 4; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11; +- if (num_bits_11 == 24) { +- t_11 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_11 += 8u; +- *scratch |= ((uint64_t)(num_bits_11)) << 56; +- } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_c = t_11; +- } +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c >> 0u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c >> 8u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c >> 16u))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = ((uint8_t)((v_c >> 24u))); +- } else { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); +- uint32_t t_12; +- if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { +- t_12 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2; +- } else { +- self->private_data.s_do_decode_image_config[0].scratch = 0; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); +- while (true) { +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint64_t* scratch = &self->private_data.s_do_decode_image_config[0].scratch; +- uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56)); +- *scratch <<= 8; +- *scratch >>= 8; +- *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12; +- if (num_bits_12 == 8) { +- t_12 = ((uint32_t)(*scratch)); +- break; +- } +- num_bits_12 += 8u; +- *scratch |= ((uint64_t)(num_bits_12)) << 56; +- } ++ wuffs_base__status t_3 = wuffs_webp__decoder__do_decode_image_config_limited_vp8l(self, a_src); ++ v_status = t_3; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- v_c = t_12; + } +- v_c5 = (31u & (v_c >> 0u)); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 5u)); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 10u)); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u; ++ wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_sub_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)))))); ++ io2_a_src = o_0_io2_a_src; ++ if (a_src) { ++ a_src->meta.closed = o_0_closed_a_src; ++ a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr)); ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } else if ( ! wuffs_base__status__is_suspension(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } else if ((v_status.repr == wuffs_base__suspension__short_read) && (self->private_impl.f_sub_chunk_length == 0u)) { ++ status = wuffs_base__make_status(wuffs_webp__error__short_chunk); ++ goto exit; + } +- v_i += 1u; ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); + } +- while (v_i < 256u) { +- self->private_data.f_src_palette[((v_i * 4u) + 0u)] = 0u; +- self->private_data.f_src_palette[((v_i * 4u) + 1u)] = 0u; +- self->private_data.f_src_palette[((v_i * 4u) + 2u)] = 0u; +- self->private_data.f_src_palette[((v_i * 4u) + 3u)] = 255u; +- v_i += 1u; ++ } else if (v_c32 == 1480085590u) { ++ status = wuffs_base__make_status(wuffs_webp__error__unsupported_webp_file); ++ goto exit; ++ } else { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; ++ } ++ ++ ok: ++ self->private_impl.p_do_decode_image_config_limited = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_image_config_limited = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func webp.decoder.do_decode_image_config_limited_vp8l ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_image_config_limited_vp8l( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_c32 = 0; ++ uint32_t v_transform_size = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config_limited_vp8l; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; + } ++ uint32_t t_0 = *iop_a_src++; ++ v_c32 = t_0; + } +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- self->private_impl.f_src_pixfmt, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- self->private_impl.f_opaque); ++ if (v_c32 != 47u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; + } +- self->private_impl.f_call_sequence = 32u; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_decode_image_config_limited_vp8l.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited_vp8l.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 24) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_c32 = t_1; ++ } ++ self->private_impl.f_width = ((v_c32 & 16383u) + 1u); ++ v_c32 >>= 14u; ++ self->private_impl.f_height = ((v_c32 & 16383u) + 1u); ++ v_c32 >>= 14u; ++ self->private_impl.f_pixfmt = 2415954056u; ++ if ((v_c32 & 1u) != 0u) { ++ self->private_impl.f_pixfmt = 2164295816u; ++ } ++ v_c32 >>= 1u; ++ if (v_c32 != 0u) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_header); ++ goto exit; ++ } ++ v_transform_size = (4u * ((self->private_impl.f_width + 3u) >> 2u) * ((self->private_impl.f_height + 3u) >> 2u)); ++ self->private_impl.f_workbuf_offset_for_transform[0u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (0u * v_transform_size)); ++ self->private_impl.f_workbuf_offset_for_transform[1u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (1u * v_transform_size)); ++ self->private_impl.f_workbuf_offset_for_transform[2u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (2u * v_transform_size)); ++ self->private_impl.f_workbuf_offset_for_transform[3u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (3u * v_transform_size)); + + goto ok; + ok: +- self->private_impl.p_do_decode_image_config[0] = 0; ++ self->private_impl.p_do_decode_image_config_limited_vp8l = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_image_config[0].v_i = v_i; ++ self->private_impl.p_do_decode_image_config_limited_vp8l = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -59702,12 +74199,12 @@ wuffs_tga__decoder__do_decode_image_config( + return status; + } + +-// -------- func tga.decoder.decode_frame_config ++// -------- func webp.decoder.decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_frame_config( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__decode_frame_config( ++ wuffs_webp__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + if (!self) { +@@ -59733,17 +74230,17 @@ wuffs_tga__decoder__decode_frame_config( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_frame_config(self, a_dst, a_src); ++ wuffs_base__status t_0 = wuffs_webp__decoder__do_decode_frame_config(self, a_dst, a_src); + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_webp__error__truncated_input); + goto exit; + } + status = v_status; +@@ -59751,13 +74248,13 @@ wuffs_tga__decoder__decode_frame_config( + } + + ok: +- self->private_impl.p_decode_frame_config[0] = 0; ++ self->private_impl.p_decode_frame_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; + + goto exit; +@@ -59768,12 +74265,12 @@ wuffs_tga__decoder__decode_frame_config( + return status; + } + +-// -------- func tga.decoder.do_decode_frame_config ++// -------- func webp.decoder.do_decode_frame_config + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_tga__decoder__do_decode_frame_config( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__do_decode_frame_config( ++ wuffs_webp__decoder* self, + wuffs_base__frame_config* a_dst, + wuffs_base__io_buffer* a_src) { + wuffs_base__status status = wuffs_base__make_status(NULL); +@@ -59789,7 +74286,7 @@ wuffs_tga__decoder__do_decode_frame_config( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +@@ -59799,7 +74296,7 @@ wuffs_tga__decoder__do_decode_frame_config( + a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_tga__decoder__do_decode_image_config(self, NULL, a_src); ++ status = wuffs_webp__decoder__do_decode_image_config(self, NULL, a_src); + if (a_src) { + iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +@@ -59831,20 +74328,20 @@ wuffs_tga__decoder__do_decode_frame_config( + 0u, + self->private_impl.f_frame_config_io_position, + 0u, +- self->private_impl.f_opaque, + false, +- 4278190080u); ++ false, ++ 0u); + } + self->private_impl.f_call_sequence = 64u; + + ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; ++ self->private_impl.p_do_decode_frame_config = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +@@ -59855,12 +74352,12 @@ wuffs_tga__decoder__do_decode_frame_config( + return status; + } + +-// -------- func tga.decoder.decode_frame ++// -------- func webp.decoder.decode_frame + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__decode_frame( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__decode_frame( ++ wuffs_webp__decoder* self, + wuffs_base__pixel_buffer* a_dst, + wuffs_base__io_buffer* a_src, + wuffs_base__pixel_blend a_blend, +@@ -59889,13 +74386,13 @@ wuffs_tga__decoder__decode_frame( + + wuffs_base__status v_status = wuffs_base__make_status(NULL); + +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_frame; + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + + while (true) { + { +- wuffs_base__status t_0 = wuffs_tga__decoder__do_decode_frame(self, ++ wuffs_base__status t_0 = wuffs_webp__decoder__do_decode_frame(self, + a_dst, + a_src, + a_blend, +@@ -59904,64 +74401,627 @@ wuffs_tga__decoder__decode_frame( + v_status = t_0; + } + if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_tga__error__truncated_input); ++ status = wuffs_base__make_status(wuffs_webp__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ } ++ return status; ++} ++ ++// -------- func webp.decoder.do_decode_frame ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__do_decode_frame( ++ wuffs_webp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__pixel_blend a_blend, ++ wuffs_base__slice_u8 a_workbuf, ++ wuffs_base__decode_frame_options* a_opts) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_has_more = 0; ++ uint32_t v_width = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ wuffs_base__slice_u8 v_tile_data = {0}; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ wuffs_base__slice_u8 v_pix = {0}; ++ uint32_t v_which = 0; ++ uint32_t v_transform_type = 0; ++ uint64_t v_ti = 0; ++ uint64_t v_tj = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_do_decode_frame; ++ if (coro_susp_point) { ++ v_width = self->private_data.s_do_decode_frame.v_width; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_call_sequence == 64u) { ++ } else if (self->private_impl.f_call_sequence < 64u) { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_webp__decoder__do_decode_frame_config(self, NULL, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } else { ++ status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ goto ok; ++ } ++ self->private_impl.f_seen_transform[0u] = false; ++ self->private_impl.f_seen_transform[1u] = false; ++ self->private_impl.f_seen_transform[2u] = false; ++ self->private_impl.f_seen_transform[3u] = false; ++ self->private_impl.f_n_transforms = 0u; ++ while (true) { ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_has_more = (self->private_impl.f_bits & 1u); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ if (v_has_more == 0u) { ++ break; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_webp__decoder__decode_transform(self, a_src, a_workbuf); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ } ++ v_width = self->private_impl.f_width; ++ if (self->private_impl.f_seen_transform[3u]) { ++ v_width = self->private_impl.f_color_indexing_width; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_overall_color_cache_bits = self->private_impl.f_color_cache_bits; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ status = wuffs_webp__decoder__decode_hg_table(self, a_src, v_width, a_workbuf); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ self->private_impl.f_color_cache_bits = self->private_impl.f_overall_color_cache_bits; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, self->private_impl.f_overall_n_huffman_groups); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ while (true) { ++ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_color_indexing)) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u]))) || ++ (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || ++ (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len))) || ++ (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ v_dst = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_color_indexing)), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u]))); ++ v_tile_data = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_1 = wuffs_webp__decoder__decode_pixels(self, ++ v_dst, ++ a_src, ++ v_width, ++ self->private_impl.f_height, ++ v_tile_data, ++ self->private_impl.f_overall_tile_size_log2); ++ v_status = t_1; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); ++ } ++ if (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(a_workbuf.len))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ v_pix = wuffs_base__slice_u8__subslice_j(a_workbuf, ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u]))); ++ v_which = self->private_impl.f_n_transforms; ++ while (v_which > 0u) { ++ v_which -= 1u; ++ v_transform_type = ((uint32_t)(self->private_impl.f_transform_type[v_which])); ++ v_tile_data = wuffs_base__utility__empty_slice_u8(); ++ if (v_transform_type < 2u) { ++ v_ti = ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])); ++ v_tj = ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)])); ++ if ((v_ti <= v_tj) && (v_tj <= ((uint64_t)(a_workbuf.len)))) { ++ v_tile_data = wuffs_base__slice_u8__subslice_ij(a_workbuf, v_ti, v_tj); ++ } ++ } ++ if (v_transform_type == 0u) { ++ wuffs_webp__decoder__apply_transform_predictor(self, v_pix, v_tile_data); ++ } else if (v_transform_type == 1u) { ++ wuffs_webp__decoder__apply_transform_cross_color(self, v_pix, v_tile_data); ++ } else if (v_transform_type == 2u) { ++ wuffs_webp__decoder__apply_transform_subtract_green(self, v_pix); ++ } else { ++ wuffs_webp__decoder__apply_transform_color_indexing(self, v_pix); ++ v_width = self->private_impl.f_width; ++ } ++ } ++ v_status = wuffs_webp__decoder__swizzle(self, a_dst, v_pix, a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = v_status; ++ if (wuffs_base__status__is_error(&status)) { ++ goto exit; ++ } else if (wuffs_base__status__is_suspension(&status)) { ++ status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ goto exit; ++ } ++ goto ok; ++ } ++ self->private_impl.f_call_sequence = 96u; ++ ++ ok: ++ self->private_impl.p_do_decode_frame = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_decode_frame.v_width = v_width; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func webp.decoder.decode_transform ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_transform( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint8_t v_c8 = 0; ++ uint32_t v_transform_type = 0; ++ uint32_t v_tile_size_log2 = 0; ++ wuffs_base__slice_u8 v_p = {0}; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_transform; ++ if (coro_susp_point) { ++ v_transform_type = self->private_data.s_decode_transform.v_transform_type; ++ v_tile_size_log2 = self->private_data.s_decode_transform.v_tile_size_log2; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_n_bits < 2u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (self->private_impl.f_n_bits >= 2u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_transform_type = (self->private_impl.f_bits & 3u); ++ self->private_impl.f_bits >>= 2u; ++ self->private_impl.f_n_bits -= 2u; ++ if (self->private_impl.f_seen_transform[v_transform_type] || (self->private_impl.f_n_transforms >= 4u)) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_transform); ++ goto exit; ++ } else if (self->private_impl.f_seen_transform[3u]) { ++ status = wuffs_base__make_status(wuffs_webp__error__unsupported_transform_after_color_indexing_transform); ++ goto exit; ++ } ++ self->private_impl.f_seen_transform[v_transform_type] = true; ++ self->private_impl.f_transform_type[self->private_impl.f_n_transforms] = ((uint8_t)(v_transform_type)); ++ self->private_impl.f_n_transforms += 1u; ++ if (v_transform_type < 2u) { ++ if (self->private_impl.f_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= 3u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_tile_size_log2 = ((self->private_impl.f_bits & 7u) + 2u); ++ self->private_impl.f_transform_tile_size_log2[v_transform_type] = ((uint8_t)(v_tile_size_log2)); ++ self->private_impl.f_bits >>= 3u; ++ self->private_impl.f_n_bits -= 3u; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ while (true) { ++ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)])) > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_webp__decoder__decode_pixels(self, ++ wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]))), ++ a_src, ++ ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2), ++ ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2), ++ wuffs_base__utility__empty_slice_u8(), ++ 0u); ++ v_status = t_2; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ } ++ } else if (v_transform_type == 2u) { ++ } else { ++ if (self->private_impl.f_n_bits < 8u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if (self->private_impl.f_n_bits >= 8u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ self->private_impl.f_color_indexing_palette_size = ((self->private_impl.f_bits & 255u) + 1u); ++ self->private_impl.f_bits >>= 8u; ++ self->private_impl.f_n_bits -= 8u; ++ if (self->private_impl.f_color_indexing_palette_size <= 2u) { ++ self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 7u) / 8u); ++ self->private_impl.f_transform_tile_size_log2[3u] = 3u; ++ } else if (self->private_impl.f_color_indexing_palette_size <= 4u) { ++ self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 3u) / 4u); ++ self->private_impl.f_transform_tile_size_log2[3u] = 2u; ++ } else if (self->private_impl.f_color_indexing_palette_size <= 16u) { ++ self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 1u) / 2u); ++ self->private_impl.f_transform_tile_size_log2[3u] = 1u; ++ } else { ++ self->private_impl.f_color_indexing_width = self->private_impl.f_width; ++ self->private_impl.f_transform_tile_size_log2[3u] = 0u; ++ } ++ if (self->private_impl.f_width >= self->private_impl.f_color_indexing_width) { ++ self->private_impl.f_workbuf_offset_for_color_indexing = (4u * (self->private_impl.f_width - self->private_impl.f_color_indexing_width) * self->private_impl.f_height); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ status = wuffs_webp__decoder__decode_pixels(self, ++ wuffs_base__make_slice_u8(self->private_data.f_palette, (4u * self->private_impl.f_color_indexing_palette_size)), ++ a_src, ++ self->private_impl.f_color_indexing_palette_size, ++ 1u, ++ wuffs_base__utility__empty_slice_u8(), ++ 0u); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; ++ } ++ wuffs_private_impl__bulk_memset(&self->private_data.f_palette[(4u * self->private_impl.f_color_indexing_palette_size)], (1024u - (4u * self->private_impl.f_color_indexing_palette_size)), 0u); ++ v_p = wuffs_base__make_slice_u8(self->private_data.f_palette, (4u * self->private_impl.f_color_indexing_palette_size)); ++ while (((uint64_t)(v_p.len)) >= 8u) { ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_p.ptr[4u] += v_p.ptr[0u]; ++ v_p.ptr[5u] += v_p.ptr[1u]; ++ v_p.ptr[6u] += v_p.ptr[2u]; ++ v_p.ptr[7u] += v_p.ptr[3u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ v_p = wuffs_base__slice_u8__subslice_i(v_p, 4u); ++ } ++ } ++ ++ ok: ++ self->private_impl.p_decode_transform = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_transform = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_transform.v_transform_type = v_transform_type; ++ self->private_data.s_decode_transform.v_tile_size_log2 = v_tile_size_log2; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ ++ return status; ++} ++ ++// -------- func webp.decoder.decode_color_cache_parameters ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_color_cache_parameters( ++ wuffs_webp__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint8_t v_c8 = 0; ++ uint32_t v_use_color_cache = 0; ++ uint32_t v_color_cache_bits = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_color_cache_parameters; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_use_color_cache = (self->private_impl.f_bits & 1u); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ self->private_impl.f_color_cache_bits = 0u; ++ if (v_use_color_cache != 0u) { ++ if (self->private_impl.f_n_bits < 4u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= 4u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); ++ goto exit; ++ } ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; ++ } ++ v_color_cache_bits = (self->private_impl.f_bits & 15u); ++ self->private_impl.f_bits >>= 4u; ++ self->private_impl.f_n_bits -= 4u; ++ if ((v_color_cache_bits < 1u) || (11u < v_color_cache_bits)) { ++ status = wuffs_base__make_status(wuffs_webp__error__bad_color_cache); + goto exit; + } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ self->private_impl.f_color_cache_bits = v_color_cache_bits; + } + ++ goto ok; + ok: +- self->private_impl.p_decode_frame[0] = 0; ++ self->private_impl.p_decode_color_cache_parameters = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++ self->private_impl.p_decode_color_cache_parameters = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + + goto exit; + exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } ++ + return status; + } + +-// -------- func tga.decoder.do_decode_frame ++// -------- func webp.decoder.decode_hg_table + + WUFFS_BASE__GENERATED_C_CODE + static wuffs_base__status +-wuffs_tga__decoder__do_decode_frame( +- wuffs_tga__decoder* self, +- wuffs_base__pixel_buffer* a_dst, ++wuffs_webp__decoder__decode_hg_table( ++ wuffs_webp__decoder* self, + wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++ uint32_t a_width, ++ wuffs_base__slice_u8 a_workbuf) { + wuffs_base__status status = wuffs_base__make_status(NULL); + + wuffs_base__status v_status = wuffs_base__make_status(NULL); +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint64_t v_dst_bytes_per_pixel = 0; +- uint32_t v_dst_x = 0; +- uint32_t v_dst_y = 0; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst_palette = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint64_t v_dst_start = 0; +- wuffs_base__slice_u8 v_src_palette = {0}; +- uint64_t v_mark = 0; +- uint64_t v_num_pixels64 = 0; +- uint32_t v_num_pixels32 = 0; +- uint32_t v_lit_length = 0; +- uint32_t v_run_length = 0; +- uint64_t v_num_dst_bytes = 0; +- uint32_t v_num_src_bytes = 0; +- uint32_t v_c = 0; +- uint32_t v_c5 = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_use_hg_table = 0; ++ uint32_t v_tile_size_log2 = 0; ++ wuffs_base__slice_u8 v_hg_pixels = {0}; ++ uint64_t v_n = 0; ++ wuffs_base__slice_u8 v_p = {0}; ++ uint32_t v_hg_plus_1 = 0; + + const uint8_t* iop_a_src = NULL; + const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +@@ -59974,276 +75034,155 @@ wuffs_tga__decoder__do_decode_frame( + io2_a_src = io0_a_src + a_src->meta.wi; + } + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; ++ uint32_t coro_susp_point = self->private_impl.p_decode_hg_table; + if (coro_susp_point) { +- v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame[0].v_dst_bytes_per_pixel; +- v_dst_x = self->private_data.s_do_decode_frame[0].v_dst_x; +- v_dst_y = self->private_data.s_do_decode_frame[0].v_dst_y; +- v_mark = self->private_data.s_do_decode_frame[0].v_mark; +- v_num_pixels32 = self->private_data.s_do_decode_frame[0].v_num_pixels32; +- v_lit_length = self->private_data.s_do_decode_frame[0].v_lit_length; +- v_run_length = self->private_data.s_do_decode_frame[0].v_run_length; +- v_num_dst_bytes = self->private_data.s_do_decode_frame[0].v_num_dst_bytes; ++ v_tile_size_log2 = self->private_data.s_decode_hg_table.v_tile_size_log2; + } + switch (coro_susp_point) { + WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ if (self->private_impl.f_n_bits < 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; + } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_tga__decoder__do_decode_frame_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ self->private_impl.f_bits = ((uint32_t)(v_c8)); ++ self->private_impl.f_n_bits = 8u; ++ } ++ v_use_hg_table = (self->private_impl.f_bits & 1u); ++ self->private_impl.f_bits >>= 1u; ++ self->private_impl.f_n_bits -= 1u; ++ if (v_use_hg_table == 0u) { ++ self->private_impl.f_overall_n_huffman_groups = 1u; ++ self->private_impl.f_overall_tile_size_log2 = 0u; ++ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; + } +- if (status.repr) { +- goto suspend; ++ v_hg_pixels = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))); ++ if (((uint64_t)(v_hg_pixels.len)) >= 4u) { ++ v_hg_pixels.ptr[0u] = 0u; ++ v_hg_pixels.ptr[1u] = 0u; ++ v_hg_pixels.ptr[2u] = 0u; ++ v_hg_pixels.ptr[3u] = 0u; + } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); ++ status = wuffs_base__make_status(NULL); + goto ok; + } +- if (self->private_impl.f_header_color_map_type != 0u) { +- v_src_palette = wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024); +- } +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), +- wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt), +- v_src_palette, +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); ++ if (self->private_impl.f_n_bits < 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (self->private_impl.f_n_bits >= 3u) { ++ status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits); + goto exit; + } +- goto ok; ++ self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits); ++ self->private_impl.f_n_bits += 8u; + } +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; ++ v_tile_size_log2 = ((self->private_impl.f_bits & 7u) + 2u); ++ self->private_impl.f_bits >>= 3u; ++ self->private_impl.f_n_bits -= 3u; ++ self->private_impl.f_overall_tile_size_log2 = v_tile_size_log2; ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); +- if ((self->private_impl.f_header_image_descriptor & 32u) == 0u) { +- v_dst_y = ((uint32_t)(self->private_impl.f_height - 1u)); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } +- if ((self->private_impl.f_header_image_type & 8u) == 0u) { +- v_lit_length = self->private_impl.f_width; ++ if (status.repr) { ++ goto suspend; ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u); ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ if (status.repr) { ++ goto suspend; + } +- label__resume__continue:; + while (true) { +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)); +- while (v_dst_y < self->private_impl.f_height) { +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_dst_y); +- v_dst_start = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel); +- if (v_dst_start <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_start); +- } else { +- v_dst = wuffs_base__utility__empty_slice_u8(); +- } +- while (v_dst_x < self->private_impl.f_width) { +- if (self->private_impl.f_src_bytes_per_pixel > 0u) { +- if (v_lit_length > 0u) { +- v_mark = ((uint64_t)(iop_a_src - io0_a_src)); +- v_num_pixels64 = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(self->private_impl.f_src_bytes_per_pixel))); +- v_num_pixels32 = ((uint32_t)(wuffs_base__u64__min(v_num_pixels64, ((uint64_t)(v_lit_length))))); +- v_num_dst_bytes = (((uint64_t)(v_num_pixels32)) * v_dst_bytes_per_pixel); +- v_num_src_bytes = (v_num_pixels32 * self->private_impl.f_src_bytes_per_pixel); +- self->private_data.s_do_decode_frame[0].scratch = v_num_src_bytes; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (self->private_data.s_do_decode_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) { +- self->private_data.s_do_decode_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src)); +- iop_a_src = io2_a_src; +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- iop_a_src += self->private_data.s_do_decode_frame[0].scratch; +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); +- if (v_num_dst_bytes <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_num_dst_bytes); +- } else { +- v_dst = wuffs_base__utility__empty_slice_u8(); +- } +- v_dst_x += v_num_pixels32; +- v_lit_length = (((uint32_t)(v_lit_length - v_num_pixels32)) & 65535u); +- if (v_lit_length > 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3); +- goto label__resume__continue; +- } +- } else if (v_run_length > 0u) { +- v_run_length -= 1u; +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_scratch_bytes_per_pixel)); +- if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); +- } +- v_dst_x += 1u; +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4); +- goto label__resume__continue; +- } +- if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) { +- v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u); +- iop_a_src += 1u; +- if ((v_lit_length + v_dst_x) > self->private_impl.f_width) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); +- goto exit; +- } +- } else { +- if (self->private_impl.f_src_bytes_per_pixel == 1u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); +- goto label__resume__continue; +- } +- v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); +- iop_a_src += 1u; +- self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- } else if (self->private_impl.f_src_bytes_per_pixel == 3u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); +- goto label__resume__continue; +- } +- v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); +- iop_a_src += 1u; +- self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7); +- goto label__resume__continue; +- } +- v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); +- iop_a_src += 1u; +- self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- self->private_data.f_scratch[3u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- } +- if ((v_run_length + v_dst_x) > self->private_impl.f_width) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); +- goto exit; +- } +- } +- } +- } else { +- if (v_lit_length > 0u) { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8); +- goto label__resume__continue; +- } +- v_c = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2u; +- v_c5 = (31u & (v_c >> 0u)); +- self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 5u)); +- self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 10u)); +- self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- self->private_data.f_scratch[3u] = 255u; +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, 4)); +- if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); +- } +- v_dst_x += 1u; +- v_lit_length -= 1u; +- } else if (v_run_length > 0u) { +- v_run_length -= 1u; +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_scratch_bytes_per_pixel)); +- if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); +- } +- v_dst_x += 1u; +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); +- goto label__resume__continue; +- } +- if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) { +- v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u); +- iop_a_src += 1u; +- if ((v_lit_length + v_dst_x) > self->private_impl.f_width) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); +- goto exit; +- } +- } else { +- if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); +- goto label__resume__continue; +- } +- v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u); +- iop_a_src += 1u; +- v_c = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); +- iop_a_src += 2u; +- v_c5 = (31u & (v_c >> 0u)); +- self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 5u)); +- self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- v_c5 = (31u & (v_c >> 10u)); +- self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u)))); +- self->private_data.f_scratch[3u] = 255u; +- if ((v_run_length + v_dst_x) > self->private_impl.f_width) { +- status = wuffs_base__make_status(wuffs_tga__error__bad_run_length_encoding); +- goto exit; +- } +- } +- } +- } +- } +- v_dst_x = 0u; +- if ((self->private_impl.f_header_image_descriptor & 32u) == 0u) { +- v_dst_y -= 1u; +- } else { +- v_dst_y += 1u; ++ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- if ((self->private_impl.f_header_image_type & 8u) == 0u) { +- v_lit_length = self->private_impl.f_width; ++ wuffs_base__status t_2 = wuffs_webp__decoder__decode_pixels(self, ++ wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))), ++ a_src, ++ ((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2), ++ ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2), ++ wuffs_base__utility__empty_slice_u8(), ++ 0u); ++ v_status = t_2; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; + } + } +- break; ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ } ++ self->private_impl.f_overall_n_huffman_groups = 1u; ++ if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len)))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ v_hg_pixels = wuffs_base__slice_u8__subslice_ij(a_workbuf, ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])), ++ ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))); ++ v_n = ((uint64_t)((((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2) * ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2) * 4u))); ++ if (v_n > ((uint64_t)(v_hg_pixels.len))) { ++ status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length); ++ goto exit; ++ } ++ v_p = wuffs_base__slice_u8__subslice_j(v_hg_pixels, v_n); ++ while (((uint64_t)(v_p.len)) >= 4u) { ++ if (v_p.ptr[2u] != 0u) { ++ status = wuffs_base__make_status(wuffs_webp__error__unsupported_number_of_huffman_groups); ++ goto exit; ++ } ++ v_hg_plus_1 = (((uint32_t)(v_p.ptr[1u])) + 1u); ++ if (self->private_impl.f_overall_n_huffman_groups < v_hg_plus_1) { ++ self->private_impl.f_overall_n_huffman_groups = v_hg_plus_1; ++ } ++ v_p = wuffs_base__slice_u8__subslice_i(v_p, 4u); + } +- self->private_impl.f_call_sequence = 96u; + + ok: +- self->private_impl.p_do_decode_frame[0] = 0; ++ self->private_impl.p_decode_hg_table = 0; + goto exit; + } + + goto suspend; + suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_frame[0].v_dst_bytes_per_pixel = v_dst_bytes_per_pixel; +- self->private_data.s_do_decode_frame[0].v_dst_x = v_dst_x; +- self->private_data.s_do_decode_frame[0].v_dst_y = v_dst_y; +- self->private_data.s_do_decode_frame[0].v_mark = v_mark; +- self->private_data.s_do_decode_frame[0].v_num_pixels32 = v_num_pixels32; +- self->private_data.s_do_decode_frame[0].v_lit_length = v_lit_length; +- self->private_data.s_do_decode_frame[0].v_run_length = v_run_length; +- self->private_data.s_do_decode_frame[0].v_num_dst_bytes = v_num_dst_bytes; ++ self->private_impl.p_decode_hg_table = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_hg_table.v_tile_size_log2 = v_tile_size_log2; + + goto exit; + exit: +@@ -60254,12 +75193,117 @@ wuffs_tga__decoder__do_decode_frame( + return status; + } + +-// -------- func tga.decoder.frame_dirty_rect ++// -------- func webp.decoder.decode_pixels ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__decode_pixels( ++ wuffs_webp__decoder* self, ++ wuffs_base__slice_u8 a_dst, ++ wuffs_base__io_buffer* a_src, ++ uint32_t a_width, ++ uint32_t a_height, ++ wuffs_base__slice_u8 a_tile_data, ++ uint32_t a_tile_size_log2) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ uint32_t v_i = 0; ++ uint32_t v_n = 0; ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_pixels; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ v_i = 0u; ++ v_n = (((uint32_t)(1u)) << self->private_impl.f_color_cache_bits); ++ while (v_i < v_n) { ++ self->private_data.f_color_cache[v_i] = 0u; ++ v_i += 1u; ++ } ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ status = wuffs_webp__decoder__decode_pixels_slow(self, ++ a_dst, ++ a_src, ++ a_width, ++ a_height, ++ a_tile_data, ++ a_tile_size_log2); ++ if (status.repr) { ++ goto suspend; ++ } ++ ++ goto ok; ++ ok: ++ self->private_impl.p_decode_pixels = 0; ++ goto exit; ++ } ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_pixels = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ ++ goto exit; ++ exit: ++ return status; ++} ++ ++// -------- func webp.decoder.swizzle ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_webp__decoder__swizzle( ++ wuffs_webp__decoder* self, ++ wuffs_base__pixel_buffer* a_dst, ++ wuffs_base__slice_u8 a_src, ++ wuffs_base__pixel_blend a_blend) { ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ wuffs_base__pixel_format v_dst_pixfmt = {0}; ++ uint32_t v_dst_bits_per_pixel = 0; ++ uint32_t v_dst_bytes_per_pixel = 0; ++ uint64_t v_dst_bytes_per_row = 0; ++ wuffs_base__slice_u8 v_dst_palette = {0}; ++ wuffs_base__table_u8 v_tab = {0}; ++ uint64_t v_src_bytes_per_row = 0; ++ wuffs_base__slice_u8 v_dst = {0}; ++ uint32_t v_y = 0; ++ ++ v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, ++ wuffs_base__pixel_buffer__pixel_format(a_dst), ++ wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_palette, 1024)), ++ wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt), ++ wuffs_base__utility__empty_slice_u8(), ++ a_blend); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ return wuffs_private_impl__status__ensure_not_a_suspension(v_status); ++ } ++ v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); ++ v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); ++ if ((v_dst_bits_per_pixel & 7u) != 0u) { ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); ++ } ++ v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u); ++ v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel))); ++ v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_palette, 1024)); ++ v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); ++ v_src_bytes_per_row = ((uint64_t)((self->private_impl.f_width * 4u))); ++ while (v_src_bytes_per_row <= ((uint64_t)(a_src.len))) { ++ v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y); ++ if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) { ++ v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row); ++ } ++ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__slice_u8__subslice_j(a_src, v_src_bytes_per_row)); ++ a_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_bytes_per_row); ++ v_y += 1u; ++ } ++ return wuffs_base__make_status(NULL); ++} ++ ++// -------- func webp.decoder.frame_dirty_rect + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_tga__decoder__frame_dirty_rect( +- const wuffs_tga__decoder* self) { ++wuffs_webp__decoder__frame_dirty_rect( ++ const wuffs_webp__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_rect_ie_u32(); + } +@@ -60275,12 +75319,12 @@ wuffs_tga__decoder__frame_dirty_rect( + self->private_impl.f_height); + } + +-// -------- func tga.decoder.num_animation_loops ++// -------- func webp.decoder.num_animation_loops + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_tga__decoder__num_animation_loops( +- const wuffs_tga__decoder* self) { ++wuffs_webp__decoder__num_animation_loops( ++ const wuffs_webp__decoder* self) { + if (!self) { + return 0; + } +@@ -60292,12 +75336,12 @@ wuffs_tga__decoder__num_animation_loops( + return 0u; + } + +-// -------- func tga.decoder.num_decoded_frame_configs ++// -------- func webp.decoder.num_decoded_frame_configs + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__num_decoded_frame_configs( +- const wuffs_tga__decoder* self) { ++wuffs_webp__decoder__num_decoded_frame_configs( ++ const wuffs_webp__decoder* self) { + if (!self) { + return 0; + } +@@ -60312,12 +75356,12 @@ wuffs_tga__decoder__num_decoded_frame_configs( + return 0u; + } + +-// -------- func tga.decoder.num_decoded_frames ++// -------- func webp.decoder.num_decoded_frames + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__num_decoded_frames( +- const wuffs_tga__decoder* self) { ++wuffs_webp__decoder__num_decoded_frames( ++ const wuffs_webp__decoder* self) { + if (!self) { + return 0; + } +@@ -60332,12 +75376,12 @@ wuffs_tga__decoder__num_decoded_frames( + return 0u; + } + +-// -------- func tga.decoder.restart_frame ++// -------- func webp.decoder.restart_frame + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__restart_frame( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__restart_frame( ++ wuffs_webp__decoder* self, + uint64_t a_index, + uint64_t a_io_position) { + if (!self) { +@@ -60353,31 +75397,30 @@ wuffs_tga__decoder__restart_frame( + if (self->private_impl.f_call_sequence < 32u) { + return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); + } +- if (a_index != 0u) { ++ if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) { + return wuffs_base__make_status(wuffs_base__error__bad_argument); + } + self->private_impl.f_call_sequence = 40u; +- self->private_impl.f_frame_config_io_position = a_io_position; + return wuffs_base__make_status(NULL); + } + +-// -------- func tga.decoder.set_report_metadata ++// -------- func webp.decoder.set_report_metadata + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_tga__decoder__set_report_metadata( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__set_report_metadata( ++ wuffs_webp__decoder* self, + uint32_t a_fourcc, + bool a_report) { + return wuffs_base__make_empty_struct(); + } + +-// -------- func tga.decoder.tell_me_more ++// -------- func webp.decoder.tell_me_more + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_tga__decoder__tell_me_more( +- wuffs_tga__decoder* self, ++wuffs_webp__decoder__tell_me_more( ++ wuffs_webp__decoder* self, + wuffs_base__io_buffer* a_dst, + wuffs_base__more_information* a_minfo, + wuffs_base__io_buffer* a_src) { +@@ -60415,29 +75458,12 @@ wuffs_tga__decoder__tell_me_more( + return status; + } + +-// -------- func tga.decoder.history_retain_length +- +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_tga__decoder__history_retain_length( +- const wuffs_tga__decoder* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; +- } +- +- return 0u; +-} +- +-// -------- func tga.decoder.workbuf_len ++// -------- func webp.decoder.workbuf_len + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_tga__decoder__workbuf_len( +- const wuffs_tga__decoder* self) { ++wuffs_webp__decoder__workbuf_len( ++ const wuffs_webp__decoder* self) { + if (!self) { + return wuffs_base__utility__empty_range_ii_u64(); + } +@@ -60446,92 +75472,66 @@ wuffs_tga__decoder__workbuf_len( + return wuffs_base__utility__empty_range_ii_u64(); + } + +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ return wuffs_base__utility__make_range_ii_u64(((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[3u])), ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[3u]))); + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) + + // ---------------- Status Codes Implementations + +-const char wuffs_wbmp__error__bad_header[] = "#wbmp: bad header"; +-const char wuffs_wbmp__error__truncated_input[] = "#wbmp: truncated input"; +- + // ---------------- Private Consts + +-// ---------------- Private Initializer Prototypes ++#define WUFFS_XXHASH32__XXH_PRIME32_1 2654435761u + +-// ---------------- Private Function Prototypes ++#define WUFFS_XXHASH32__XXH_PRIME32_2 2246822519u + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_image_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src); ++#define WUFFS_XXHASH32__XXH_PRIME32_3 3266489917u + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_frame_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src); ++#define WUFFS_XXHASH32__XXH_PRIME32_4 668265263u ++ ++#define WUFFS_XXHASH32__XXH_PRIME32_5 374761393u ++ ++#define WUFFS_XXHASH32__INITIAL_V0 606290984u ++ ++#define WUFFS_XXHASH32__INITIAL_V1 2246822519u ++ ++#define WUFFS_XXHASH32__INITIAL_V2 0u ++ ++#define WUFFS_XXHASH32__INITIAL_V3 1640531535u ++ ++// ---------------- Private Initializer Prototypes ++ ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_frame( +- wuffs_wbmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts); ++static wuffs_base__empty_struct ++wuffs_xxhash32__hasher__up( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x); + + // ---------------- VTables + +-const wuffs_base__image_decoder__func_ptrs +-wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder = { +- (wuffs_base__status(*)(void*, +- wuffs_base__pixel_buffer*, +- wuffs_base__io_buffer*, +- wuffs_base__pixel_blend, +- wuffs_base__slice_u8, +- wuffs_base__decode_frame_options*))(&wuffs_wbmp__decoder__decode_frame), +- (wuffs_base__status(*)(void*, +- wuffs_base__frame_config*, +- wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_frame_config), +- (wuffs_base__status(*)(void*, +- wuffs_base__image_config*, +- wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_image_config), +- (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_wbmp__decoder__frame_dirty_rect), ++const wuffs_base__hasher_u32__func_ptrs ++wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = { ++ (uint32_t(*)(const void*))(&wuffs_xxhash32__hasher__checksum_u32), + (uint64_t(*)(const void*, +- uint32_t))(&wuffs_wbmp__decoder__get_quirk), +- (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__history_retain_length), +- (uint32_t(*)(const void*))(&wuffs_wbmp__decoder__num_animation_loops), +- (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frame_configs), +- (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frames), +- (wuffs_base__status(*)(void*, +- uint64_t, +- uint64_t))(&wuffs_wbmp__decoder__restart_frame), ++ uint32_t))(&wuffs_xxhash32__hasher__get_quirk), + (wuffs_base__status(*)(void*, + uint32_t, +- uint64_t))(&wuffs_wbmp__decoder__set_quirk), ++ uint64_t))(&wuffs_xxhash32__hasher__set_quirk), + (wuffs_base__empty_struct(*)(void*, +- uint32_t, +- bool))(&wuffs_wbmp__decoder__set_report_metadata), +- (wuffs_base__status(*)(void*, +- wuffs_base__io_buffer*, +- wuffs_base__more_information*, +- wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__tell_me_more), +- (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_wbmp__decoder__workbuf_len), ++ wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update), ++ (uint32_t(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update_u32), + }; + + // ---------------- Initializer Implementations + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_wbmp__decoder__initialize( +- wuffs_wbmp__decoder* self, ++wuffs_xxhash32__hasher__initialize( ++ wuffs_xxhash32__hasher* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ +@@ -60569,22 +75569,22 @@ wuffs_wbmp__decoder__initialize( + } + + self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name = +- wuffs_base__image_decoder__vtable_name; +- self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers = +- (const void*)(&wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder); ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = ++ wuffs_base__hasher_u32__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = ++ (const void*)(&wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32); + return wuffs_base__make_status(NULL); + } + +-wuffs_wbmp__decoder* +-wuffs_wbmp__decoder__alloc(void) { +- wuffs_wbmp__decoder* x = +- (wuffs_wbmp__decoder*)(calloc(sizeof(wuffs_wbmp__decoder), 1)); ++wuffs_xxhash32__hasher* ++wuffs_xxhash32__hasher__alloc(void) { ++ wuffs_xxhash32__hasher* x = ++ (wuffs_xxhash32__hasher*)(calloc(1, sizeof(wuffs_xxhash32__hasher))); + if (!x) { + return NULL; + } +- if (wuffs_wbmp__decoder__initialize( +- x, sizeof(wuffs_wbmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ if (wuffs_xxhash32__hasher__initialize( ++ x, sizeof(wuffs_xxhash32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } +@@ -60592,18 +75592,18 @@ wuffs_wbmp__decoder__alloc(void) { + } + + size_t +-sizeof__wuffs_wbmp__decoder(void) { +- return sizeof(wuffs_wbmp__decoder); ++sizeof__wuffs_xxhash32__hasher(void) { ++ return sizeof(wuffs_xxhash32__hasher); + } + + // ---------------- Function Implementations + +-// -------- func wbmp.decoder.get_quirk ++// -------- func xxhash32.hasher.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__get_quirk( +- const wuffs_wbmp__decoder* self, ++wuffs_xxhash32__hasher__get_quirk( ++ const wuffs_xxhash32__hasher* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -60616,12 +75616,12 @@ wuffs_wbmp__decoder__get_quirk( + return 0u; + } + +-// -------- func wbmp.decoder.set_quirk ++// -------- func xxhash32.hasher.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__set_quirk( +- wuffs_wbmp__decoder* self, ++wuffs_xxhash32__hasher__set_quirk( ++ wuffs_xxhash32__hasher* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -60637,627 +75637,387 @@ wuffs_wbmp__decoder__set_quirk( + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func wbmp.decoder.decode_image_config ++// -------- func xxhash32.hasher.update + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_image_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct ++wuffs_xxhash32__hasher__update( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return wuffs_base__make_empty_struct(); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 1)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_image_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } +- +- ok: +- self->private_impl.p_decode_image_config[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_empty_struct(); + } +- return status; +-} +- +-// -------- func wbmp.decoder.do_decode_image_config +- +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_image_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__image_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); + +- uint8_t v_c = 0; +- uint32_t v_i = 0; +- uint32_t v_p = 0; +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++ wuffs_base__slice_u8 v_remaining = {0}; + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config[0]; +- if (coro_susp_point) { +- v_i = self->private_data.s_do_decode_image_config[0].v_i; +- v_p = self->private_data.s_do_decode_image_config[0].v_p; ++ if ((self->private_impl.f_length_modulo_u32 == 0u) && ! self->private_impl.f_length_overflows_u32) { ++ self->private_impl.f_v0 = 606290984u; ++ self->private_impl.f_v1 = 2246822519u; ++ self->private_impl.f_v2 = 0u; ++ self->private_impl.f_v3 = 1640531535u; + } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- if (self->private_impl.f_call_sequence != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- goto exit; +- } +- v_i = 0u; +- while (v_i < 2u) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_0 = *iop_a_src++; +- v_c = t_0; +- } +- if (v_c != 0u) { +- status = wuffs_base__make_status(wuffs_wbmp__error__bad_header); +- goto exit; +- } +- v_i += 1u; +- } +- v_i = 0u; +- while (v_i < 2u) { +- v_p = 0u; +- while (true) { +- { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); +- if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- goto suspend; +- } +- uint8_t t_1 = *iop_a_src++; +- v_c = t_1; +- } +- v_p |= ((uint32_t)((v_c & 127u))); +- if ((v_c >> 7u) == 0u) { +- break; +- } else if (v_p > 131071u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension); +- goto exit; +- } +- v_p <<= 7u; +- } +- if (v_i == 0u) { +- self->private_impl.f_width = v_p; +- } else { +- self->private_impl.f_height = v_p; +- } +- v_i += 1u; +- } +- self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))); +- if (a_dst != NULL) { +- wuffs_base__image_config__set( +- a_dst, +- 2198077448u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height, +- self->private_impl.f_frame_config_io_position, +- true); ++ while (((uint64_t)(a_x.len)) > 0u) { ++ v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); ++ if (((uint64_t)(a_x.len)) > 16777216u) { ++ v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 16777216u); ++ a_x = wuffs_base__slice_u8__subslice_j(a_x, 16777216u); + } +- self->private_impl.f_call_sequence = 32u; +- +- goto ok; +- ok: +- self->private_impl.p_do_decode_image_config[0] = 0; +- goto exit; +- } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_image_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_image_config[0].v_i = v_i; +- self->private_data.s_do_decode_image_config[0].v_p = v_p; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ wuffs_xxhash32__hasher__up(self, a_x); ++ a_x = v_remaining; + } +- +- return status; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func wbmp.decoder.decode_frame_config ++// -------- func xxhash32.hasher.update_u32 + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_frame_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_xxhash32__hasher__update_u32( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return 0; + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 2)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); +- } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; +- +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame_config(self, a_dst, a_src); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } +- +- ok: +- self->private_impl.p_decode_frame_config[0] = 0; +- goto exit; ++ return 0; + } + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0; +- +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; ++ wuffs_xxhash32__hasher__update(self, a_x); ++ return wuffs_xxhash32__hasher__checksum_u32(self); + } + +-// -------- func wbmp.decoder.do_decode_frame_config ++// -------- func xxhash32.hasher.up + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_frame_config( +- wuffs_wbmp__decoder* self, +- wuffs_base__frame_config* a_dst, +- wuffs_base__io_buffer* a_src) { +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } +- +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++static wuffs_base__empty_struct ++wuffs_xxhash32__hasher__up( ++ wuffs_xxhash32__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint32_t v_new_lmu = 0; ++ uint32_t v_buf_u32 = 0; ++ uint32_t v_buf_len = 0; ++ uint32_t v_v0 = 0; ++ uint32_t v_v1 = 0; ++ uint32_t v_v2 = 0; ++ uint32_t v_v3 = 0; ++ wuffs_base__slice_u8 v_p = {0}; + +- if (self->private_impl.f_call_sequence == 32u) { +- } else if (self->private_impl.f_call_sequence < 32u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_wbmp__decoder__do_decode_image_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else if (self->private_impl.f_call_sequence == 40u) { +- if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) { +- status = wuffs_base__make_status(wuffs_base__error__bad_restart); +- goto exit; +- } +- } else if (self->private_impl.f_call_sequence == 64u) { +- self->private_impl.f_call_sequence = 96u; +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; ++ v_new_lmu = ((uint32_t)(self->private_impl.f_length_modulo_u32 + ((uint32_t)(((uint64_t)(a_x.len)))))); ++ self->private_impl.f_length_overflows_u32 = ((v_new_lmu < self->private_impl.f_length_modulo_u32) || self->private_impl.f_length_overflows_u32); ++ self->private_impl.f_length_modulo_u32 = v_new_lmu; ++ while (true) { ++ if (self->private_impl.f_buf_len >= 16u) { ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u)); ++ v_v0 = ((uint32_t)(self->private_impl.f_v0 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u)); ++ self->private_impl.f_v0 = ((uint32_t)(v_v0 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u)); ++ v_v1 = ((uint32_t)(self->private_impl.f_v1 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u)); ++ self->private_impl.f_v1 = ((uint32_t)(v_v1 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u)); ++ v_v2 = ((uint32_t)(self->private_impl.f_v2 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u)); ++ self->private_impl.f_v2 = ((uint32_t)(v_v2 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[12u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[13u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[14u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[15u])) << 24u)); ++ v_v3 = ((uint32_t)(self->private_impl.f_v3 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u)); ++ self->private_impl.f_v3 = ((uint32_t)(v_v3 * 2654435761u)); ++ self->private_impl.f_buf_len = 0u; ++ break; + } +- if (a_dst != NULL) { +- wuffs_base__frame_config__set( +- a_dst, +- wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height), +- ((wuffs_base__flicks)(0u)), +- 0u, +- self->private_impl.f_frame_config_io_position, +- 0u, +- true, +- false, +- 4278190080u); ++ if (((uint64_t)(a_x.len)) <= 0u) { ++ return wuffs_base__make_empty_struct(); + } +- self->private_impl.f_call_sequence = 64u; +- +- ok: +- self->private_impl.p_do_decode_frame_config[0] = 0; +- goto exit; ++ self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ self->private_impl.f_buf_len += 1u; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); + } +- +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame_config[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ v_buf_len = ((uint32_t)(((uint8_t)(self->private_impl.f_buf_len & 15u)))); ++ v_v0 = self->private_impl.f_v0; ++ v_v1 = self->private_impl.f_v1; ++ v_v2 = self->private_impl.f_v2; ++ v_v3 = self->private_impl.f_v3; ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 16; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16)); ++ while (v_p.ptr < i_end0_p) { ++ v_buf_u32 = (((uint32_t)(v_p.ptr[0u])) | ++ (((uint32_t)(v_p.ptr[1u])) << 8u) | ++ (((uint32_t)(v_p.ptr[2u])) << 16u) | ++ (((uint32_t)(v_p.ptr[3u])) << 24u)); ++ v_v0 = ((uint32_t)(v_v0 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u)); ++ v_v0 = ((uint32_t)(v_v0 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(v_p.ptr[4u])) | ++ (((uint32_t)(v_p.ptr[5u])) << 8u) | ++ (((uint32_t)(v_p.ptr[6u])) << 16u) | ++ (((uint32_t)(v_p.ptr[7u])) << 24u)); ++ v_v1 = ((uint32_t)(v_v1 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u)); ++ v_v1 = ((uint32_t)(v_v1 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(v_p.ptr[8u])) | ++ (((uint32_t)(v_p.ptr[9u])) << 8u) | ++ (((uint32_t)(v_p.ptr[10u])) << 16u) | ++ (((uint32_t)(v_p.ptr[11u])) << 24u)); ++ v_v2 = ((uint32_t)(v_v2 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u)); ++ v_v2 = ((uint32_t)(v_v2 * 2654435761u)); ++ v_buf_u32 = (((uint32_t)(v_p.ptr[12u])) | ++ (((uint32_t)(v_p.ptr[13u])) << 8u) | ++ (((uint32_t)(v_p.ptr[14u])) << 16u) | ++ (((uint32_t)(v_p.ptr[15u])) << 24u)); ++ v_v3 = ((uint32_t)(v_v3 + ((uint32_t)(v_buf_u32 * 2246822519u)))); ++ v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u)); ++ v_v3 = ((uint32_t)(v_v3 * 2654435761u)); ++ v_p.ptr += 16; ++ } ++ v_p.len = 1; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end1_p) { ++ self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u]; ++ v_buf_len = ((v_buf_len + 1u) & 15u); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; + } +- +- return status; ++ self->private_impl.f_buf_len = ((uint8_t)(v_buf_len)); ++ self->private_impl.f_v0 = v_v0; ++ self->private_impl.f_v1 = v_v1; ++ self->private_impl.f_v2 = v_v2; ++ self->private_impl.f_v3 = v_v3; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func wbmp.decoder.decode_frame ++// -------- func xxhash32.hasher.checksum_u32 + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__decode_frame( +- wuffs_wbmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { ++WUFFS_BASE__MAYBE_STATIC uint32_t ++wuffs_xxhash32__hasher__checksum_u32( ++ const wuffs_xxhash32__hasher* self) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return 0; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return 0; ++ } ++ ++ uint32_t v_ret = 0; ++ uint32_t v_i = 0; ++ uint32_t v_n = 0; ++ uint32_t v_buf_u32 = 0; ++ ++ if ((self->private_impl.f_length_modulo_u32 >= 16u) || self->private_impl.f_length_overflows_u32) { ++ v_ret += (((uint32_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 31u)); ++ v_ret += (((uint32_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 25u)); ++ v_ret += (((uint32_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 20u)); ++ v_ret += (((uint32_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 14u)); ++ v_ret += self->private_impl.f_length_modulo_u32; ++ } else { ++ v_ret += 374761393u; ++ v_ret += self->private_impl.f_length_modulo_u32; ++ } ++ v_n = 16u; ++ v_n = wuffs_base__u32__min(v_n, ((uint32_t)(self->private_impl.f_buf_len))); ++ if (4u <= v_n) { ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u)); ++ v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); ++ v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); ++ v_ret *= 668265263u; ++ v_i = 4u; ++ } ++ if (8u <= v_n) { ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u)); ++ v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); ++ v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); ++ v_ret *= 668265263u; ++ v_i = 8u; + } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ if (12u <= v_n) { ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) | ++ (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u)); ++ v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); ++ v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); ++ v_ret *= 668265263u; ++ v_i = 12u; + } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 3)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ while (v_i < v_n) { ++ v_ret += ((uint32_t)(((uint32_t)(self->private_impl.f_buf_data[v_i])) * 374761393u)); ++ v_ret = (((uint32_t)(v_ret << 11u)) | (v_ret >> 21u)); ++ v_ret *= 2654435761u; ++ v_i += 1u; + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); +- +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- +- uint32_t coro_susp_point = self->private_impl.p_decode_frame[0]; +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ v_ret ^= (v_ret >> 15u); ++ v_ret *= 2246822519u; ++ v_ret ^= (v_ret >> 13u); ++ v_ret *= 3266489917u; ++ v_ret ^= (v_ret >> 16u); ++ return v_ret; ++} + +- while (true) { +- { +- wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame(self, +- a_dst, +- a_src, +- a_blend, +- a_workbuf, +- a_opts); +- v_status = t_0; +- } +- if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { +- status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input); +- goto exit; +- } +- status = v_status; +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); +- } ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) + +- ok: +- self->private_impl.p_decode_frame[0] = 0; +- goto exit; +- } ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) + +- goto suspend; +- suspend: +- self->private_impl.p_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0; ++// ---------------- Status Codes Implementations + +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- } +- return status; +-} ++// ---------------- Private Consts + +-// -------- func wbmp.decoder.do_decode_frame ++#define WUFFS_XXHASH64__XXH_PRIME64_1 11400714785074694791u + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__status +-wuffs_wbmp__decoder__do_decode_frame( +- wuffs_wbmp__decoder* self, +- wuffs_base__pixel_buffer* a_dst, +- wuffs_base__io_buffer* a_src, +- wuffs_base__pixel_blend a_blend, +- wuffs_base__slice_u8 a_workbuf, +- wuffs_base__decode_frame_options* a_opts) { +- wuffs_base__status status = wuffs_base__make_status(NULL); ++#define WUFFS_XXHASH64__XXH_PRIME64_2 14029467366897019727u + +- wuffs_base__status v_status = wuffs_base__make_status(NULL); +- wuffs_base__pixel_format v_dst_pixfmt = {0}; +- uint32_t v_dst_bits_per_pixel = 0; +- uint64_t v_dst_bytes_per_pixel = 0; +- uint64_t v_dst_x_in_bytes = 0; +- uint32_t v_dst_x = 0; +- uint32_t v_dst_y = 0; +- wuffs_base__table_u8 v_tab = {0}; +- wuffs_base__slice_u8 v_dst = {0}; +- uint8_t v_src[1] = {0}; +- uint8_t v_c = 0; ++#define WUFFS_XXHASH64__XXH_PRIME64_3 1609587929392839161u + +- const uint8_t* iop_a_src = NULL; +- const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; +- if (a_src && a_src->data.ptr) { +- io0_a_src = a_src->data.ptr; +- io1_a_src = io0_a_src + a_src->meta.ri; +- iop_a_src = io1_a_src; +- io2_a_src = io0_a_src + a_src->meta.wi; +- } ++#define WUFFS_XXHASH64__XXH_PRIME64_4 9650029242287828579u + +- uint32_t coro_susp_point = self->private_impl.p_do_decode_frame[0]; +- if (coro_susp_point) { +- v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame[0].v_dst_bytes_per_pixel; +- v_dst_x = self->private_data.s_do_decode_frame[0].v_dst_x; +- v_dst_y = self->private_data.s_do_decode_frame[0].v_dst_y; +- memcpy(v_src, self->private_data.s_do_decode_frame[0].v_src, sizeof(v_src)); +- v_c = self->private_data.s_do_decode_frame[0].v_c; +- } +- switch (coro_susp_point) { +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++#define WUFFS_XXHASH64__XXH_PRIME64_5 2870177450012600261u + +- if (self->private_impl.f_call_sequence == 64u) { +- } else if (self->private_impl.f_call_sequence < 64u) { +- if (a_src) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); +- status = wuffs_wbmp__decoder__do_decode_frame_config(self, NULL, a_src); +- if (a_src) { +- iop_a_src = a_src->data.ptr + a_src->meta.ri; +- } +- if (status.repr) { +- goto suspend; +- } +- } else { +- status = wuffs_base__make_status(wuffs_base__note__end_of_data); +- goto ok; +- } +- v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler, +- wuffs_base__pixel_buffer__pixel_format(a_dst), +- wuffs_base__pixel_buffer__palette(a_dst), +- wuffs_base__utility__make_pixel_format(536870920u), +- wuffs_base__utility__empty_slice_u8(), +- a_blend); +- if ( ! wuffs_base__status__is_ok(&v_status)) { +- status = v_status; +- if (wuffs_base__status__is_error(&status)) { +- goto exit; +- } else if (wuffs_base__status__is_suspension(&status)) { +- status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); +- goto exit; +- } +- goto ok; +- } +- v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst); +- v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt); +- if ((v_dst_bits_per_pixel & 7u) != 0u) { +- status = wuffs_base__make_status(wuffs_base__error__unsupported_option); +- goto exit; +- } +- v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u))); +- if (self->private_impl.f_width > 0u) { +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- while (v_dst_y < self->private_impl.f_height) { +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_dst_y); +- v_dst_x = 0u; +- while (v_dst_x < self->private_impl.f_width) { +- if ((v_dst_x & 7u) == 0u) { +- while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { +- status = wuffs_base__make_status(wuffs_base__suspension__short_read); +- WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); +- v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u); +- v_dst = wuffs_base__table_u8__row_u32(v_tab, v_dst_y); +- v_dst_x_in_bytes = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel); +- if (v_dst_x_in_bytes <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_x_in_bytes); +- } +- } +- v_c = wuffs_base__peek_u8be__no_bounds_check(iop_a_src); +- iop_a_src += 1u; +- } +- if ((v_c & 128u) == 0u) { +- v_src[0u] = 0u; +- } else { +- v_src[0u] = 255u; +- } +- v_c = ((uint8_t)((((uint32_t)(v_c)) << 1u))); +- wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__utility__empty_slice_u8(), wuffs_base__make_slice_u8(v_src, 1)); +- if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) { +- v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel); +- } +- v_dst_x += 1u; +- } +- v_dst_y += 1u; +- } +- } +- self->private_impl.f_call_sequence = 96u; ++#define WUFFS_XXHASH64__INITIAL_V0 6983438078262162902u + +- ok: +- self->private_impl.p_do_decode_frame[0] = 0; +- goto exit; +- } ++#define WUFFS_XXHASH64__INITIAL_V1 14029467366897019727u + +- goto suspend; +- suspend: +- self->private_impl.p_do_decode_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; +- self->private_data.s_do_decode_frame[0].v_dst_bytes_per_pixel = v_dst_bytes_per_pixel; +- self->private_data.s_do_decode_frame[0].v_dst_x = v_dst_x; +- self->private_data.s_do_decode_frame[0].v_dst_y = v_dst_y; +- memcpy(self->private_data.s_do_decode_frame[0].v_src, v_src, sizeof(v_src)); +- self->private_data.s_do_decode_frame[0].v_c = v_c; ++#define WUFFS_XXHASH64__INITIAL_V2 0u + +- goto exit; +- exit: +- if (a_src && a_src->data.ptr) { +- a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); +- } ++#define WUFFS_XXHASH64__INITIAL_V3 7046029288634856825u + +- return status; +-} ++// ---------------- Private Initializer Prototypes + +-// -------- func wbmp.decoder.frame_dirty_rect ++// ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32 +-wuffs_wbmp__decoder__frame_dirty_rect( +- const wuffs_wbmp__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_rect_ie_u32(); +- } ++static wuffs_base__empty_struct ++wuffs_xxhash64__hasher__up( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x); + +- return wuffs_base__utility__make_rect_ie_u32( +- 0u, +- 0u, +- self->private_impl.f_width, +- self->private_impl.f_height); +-} ++// ---------------- VTables + +-// -------- func wbmp.decoder.num_animation_loops ++const wuffs_base__hasher_u64__func_ptrs ++wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64 = { ++ (uint64_t(*)(const void*))(&wuffs_xxhash64__hasher__checksum_u64), ++ (uint64_t(*)(const void*, ++ uint32_t))(&wuffs_xxhash64__hasher__get_quirk), ++ (wuffs_base__status(*)(void*, ++ uint32_t, ++ uint64_t))(&wuffs_xxhash64__hasher__set_quirk), ++ (wuffs_base__empty_struct(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update), ++ (uint64_t(*)(void*, ++ wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update_u64), ++}; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_wbmp__decoder__num_animation_loops( +- const wuffs_wbmp__decoder* self) { ++// ---------------- Initializer Implementations ++ ++wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT ++wuffs_xxhash64__hasher__initialize( ++ wuffs_xxhash64__hasher* self, ++ size_t sizeof_star_self, ++ uint64_t wuffs_version, ++ uint32_t options){ + if (!self) { +- return 0; ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (sizeof(*self) != sizeof_star_self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ } ++ if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || ++ (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { ++ return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); + } + +- return 0u; +-} ++ if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { ++ // The whole point of this if-check is to detect an uninitialized *self. ++ // We disable the warning on GCC. Clang-5.0 does not have this warning. ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" ++#endif ++ if (self->private_impl.magic != 0) { ++ return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ } ++#if !defined(__clang__) && defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ } else { ++ if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { ++ memset(self, 0, sizeof(*self)); ++ options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ } else { ++ memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ } ++ } + +-// -------- func wbmp.decoder.num_decoded_frame_configs ++ self->private_impl.magic = WUFFS_BASE__MAGIC; ++ self->private_impl.vtable_for__wuffs_base__hasher_u64.vtable_name = ++ wuffs_base__hasher_u64__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__hasher_u64.function_pointers = ++ (const void*)(&wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64); ++ return wuffs_base__make_status(NULL); ++} + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__num_decoded_frame_configs( +- const wuffs_wbmp__decoder* self) { +- if (!self) { +- return 0; ++wuffs_xxhash64__hasher* ++wuffs_xxhash64__hasher__alloc(void) { ++ wuffs_xxhash64__hasher* x = ++ (wuffs_xxhash64__hasher*)(calloc(1, sizeof(wuffs_xxhash64__hasher))); ++ if (!x) { ++ return NULL; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ if (wuffs_xxhash64__hasher__initialize( ++ x, sizeof(wuffs_xxhash64__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ free(x); ++ return NULL; + } ++ return x; ++} + +- if (self->private_impl.f_call_sequence > 32u) { +- return 1u; +- } +- return 0u; ++size_t ++sizeof__wuffs_xxhash64__hasher(void) { ++ return sizeof(wuffs_xxhash64__hasher); + } + +-// -------- func wbmp.decoder.num_decoded_frames ++// ---------------- Function Implementations ++ ++// -------- func xxhash64.hasher.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__num_decoded_frames( +- const wuffs_wbmp__decoder* self) { ++wuffs_xxhash64__hasher__get_quirk( ++ const wuffs_xxhash64__hasher* self, ++ uint32_t a_key) { + if (!self) { + return 0; + } +@@ -61266,20 +76026,17 @@ wuffs_wbmp__decoder__num_decoded_frames( + return 0; + } + +- if (self->private_impl.f_call_sequence > 64u) { +- return 1u; +- } + return 0u; + } + +-// -------- func wbmp.decoder.restart_frame ++// -------- func xxhash64.hasher.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__restart_frame( +- wuffs_wbmp__decoder* self, +- uint64_t a_index, +- uint64_t a_io_position) { ++wuffs_xxhash64__hasher__set_quirk( ++ wuffs_xxhash64__hasher* self, ++ uint32_t a_key, ++ uint64_t a_value) { + if (!self) { + return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } +@@ -61290,77 +76047,206 @@ wuffs_wbmp__decoder__restart_frame( + : wuffs_base__error__initialize_not_called); + } + +- if (self->private_impl.f_call_sequence < 32u) { +- return wuffs_base__make_status(wuffs_base__error__bad_call_sequence); +- } +- if (a_index != 0u) { +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- self->private_impl.f_call_sequence = 40u; +- self->private_impl.f_frame_config_io_position = a_io_position; +- return wuffs_base__make_status(NULL); ++ return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func wbmp.decoder.set_report_metadata ++// -------- func xxhash64.hasher.update + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_wbmp__decoder__set_report_metadata( +- wuffs_wbmp__decoder* self, +- uint32_t a_fourcc, +- bool a_report) { ++wuffs_xxhash64__hasher__update( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ if (!self) { ++ return wuffs_base__make_empty_struct(); ++ } ++ if (self->private_impl.magic != WUFFS_BASE__MAGIC) { ++ return wuffs_base__make_empty_struct(); ++ } ++ ++ if ((self->private_impl.f_length_modulo_u64 == 0u) && ! self->private_impl.f_length_overflows_u64) { ++ self->private_impl.f_v0 = 6983438078262162902u; ++ self->private_impl.f_v1 = 14029467366897019727u; ++ self->private_impl.f_v2 = 0u; ++ self->private_impl.f_v3 = 7046029288634856825u; ++ } ++ wuffs_xxhash64__hasher__up(self, a_x); + return wuffs_base__make_empty_struct(); + } + +-// -------- func wbmp.decoder.tell_me_more ++// -------- func xxhash64.hasher.update_u64 + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_wbmp__decoder__tell_me_more( +- wuffs_wbmp__decoder* self, +- wuffs_base__io_buffer* a_dst, +- wuffs_base__more_information* a_minfo, +- wuffs_base__io_buffer* a_src) { ++WUFFS_BASE__MAYBE_STATIC uint64_t ++wuffs_xxhash64__hasher__update_u64( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x) { + if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); ++ return 0; + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- if (!a_dst || !a_src) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__bad_argument); +- } +- if ((self->private_impl.active_coroutine != 0) && +- (self->private_impl.active_coroutine != 4)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; +- return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ return 0; + } +- self->private_impl.active_coroutine = 0; +- wuffs_base__status status = wuffs_base__make_status(NULL); + +- status = wuffs_base__make_status(wuffs_base__error__no_more_information); +- goto exit; ++ wuffs_xxhash64__hasher__update(self, a_x); ++ return wuffs_xxhash64__hasher__checksum_u64(self); ++} + +- goto ok; +- ok: +- goto exit; +- exit: +- if (wuffs_base__status__is_error(&status)) { +- self->private_impl.magic = WUFFS_BASE__DISABLED; ++// -------- func xxhash64.hasher.up ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__empty_struct ++wuffs_xxhash64__hasher__up( ++ wuffs_xxhash64__hasher* self, ++ wuffs_base__slice_u8 a_x) { ++ uint64_t v_new_lmu = 0; ++ uint64_t v_buf_u64 = 0; ++ uint32_t v_buf_len = 0; ++ uint64_t v_v0 = 0; ++ uint64_t v_v1 = 0; ++ uint64_t v_v2 = 0; ++ uint64_t v_v3 = 0; ++ wuffs_base__slice_u8 v_p = {0}; ++ ++ v_new_lmu = ((uint64_t)(self->private_impl.f_length_modulo_u64 + ((uint64_t)(a_x.len)))); ++ self->private_impl.f_length_overflows_u64 = ((v_new_lmu < self->private_impl.f_length_modulo_u64) || self->private_impl.f_length_overflows_u64); ++ self->private_impl.f_length_modulo_u64 = v_new_lmu; ++ while (true) { ++ if (self->private_impl.f_buf_len >= 32u) { ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u)); ++ v_v0 = ((uint64_t)(self->private_impl.f_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); ++ self->private_impl.f_v0 = ((uint64_t)(v_v0 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u)); ++ v_v1 = ((uint64_t)(self->private_impl.f_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); ++ self->private_impl.f_v1 = ((uint64_t)(v_v1 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u)); ++ v_v2 = ((uint64_t)(self->private_impl.f_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); ++ self->private_impl.f_v2 = ((uint64_t)(v_v2 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[24u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[25u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[26u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[27u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[28u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[29u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[30u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[31u])) << 56u)); ++ v_v3 = ((uint64_t)(self->private_impl.f_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); ++ self->private_impl.f_v3 = ((uint64_t)(v_v3 * 11400714785074694791u)); ++ self->private_impl.f_buf_len = 0u; ++ break; ++ } ++ if (((uint64_t)(a_x.len)) <= 0u) { ++ return wuffs_base__make_empty_struct(); ++ } ++ self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u]; ++ self->private_impl.f_buf_len += 1u; ++ a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); ++ } ++ v_buf_len = (self->private_impl.f_buf_len & 31u); ++ v_v0 = self->private_impl.f_v0; ++ v_v1 = self->private_impl.f_v1; ++ v_v2 = self->private_impl.f_v2; ++ v_v3 = self->private_impl.f_v3; ++ { ++ wuffs_base__slice_u8 i_slice_p = a_x; ++ v_p.ptr = i_slice_p.ptr; ++ v_p.len = 32; ++ const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32)); ++ while (v_p.ptr < i_end0_p) { ++ v_buf_u64 = (((uint64_t)(v_p.ptr[0u])) | ++ (((uint64_t)(v_p.ptr[1u])) << 8u) | ++ (((uint64_t)(v_p.ptr[2u])) << 16u) | ++ (((uint64_t)(v_p.ptr[3u])) << 24u) | ++ (((uint64_t)(v_p.ptr[4u])) << 32u) | ++ (((uint64_t)(v_p.ptr[5u])) << 40u) | ++ (((uint64_t)(v_p.ptr[6u])) << 48u) | ++ (((uint64_t)(v_p.ptr[7u])) << 56u)); ++ v_v0 = ((uint64_t)(v_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); ++ v_v0 = ((uint64_t)(v_v0 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(v_p.ptr[8u])) | ++ (((uint64_t)(v_p.ptr[9u])) << 8u) | ++ (((uint64_t)(v_p.ptr[10u])) << 16u) | ++ (((uint64_t)(v_p.ptr[11u])) << 24u) | ++ (((uint64_t)(v_p.ptr[12u])) << 32u) | ++ (((uint64_t)(v_p.ptr[13u])) << 40u) | ++ (((uint64_t)(v_p.ptr[14u])) << 48u) | ++ (((uint64_t)(v_p.ptr[15u])) << 56u)); ++ v_v1 = ((uint64_t)(v_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); ++ v_v1 = ((uint64_t)(v_v1 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(v_p.ptr[16u])) | ++ (((uint64_t)(v_p.ptr[17u])) << 8u) | ++ (((uint64_t)(v_p.ptr[18u])) << 16u) | ++ (((uint64_t)(v_p.ptr[19u])) << 24u) | ++ (((uint64_t)(v_p.ptr[20u])) << 32u) | ++ (((uint64_t)(v_p.ptr[21u])) << 40u) | ++ (((uint64_t)(v_p.ptr[22u])) << 48u) | ++ (((uint64_t)(v_p.ptr[23u])) << 56u)); ++ v_v2 = ((uint64_t)(v_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); ++ v_v2 = ((uint64_t)(v_v2 * 11400714785074694791u)); ++ v_buf_u64 = (((uint64_t)(v_p.ptr[24u])) | ++ (((uint64_t)(v_p.ptr[25u])) << 8u) | ++ (((uint64_t)(v_p.ptr[26u])) << 16u) | ++ (((uint64_t)(v_p.ptr[27u])) << 24u) | ++ (((uint64_t)(v_p.ptr[28u])) << 32u) | ++ (((uint64_t)(v_p.ptr[29u])) << 40u) | ++ (((uint64_t)(v_p.ptr[30u])) << 48u) | ++ (((uint64_t)(v_p.ptr[31u])) << 56u)); ++ v_v3 = ((uint64_t)(v_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); ++ v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); ++ v_v3 = ((uint64_t)(v_v3 * 11400714785074694791u)); ++ v_p.ptr += 32; ++ } ++ v_p.len = 1; ++ const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len); ++ while (v_p.ptr < i_end1_p) { ++ self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u]; ++ v_buf_len = ((v_buf_len + 1u) & 31u); ++ v_p.ptr += 1; ++ } ++ v_p.len = 0; + } +- return status; ++ self->private_impl.f_buf_len = v_buf_len; ++ self->private_impl.f_v0 = v_v0; ++ self->private_impl.f_v1 = v_v1; ++ self->private_impl.f_v2 = v_v2; ++ self->private_impl.f_v3 = v_v3; ++ return wuffs_base__make_empty_struct(); + } + +-// -------- func wbmp.decoder.history_retain_length ++// -------- func xxhash64.hasher.checksum_u64 + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_wbmp__decoder__history_retain_length( +- const wuffs_wbmp__decoder* self) { ++wuffs_xxhash64__hasher__checksum_u64( ++ const wuffs_xxhash64__hasher* self) { + if (!self) { + return 0; + } +@@ -61369,83 +76255,307 @@ wuffs_wbmp__decoder__history_retain_length( + return 0; + } + +- return 0u; +-} +- +-// -------- func wbmp.decoder.workbuf_len ++ uint64_t v_ret = 0; ++ uint64_t v_v0 = 0; ++ uint64_t v_v1 = 0; ++ uint64_t v_v2 = 0; ++ uint64_t v_v3 = 0; ++ uint32_t v_i = 0; ++ uint32_t v_i8 = 0; ++ uint32_t v_n = 0; ++ uint32_t v_buf_u32 = 0; ++ uint64_t v_buf_u64 = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 +-wuffs_wbmp__decoder__workbuf_len( +- const wuffs_wbmp__decoder* self) { +- if (!self) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ if ((self->private_impl.f_length_modulo_u64 >= 32u) || self->private_impl.f_length_overflows_u64) { ++ v_ret += (((uint64_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 63u)); ++ v_ret += (((uint64_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 57u)); ++ v_ret += (((uint64_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 52u)); ++ v_ret += (((uint64_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 46u)); ++ v_v0 = ((uint64_t)(self->private_impl.f_v0 * 14029467366897019727u)); ++ v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); ++ v_v0 *= 11400714785074694791u; ++ v_v1 = ((uint64_t)(self->private_impl.f_v1 * 14029467366897019727u)); ++ v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); ++ v_v1 *= 11400714785074694791u; ++ v_v2 = ((uint64_t)(self->private_impl.f_v2 * 14029467366897019727u)); ++ v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); ++ v_v2 *= 11400714785074694791u; ++ v_v3 = ((uint64_t)(self->private_impl.f_v3 * 14029467366897019727u)); ++ v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); ++ v_v3 *= 11400714785074694791u; ++ v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v0) * 11400714785074694791u)) + 9650029242287828579u)); ++ v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v1) * 11400714785074694791u)) + 9650029242287828579u)); ++ v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v2) * 11400714785074694791u)) + 9650029242287828579u)); ++ v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v3) * 11400714785074694791u)) + 9650029242287828579u)); ++ v_ret += self->private_impl.f_length_modulo_u64; ++ } else { ++ v_ret += 2870177450012600261u; ++ v_ret += self->private_impl.f_length_modulo_u64; + } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return wuffs_base__utility__empty_range_ii_u64(); ++ v_n = 32u; ++ v_n = wuffs_base__u32__min(v_n, self->private_impl.f_buf_len); ++ if (8u <= v_n) { ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u)); ++ v_buf_u64 *= 14029467366897019727u; ++ v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); ++ v_buf_u64 *= 11400714785074694791u; ++ v_ret ^= v_buf_u64; ++ v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); ++ v_ret *= 11400714785074694791u; ++ v_ret += 9650029242287828579u; ++ v_i = 8u; + } +- +- return wuffs_base__utility__make_range_ii_u64(0u, 0u); ++ if (16u <= v_n) { ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u)); ++ v_buf_u64 *= 14029467366897019727u; ++ v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); ++ v_buf_u64 *= 11400714785074694791u; ++ v_ret ^= v_buf_u64; ++ v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); ++ v_ret *= 11400714785074694791u; ++ v_ret += 9650029242287828579u; ++ v_i = 16u; ++ } ++ if (24u <= v_n) { ++ v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) | ++ (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) | ++ (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) | ++ (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) | ++ (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) | ++ (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) | ++ (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) | ++ (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u)); ++ v_buf_u64 *= 14029467366897019727u; ++ v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); ++ v_buf_u64 *= 11400714785074694791u; ++ v_ret ^= v_buf_u64; ++ v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); ++ v_ret *= 11400714785074694791u; ++ v_ret += 9650029242287828579u; ++ v_i = 24u; ++ } ++ if ((v_n & 4u) != 0u) { ++ v_i8 = (v_i & 24u); ++ v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 0u)])) | ++ (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 1u)])) << 8u) | ++ (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 2u)])) << 16u) | ++ (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 3u)])) << 24u)); ++ v_ret ^= ((uint64_t)(((uint64_t)(v_buf_u32)) * 11400714785074694791u)); ++ v_ret = (((uint64_t)(v_ret << 23u)) | (v_ret >> 41u)); ++ v_ret *= 14029467366897019727u; ++ v_ret += 1609587929392839161u; ++ v_i = (v_i8 + 4u); ++ } ++ while (v_i < v_n) { ++ v_ret ^= ((uint64_t)(((uint64_t)(self->private_impl.f_buf_data[v_i])) * 2870177450012600261u)); ++ v_ret = (((uint64_t)(v_ret << 11u)) | (v_ret >> 53u)); ++ v_ret *= 11400714785074694791u; ++ v_i += 1u; ++ } ++ v_ret ^= (v_ret >> 33u); ++ v_ret *= 14029467366897019727u; ++ v_ret ^= (v_ret >> 29u); ++ v_ret *= 1609587929392839161u; ++ v_ret ^= (v_ret >> 32u); ++ return ((uint64_t)(v_ret)); + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) + +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) + + // ---------------- Status Codes Implementations + +-// ---------------- Private Consts ++const char wuffs_xz__error__bad_bcj_offset[] = "#xz: bad BCJ offset"; ++const char wuffs_xz__error__bad_block_header[] = "#xz: bad block header"; ++const char wuffs_xz__error__bad_checksum[] = "#xz: bad checksum"; ++const char wuffs_xz__error__bad_filter[] = "#xz: bad filter"; ++const char wuffs_xz__error__bad_footer[] = "#xz: bad footer"; ++const char wuffs_xz__error__bad_header[] = "#xz: bad header"; ++const char wuffs_xz__error__bad_header_concatenated_stream[] = "#xz: bad header (concatenated stream)"; ++const char wuffs_xz__error__bad_index[] = "#xz: bad index"; ++const char wuffs_xz__error__bad_padding[] = "#xz: bad padding"; ++const char wuffs_xz__error__truncated_input[] = "#xz: truncated input"; ++const char wuffs_xz__error__unsupported_checksum_algorithm[] = "#xz: unsupported checksum algorithm"; ++const char wuffs_xz__error__unsupported_filter[] = "#xz: unsupported filter"; ++const char wuffs_xz__error__unsupported_filter_combination[] = "#xz: unsupported filter combination"; ++const char wuffs_xz__error__internal_error_inconsistent_bcj_filter_state[] = "#xz: internal error: inconsistent BCJ filter state"; + +-#define WUFFS_XXHASH32__XXH_PRIME32_1 2654435761 ++// ---------------- Private Consts + +-#define WUFFS_XXHASH32__XXH_PRIME32_2 2246822519 ++static const bool ++WUFFS_XZ__FILTER_04_X86_MASK_TO_ALLOWED_STATUS[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 1u, 1u, 1u, 0u, 1u, 0u, 0u, 0u, ++}; + +-#define WUFFS_XXHASH32__XXH_PRIME32_3 3266489917 ++static const uint8_t ++WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 1u, 2u, 2u, 3u, 3u, 3u, 3u, ++}; + +-#define WUFFS_XXHASH32__XXH_PRIME32_4 668265263 ++static const uint32_t ++WUFFS_XZ__FILTER_04_X86_MASK_TO_XOR_OPERAND[8] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 4294967295u, 16777215u, 65535u, 65535u, 255u, 255u, 255u, 255u, ++}; + +-#define WUFFS_XXHASH32__XXH_PRIME32_5 374761393 ++static const uint8_t ++WUFFS_XZ__FILTER_06_IA64_BRANCH_TABLE[32] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, ++ 4u, 4u, 6u, 6u, 0u, 0u, 7u, 7u, ++ 4u, 4u, 0u, 0u, 4u, 4u, 0u, 0u, ++}; + +-#define WUFFS_XXHASH32__INITIAL_V0 606290984 ++#define WUFFS_XZ__QUIRKS_BASE 2021322752u + +-#define WUFFS_XXHASH32__INITIAL_V1 2246822519 ++static const uint8_t ++WUFFS_XZ__CHECKSUM_LENGTH[4] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 4u, 8u, 32u, ++}; + +-#define WUFFS_XXHASH32__INITIAL_V2 0 ++static const uint8_t ++WUFFS_XZ__ZEROES[3] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, ++}; + +-#define WUFFS_XXHASH32__INITIAL_V3 1640531535 ++static const uint8_t ++WUFFS_XZ__BCJ_OFFSET_ALIGNMENT[12] WUFFS_BASE__POTENTIALLY_UNUSED = { ++ 0u, 0u, 0u, 0u, 1u, 4u, 16u, 4u, ++ 2u, 4u, 4u, 2u, ++}; + + // ---------------- Private Initializer Prototypes + + // ---------------- Private Function Prototypes + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_xxhash32__hasher__up( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x); ++static uint8_t ++wuffs_xz__decoder__apply_non_final_filters( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_non_final_filters__choosy_default( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_04_x86( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_05_powerpc( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_06_ia64( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_07_arm( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_08_armthumb( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_09_sparc( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_0a_arm64( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_0b_riscv( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__do_transform_io( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__decode_block_header_with_padding( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__decode_block_header_sans_padding( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__verify_index( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src); ++ ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__verify_footer( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src); + + // ---------------- VTables + +-const wuffs_base__hasher_u32__func_ptrs +-wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = { +- (uint32_t(*)(const void*))(&wuffs_xxhash32__hasher__checksum_u32), ++const wuffs_base__io_transformer__func_ptrs ++wuffs_xz__decoder__func_ptrs_for__wuffs_base__io_transformer = { ++ (wuffs_base__optional_u63(*)(const void*))(&wuffs_xz__decoder__dst_history_retain_length), + (uint64_t(*)(const void*, +- uint32_t))(&wuffs_xxhash32__hasher__get_quirk), ++ uint32_t))(&wuffs_xz__decoder__get_quirk), + (wuffs_base__status(*)(void*, + uint32_t, +- uint64_t))(&wuffs_xxhash32__hasher__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update), +- (uint32_t(*)(void*, +- wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update_u32), ++ uint64_t))(&wuffs_xz__decoder__set_quirk), ++ (wuffs_base__status(*)(void*, ++ wuffs_base__io_buffer*, ++ wuffs_base__io_buffer*, ++ wuffs_base__slice_u8))(&wuffs_xz__decoder__transform_io), ++ (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_xz__decoder__workbuf_len), + }; + + // ---------------- Initializer Implementations + + wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_xxhash32__hasher__initialize( +- wuffs_xxhash32__hasher* self, ++wuffs_xz__decoder__initialize( ++ wuffs_xz__decoder* self, + size_t sizeof_star_self, + uint64_t wuffs_version, + uint32_t options){ +@@ -61482,23 +76592,53 @@ wuffs_xxhash32__hasher__initialize( + } + } + ++ self->private_impl.choosy_apply_non_final_filters = &wuffs_xz__decoder__apply_non_final_filters__choosy_default; ++ ++ { ++ wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize( ++ &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_crc64__ecma_hasher__initialize( ++ &self->private_data.f_crc64, sizeof(self->private_data.f_crc64), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_sha256__hasher__initialize( ++ &self->private_data.f_sha256, sizeof(self->private_data.f_sha256), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } ++ { ++ wuffs_base__status z = wuffs_lzma__decoder__initialize( ++ &self->private_data.f_lzma, sizeof(self->private_data.f_lzma), WUFFS_VERSION, options); ++ if (z.repr) { ++ return z; ++ } ++ } + self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name = +- wuffs_base__hasher_u32__vtable_name; +- self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers = +- (const void*)(&wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32); ++ self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name = ++ wuffs_base__io_transformer__vtable_name; ++ self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers = ++ (const void*)(&wuffs_xz__decoder__func_ptrs_for__wuffs_base__io_transformer); + return wuffs_base__make_status(NULL); + } + +-wuffs_xxhash32__hasher* +-wuffs_xxhash32__hasher__alloc(void) { +- wuffs_xxhash32__hasher* x = +- (wuffs_xxhash32__hasher*)(calloc(sizeof(wuffs_xxhash32__hasher), 1)); ++wuffs_xz__decoder* ++wuffs_xz__decoder__alloc(void) { ++ wuffs_xz__decoder* x = ++ (wuffs_xz__decoder*)(calloc(1, sizeof(wuffs_xz__decoder))); + if (!x) { + return NULL; + } +- if (wuffs_xxhash32__hasher__initialize( +- x, sizeof(wuffs_xxhash32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { ++ if (wuffs_xz__decoder__initialize( ++ x, sizeof(wuffs_xz__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { + free(x); + return NULL; + } +@@ -61506,18 +76646,511 @@ wuffs_xxhash32__hasher__alloc(void) { + } + + size_t +-sizeof__wuffs_xxhash32__hasher(void) { +- return sizeof(wuffs_xxhash32__hasher); ++sizeof__wuffs_xz__decoder(void) { ++ return sizeof(wuffs_xz__decoder); + } + + // ---------------- Function Implementations + +-// -------- func xxhash32.hasher.get_quirk ++// -------- func xz.decoder.apply_non_final_filters ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_non_final_filters( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ return (*self->private_impl.choosy_apply_non_final_filters)(self, a_dst_slice); ++} ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_non_final_filters__choosy_default( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ uint32_t v_f = 0; ++ uint64_t v_i = 0; ++ uint32_t v_filter_id = 0; ++ uint32_t v_delta_dist = 0; ++ uint32_t v_delta_pos = 0; ++ uint8_t v_c8 = 0; ++ ++ if (self->private_impl.f_num_non_final_filters <= 0u) { ++ return 0u; ++ } ++ v_f = (self->private_impl.f_num_non_final_filters - 1u); ++ while (true) { ++ v_filter_id = (self->private_impl.f_filters[v_f] & 127u); ++ if (v_filter_id == 3u) { ++ v_delta_dist = (((self->private_impl.f_filters[v_f] >> 8u) & 255u) + 1u); ++ v_delta_pos = (self->private_impl.f_filters[v_f] >> 24u); ++ v_i = 0u; ++ while (v_i < ((uint64_t)(a_dst_slice.len))) { ++ v_c8 = a_dst_slice.ptr[v_i]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wconversion" ++#endif ++ v_c8 += self->private_data.f_filter_data[v_f][(((uint32_t)(v_delta_dist + v_delta_pos)) & 255u)]; ++#if defined(__GNUC__) ++#pragma GCC diagnostic pop ++#endif ++ self->private_data.f_filter_data[v_f][(v_delta_pos & 255u)] = v_c8; ++ v_delta_pos -= 1u; ++ a_dst_slice.ptr[v_i] = v_c8; ++ v_i += 1u; ++ } ++ self->private_impl.f_filters[v_f] &= 65535u; ++ self->private_impl.f_filters[v_f] |= ((uint32_t)(v_delta_pos << 24u)); ++ } ++ if (v_f <= 0u) { ++ break; ++ } ++ v_f -= 1u; ++ } ++ return 0u; ++} ++ ++// -------- func xz.decoder.apply_filter_04_x86 ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_04_x86( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint64_t v_i = 0; ++ uint64_t v_prev_pos = 0; ++ uint32_t v_prev_mask = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_src = 0; ++ uint32_t v_dst = 0; ++ uint32_t v_bit_num = 0; ++ ++ v_s = a_dst_slice; ++ v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 5u)); ++ v_prev_pos = 18446744073709551615u; ++ v_prev_mask = self->private_impl.f_bcj_x86_prev_mask; ++ while (((uint64_t)(v_s.len)) >= 5u) { ++ if (((uint8_t)(v_s.ptr[0u] & 254u)) != 232u) { ++ v_i += 1u; ++ v_p += 1u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ continue; ++ } ++ v_prev_pos = ((uint64_t)(v_i - v_prev_pos)); ++ if (v_prev_pos > 3u) { ++ v_prev_mask = 0u; ++ } else if (v_prev_pos > 0u) { ++ v_prev_mask = (((uint32_t)(v_prev_mask << (v_prev_pos - 1u))) & 7u); ++ if (v_prev_mask != 0u) { ++ v_c8 = v_s.ptr[((uint8_t)(4u - WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[(v_prev_mask & 7u)]))]; ++ if ( ! WUFFS_XZ__FILTER_04_X86_MASK_TO_ALLOWED_STATUS[(v_prev_mask & 7u)] || (v_c8 == 0u) || (v_c8 == 255u)) { ++ v_prev_pos = v_i; ++ v_prev_mask = (((uint32_t)(v_prev_mask << 1u)) | 1u); ++ v_i += 1u; ++ v_p += 1u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ continue; ++ } ++ } ++ } ++ v_prev_pos = v_i; ++ v_c8 = v_s.ptr[4u]; ++ if ((v_c8 != 0u) && (v_c8 != 255u)) { ++ v_prev_mask = (((uint32_t)(v_prev_mask << 1u)) | 1u); ++ v_i += 1u; ++ v_p += 1u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u); ++ continue; ++ } ++ v_src = ((((uint32_t)(v_s.ptr[1u])) << 0u) | ++ (((uint32_t)(v_s.ptr[2u])) << 8u) | ++ (((uint32_t)(v_s.ptr[3u])) << 16u) | ++ (((uint32_t)(v_s.ptr[4u])) << 24u)); ++ while (true) { ++ v_dst = ((uint32_t)(v_src - v_p)); ++ if (v_prev_mask == 0u) { ++ break; ++ } ++ v_bit_num = ((uint32_t)(WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[(v_prev_mask & 7u)])); ++ v_c8 = ((uint8_t)((v_dst >> (24u - (v_bit_num * 8u))))); ++ if ((v_c8 != 0u) && (v_c8 != 255u)) { ++ break; ++ } ++ v_src = (v_dst ^ WUFFS_XZ__FILTER_04_X86_MASK_TO_XOR_OPERAND[(v_prev_mask & 7u)]); ++ } ++ v_dst &= 33554431u; ++ v_dst |= ((uint32_t)(0u - (v_dst & 16777216u))); ++ v_s.ptr[1u] = ((uint8_t)((v_dst >> 0u))); ++ v_s.ptr[2u] = ((uint8_t)((v_dst >> 8u))); ++ v_s.ptr[3u] = ((uint8_t)((v_dst >> 16u))); ++ v_s.ptr[4u] = ((uint8_t)((v_dst >> 24u))); ++ v_i += 5u; ++ v_p += 5u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 5u); ++ } ++ v_prev_pos = ((uint64_t)(v_i - v_prev_pos)); ++ if (v_prev_pos > 3u) { ++ self->private_impl.f_bcj_x86_prev_mask = 0u; ++ } else if (v_prev_pos > 0u) { ++ self->private_impl.f_bcj_x86_prev_mask = ((uint32_t)(v_prev_mask << (v_prev_pos - 1u))); ++ } ++ self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 5u)); ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_05_powerpc ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_05_powerpc( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ ++ v_s = a_dst_slice; ++ v_p = self->private_impl.f_bcj_pos; ++ while (((uint64_t)(v_s.len)) >= 4u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 24u) | ++ (((uint32_t)(v_s.ptr[1u])) << 16u) | ++ (((uint32_t)(v_s.ptr[2u])) << 8u) | ++ (((uint32_t)(v_s.ptr[3u])) << 0u)); ++ if ((v_x & 4227858435u) == 1207959553u) { ++ v_x = ((((uint32_t)((v_x & 67108860u) - v_p)) & 67108860u) | 1207959553u); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 24u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 0u))); ++ } ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ self->private_impl.f_bcj_pos = v_p; ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_06_ia64 ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_06_ia64( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_mask = 0; ++ uint32_t v_slot = 0; ++ uint32_t v_bit_pos = 0; ++ uint32_t v_byte_pos = 0; ++ uint32_t v_bit_res = 0; ++ uint64_t v_x = 0; ++ uint32_t v_j = 0; ++ uint64_t v_norm = 0; ++ uint32_t v_addr = 0; ++ ++ v_s = a_dst_slice; ++ v_p = self->private_impl.f_bcj_pos; ++ while (((uint64_t)(v_s.len)) >= 16u) { ++ v_mask = ((uint32_t)(WUFFS_XZ__FILTER_06_IA64_BRANCH_TABLE[((uint8_t)(v_s.ptr[0u] & 31u))])); ++ v_slot = 0u; ++ while (true) { ++ do { ++ if (((v_mask >> v_slot) & 1u) == 0u) { ++ break; ++ } ++ v_bit_pos = ((v_slot * 41u) + 5u); ++ v_byte_pos = (v_bit_pos >> 3u); ++ v_bit_res = (v_bit_pos & 7u); ++ v_x = 0u; ++ v_j = 0u; ++ while (v_j < 6u) { ++ v_x |= (((uint64_t)(v_s.ptr[(v_j + v_byte_pos)])) << (8u * v_j)); ++ v_j += 1u; ++ } ++ v_norm = (v_x >> v_bit_res); ++ if ((((v_norm >> 37u) & 15u) != 5u) || (((v_norm >> 9u) & 7u) != 0u)) { ++ break; ++ } ++ v_addr = ((uint32_t)(((v_norm >> 13u) & 1048575u))); ++ v_addr |= (((uint32_t)(((v_norm >> 36u) & 1u))) << 20u); ++ v_addr <<= 4u; ++ v_addr -= v_p; ++ v_addr >>= 4u; ++ v_norm &= 18446743996400148479u; ++ v_norm |= (((uint64_t)((v_addr & 1048575u))) << 13u); ++ v_norm |= (((uint64_t)((v_addr & 1048576u))) << 16u); ++ v_x &= ((((uint64_t)(1u)) << v_bit_res) - 1u); ++ v_x |= ((uint64_t)(v_norm << v_bit_res)); ++ v_j = 0u; ++ while (v_j < 6u) { ++ v_s.ptr[(v_j + v_byte_pos)] = ((uint8_t)((v_x >> (8u * v_j)))); ++ v_j += 1u; ++ } ++ } while (0); ++ if (v_slot >= 2u) { ++ break; ++ } ++ v_slot += 1u; ++ } ++ v_p += 16u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 16u); ++ } ++ self->private_impl.f_bcj_pos = v_p; ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_07_arm ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_07_arm( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ ++ v_s = a_dst_slice; ++ v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 8u)); ++ while (((uint64_t)(v_s.len)) >= 4u) { ++ if (v_s.ptr[3u] == 235u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) | ++ (((uint32_t)(v_s.ptr[1u])) << 8u) | ++ (((uint32_t)(v_s.ptr[2u])) << 16u) | ++ (((uint32_t)(v_s.ptr[3u])) << 24u)); ++ v_x = (((uint32_t)(((v_x & 16777215u) << 2u) - v_p)) >> 2u); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 0u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 16u))); ++ } ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 8u)); ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_08_armthumb ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_08_armthumb( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ uint32_t v_y = 0; ++ ++ v_s = a_dst_slice; ++ v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 4u)); ++ while (((uint64_t)(v_s.len)) >= 4u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) | ++ (((uint32_t)(v_s.ptr[1u])) << 8u) | ++ (((uint32_t)(v_s.ptr[2u])) << 16u) | ++ (((uint32_t)(v_s.ptr[3u])) << 24u)); ++ if ((v_x & 4160813056u) != 4160811008u) { ++ v_p += 2u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); ++ continue; ++ } ++ v_y = ((((uint32_t)(((uint8_t)(v_s.ptr[0u] & 255u)))) << 11u) | ++ (((uint32_t)(((uint8_t)(v_s.ptr[1u] & 7u)))) << 19u) | ++ (((uint32_t)(((uint8_t)(v_s.ptr[2u] & 255u)))) << 0u) | ++ (((uint32_t)(((uint8_t)(v_s.ptr[3u] & 7u)))) << 8u)); ++ v_y = (((uint32_t)(((uint32_t)(v_y << 1u)) - v_p)) >> 1u); ++ v_s.ptr[0u] = ((uint8_t)((v_y >> 11u))); ++ v_s.ptr[1u] = ((uint8_t)((((v_y >> 19u) & 7u) | 240u))); ++ v_s.ptr[2u] = ((uint8_t)((v_y >> 0u))); ++ v_s.ptr[3u] = ((uint8_t)((((v_y >> 8u) & 7u) | 248u))); ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 4u)); ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_09_sparc ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_09_sparc( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ ++ v_s = a_dst_slice; ++ v_p = self->private_impl.f_bcj_pos; ++ while (((uint64_t)(v_s.len)) >= 4u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 24u) | ++ (((uint32_t)(v_s.ptr[1u])) << 16u) | ++ (((uint32_t)(v_s.ptr[2u])) << 8u) | ++ (((uint32_t)(v_s.ptr[3u])) << 0u)); ++ if (((v_x >> 22u) == 256u) || ((v_x >> 22u) == 511u)) { ++ v_x = (((uint32_t)(((uint32_t)(v_x << 2u)) - v_p)) >> 2u); ++ v_x = ((1073741824u - (v_x & 4194304u)) | 1073741824u | (v_x & 4194303u)); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 24u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 0u))); ++ } ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ self->private_impl.f_bcj_pos = v_p; ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_0a_arm64 ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_0a_arm64( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ uint32_t v_y = 0; ++ ++ v_s = a_dst_slice; ++ v_p = self->private_impl.f_bcj_pos; ++ while (((uint64_t)(v_s.len)) >= 4u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) | ++ (((uint32_t)(v_s.ptr[1u])) << 8u) | ++ (((uint32_t)(v_s.ptr[2u])) << 16u) | ++ (((uint32_t)(v_s.ptr[3u])) << 24u)); ++ if ((v_x >> 26u) == 37u) { ++ v_y = ((uint32_t)(v_x - (v_p >> 2u))); ++ v_x = (2483027968u | (v_y & 67108863u)); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 0u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 24u))); ++ } else if ((v_x & 2667577344u) == 2415919104u) { ++ v_y = (((v_x >> 29u) & 3u) | ((v_x >> 3u) & 2097148u)); ++ if ((((uint32_t)(v_y + 131072u)) & 1835008u) == 0u) { ++ v_y -= (v_p >> 12u); ++ v_x &= 2415919135u; ++ v_x |= ((v_y & 3u) << 29u); ++ v_x |= ((v_y & 262140u) << 3u); ++ v_x |= (((uint32_t)(0u - (v_y & 131072u))) & 14680064u); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 0u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 24u))); ++ } ++ } ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ } ++ self->private_impl.f_bcj_pos = v_p; ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.apply_filter_0b_riscv ++ ++WUFFS_BASE__GENERATED_C_CODE ++static uint8_t ++wuffs_xz__decoder__apply_filter_0b_riscv( ++ wuffs_xz__decoder* self, ++ wuffs_base__slice_u8 a_dst_slice) { ++ wuffs_base__slice_u8 v_s = {0}; ++ uint32_t v_p = 0; ++ uint32_t v_x = 0; ++ uint32_t v_x27 = 0; ++ uint32_t v_y = 0; ++ uint32_t v_addr = 0; ++ ++ v_s = a_dst_slice; ++ v_p = self->private_impl.f_bcj_pos; ++ while (((uint64_t)(v_s.len)) >= 8u) { ++ if (v_s.ptr[0u] == 239u) { ++ if (((uint8_t)(v_s.ptr[1u] & 13u)) != 0u) { ++ v_p += 2u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); ++ continue; ++ } ++ v_addr = ((((uint32_t)(((uint8_t)(v_s.ptr[1u] & 240u)))) << 13u) | (((uint32_t)(v_s.ptr[2u])) << 9u) | (((uint32_t)(v_s.ptr[3u])) << 1u)); ++ v_addr -= v_p; ++ v_s.ptr[1u] = ((uint8_t)(((uint8_t)(v_s.ptr[1u] & 15u)) | ((uint8_t)(((v_addr >> 8u) & 240u))))); ++ v_s.ptr[2u] = ((uint8_t)((((v_addr >> 16u) & 15u) | ((v_addr >> 7u) & 16u) | (((uint32_t)(v_addr << 4u)) & 224u)))); ++ v_s.ptr[3u] = ((uint8_t)((((v_addr >> 4u) & 127u) | ((v_addr >> 13u) & 128u)))); ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ continue; ++ } else if (((uint8_t)(v_s.ptr[0u] & 127u)) == 23u) { ++ v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) | ++ (((uint32_t)(v_s.ptr[1u])) << 8u) | ++ (((uint32_t)(v_s.ptr[2u])) << 16u) | ++ (((uint32_t)(v_s.ptr[3u])) << 24u)); ++ if ((v_x & 3712u) != 0u) { ++ v_y = ((((uint32_t)(v_s.ptr[4u])) << 0u) | ++ (((uint32_t)(v_s.ptr[5u])) << 8u) | ++ (((uint32_t)(v_s.ptr[6u])) << 16u) | ++ (((uint32_t)(v_s.ptr[7u])) << 24u)); ++ if (((((uint32_t)(v_x << 8u)) ^ ((uint32_t)(v_y - 3u))) & 1015811u) != 0u) { ++ v_p += 6u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 6u); ++ continue; ++ } ++ v_addr = ((v_x & 4294963200u) | (v_y >> 20u)); ++ v_x = (279u | ((uint32_t)(v_y << 12u))); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 0u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 24u))); ++ v_s.ptr[4u] = ((uint8_t)((v_addr >> 0u))); ++ v_s.ptr[5u] = ((uint8_t)((v_addr >> 8u))); ++ v_s.ptr[6u] = ((uint8_t)((v_addr >> 16u))); ++ v_s.ptr[7u] = ((uint8_t)((v_addr >> 24u))); ++ v_p += 8u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u); ++ continue; ++ } ++ v_x27 = (v_x >> 27u); ++ if (((uint32_t)(((uint32_t)(v_x - 12567u)) << 18u)) >= (v_x27 & 29u)) { ++ v_p += 4u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u); ++ continue; ++ } ++ v_addr = ((((uint32_t)(v_s.ptr[4u])) << 24u) | ++ (((uint32_t)(v_s.ptr[5u])) << 16u) | ++ (((uint32_t)(v_s.ptr[6u])) << 8u) | ++ (((uint32_t)(v_s.ptr[7u])) << 0u)); ++ v_addr -= v_p; ++ v_y = ((v_x >> 12u) | ((uint32_t)(v_addr << 20u))); ++ v_x = (23u | (v_x27 << 7u) | (((uint32_t)(v_addr + 2048u)) & 4294963200u)); ++ v_s.ptr[0u] = ((uint8_t)((v_x >> 0u))); ++ v_s.ptr[1u] = ((uint8_t)((v_x >> 8u))); ++ v_s.ptr[2u] = ((uint8_t)((v_x >> 16u))); ++ v_s.ptr[3u] = ((uint8_t)((v_x >> 24u))); ++ v_s.ptr[4u] = ((uint8_t)((v_y >> 0u))); ++ v_s.ptr[5u] = ((uint8_t)((v_y >> 8u))); ++ v_s.ptr[6u] = ((uint8_t)((v_y >> 16u))); ++ v_s.ptr[7u] = ((uint8_t)((v_y >> 24u))); ++ v_p += 8u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u); ++ continue; ++ } ++ v_p += 2u; ++ v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u); ++ } ++ self->private_impl.f_bcj_pos = v_p; ++ return ((uint8_t)(((uint64_t)(v_s.len)))); ++} ++ ++// -------- func xz.decoder.get_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash32__hasher__get_quirk( +- const wuffs_xxhash32__hasher* self, ++wuffs_xz__decoder__get_quirk( ++ const wuffs_xz__decoder* self, + uint32_t a_key) { + if (!self) { + return 0; +@@ -61527,15 +77160,24 @@ wuffs_xxhash32__hasher__get_quirk( + return 0; + } + ++ if (a_key == 1u) { ++ if (self->private_impl.f_ignore_checksum) { ++ return 1u; ++ } ++ } else if (a_key == 2021322752u) { ++ if (self->private_impl.f_standalone_format) { ++ return 1u; ++ } ++ } + return 0u; + } + +-// -------- func xxhash32.hasher.set_quirk ++// -------- func xz.decoder.set_quirk + + WUFFS_BASE__GENERATED_C_CODE + WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_xxhash32__hasher__set_quirk( +- wuffs_xxhash32__hasher* self, ++wuffs_xz__decoder__set_quirk( ++ wuffs_xz__decoder* self, + uint32_t a_key, + uint64_t a_value) { + if (!self) { +@@ -61548,747 +77190,1667 @@ wuffs_xxhash32__hasher__set_quirk( + : wuffs_base__error__initialize_not_called); + } + ++ if (a_key == 1u) { ++ self->private_impl.f_ignore_checksum = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } else if (a_key == 2021322752u) { ++ self->private_impl.f_standalone_format = (a_value > 0u); ++ return wuffs_base__make_status(NULL); ++ } + return wuffs_base__make_status(wuffs_base__error__unsupported_option); + } + +-// -------- func xxhash32.hasher.update ++// -------- func xz.decoder.dst_history_retain_length + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_xxhash32__hasher__update( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x) { ++WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63 ++wuffs_xz__decoder__dst_history_retain_length( ++ const wuffs_xz__decoder* self) { + if (!self) { +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__make_optional_u63(false, 0u); ++ } ++ ++ return wuffs_lzma__decoder__dst_history_retain_length(&self->private_data.f_lzma); ++} ++ ++// -------- func xz.decoder.workbuf_len ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64 ++wuffs_xz__decoder__workbuf_len( ++ const wuffs_xz__decoder* self) { ++ if (!self) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && ++ (self->private_impl.magic != WUFFS_BASE__DISABLED)) { ++ return wuffs_base__utility__empty_range_ii_u64(); ++ } ++ ++ return wuffs_lzma__decoder__workbuf_len(&self->private_data.f_lzma); ++} ++ ++// -------- func xz.decoder.transform_io ++ ++WUFFS_BASE__GENERATED_C_CODE ++WUFFS_BASE__MAYBE_STATIC wuffs_base__status ++wuffs_xz__decoder__transform_io( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ if (!self) { ++ return wuffs_base__make_status(wuffs_base__error__bad_receiver); + } + if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ return wuffs_base__make_status( ++ (self->private_impl.magic == WUFFS_BASE__DISABLED) ++ ? wuffs_base__error__disabled_by_previous_error ++ : wuffs_base__error__initialize_not_called); ++ } ++ if (!a_dst || !a_src) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__bad_argument); ++ } ++ if ((self->private_impl.active_coroutine != 0) && ++ (self->private_impl.active_coroutine != 1)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; ++ return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls); ++ } ++ self->private_impl.active_coroutine = 0; ++ wuffs_base__status status = wuffs_base__make_status(NULL); ++ ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ ++ uint32_t coro_susp_point = self->private_impl.p_transform_io; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ while (true) { ++ { ++ wuffs_base__status t_0 = wuffs_xz__decoder__do_transform_io(self, a_dst, a_src, a_workbuf); ++ v_status = t_0; ++ } ++ if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) { ++ status = wuffs_base__make_status(wuffs_xz__error__truncated_input); ++ goto exit; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1); ++ } ++ ++ ok: ++ self->private_impl.p_transform_io = 0; ++ goto exit; + } + +- wuffs_base__slice_u8 v_remaining = {0}; ++ goto suspend; ++ suspend: ++ self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0; + +- if ((self->private_impl.f_length_modulo_u32 == 0u) && ! self->private_impl.f_length_overflows_u32) { +- self->private_impl.f_v0 = 606290984u; +- self->private_impl.f_v1 = 2246822519u; +- self->private_impl.f_v2 = 0u; +- self->private_impl.f_v3 = 1640531535u; +- } +- while (((uint64_t)(a_x.len)) > 0u) { +- v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u); +- if (((uint64_t)(a_x.len)) > 16777216u) { +- v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 16777216u); +- a_x = wuffs_base__slice_u8__subslice_j(a_x, 16777216u); +- } +- wuffs_xxhash32__hasher__up(self, a_x); +- a_x = v_remaining; ++ goto exit; ++ exit: ++ if (wuffs_base__status__is_error(&status)) { ++ self->private_impl.magic = WUFFS_BASE__DISABLED; + } +- return wuffs_base__make_empty_struct(); ++ return status; + } + +-// -------- func xxhash32.hasher.update_u32 ++// -------- func xz.decoder.do_transform_io + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_xxhash32__hasher__update_u32( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return 0; +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; +- } ++static wuffs_base__status ++wuffs_xz__decoder__do_transform_io( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_dst, ++ wuffs_base__io_buffer* a_src, ++ wuffs_base__slice_u8 a_workbuf) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- wuffs_xxhash32__hasher__update(self, a_x); +- return wuffs_xxhash32__hasher__checksum_u32(self); +-} ++ uint64_t v_header_magic = 0; ++ uint64_t v_dmark = 0; ++ uint64_t v_smark = 0; ++ uint8_t v_i8 = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_checksum32_have = 0; ++ uint32_t v_checksum32_want = 0; ++ uint64_t v_checksum64_have = 0; ++ uint64_t v_checksum64_want = 0; ++ wuffs_base__bitvec256 v_checksum256_have = {0}; ++ uint64_t v_compressed_size = 0; ++ uint64_t v_uncompressed_size = 0; ++ uint32_t v_hash = 0; ++ uint8_t v_c8 = 0; ++ uint32_t v_c32 = 0; ++ uint16_t v_footer_magic = 0; + +-// -------- func xxhash32.hasher.up ++ uint8_t* iop_a_dst = NULL; ++ uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_dst && a_dst->data.ptr) { ++ io0_a_dst = a_dst->data.ptr; ++ io1_a_dst = io0_a_dst + a_dst->meta.wi; ++ iop_a_dst = io1_a_dst; ++ io2_a_dst = io0_a_dst + a_dst->data.len; ++ if (a_dst->meta.closed) { ++ io2_a_dst = iop_a_dst; ++ } ++ } ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_xxhash32__hasher__up( +- wuffs_xxhash32__hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint32_t v_new_lmu = 0; +- uint32_t v_buf_u32 = 0; +- uint32_t v_buf_len = 0; +- uint32_t v_v0 = 0; +- uint32_t v_v1 = 0; +- uint32_t v_v2 = 0; +- uint32_t v_v3 = 0; +- wuffs_base__slice_u8 v_p = {0}; ++ uint32_t coro_susp_point = self->private_impl.p_do_transform_io; ++ if (coro_susp_point) { ++ v_checksum32_have = self->private_data.s_do_transform_io.v_checksum32_have; ++ v_checksum32_want = self->private_data.s_do_transform_io.v_checksum32_want; ++ v_checksum256_have = self->private_data.s_do_transform_io.v_checksum256_have; ++ v_compressed_size = self->private_data.s_do_transform_io.v_compressed_size; ++ v_uncompressed_size = self->private_data.s_do_transform_io.v_uncompressed_size; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- v_new_lmu = ((uint32_t)(self->private_impl.f_length_modulo_u32 + ((uint32_t)(((uint64_t)(a_x.len)))))); +- self->private_impl.f_length_overflows_u32 = ((v_new_lmu < self->private_impl.f_length_modulo_u32) || self->private_impl.f_length_overflows_u32); +- self->private_impl.f_length_modulo_u32 = v_new_lmu; +- while (true) { +- if (self->private_impl.f_buf_len >= 16u) { +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) | +- (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u)); +- v_v0 = ((uint32_t)(self->private_impl.f_v0 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u)); +- self->private_impl.f_v0 = ((uint32_t)(v_v0 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) | +- (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u)); +- v_v1 = ((uint32_t)(self->private_impl.f_v1 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u)); +- self->private_impl.f_v1 = ((uint32_t)(v_v1 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) | +- (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u)); +- v_v2 = ((uint32_t)(self->private_impl.f_v2 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u)); +- self->private_impl.f_v2 = ((uint32_t)(v_v2 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[12u])) | +- (((uint32_t)(self->private_impl.f_buf_data[13u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[14u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[15u])) << 24u)); +- v_v3 = ((uint32_t)(self->private_impl.f_v3 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u)); +- self->private_impl.f_v3 = ((uint32_t)(v_v3 * 2654435761u)); +- self->private_impl.f_buf_len = 0u; +- break; +- } +- if (((uint64_t)(a_x.len)) <= 0u) { +- return wuffs_base__make_empty_struct(); +- } +- self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u]; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint64_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) { ++ t_0 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))); ++ iop_a_src += 6; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 40) { ++ t_0 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_header_magic = t_0; ++ } ++ if (v_header_magic != 388031461373u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_header); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint64_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) { ++ t_1 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))); ++ iop_a_src += 6; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 40) { ++ t_1 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_header_magic = t_1; ++ } ++ if (v_header_magic == 72400582410240u) { ++ self->private_impl.f_checksummer = 0u; ++ } else if (v_header_magic == 60327687946496u) { ++ self->private_impl.f_checksummer = 1u; ++ } else if (v_header_magic == 77742513456128u) { ++ self->private_impl.f_checksummer = 2u; ++ } else if (v_header_magic == 177077137508864u) { ++ self->private_impl.f_checksummer = 3u; ++ } else if ((v_header_magic & 61695u) != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_header); ++ goto exit; ++ } else { ++ v_header_magic = (15u & (v_header_magic >> 8u)); ++ if ((v_header_magic != 0u) && ++ (v_header_magic != 1u) && ++ (v_header_magic != 4u) && ++ (v_header_magic != 10u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__unsupported_checksum_algorithm); ++ goto exit; ++ } ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ self->private_impl.f_flags = ((uint16_t)(v_header_magic)); ++ self->private_impl.f_num_actual_blocks = 0u; ++ while (true) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5); ++ continue; ++ } else if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) == 0u) { ++ break; ++ } ++ self->private_impl.f_num_actual_blocks += 1u; ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ self->private_impl.f_compressed_size_for_index = 4u; ++ while (true) { ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_2 = wuffs_xz__decoder__decode_block_header_with_padding(self, a_src); ++ v_status = t_2; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_size_for_index, wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)))); ++ if ( ! self->private_impl.f_ignore_checksum) { ++ v_checksum32_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ uint32_t t_3; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3; ++ if (num_bits_3 == 24) { ++ t_3 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_3 += 8u; ++ *scratch |= ((uint64_t)(num_bits_3)) << 56; ++ } ++ } ++ v_checksum32_want = t_3; ++ } ++ if (self->private_impl.f_ignore_checksum) { ++ } else if (v_checksum32_have != v_checksum32_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } else { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_private_impl__ignore_status(wuffs_crc64__ecma_hasher__initialize(&self->private_data.f_crc64, ++ sizeof (wuffs_crc64__ecma_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ wuffs_private_impl__ignore_status(wuffs_sha256__hasher__initialize(&self->private_data.f_sha256, ++ sizeof (wuffs_sha256__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ v_compressed_size = 0u; ++ v_uncompressed_size = 0u; ++ while (true) { ++ if (((uint64_t)(self->private_impl.f_bcj_undo_index)) > ((uint64_t)(io2_a_dst - iop_a_dst))) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_write); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9); ++ continue; ++ } ++ v_dmark = ((uint64_t)(iop_a_dst - io0_a_dst)); ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ if (self->private_impl.f_num_non_final_filters == 0u) { ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_4 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf); ++ v_status = t_4; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ } else { ++ if (self->private_impl.f_bcj_undo_index > 0u) { ++ wuffs_private_impl__io_writer__copy_from_slice(&iop_a_dst, io2_a_dst,wuffs_base__make_slice_u8(self->private_data.f_filter_data[0u], self->private_impl.f_bcj_undo_index)); ++ self->private_impl.f_bcj_undo_index = 0u; ++ } ++ { ++ uint8_t* o_0_io0_a_dst = io0_a_dst; ++ uint8_t* o_0_io1_a_dst = io1_a_dst; ++ io0_a_dst = iop_a_dst; ++ io1_a_dst = iop_a_dst; ++ wuffs_base__io_buffer o_0_a_dst; ++ if (a_dst) { ++ memcpy(&o_0_a_dst, a_dst, sizeof(*a_dst)); ++ size_t wi0 = a_dst->meta.wi; ++ a_dst->data.ptr += wi0; ++ a_dst->data.len -= wi0; ++ a_dst->meta.ri = 0; ++ a_dst->meta.wi = 0; ++ a_dst->meta.pos = wuffs_base__u64__sat_add(a_dst->meta.pos, wi0); ++ } ++ { ++ if (a_dst) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ } ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_5 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf); ++ v_status = t_5; ++ if (a_dst) { ++ iop_a_dst = a_dst->data.ptr + a_dst->meta.wi; ++ } ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if (a_dst) { ++ memcpy(a_dst, &o_0_a_dst, sizeof(*a_dst)); ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); ++ io0_a_dst = o_0_io0_a_dst; ++ io1_a_dst = o_0_io1_a_dst; ++ } ++ } ++ self->private_impl.f_bcj_undo_index = wuffs_xz__decoder__apply_non_final_filters(self, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ if ((self->private_impl.f_bcj_undo_index > 0u) && ! wuffs_base__status__is_ok(&v_status)) { ++ v_i8 = ((uint8_t)(self->private_impl.f_bcj_undo_index - 1u)); ++ while (true) { ++ if ( ! (iop_a_dst > io1_a_dst)) { ++ status = wuffs_base__make_status(wuffs_xz__error__internal_error_inconsistent_bcj_filter_state); ++ goto exit; ++ } ++ self->private_data.f_filter_data[0u][v_i8] = iop_a_dst[-1]; ++ iop_a_dst--; ++ if (v_i8 <= 0u) { ++ break; ++ } + #if defined(__GNUC__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wconversion" + #endif +- self->private_impl.f_buf_len += 1u; ++ v_i8 -= 1u; + #if defined(__GNUC__) + #pragma GCC diagnostic pop + #endif +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); +- } +- v_buf_len = ((uint32_t)((self->private_impl.f_buf_len & 15u))); +- v_v0 = self->private_impl.f_v0; +- v_v1 = self->private_impl.f_v1; +- v_v2 = self->private_impl.f_v2; +- v_v3 = self->private_impl.f_v3; +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 16; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16); +- while (v_p.ptr < i_end0_p) { +- v_buf_u32 = (((uint32_t)(v_p.ptr[0u])) | +- (((uint32_t)(v_p.ptr[1u])) << 8u) | +- (((uint32_t)(v_p.ptr[2u])) << 16u) | +- (((uint32_t)(v_p.ptr[3u])) << 24u)); +- v_v0 = ((uint32_t)(v_v0 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u)); +- v_v0 = ((uint32_t)(v_v0 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(v_p.ptr[4u])) | +- (((uint32_t)(v_p.ptr[5u])) << 8u) | +- (((uint32_t)(v_p.ptr[6u])) << 16u) | +- (((uint32_t)(v_p.ptr[7u])) << 24u)); +- v_v1 = ((uint32_t)(v_v1 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u)); +- v_v1 = ((uint32_t)(v_v1 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(v_p.ptr[8u])) | +- (((uint32_t)(v_p.ptr[9u])) << 8u) | +- (((uint32_t)(v_p.ptr[10u])) << 16u) | +- (((uint32_t)(v_p.ptr[11u])) << 24u)); +- v_v2 = ((uint32_t)(v_v2 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u)); +- v_v2 = ((uint32_t)(v_v2 * 2654435761u)); +- v_buf_u32 = (((uint32_t)(v_p.ptr[12u])) | +- (((uint32_t)(v_p.ptr[13u])) << 8u) | +- (((uint32_t)(v_p.ptr[14u])) << 16u) | +- (((uint32_t)(v_p.ptr[15u])) << 24u)); +- v_v3 = ((uint32_t)(v_v3 + ((uint32_t)(v_buf_u32 * 2246822519u)))); +- v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u)); +- v_v3 = ((uint32_t)(v_v3 * 2654435761u)); +- v_p.ptr += 16; +- } +- v_p.len = 1; +- uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end1_p) { +- self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u]; +- v_buf_len = ((v_buf_len + 1u) & 15u); +- v_p.ptr += 1; ++ } ++ } ++ } ++ v_compressed_size += wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src))); ++ v_uncompressed_size += wuffs_private_impl__io__count_since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst))); ++ if (self->private_impl.f_ignore_checksum) { ++ } else if (self->private_impl.f_checksummer == 1u) { ++ wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ } else if (self->private_impl.f_checksummer == 2u) { ++ wuffs_crc64__ecma_hasher__update(&self->private_data.f_crc64, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ } else if (self->private_impl.f_checksummer == 3u) { ++ wuffs_sha256__hasher__update(&self->private_data.f_sha256, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10); ++ } ++ if ((self->private_impl.f_block_has_compressed_size && (self->private_impl.f_block_compressed_size != v_compressed_size)) || (self->private_impl.f_block_has_uncompressed_size && (self->private_impl.f_block_uncompressed_size != v_uncompressed_size))) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_size_for_index, v_compressed_size); ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_size_for_index, ((uint64_t)(WUFFS_XZ__CHECKSUM_LENGTH[self->private_impl.f_checksummer]))); ++ self->private_impl.f_verification_have_total_sizes[0u] += self->private_impl.f_compressed_size_for_index; ++ v_hash = ((uint32_t)((self->private_impl.f_compressed_size_for_index ^ (self->private_impl.f_compressed_size_for_index >> 32u)))); ++ v_hash *= 3432918353u; ++ v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u)); ++ v_hash *= 461845907u; ++ v_hash ^= self->private_impl.f_verification_have_hashed_sizes[0u]; ++ v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u)); ++ self->private_impl.f_verification_have_hashed_sizes[0u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u)); ++ self->private_impl.f_verification_have_total_sizes[1u] += v_uncompressed_size; ++ v_hash = ((uint32_t)((v_uncompressed_size ^ (v_uncompressed_size >> 32u)))); ++ v_hash *= 3432918353u; ++ v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u)); ++ v_hash *= 461845907u; ++ v_hash ^= self->private_impl.f_verification_have_hashed_sizes[1u]; ++ v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u)); ++ self->private_impl.f_verification_have_hashed_sizes[1u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u)); ++ while ((v_compressed_size & 3u) != 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_padding); ++ goto exit; ++ } ++ v_compressed_size += 1u; ++ } ++ self->private_impl.f_lzma_needs_reset = true; ++ if (self->private_impl.f_ignore_checksum) { ++ self->private_data.s_do_transform_io.scratch = ((uint32_t)(WUFFS_XZ__CHECKSUM_LENGTH[self->private_impl.f_checksummer])); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) { ++ self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src)); ++ iop_a_src = io2_a_src; ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ iop_a_src += self->private_data.s_do_transform_io.scratch; ++ } else if (self->private_impl.f_checksummer == 1u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13); ++ uint32_t t_7; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; ++ if (num_bits_7 == 24) { ++ t_7 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_7 += 8u; ++ *scratch |= ((uint64_t)(num_bits_7)) << 56; ++ } ++ } ++ v_checksum32_want = t_7; ++ } ++ v_checksum32_have = wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32); ++ if (v_checksum32_have != v_checksum32_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ } else if (self->private_impl.f_checksummer == 2u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15); ++ uint64_t t_8; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_8 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8; ++ if (num_bits_8 == 56) { ++ t_8 = ((uint64_t)(*scratch)); ++ break; ++ } ++ num_bits_8 += 8u; ++ *scratch |= ((uint64_t)(num_bits_8)) << 56; ++ } ++ } ++ v_checksum64_want = t_8; ++ } ++ v_checksum64_have = wuffs_crc64__ecma_hasher__checksum_u64(&self->private_data.f_crc64); ++ if (v_checksum64_have != v_checksum64_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ } else if (self->private_impl.f_checksummer == 3u) { ++ v_checksum256_have = wuffs_sha256__hasher__checksum_bitvec256(&self->private_data.f_sha256); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17); ++ uint64_t t_9; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_9 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_9 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_9); ++ if (num_bits_9 == 56) { ++ t_9 = ((uint64_t)(*scratch >> 0)); ++ break; ++ } ++ num_bits_9 += 8u; ++ *scratch |= ((uint64_t)(num_bits_9)); ++ } ++ } ++ v_checksum64_want = t_9; ++ } ++ if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 3u) != v_checksum64_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19); ++ uint64_t t_10; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_10 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_10 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_10); ++ if (num_bits_10 == 56) { ++ t_10 = ((uint64_t)(*scratch >> 0)); ++ break; ++ } ++ num_bits_10 += 8u; ++ *scratch |= ((uint64_t)(num_bits_10)); ++ } ++ } ++ v_checksum64_want = t_10; ++ } ++ if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 2u) != v_checksum64_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21); ++ uint64_t t_11; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_11 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_11 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_11); ++ if (num_bits_11 == 56) { ++ t_11 = ((uint64_t)(*scratch >> 0)); ++ break; ++ } ++ num_bits_11 += 8u; ++ *scratch |= ((uint64_t)(num_bits_11)); ++ } ++ } ++ v_checksum64_want = t_11; ++ } ++ if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 1u) != v_checksum64_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23); ++ uint64_t t_12; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) { ++ t_12 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src); ++ iop_a_src += 8; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_12 = ((uint32_t)(*scratch & 0xFFu)); ++ *scratch >>= 8; ++ *scratch <<= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_12); ++ if (num_bits_12 == 56) { ++ t_12 = ((uint64_t)(*scratch >> 0)); ++ break; ++ } ++ num_bits_12 += 8u; ++ *scratch |= ((uint64_t)(num_bits_12)); ++ } ++ } ++ v_checksum64_want = t_12; ++ } ++ if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 0u) != v_checksum64_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ } ++ } ++ self->private_impl.f_backwards_size = 0u; ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ while (true) { ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_13 = wuffs_xz__decoder__verify_index(self, a_src); ++ v_status = t_13; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_backwards_size, wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)))); ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(25); ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_XZ__ZEROES), (3u & ((uint64_t)(0u - (3u & self->private_impl.f_backwards_size)))))); ++ } ++ while ((self->private_impl.f_backwards_size & 3u) != 0u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_14 = *iop_a_src++; ++ v_c8 = t_14; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ self->private_impl.f_backwards_size += 1u; ++ } ++ self->private_impl.f_backwards_size >>= 2u; ++ if ((self->private_impl.f_backwards_size == 0u) || (self->private_impl.f_backwards_size > 4294967295u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27); ++ uint32_t t_15; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_15 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_15 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_15; ++ if (num_bits_15 == 24) { ++ t_15 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_15 += 8u; ++ *scratch |= ((uint64_t)(num_bits_15)) << 56; ++ } ++ } ++ v_checksum32_want = t_15; ++ } ++ if (self->private_impl.f_ignore_checksum) { ++ } else if (v_checksum32_want != wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } else { ++ wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32, ++ sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29); ++ uint32_t t_16; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_16 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_16 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_16; ++ if (num_bits_16 == 24) { ++ t_16 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_16 += 8u; ++ *scratch |= ((uint64_t)(num_bits_16)) << 56; ++ } ++ } ++ v_checksum32_want = t_16; ++ } ++ while (true) { ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_17 = wuffs_xz__decoder__verify_footer(self, a_src); ++ v_status = t_17; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ if ( ! self->private_impl.f_ignore_checksum) { ++ wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src)); ++ } ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(31); ++ } ++ if ( ! self->private_impl.f_ignore_checksum && (v_checksum32_want != wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32))) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_checksum); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32); ++ uint16_t t_18; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_18 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_do_transform_io.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_do_transform_io.scratch; ++ uint32_t num_bits_18 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_18; ++ if (num_bits_18 == 8) { ++ t_18 = ((uint16_t)(*scratch)); ++ break; ++ } ++ num_bits_18 += 8u; ++ *scratch |= ((uint64_t)(num_bits_18)) << 56; ++ } ++ } ++ v_footer_magic = t_18; ++ } ++ if (v_footer_magic != 23129u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_footer); ++ goto exit; ++ } ++ if ( ! self->private_impl.f_standalone_format) { ++ break; ++ } ++ while (true) { ++ while (((uint64_t)(io2_a_src - iop_a_src)) < 4u) { ++ if (a_src && a_src->meta.closed) { ++ if (((uint64_t)(io2_a_src - iop_a_src)) == 0u) { ++ goto label__streams__break; ++ } else { ++ status = wuffs_base__make_status(wuffs_xz__error__truncated_input); ++ goto exit; ++ } ++ } ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(34); ++ } ++ v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ if (v_c32 == 1484404733u) { ++ break; ++ } else if (v_c32 != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_header_concatenated_stream); ++ goto exit; ++ } ++ iop_a_src += 4u; ++ } ++ self->private_impl.f_started_verify_index = false; + } +- v_p.len = 0; +- } +- self->private_impl.f_buf_len = ((uint8_t)(v_buf_len)); +- self->private_impl.f_v0 = v_v0; +- self->private_impl.f_v1 = v_v1; +- self->private_impl.f_v2 = v_v2; +- self->private_impl.f_v3 = v_v3; +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func xxhash32.hasher.checksum_u32 ++ label__streams__break:; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint32_t +-wuffs_xxhash32__hasher__checksum_u32( +- const wuffs_xxhash32__hasher* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ ok: ++ self->private_impl.p_do_transform_io = 0; ++ goto exit; + } + +- uint32_t v_ret = 0; +- uint32_t v_i = 0; +- uint32_t v_n = 0; +- uint32_t v_buf_u32 = 0; ++ goto suspend; ++ suspend: ++ self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_do_transform_io.v_checksum32_have = v_checksum32_have; ++ self->private_data.s_do_transform_io.v_checksum32_want = v_checksum32_want; ++ self->private_data.s_do_transform_io.v_checksum256_have = v_checksum256_have; ++ self->private_data.s_do_transform_io.v_compressed_size = v_compressed_size; ++ self->private_data.s_do_transform_io.v_uncompressed_size = v_uncompressed_size; + +- if ((self->private_impl.f_length_modulo_u32 >= 16u) || self->private_impl.f_length_overflows_u32) { +- v_ret += (((uint32_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 31u)); +- v_ret += (((uint32_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 25u)); +- v_ret += (((uint32_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 20u)); +- v_ret += (((uint32_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 14u)); +- v_ret += self->private_impl.f_length_modulo_u32; +- } else { +- v_ret += 374761393u; +- v_ret += self->private_impl.f_length_modulo_u32; +- } +- v_n = 16u; +- v_n = wuffs_base__u32__min(v_n, ((uint32_t)(self->private_impl.f_buf_len))); +- if (4u <= v_n) { +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) | +- (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u)); +- v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); +- v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); +- v_ret *= 668265263u; +- v_i = 4u; +- } +- if (8u <= v_n) { +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) | +- (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u)); +- v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); +- v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); +- v_ret *= 668265263u; +- v_i = 8u; +- } +- if (12u <= v_n) { +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) | +- (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u)); +- v_ret += ((uint32_t)(v_buf_u32 * 3266489917u)); +- v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u)); +- v_ret *= 668265263u; +- v_i = 12u; ++ goto exit; ++ exit: ++ if (a_dst && a_dst->data.ptr) { ++ a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr)); + } +- while (v_i < v_n) { +- v_ret += ((uint32_t)(((uint32_t)(self->private_impl.f_buf_data[v_i])) * 374761393u)); +- v_ret = (((uint32_t)(v_ret << 11u)) | (v_ret >> 21u)); +- v_ret *= 2654435761u; +- v_i += 1u; ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_ret ^= (v_ret >> 15u); +- v_ret *= 2246822519u; +- v_ret ^= (v_ret >> 13u); +- v_ret *= 3266489917u; +- v_ret ^= (v_ret >> 16u); +- return v_ret; +-} +- +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) +- +-#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) +- +-// ---------------- Status Codes Implementations + +-// ---------------- Private Consts ++ return status; ++} + +-#define WUFFS_XXHASH64__XXH_PRIME64_1 11400714785074694791 ++// -------- func xz.decoder.decode_block_header_with_padding + +-#define WUFFS_XXHASH64__XXH_PRIME64_2 14029467366897019727 ++WUFFS_BASE__GENERATED_C_CODE ++static wuffs_base__status ++wuffs_xz__decoder__decode_block_header_with_padding( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-#define WUFFS_XXHASH64__XXH_PRIME64_3 1609587929392839161 ++ uint8_t v_c8 = 0; ++ uint64_t v_padded_size_have = 0; ++ uint64_t v_padded_size_want = 0; ++ uint64_t v_smark = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); + +-#define WUFFS_XXHASH64__XXH_PRIME64_4 9650029242287828579 ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } + +-#define WUFFS_XXHASH64__XXH_PRIME64_5 2870177450012600261 ++ uint32_t coro_susp_point = self->private_impl.p_decode_block_header_with_padding; ++ if (coro_susp_point) { ++ v_padded_size_have = self->private_data.s_decode_block_header_with_padding.v_padded_size_have; ++ v_padded_size_want = self->private_data.s_decode_block_header_with_padding.v_padded_size_want; ++ } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-#define WUFFS_XXHASH64__INITIAL_V0 6983438078262162902 ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ v_padded_size_want = ((uint64_t)((((uint64_t)(v_c8)) * 4u) - 1u)); ++ while (true) { ++ v_smark = ((uint64_t)(iop_a_src - io0_a_src)); ++ { ++ if (a_src) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } ++ wuffs_base__status t_1 = wuffs_xz__decoder__decode_block_header_sans_padding(self, a_src); ++ v_status = t_1; ++ if (a_src) { ++ iop_a_src = a_src->data.ptr + a_src->meta.ri; ++ } ++ } ++ wuffs_private_impl__u64__sat_add_indirect(&v_padded_size_have, wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)))); ++ if (wuffs_base__status__is_ok(&v_status)) { ++ break; ++ } ++ status = v_status; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2); ++ } ++ if (v_padded_size_have > v_padded_size_want) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ while (v_padded_size_have < v_padded_size_want) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ v_padded_size_have += 1u; ++ } + +-#define WUFFS_XXHASH64__INITIAL_V1 14029467366897019727 ++ ok: ++ self->private_impl.p_decode_block_header_with_padding = 0; ++ goto exit; ++ } + +-#define WUFFS_XXHASH64__INITIAL_V2 0 ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_block_header_with_padding = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_block_header_with_padding.v_padded_size_have = v_padded_size_have; ++ self->private_data.s_decode_block_header_with_padding.v_padded_size_want = v_padded_size_want; + +-#define WUFFS_XXHASH64__INITIAL_V3 7046029288634856825 ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); ++ } + +-// ---------------- Private Initializer Prototypes ++ return status; ++} + +-// ---------------- Private Function Prototypes ++// -------- func xz.decoder.decode_block_header_sans_padding + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_xxhash64__hasher__up( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x); +- +-// ---------------- VTables +- +-const wuffs_base__hasher_u64__func_ptrs +-wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64 = { +- (uint64_t(*)(const void*))(&wuffs_xxhash64__hasher__checksum_u64), +- (uint64_t(*)(const void*, +- uint32_t))(&wuffs_xxhash64__hasher__get_quirk), +- (wuffs_base__status(*)(void*, +- uint32_t, +- uint64_t))(&wuffs_xxhash64__hasher__set_quirk), +- (wuffs_base__empty_struct(*)(void*, +- wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update), +- (uint64_t(*)(void*, +- wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update_u64), +-}; ++static wuffs_base__status ++wuffs_xz__decoder__decode_block_header_sans_padding( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// ---------------- Initializer Implementations ++ uint8_t v_c8 = 0; ++ uint32_t v_c32 = 0; ++ uint32_t v_alignment = 0; ++ uint8_t v_flags = 0; ++ uint8_t v_filter_id = 0; ++ wuffs_base__status v_status = wuffs_base__make_status(NULL); ++ uint32_t v_shift = 0; ++ uint32_t v_f = 0; ++ uint32_t v_k = 0; + +-wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT +-wuffs_xxhash64__hasher__initialize( +- wuffs_xxhash64__hasher* self, +- size_t sizeof_star_self, +- uint64_t wuffs_version, +- uint32_t options){ +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (sizeof(*self) != sizeof_star_self) { +- return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } +- if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) || +- (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) { +- return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version); ++ ++ uint32_t coro_susp_point = self->private_impl.p_decode_block_header_sans_padding; ++ if (coro_susp_point) { ++ v_flags = self->private_data.s_decode_block_header_sans_padding.v_flags; ++ v_filter_id = self->private_data.s_decode_block_header_sans_padding.v_filter_id; ++ v_shift = self->private_data.s_decode_block_header_sans_padding.v_shift; ++ v_f = self->private_data.s_decode_block_header_sans_padding.v_f; + } ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +- if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) { +- // The whole point of this if-check is to detect an uninitialized *self. +- // We disable the warning on GCC. Clang-5.0 does not have this warning. +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic push +-#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +-#endif +- if (self->private_impl.magic != 0) { +- return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed); ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_flags = t_0; + } +-#if !defined(__clang__) && defined(__GNUC__) +-#pragma GCC diagnostic pop +-#endif +- } else { +- if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) { +- memset(self, 0, sizeof(*self)); +- options |= WUFFS_INITIALIZE__ALREADY_ZEROED; ++ self->private_impl.f_num_non_final_filters = ((uint32_t)(((uint8_t)(v_flags & 3u)))); ++ if (((uint8_t)(v_flags & 60u)) != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ self->private_impl.f_block_has_compressed_size = (((uint8_t)(v_flags & 64u)) != 0u); ++ if (self->private_impl.f_block_has_compressed_size) { ++ self->private_impl.f_block_compressed_size = 0u; ++ v_shift = 0u; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (v_shift <= 56u) { ++ self->private_impl.f_block_compressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift); ++ if (v_c8 >= 128u) { ++ v_shift += 7u; ++ continue; ++ } else if ((v_c8 == 0u) && (v_shift > 0u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ break; ++ } else if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ self->private_impl.f_block_compressed_size |= (((uint64_t)(1u)) << 63u); ++ break; ++ } ++ } ++ self->private_impl.f_block_has_uncompressed_size = (((uint8_t)(v_flags & 128u)) != 0u); ++ if (self->private_impl.f_block_has_uncompressed_size) { ++ self->private_impl.f_block_uncompressed_size = 0u; ++ v_shift = 0u; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (v_shift <= 56u) { ++ self->private_impl.f_block_uncompressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift); ++ if (v_c8 >= 128u) { ++ v_shift += 7u; ++ continue; ++ } else if ((v_c8 == 0u) && (v_shift > 0u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ break; ++ } else if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_block_header); ++ goto exit; ++ } ++ self->private_impl.f_block_uncompressed_size |= (((uint64_t)(1u)) << 63u); ++ break; ++ } ++ } ++ self->private_impl.f_bcj_x86_prev_mask = 0u; ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_non_final_filters__choosy_default); ++ v_f = 0u; ++ while (v_f < self->private_impl.f_num_non_final_filters) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_filter_id = t_3; ++ } ++ if (v_filter_id == 33u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_filter); ++ goto exit; ++ } else if (v_filter_id == 3u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_4 = *iop_a_src++; ++ v_c8 = t_4; ++ } ++ if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_filter); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_5 = *iop_a_src++; ++ v_c8 = t_5; ++ } ++ self->private_impl.f_filters[v_f] = ((((uint32_t)(v_c8)) << 8u) | 3u); ++ v_k = 0u; ++ while (v_k < 256u) { ++ self->private_data.f_filter_data[v_f][v_k] = 0u; ++ v_k += 1u; ++ } ++ } else if ((v_filter_id < 3u) || (11u < v_filter_id)) { ++ status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter); ++ goto exit; ++ } else if (v_f != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter_combination); ++ goto exit; ++ } else { ++ self->private_impl.f_filters[v_f] = ((uint32_t)(v_filter_id)); ++ if (v_filter_id == 4u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_04_x86); ++ } else if (v_filter_id == 5u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_05_powerpc); ++ } else if (v_filter_id == 6u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_06_ia64); ++ } else if (v_filter_id == 7u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_07_arm); ++ } else if (v_filter_id == 8u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_08_armthumb); ++ } else if (v_filter_id == 9u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_09_sparc); ++ } else if (v_filter_id == 10u) { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_0a_arm64); ++ } else { ++ self->private_impl.choosy_apply_non_final_filters = ( ++ &wuffs_xz__decoder__apply_filter_0b_riscv); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_6 = *iop_a_src++; ++ v_c8 = t_6; ++ } ++ if (v_c8 == 0u) { ++ self->private_impl.f_bcj_pos = 0u; ++ } else if (v_c8 == 4u) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8); ++ uint32_t t_7; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_decode_block_header_sans_padding.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_decode_block_header_sans_padding.scratch; ++ uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7; ++ if (num_bits_7 == 24) { ++ t_7 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_7 += 8u; ++ *scratch |= ((uint64_t)(num_bits_7)) << 56; ++ } ++ } ++ v_c32 = t_7; ++ } ++ v_alignment = ((uint32_t)(WUFFS_XZ__BCJ_OFFSET_ALIGNMENT[v_filter_id])); ++ if (v_alignment > 0u) { ++ if ((v_c32 % v_alignment) != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_bcj_offset); ++ goto exit; ++ } ++ } ++ self->private_impl.f_bcj_pos = v_c32; ++ } else { ++ status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter); ++ goto exit; ++ } ++ } ++ v_f += 1u; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_8 = *iop_a_src++; ++ v_filter_id = t_8; ++ } ++ if (v_filter_id == 33u) { ++ if (self->private_impl.f_lzma_needs_reset) { ++ wuffs_private_impl__ignore_status(wuffs_lzma__decoder__initialize(&self->private_data.f_lzma, ++ sizeof (wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED)); ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_9 = *iop_a_src++; ++ v_c8 = t_9; ++ } ++ if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_filter); ++ goto exit; ++ } ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_10 = *iop_a_src++; ++ v_c8 = t_10; ++ } ++ v_status = wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1348001793u, (2u | (((uint64_t)(v_c8)) << 8u))); ++ if ( ! wuffs_base__status__is_ok(&v_status)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_filter); ++ goto exit; ++ } ++ } else if ((v_filter_id < 3u) || (11u < v_filter_id)) { ++ status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter); ++ goto exit; + } else { +- memset(&(self->private_impl), 0, sizeof(self->private_impl)); ++ status = wuffs_base__make_status(wuffs_xz__error__bad_filter); ++ goto exit; + } +- } + +- self->private_impl.magic = WUFFS_BASE__MAGIC; +- self->private_impl.vtable_for__wuffs_base__hasher_u64.vtable_name = +- wuffs_base__hasher_u64__vtable_name; +- self->private_impl.vtable_for__wuffs_base__hasher_u64.function_pointers = +- (const void*)(&wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64); +- return wuffs_base__make_status(NULL); +-} +- +-wuffs_xxhash64__hasher* +-wuffs_xxhash64__hasher__alloc(void) { +- wuffs_xxhash64__hasher* x = +- (wuffs_xxhash64__hasher*)(calloc(sizeof(wuffs_xxhash64__hasher), 1)); +- if (!x) { +- return NULL; +- } +- if (wuffs_xxhash64__hasher__initialize( +- x, sizeof(wuffs_xxhash64__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) { +- free(x); +- return NULL; ++ goto ok; ++ ok: ++ self->private_impl.p_decode_block_header_sans_padding = 0; ++ goto exit; + } +- return x; +-} +- +-size_t +-sizeof__wuffs_xxhash64__hasher(void) { +- return sizeof(wuffs_xxhash64__hasher); +-} + +-// ---------------- Function Implementations +- +-// -------- func xxhash64.hasher.get_quirk ++ goto suspend; ++ suspend: ++ self->private_impl.p_decode_block_header_sans_padding = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_decode_block_header_sans_padding.v_flags = v_flags; ++ self->private_data.s_decode_block_header_sans_padding.v_filter_id = v_filter_id; ++ self->private_data.s_decode_block_header_sans_padding.v_shift = v_shift; ++ self->private_data.s_decode_block_header_sans_padding.v_f = v_f; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__get_quirk( +- const wuffs_xxhash64__hasher* self, +- uint32_t a_key) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- return 0u; ++ return status; + } + +-// -------- func xxhash64.hasher.set_quirk ++// -------- func xz.decoder.verify_index + + WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__status +-wuffs_xxhash64__hasher__set_quirk( +- wuffs_xxhash64__hasher* self, +- uint32_t a_key, +- uint64_t a_value) { +- if (!self) { +- return wuffs_base__make_status(wuffs_base__error__bad_receiver); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_status( +- (self->private_impl.magic == WUFFS_BASE__DISABLED) +- ? wuffs_base__error__disabled_by_previous_error +- : wuffs_base__error__initialize_not_called); +- } +- +- return wuffs_base__make_status(wuffs_base__error__unsupported_option); +-} ++static wuffs_base__status ++wuffs_xz__decoder__verify_index( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +-// -------- func xxhash64.hasher.update ++ uint8_t v_c8 = 0; ++ uint32_t v_shift = 0; ++ uint32_t v_hash = 0; + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct +-wuffs_xxhash64__hasher__update( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return wuffs_base__make_empty_struct(); +- } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return wuffs_base__make_empty_struct(); ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; + } + +- if ((self->private_impl.f_length_modulo_u64 == 0u) && ! self->private_impl.f_length_overflows_u64) { +- self->private_impl.f_v0 = 6983438078262162902u; +- self->private_impl.f_v1 = 14029467366897019727u; +- self->private_impl.f_v2 = 0u; +- self->private_impl.f_v3 = 7046029288634856825u; ++ uint32_t coro_susp_point = self->private_impl.p_verify_index; ++ if (coro_susp_point) { ++ v_shift = self->private_data.s_verify_index.v_shift; + } +- wuffs_xxhash64__hasher__up(self, a_x); +- return wuffs_base__make_empty_struct(); +-} ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; + +-// -------- func xxhash64.hasher.update_u64 ++ if ( ! self->private_impl.f_started_verify_index) { ++ self->private_impl.f_started_verify_index = true; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_0 = *iop_a_src++; ++ v_c8 = t_0; ++ } ++ if (v_c8 != 0u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ self->private_impl.f_num_index_blocks = 0u; ++ v_shift = 0u; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_1 = *iop_a_src++; ++ v_c8 = t_1; ++ } ++ if (v_shift <= 56u) { ++ self->private_impl.f_num_index_blocks |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift); ++ if (v_c8 >= 128u) { ++ v_shift += 7u; ++ continue; ++ } else if ((v_c8 == 0u) && (v_shift > 0u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ break; ++ } else if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ self->private_impl.f_num_index_blocks |= (((uint64_t)(1u)) << 63u); ++ break; ++ } ++ if (self->private_impl.f_num_index_blocks != self->private_impl.f_num_actual_blocks) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ } ++ while (self->private_impl.f_num_index_blocks > 0u) { ++ self->private_impl.f_num_index_blocks -= 1u; ++ self->private_impl.f_index_block_compressed_size = 0u; ++ v_shift = 0u; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_2 = *iop_a_src++; ++ v_c8 = t_2; ++ } ++ if (v_shift <= 56u) { ++ self->private_impl.f_index_block_compressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift); ++ if (v_c8 >= 128u) { ++ v_shift += 7u; ++ continue; ++ } else if ((v_c8 == 0u) && (v_shift > 0u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ break; ++ } else if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ self->private_impl.f_index_block_compressed_size |= (((uint64_t)(1u)) << 63u); ++ break; ++ } ++ self->private_impl.f_index_block_uncompressed_size = 0u; ++ v_shift = 0u; ++ while (true) { ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint8_t t_3 = *iop_a_src++; ++ v_c8 = t_3; ++ } ++ if (v_shift <= 56u) { ++ self->private_impl.f_index_block_uncompressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift); ++ if (v_c8 >= 128u) { ++ v_shift += 7u; ++ continue; ++ } else if ((v_c8 == 0u) && (v_shift > 0u)) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ break; ++ } else if (v_c8 != 1u) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } ++ self->private_impl.f_index_block_uncompressed_size |= (((uint64_t)(1u)) << 63u); ++ break; ++ } ++ self->private_impl.f_verification_want_total_sizes[0u] += self->private_impl.f_index_block_compressed_size; ++ v_hash = ((uint32_t)((self->private_impl.f_index_block_compressed_size ^ (self->private_impl.f_index_block_compressed_size >> 32u)))); ++ v_hash *= 3432918353u; ++ v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u)); ++ v_hash *= 461845907u; ++ v_hash ^= self->private_impl.f_verification_want_hashed_sizes[0u]; ++ v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u)); ++ self->private_impl.f_verification_want_hashed_sizes[0u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u)); ++ self->private_impl.f_verification_want_total_sizes[1u] += self->private_impl.f_index_block_uncompressed_size; ++ v_hash = ((uint32_t)((self->private_impl.f_index_block_uncompressed_size ^ (self->private_impl.f_index_block_uncompressed_size >> 32u)))); ++ v_hash *= 3432918353u; ++ v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u)); ++ v_hash *= 461845907u; ++ v_hash ^= self->private_impl.f_verification_want_hashed_sizes[1u]; ++ v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u)); ++ self->private_impl.f_verification_want_hashed_sizes[1u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u)); ++ } ++ if ((self->private_impl.f_verification_have_hashed_sizes[0u] != self->private_impl.f_verification_want_hashed_sizes[0u]) || ++ (self->private_impl.f_verification_have_hashed_sizes[1u] != self->private_impl.f_verification_want_hashed_sizes[1u]) || ++ (self->private_impl.f_verification_have_total_sizes[0u] != self->private_impl.f_verification_want_total_sizes[0u]) || ++ (self->private_impl.f_verification_have_total_sizes[1u] != self->private_impl.f_verification_want_total_sizes[1u])) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_index); ++ goto exit; ++ } + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__update_u64( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x) { +- if (!self) { +- return 0; ++ goto ok; ++ ok: ++ self->private_impl.p_verify_index = 0; ++ goto exit; + } +- if (self->private_impl.magic != WUFFS_BASE__MAGIC) { +- return 0; ++ ++ goto suspend; ++ suspend: ++ self->private_impl.p_verify_index = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; ++ self->private_data.s_verify_index.v_shift = v_shift; ++ ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } + +- wuffs_xxhash64__hasher__update(self, a_x); +- return wuffs_xxhash64__hasher__checksum_u64(self); ++ return status; + } + +-// -------- func xxhash64.hasher.up ++// -------- func xz.decoder.verify_footer + + WUFFS_BASE__GENERATED_C_CODE +-static wuffs_base__empty_struct +-wuffs_xxhash64__hasher__up( +- wuffs_xxhash64__hasher* self, +- wuffs_base__slice_u8 a_x) { +- uint64_t v_new_lmu = 0; +- uint64_t v_buf_u64 = 0; +- uint32_t v_buf_len = 0; +- uint64_t v_v0 = 0; +- uint64_t v_v1 = 0; +- uint64_t v_v2 = 0; +- uint64_t v_v3 = 0; +- wuffs_base__slice_u8 v_p = {0}; ++static wuffs_base__status ++wuffs_xz__decoder__verify_footer( ++ wuffs_xz__decoder* self, ++ wuffs_base__io_buffer* a_src) { ++ wuffs_base__status status = wuffs_base__make_status(NULL); + +- v_new_lmu = ((uint64_t)(self->private_impl.f_length_modulo_u64 + ((uint64_t)(a_x.len)))); +- self->private_impl.f_length_overflows_u64 = ((v_new_lmu < self->private_impl.f_length_modulo_u64) || self->private_impl.f_length_overflows_u64); +- self->private_impl.f_length_modulo_u64 = v_new_lmu; +- while (true) { +- if (self->private_impl.f_buf_len >= 32u) { +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) | +- (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u)); +- v_v0 = ((uint64_t)(self->private_impl.f_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); +- self->private_impl.f_v0 = ((uint64_t)(v_v0 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) | +- (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u)); +- v_v1 = ((uint64_t)(self->private_impl.f_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); +- self->private_impl.f_v1 = ((uint64_t)(v_v1 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) | +- (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u)); +- v_v2 = ((uint64_t)(self->private_impl.f_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); +- self->private_impl.f_v2 = ((uint64_t)(v_v2 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[24u])) | +- (((uint64_t)(self->private_impl.f_buf_data[25u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[26u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[27u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[28u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[29u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[30u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[31u])) << 56u)); +- v_v3 = ((uint64_t)(self->private_impl.f_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); +- self->private_impl.f_v3 = ((uint64_t)(v_v3 * 11400714785074694791u)); +- self->private_impl.f_buf_len = 0u; +- break; ++ uint32_t v_c32 = 0; ++ ++ const uint8_t* iop_a_src = NULL; ++ const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL; ++ if (a_src && a_src->data.ptr) { ++ io0_a_src = a_src->data.ptr; ++ io1_a_src = io0_a_src + a_src->meta.ri; ++ iop_a_src = io1_a_src; ++ io2_a_src = io0_a_src + a_src->meta.wi; ++ } ++ ++ uint32_t coro_susp_point = self->private_impl.p_verify_footer; ++ switch (coro_susp_point) { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0; ++ ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1); ++ uint32_t t_0; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) { ++ t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src); ++ iop_a_src += 4; ++ } else { ++ self->private_data.s_verify_footer.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_verify_footer.scratch; ++ uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0; ++ if (num_bits_0 == 24) { ++ t_0 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_0 += 8u; ++ *scratch |= ((uint64_t)(num_bits_0)) << 56; ++ } ++ } ++ v_c32 = t_0; + } +- if (((uint64_t)(a_x.len)) <= 0u) { +- return wuffs_base__make_empty_struct(); ++ if (v_c32 != ((uint32_t)(self->private_impl.f_backwards_size))) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_footer); ++ goto exit; + } +- self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u]; +- self->private_impl.f_buf_len += 1u; +- a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u); +- } +- v_buf_len = (self->private_impl.f_buf_len & 31u); +- v_v0 = self->private_impl.f_v0; +- v_v1 = self->private_impl.f_v1; +- v_v2 = self->private_impl.f_v2; +- v_v3 = self->private_impl.f_v3; +- { +- wuffs_base__slice_u8 i_slice_p = a_x; +- v_p.ptr = i_slice_p.ptr; +- v_p.len = 32; +- uint8_t* i_end0_p = v_p.ptr + (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 32) * 32); +- while (v_p.ptr < i_end0_p) { +- v_buf_u64 = (((uint64_t)(v_p.ptr[0u])) | +- (((uint64_t)(v_p.ptr[1u])) << 8u) | +- (((uint64_t)(v_p.ptr[2u])) << 16u) | +- (((uint64_t)(v_p.ptr[3u])) << 24u) | +- (((uint64_t)(v_p.ptr[4u])) << 32u) | +- (((uint64_t)(v_p.ptr[5u])) << 40u) | +- (((uint64_t)(v_p.ptr[6u])) << 48u) | +- (((uint64_t)(v_p.ptr[7u])) << 56u)); +- v_v0 = ((uint64_t)(v_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); +- v_v0 = ((uint64_t)(v_v0 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(v_p.ptr[8u])) | +- (((uint64_t)(v_p.ptr[9u])) << 8u) | +- (((uint64_t)(v_p.ptr[10u])) << 16u) | +- (((uint64_t)(v_p.ptr[11u])) << 24u) | +- (((uint64_t)(v_p.ptr[12u])) << 32u) | +- (((uint64_t)(v_p.ptr[13u])) << 40u) | +- (((uint64_t)(v_p.ptr[14u])) << 48u) | +- (((uint64_t)(v_p.ptr[15u])) << 56u)); +- v_v1 = ((uint64_t)(v_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); +- v_v1 = ((uint64_t)(v_v1 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(v_p.ptr[16u])) | +- (((uint64_t)(v_p.ptr[17u])) << 8u) | +- (((uint64_t)(v_p.ptr[18u])) << 16u) | +- (((uint64_t)(v_p.ptr[19u])) << 24u) | +- (((uint64_t)(v_p.ptr[20u])) << 32u) | +- (((uint64_t)(v_p.ptr[21u])) << 40u) | +- (((uint64_t)(v_p.ptr[22u])) << 48u) | +- (((uint64_t)(v_p.ptr[23u])) << 56u)); +- v_v2 = ((uint64_t)(v_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); +- v_v2 = ((uint64_t)(v_v2 * 11400714785074694791u)); +- v_buf_u64 = (((uint64_t)(v_p.ptr[24u])) | +- (((uint64_t)(v_p.ptr[25u])) << 8u) | +- (((uint64_t)(v_p.ptr[26u])) << 16u) | +- (((uint64_t)(v_p.ptr[27u])) << 24u) | +- (((uint64_t)(v_p.ptr[28u])) << 32u) | +- (((uint64_t)(v_p.ptr[29u])) << 40u) | +- (((uint64_t)(v_p.ptr[30u])) << 48u) | +- (((uint64_t)(v_p.ptr[31u])) << 56u)); +- v_v3 = ((uint64_t)(v_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u)))); +- v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); +- v_v3 = ((uint64_t)(v_v3 * 11400714785074694791u)); +- v_p.ptr += 32; ++ { ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3); ++ uint32_t t_1; ++ if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) { ++ t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src))); ++ iop_a_src += 2; ++ } else { ++ self->private_data.s_verify_footer.scratch = 0; ++ WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4); ++ while (true) { ++ if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) { ++ status = wuffs_base__make_status(wuffs_base__suspension__short_read); ++ goto suspend; ++ } ++ uint64_t* scratch = &self->private_data.s_verify_footer.scratch; ++ uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56)); ++ *scratch <<= 8; ++ *scratch >>= 8; ++ *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1; ++ if (num_bits_1 == 8) { ++ t_1 = ((uint32_t)(*scratch)); ++ break; ++ } ++ num_bits_1 += 8u; ++ *scratch |= ((uint64_t)(num_bits_1)) << 56; ++ } ++ } ++ v_c32 = t_1; + } +- v_p.len = 1; +- uint8_t* i_end1_p = i_slice_p.ptr + i_slice_p.len; +- while (v_p.ptr < i_end1_p) { +- self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u]; +- v_buf_len = ((v_buf_len + 1u) & 31u); +- v_p.ptr += 1; ++ if (v_c32 != ((uint32_t)(self->private_impl.f_flags))) { ++ status = wuffs_base__make_status(wuffs_xz__error__bad_footer); ++ goto exit; + } +- v_p.len = 0; +- } +- self->private_impl.f_buf_len = v_buf_len; +- self->private_impl.f_v0 = v_v0; +- self->private_impl.f_v1 = v_v1; +- self->private_impl.f_v2 = v_v2; +- self->private_impl.f_v3 = v_v3; +- return wuffs_base__make_empty_struct(); +-} +- +-// -------- func xxhash64.hasher.checksum_u64 + +-WUFFS_BASE__GENERATED_C_CODE +-WUFFS_BASE__MAYBE_STATIC uint64_t +-wuffs_xxhash64__hasher__checksum_u64( +- const wuffs_xxhash64__hasher* self) { +- if (!self) { +- return 0; +- } +- if ((self->private_impl.magic != WUFFS_BASE__MAGIC) && +- (self->private_impl.magic != WUFFS_BASE__DISABLED)) { +- return 0; ++ goto ok; ++ ok: ++ self->private_impl.p_verify_footer = 0; ++ goto exit; + } + +- uint64_t v_ret = 0; +- uint64_t v_v0 = 0; +- uint64_t v_v1 = 0; +- uint64_t v_v2 = 0; +- uint64_t v_v3 = 0; +- uint32_t v_i = 0; +- uint32_t v_i8 = 0; +- uint32_t v_n = 0; +- uint32_t v_buf_u32 = 0; +- uint64_t v_buf_u64 = 0; ++ goto suspend; ++ suspend: ++ self->private_impl.p_verify_footer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0; + +- if ((self->private_impl.f_length_modulo_u64 >= 32u) || self->private_impl.f_length_overflows_u64) { +- v_ret += (((uint64_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 63u)); +- v_ret += (((uint64_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 57u)); +- v_ret += (((uint64_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 52u)); +- v_ret += (((uint64_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 46u)); +- v_v0 = ((uint64_t)(self->private_impl.f_v0 * 14029467366897019727u)); +- v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u)); +- v_v0 *= 11400714785074694791u; +- v_v1 = ((uint64_t)(self->private_impl.f_v1 * 14029467366897019727u)); +- v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u)); +- v_v1 *= 11400714785074694791u; +- v_v2 = ((uint64_t)(self->private_impl.f_v2 * 14029467366897019727u)); +- v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u)); +- v_v2 *= 11400714785074694791u; +- v_v3 = ((uint64_t)(self->private_impl.f_v3 * 14029467366897019727u)); +- v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u)); +- v_v3 *= 11400714785074694791u; +- v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v0) * 11400714785074694791u)) + 9650029242287828579u)); +- v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v1) * 11400714785074694791u)) + 9650029242287828579u)); +- v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v2) * 11400714785074694791u)) + 9650029242287828579u)); +- v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v3) * 11400714785074694791u)) + 9650029242287828579u)); +- v_ret += self->private_impl.f_length_modulo_u64; +- } else { +- v_ret += 2870177450012600261u; +- v_ret += self->private_impl.f_length_modulo_u64; +- } +- v_n = 32u; +- v_n = wuffs_base__u32__min(v_n, self->private_impl.f_buf_len); +- if (8u <= v_n) { +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) | +- (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u)); +- v_buf_u64 *= 14029467366897019727u; +- v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); +- v_buf_u64 *= 11400714785074694791u; +- v_ret ^= v_buf_u64; +- v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); +- v_ret *= 11400714785074694791u; +- v_ret += 9650029242287828579u; +- v_i = 8u; +- } +- if (16u <= v_n) { +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) | +- (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u)); +- v_buf_u64 *= 14029467366897019727u; +- v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); +- v_buf_u64 *= 11400714785074694791u; +- v_ret ^= v_buf_u64; +- v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); +- v_ret *= 11400714785074694791u; +- v_ret += 9650029242287828579u; +- v_i = 16u; +- } +- if (24u <= v_n) { +- v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) | +- (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) | +- (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) | +- (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) | +- (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) | +- (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) | +- (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) | +- (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u)); +- v_buf_u64 *= 14029467366897019727u; +- v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u)); +- v_buf_u64 *= 11400714785074694791u; +- v_ret ^= v_buf_u64; +- v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u)); +- v_ret *= 11400714785074694791u; +- v_ret += 9650029242287828579u; +- v_i = 24u; +- } +- if ((v_n & 4u) != 0u) { +- v_i8 = (v_i & 24u); +- v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 0u)])) | +- (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 1u)])) << 8u) | +- (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 2u)])) << 16u) | +- (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 3u)])) << 24u)); +- v_ret ^= ((uint64_t)(((uint64_t)(v_buf_u32)) * 11400714785074694791u)); +- v_ret = (((uint64_t)(v_ret << 23u)) | (v_ret >> 41u)); +- v_ret *= 14029467366897019727u; +- v_ret += 1609587929392839161u; +- v_i = (v_i8 + 4u); +- } +- while (v_i < v_n) { +- v_ret ^= ((uint64_t)(((uint64_t)(self->private_impl.f_buf_data[v_i])) * 2870177450012600261u)); +- v_ret = (((uint64_t)(v_ret << 11u)) | (v_ret >> 53u)); +- v_ret *= 11400714785074694791u; +- v_i += 1u; ++ goto exit; ++ exit: ++ if (a_src && a_src->data.ptr) { ++ a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr)); + } +- v_ret ^= (v_ret >> 33u); +- v_ret *= 14029467366897019727u; +- v_ret ^= (v_ret >> 29u); +- v_ret *= 1609587929392839161u; +- v_ret ^= (v_ret >> 32u); +- return ((uint64_t)(v_ret)); ++ ++ return status; + } + +-#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) ++#endif // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) + + #if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR) + +@@ -62309,16 +78871,12 @@ DynIOBuffer::DynIOBuffer(uint64_t max_incl) + : m_buf(wuffs_base__empty_io_buffer()), m_max_incl(max_incl) {} + + DynIOBuffer::~DynIOBuffer() { +- if (m_buf.data.ptr) { +- free(m_buf.data.ptr); +- } ++ free(m_buf.data.ptr); + } + + void // + DynIOBuffer::drop() { +- if (m_buf.data.ptr) { +- free(m_buf.data.ptr); +- } ++ free(m_buf.data.ptr); + m_buf = wuffs_base__empty_io_buffer(); + } + +@@ -62329,13 +78887,16 @@ DynIOBuffer::grow(uint64_t min_incl) { + return ((min_incl == 0) && (m_max_incl == 0)) + ? DynIOBuffer::GrowResult::OK + : DynIOBuffer::GrowResult::FailedMaxInclExceeded; ++ } else if (n > SIZE_MAX) { ++ return DynIOBuffer::GrowResult::FailedOutOfMemory; + } else if (n > m_buf.data.len) { +- uint8_t* ptr = static_cast(realloc(m_buf.data.ptr, n)); ++ uint8_t* ptr = ++ static_cast(realloc(m_buf.data.ptr, static_cast(n))); + if (!ptr) { + return DynIOBuffer::GrowResult::FailedOutOfMemory; + } + m_buf.data.ptr = ptr; +- m_buf.data.len = n; ++ m_buf.data.len = static_cast(n); + } + return DynIOBuffer::GrowResult::OK; + } +@@ -62382,7 +78943,7 @@ Input::BringsItsOwnIOBuffer() { + FileInput::FileInput(FILE* f) : m_f(f) {} + + std::string // +-FileInput::CopyIn(IOBuffer* dst, uint64_t history_retain_length) { ++FileInput::CopyIn(IOBuffer* dst) { + if (!m_f) { + return "wuffs_aux::sync_io::FileInput: nullptr file"; + } else if (!dst) { +@@ -62390,7 +78951,7 @@ FileInput::CopyIn(IOBuffer* dst, uint64_t history_retain_length) { + } else if (dst->meta.closed) { + return "wuffs_aux::sync_io::FileInput: end of file"; + } else { +- dst->compact_retaining(history_retain_length); ++ dst->compact(); + size_t n = fread(dst->writer_pointer(), 1, dst->writer_length(), m_f); + dst->meta.wi += n; + dst->meta.closed = feof(m_f); +@@ -62418,7 +78979,7 @@ MemoryInput::BringsItsOwnIOBuffer() { + } + + std::string // +-MemoryInput::CopyIn(IOBuffer* dst, uint64_t history_retain_length) { ++MemoryInput::CopyIn(IOBuffer* dst) { + if (!dst) { + return "wuffs_aux::sync_io::MemoryInput: nullptr IOBuffer"; + } else if (dst->meta.closed) { +@@ -62428,7 +78989,7 @@ MemoryInput::CopyIn(IOBuffer* dst, uint64_t history_retain_length) { + // to it. + return "wuffs_aux::sync_io::MemoryInput: overlapping buffers"; + } else { +- dst->compact_retaining(history_retain_length); ++ dst->compact(); + size_t nd = dst->writer_length(); + size_t ns = m_io.reader_length(); + size_t n = (nd < ns) ? nd : ns; +@@ -62483,7 +79044,7 @@ AdvanceIOBufferTo(const ErrorMessages& error_messages, + if (!input.BringsItsOwnIOBuffer()) { + io_buf.compact(); + } +- std::string error_message = input.CopyIn(&io_buf, 0); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return error_message; + } +@@ -62566,7 +79127,7 @@ HandleMetadata( + } else if (!input.BringsItsOwnIOBuffer()) { + io_buf.compact(); + } +- std::string error_message = input.CopyIn(&io_buf, 0); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return error_message; + } +@@ -62627,15 +79188,13 @@ DecodeCborCallbacks::Done(DecodeCborResult& result, + sync_io::Input& input, + IOBuffer& buffer) {} + +-DecodeCborArgQuirks::DecodeCborArgQuirks(wuffs_base__slice_u32 repr0) +- : repr(repr0) {} +- +-DecodeCborArgQuirks::DecodeCborArgQuirks(uint32_t* ptr0, size_t len0) +- : repr(wuffs_base__make_slice_u32(ptr0, len0)) {} ++DecodeCborArgQuirks::DecodeCborArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0) ++ : ptr(ptr0), len(len0) {} + + DecodeCborArgQuirks // + DecodeCborArgQuirks::DefaultValue() { +- return DecodeCborArgQuirks(wuffs_base__empty_slice_u32()); ++ return DecodeCborArgQuirks(nullptr, 0); + } + + DecodeCborResult // +@@ -62664,8 +79223,8 @@ DecodeCbor(DecodeCborCallbacks& callbacks, + ret_error_message = "wuffs_aux::DecodeCbor: out of memory"; + goto done; + } +- for (size_t i = 0; i < quirks.repr.len; i++) { +- dec->set_quirk(quirks.repr.ptr[i], 1); ++ for (size_t i = 0; i < quirks.len; i++) { ++ dec->set_quirk(quirks.ptr[i].first, quirks.ptr[i].second); + } + + // Prepare the wuffs_base__tok_buffer. 256 tokens is 2KiB. +@@ -62710,14 +79269,14 @@ DecodeCbor(DecodeCborCallbacks& callbacks, + "wuffs_aux::DecodeCbor: internal error: io_buf is closed"; + goto done; + } +- io_buf->compact_retaining(dec->history_retain_length()); ++ io_buf->compact(); + if (io_buf->meta.wi >= io_buf->data.len) { + ret_error_message = + "wuffs_aux::DecodeCbor: internal error: io_buf is full"; + goto done; + } + cursor_index = io_buf->meta.ri; +- io_error_message = input.CopyIn(io_buf, dec->history_retain_length()); ++ io_error_message = input.CopyIn(io_buf); + } else { + ret_error_message = tok_status.message(); + goto done; +@@ -62796,7 +79355,7 @@ DecodeCbor(DecodeCborCallbacks& callbacks, + goto done; + } + depth++; +- if (depth > WUFFS_CBOR__DECODER_DEPTH_MAX_INCL) { ++ if (depth > (int32_t)WUFFS_CBOR__DECODER_DEPTH_MAX_INCL) { + ret_error_message = + "wuffs_aux::DecodeCbor: internal error: bad depth"; + goto done; +@@ -63052,6 +79611,11 @@ DecodeImageCallbacks::SelectDecoder(uint32_t fourcc, + } + #endif + ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) ++ case WUFFS_BASE__FOURCC__QOI: ++ return wuffs_qoi__decoder::alloc_as__wuffs_base__image_decoder(); ++#endif ++ + #if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) + case WUFFS_BASE__FOURCC__TGA: + return wuffs_tga__decoder::alloc_as__wuffs_base__image_decoder(); +@@ -63061,6 +79625,11 @@ DecodeImageCallbacks::SelectDecoder(uint32_t fourcc, + case WUFFS_BASE__FOURCC__WBMP: + return wuffs_wbmp__decoder::alloc_as__wuffs_base__image_decoder(); + #endif ++ ++#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) ++ case WUFFS_BASE__FOURCC__WEBP: ++ return wuffs_webp__decoder::alloc_as__wuffs_base__image_decoder(); ++#endif + } + + return wuffs_base__image_decoder::unique_ptr(nullptr); +@@ -63091,7 +79660,7 @@ DecodeImageCallbacks::AllocPixbuf(const wuffs_base__image_config& image_config, + return AllocPixbufResult(DecodeImage_UnsupportedPixelConfiguration); + } + void* ptr = +- allow_uninitialized_memory ? malloc((size_t)len) : calloc((size_t)len, 1); ++ allow_uninitialized_memory ? malloc((size_t)len) : calloc(1, (size_t)len); + if (!ptr) { + return AllocPixbufResult(DecodeImage_OutOfMemory); + } +@@ -63116,7 +79685,7 @@ DecodeImageCallbacks::AllocWorkbuf(wuffs_base__range_ii_u64 len_range, + return AllocWorkbufResult(DecodeImage_OutOfMemory); + } + void* ptr = +- allow_uninitialized_memory ? malloc((size_t)len) : calloc((size_t)len, 1); ++ allow_uninitialized_memory ? malloc((size_t)len) : calloc(1, (size_t)len); + if (!ptr) { + return AllocWorkbufResult(DecodeImage_OutOfMemory); + } +@@ -63153,15 +79722,13 @@ const char DecodeImage_UnsupportedPixelConfiguration[] = // + const char DecodeImage_UnsupportedPixelFormat[] = // + "wuffs_aux::DecodeImage: unsupported pixel format"; + +-DecodeImageArgQuirks::DecodeImageArgQuirks(wuffs_base__slice_u32 repr0) +- : repr(repr0) {} +- +-DecodeImageArgQuirks::DecodeImageArgQuirks(uint32_t* ptr0, size_t len0) +- : repr(wuffs_base__make_slice_u32(ptr0, len0)) {} ++DecodeImageArgQuirks::DecodeImageArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0) ++ : ptr(ptr0), len(len0) {} + + DecodeImageArgQuirks // + DecodeImageArgQuirks::DefaultValue() { +- return DecodeImageArgQuirks(wuffs_base__empty_slice_u32()); ++ return DecodeImageArgQuirks(nullptr, 0); + } + + DecodeImageArgFlags::DecodeImageArgFlags(uint64_t repr0) : repr(repr0) {} +@@ -63259,7 +79826,8 @@ DecodeImage0(wuffs_base__image_decoder::unique_ptr& image_decoder, + DecodeImageCallbacks& callbacks, + sync_io::Input& input, + wuffs_base__io_buffer& io_buf, +- wuffs_base__slice_u32 quirks, ++ const QuirkKeyValuePair* quirks_ptr, ++ const size_t quirks_len, + uint64_t flags, + wuffs_base__pixel_blend pixel_blend, + wuffs_base__color_u32_argb_premul background_color, +@@ -63301,7 +79869,7 @@ redirect: + fourcc = 0; + break; + } +- std::string error_message = input.CopyIn(&io_buf, 0); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } +@@ -63342,8 +79910,8 @@ redirect: + } + + // Apply quirks. +- for (size_t i = 0; i < quirks.len; i++) { +- image_decoder->set_quirk(quirks.ptr[i], 1); ++ for (size_t i = 0; i < quirks_len; i++) { ++ image_decoder->set_quirk(quirks_ptr[i].first, quirks_ptr[i].second); + } + + // Apply flags. +@@ -63397,8 +79965,7 @@ redirect: + } else if (io_buf.meta.closed) { + return DecodeImageResult(DecodeImage_UnexpectedEndOfFile); + } else { +- std::string error_message = +- input.CopyIn(&io_buf, image_decoder->history_retain_length()); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } +@@ -63480,8 +80047,7 @@ redirect: + } else if (io_buf.meta.closed) { + return DecodeImageResult(DecodeImage_UnexpectedEndOfFile); + } else { +- std::string error_message = +- input.CopyIn(&io_buf, image_decoder->history_retain_length()); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } +@@ -63510,8 +80076,7 @@ redirect: + message = DecodeImage_UnexpectedEndOfFile; + break; + } else { +- std::string error_message = +- input.CopyIn(&io_buf, image_decoder->history_retain_length()); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + message = std::move(error_message); + break; +@@ -63539,8 +80104,7 @@ redirect: + } else if (io_buf.meta.closed) { + return DecodeImageResult(DecodeImage_UnexpectedEndOfFile); + } else { +- std::string error_message = +- input.CopyIn(&io_buf, image_decoder->history_retain_length()); ++ std::string error_message = input.CopyIn(&io_buf); + if (!error_message.empty()) { + return DecodeImageResult(std::move(error_message)); + } +@@ -63574,10 +80138,10 @@ DecodeImage(DecodeImageCallbacks& callbacks, + } + + wuffs_base__image_decoder::unique_ptr image_decoder(nullptr); +- DecodeImageResult result = +- DecodeImage0(image_decoder, callbacks, input, *io_buf, quirks.repr, +- flags.repr, pixel_blend.repr, background_color.repr, +- max_incl_dimension.repr, max_incl_metadata_length.repr); ++ DecodeImageResult result = DecodeImage0( ++ image_decoder, callbacks, input, *io_buf, quirks.ptr, quirks.len, ++ flags.repr, pixel_blend.repr, background_color.repr, ++ max_incl_dimension.repr, max_incl_metadata_length.repr); + callbacks.Done(result, input, *io_buf, std::move(image_decoder)); + return result; + } +@@ -63612,15 +80176,13 @@ const char DecodeJson_BadJsonPointer[] = // + const char DecodeJson_NoMatch[] = // + "wuffs_aux::DecodeJson: no match"; + +-DecodeJsonArgQuirks::DecodeJsonArgQuirks(wuffs_base__slice_u32 repr0) +- : repr(repr0) {} +- +-DecodeJsonArgQuirks::DecodeJsonArgQuirks(uint32_t* ptr0, size_t len0) +- : repr(wuffs_base__make_slice_u32(ptr0, len0)) {} ++DecodeJsonArgQuirks::DecodeJsonArgQuirks(const QuirkKeyValuePair* ptr0, ++ const size_t len0) ++ : ptr(ptr0), len(len0) {} + + DecodeJsonArgQuirks // + DecodeJsonArgQuirks::DefaultValue() { +- return DecodeJsonArgQuirks(wuffs_base__empty_slice_u32()); ++ return DecodeJsonArgQuirks(nullptr, 0); + } + + DecodeJsonArgJsonPointer::DecodeJsonArgJsonPointer(std::string repr0) +@@ -63633,58 +80195,58 @@ DecodeJsonArgJsonPointer::DefaultValue() { + + // -------- + +-#define WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN \ +- while (tok_buf.meta.ri >= tok_buf.meta.wi) { \ +- if (tok_status.repr == nullptr) { \ +- goto done; \ +- } else if (tok_status.repr == wuffs_base__suspension__short_write) { \ +- tok_buf.compact(); \ +- } else if (tok_status.repr == wuffs_base__suspension__short_read) { \ +- if (!io_error_message.empty()) { \ +- ret_error_message = std::move(io_error_message); \ +- goto done; \ +- } else if (cursor_index != io_buf->meta.ri) { \ +- ret_error_message = \ +- "wuffs_aux::DecodeJson: internal error: bad cursor_index"; \ +- goto done; \ +- } else if (io_buf->meta.closed) { \ +- ret_error_message = \ +- "wuffs_aux::DecodeJson: internal error: io_buf is closed"; \ +- goto done; \ +- } \ +- io_buf->compact_retaining(dec->history_retain_length()); \ +- if (io_buf->meta.wi >= io_buf->data.len) { \ +- ret_error_message = \ +- "wuffs_aux::DecodeJson: internal error: io_buf is full"; \ +- goto done; \ +- } \ +- cursor_index = io_buf->meta.ri; \ +- io_error_message = input.CopyIn(io_buf, dec->history_retain_length()); \ +- } else { \ +- ret_error_message = tok_status.message(); \ +- goto done; \ +- } \ +- tok_status = \ +- dec->decode_tokens(&tok_buf, io_buf, wuffs_base__empty_slice_u8()); \ +- if ((tok_buf.meta.ri > tok_buf.meta.wi) || \ +- (tok_buf.meta.wi > tok_buf.data.len) || \ +- (io_buf->meta.ri > io_buf->meta.wi) || \ +- (io_buf->meta.wi > io_buf->data.len)) { \ +- ret_error_message = \ +- "wuffs_aux::DecodeJson: internal error: bad buffer indexes"; \ +- goto done; \ +- } \ +- } \ +- wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++]; \ +- uint64_t token_len = token.length(); \ +- if ((io_buf->meta.ri < cursor_index) || \ +- ((io_buf->meta.ri - cursor_index) < token_len)) { \ +- ret_error_message = \ +- "wuffs_aux::DecodeJson: internal error: bad token indexes"; \ +- goto done; \ +- } \ +- uint8_t* token_ptr = io_buf->data.ptr + cursor_index; \ +- (void)(token_ptr); \ ++#define WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN \ ++ while (tok_buf.meta.ri >= tok_buf.meta.wi) { \ ++ if (tok_status.repr == nullptr) { \ ++ goto done; \ ++ } else if (tok_status.repr == wuffs_base__suspension__short_write) { \ ++ tok_buf.compact(); \ ++ } else if (tok_status.repr == wuffs_base__suspension__short_read) { \ ++ if (!io_error_message.empty()) { \ ++ ret_error_message = std::move(io_error_message); \ ++ goto done; \ ++ } else if (cursor_index != io_buf->meta.ri) { \ ++ ret_error_message = \ ++ "wuffs_aux::DecodeJson: internal error: bad cursor_index"; \ ++ goto done; \ ++ } else if (io_buf->meta.closed) { \ ++ ret_error_message = \ ++ "wuffs_aux::DecodeJson: internal error: io_buf is closed"; \ ++ goto done; \ ++ } \ ++ io_buf->compact(); \ ++ if (io_buf->meta.wi >= io_buf->data.len) { \ ++ ret_error_message = \ ++ "wuffs_aux::DecodeJson: internal error: io_buf is full"; \ ++ goto done; \ ++ } \ ++ cursor_index = io_buf->meta.ri; \ ++ io_error_message = input.CopyIn(io_buf); \ ++ } else { \ ++ ret_error_message = tok_status.message(); \ ++ goto done; \ ++ } \ ++ tok_status = \ ++ dec->decode_tokens(&tok_buf, io_buf, wuffs_base__empty_slice_u8()); \ ++ if ((tok_buf.meta.ri > tok_buf.meta.wi) || \ ++ (tok_buf.meta.wi > tok_buf.data.len) || \ ++ (io_buf->meta.ri > io_buf->meta.wi) || \ ++ (io_buf->meta.wi > io_buf->data.len)) { \ ++ ret_error_message = \ ++ "wuffs_aux::DecodeJson: internal error: bad buffer indexes"; \ ++ goto done; \ ++ } \ ++ } \ ++ wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++]; \ ++ uint64_t token_len = token.length(); \ ++ if ((io_buf->meta.ri < cursor_index) || \ ++ ((io_buf->meta.ri - cursor_index) < token_len)) { \ ++ ret_error_message = \ ++ "wuffs_aux::DecodeJson: internal error: bad token indexes"; \ ++ goto done; \ ++ } \ ++ uint8_t* token_ptr = io_buf->data.ptr + cursor_index; \ ++ (void)(token_ptr); \ + cursor_index += static_cast(token_len) + + // -------- +@@ -63965,11 +80527,11 @@ DecodeJson(DecodeJsonCallbacks& callbacks, + goto done; + } + bool allow_tilde_n_tilde_r_tilde_t = false; +- for (size_t i = 0; i < quirks.repr.len; i++) { +- dec->set_quirk(quirks.repr.ptr[i], 1); +- if (quirks.repr.ptr[i] == ++ for (size_t i = 0; i < quirks.len; i++) { ++ dec->set_quirk(quirks.ptr[i].first, quirks.ptr[i].second); ++ if (quirks.ptr[i].first == + WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T) { +- allow_tilde_n_tilde_r_tilde_t = true; ++ allow_tilde_n_tilde_r_tilde_t = (quirks.ptr[i].second != 0); + } + } + +@@ -64025,7 +80587,7 @@ DecodeJson(DecodeJsonCallbacks& callbacks, + goto done; + } + depth++; +- if (depth > WUFFS_JSON__DECODER_DEPTH_MAX_INCL) { ++ if (depth > (int32_t)WUFFS_JSON__DECODER_DEPTH_MAX_INCL) { + ret_error_message = + "wuffs_aux::DecodeJson: internal error: bad depth"; + goto done; +-- +2.39.2 + diff --git a/patches/coreboot-system76-unreleased/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch b/patches/coreboot-system76-unreleased/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch deleted file mode 100644 index a31118c14..000000000 --- a/patches/coreboot-system76-unreleased/0002-increase_heap_from1mb_to4mb_when_bootpslash_enabled.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 00d695849a5fb503d87203e3515f761fa8dac850 Mon Sep 17 00:00:00 2001 -From: Jonathon Hall -Date: Mon, 15 Jul 2024 16:37:40 -0400 -Subject: [PATCH] bootsplash: Increase heap from 1 MB to 4 MB when bootsplash - is enabled - -Since commit 1d029b40c9de ("lib/jpeg: Replace decoder with Wuffs' -implementation"), a relatively large heap allocation is needed to -decode many JPEGs for use as work area. The prior decoder did not need -this, but also had many limitations in the JPEGs it could decode. - -A 1024x768 non-progressive JPEG used in Heads needs 1179648 bytes of -work area; about 1.2 MB. While the work area will also depend on the -subsampling of each channel, it's generally proportional to the image -size. - -Increasing the heap size to 4 MB when bootsplash is enabled should be -enough to decode bootsplashes up to 1920x1080 with some headroom. - -Change-Id: Ia4348d39effbc16c1b42ab01bcf1e4ec5d652fa9 -Signed-off-by: Jonathon Hall ---- - src/device/Kconfig | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/src/device/Kconfig b/src/device/Kconfig -index 243e23e52a..4dd03eba21 100644 ---- a/src/device/Kconfig -+++ b/src/device/Kconfig -@@ -501,6 +501,11 @@ config BOOTSPLASH - image in the 'General' section or add it manually to CBFS, using, - for example, cbfstool. - -+# The bootsplash JPEG decoder requires heap space approximately proportional to -+# the image size. This usually needs a larger heap. -+config HEAP_SIZE -+ default 0x400000 if BOOTSPLASH -+ - config LINEAR_FRAMEBUFFER_MAX_WIDTH - int "Maximum width in pixels" - depends on LINEAR_FRAMEBUFFER && MAINBOARD_USE_LIBGFXINIT --- -2.39.2 - diff --git a/patches/coreboot-system76-unreleased/0002-lib_jpeg-avoidcalling-malloc-and-free.patch b/patches/coreboot-system76-unreleased/0002-lib_jpeg-avoidcalling-malloc-and-free.patch new file mode 100644 index 000000000..fa1310628 --- /dev/null +++ b/patches/coreboot-system76-unreleased/0002-lib_jpeg-avoidcalling-malloc-and-free.patch @@ -0,0 +1,91 @@ +From efad423f8472c1b9c130842e3d92625500f82d5d Mon Sep 17 00:00:00 2001 +From: Nigel Tao +Date: Tue, 13 Aug 2024 22:29:21 +1000 +Subject: [PATCH] lib/jpeg: avoid calling malloc and free + +Since commit 1d029b40c9de ("lib/jpeg: Replace decoder with Wuffs' +implementation"), a relatively large heap allocation is needed to decode +many JPEGs for use as work area. The prior decoder did not need this, +but also had many limitations in the JPEGs it could decode, was not as +memory-safe and quickly crashed under fuzzing. + +This commit keeps using Wuffs' JPEG decoder, but it no longer requires +any heap allocation (and thus configuring the heap size depending on how +big a bootsplash image you want to support). + +Change-Id: Ie4c52520cbce498539517c4898ff765365a6beba +Signed-off-by: Nigel Tao +Reviewed-on: https://review.coreboot.org/c/coreboot/+/83895 +Tested-by: build bot (Jenkins) +Reviewed-by: Nico Huber +Reviewed-by: Felix Singer +Reviewed-by: Jonathon Hall +--- + src/lib/jpeg.c | 36 +++++++++++++++++++++--------------- + 1 file changed, 21 insertions(+), 15 deletions(-) + +diff --git a/src/lib/jpeg.c b/src/lib/jpeg.c +index 242cf0ca8e..617ab0b22a 100644 +--- a/src/lib/jpeg.c ++++ b/src/lib/jpeg.c +@@ -1,9 +1,7 @@ + /* SPDX-License-Identifier: GPL-2.0-only */ + + /* +- * Provide a simple API around the Wuffs JPEG decoder +- * Uses the heap (and lots of it) for the image-size specific +- * work buffer, so ramstage-only. ++ * Provide a simple API around the Wuffs JPEG decoder. + */ + + #include +@@ -85,6 +83,24 @@ int jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *pic, + return JPEG_DECODE_FAILED; + } + ++ /* Opting in to lower quality means that we can pass an empty slice as the ++ * "work buffer" argument to wuffs_jpeg__decoder__decode_frame below. ++ * ++ * Decoding progressive (not sequential) JPEGs would still require dynamic ++ * memory allocation (and the amount of work buffer required depends on the ++ * image dimensions), but we choose to just reject progressive JPEGs. It is ++ * simpler than sometimes calling malloc (which can fail, especially for ++ * large allocations) and free. ++ * ++ * More commentary about these quirks is at ++ * https://github.com/google/wuffs/blob/beaf45650085a16780b5f708b72daaeb1aa865c8/std/jpeg/decode_quirks.wuffs ++ */ ++ wuffs_jpeg__decoder__set_quirk( ++ &dec, WUFFS_BASE__QUIRK_QUALITY, ++ WUFFS_BASE__QUIRK_QUALITY__VALUE__LOWER_QUALITY); ++ wuffs_jpeg__decoder__set_quirk( ++ &dec, WUFFS_JPEG__QUIRK_REJECT_PROGRESSIVE_JPEGS, 1); ++ + wuffs_base__image_config imgcfg; + wuffs_base__io_buffer src = wuffs_base__ptr_u8__reader(filedata, filesize, true); + status = wuffs_jpeg__decoder__decode_image_config(&dec, &imgcfg, &src); +@@ -104,19 +120,9 @@ int jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *pic, + return JPEG_DECODE_FAILED; + } + +- uint64_t workbuf_len_min_incl = wuffs_jpeg__decoder__workbuf_len(&dec).min_incl; +- uint8_t *workbuf_array = malloc(workbuf_len_min_incl); +- if ((workbuf_array == NULL) && workbuf_len_min_incl) { +- return JPEG_DECODE_FAILED; +- } +- +- wuffs_base__slice_u8 workbuf = +- wuffs_base__make_slice_u8(workbuf_array, workbuf_len_min_incl); + status = wuffs_jpeg__decoder__decode_frame(&dec, &pixbuf, &src, +- WUFFS_BASE__PIXEL_BLEND__SRC, workbuf, NULL); +- +- free(workbuf_array); +- ++ WUFFS_BASE__PIXEL_BLEND__SRC, ++ wuffs_base__empty_slice_u8(), NULL); + if (status.repr) { + return JPEG_DECODE_FAILED; + } +-- +2.39.2 +